feat(#447): permission-gated reader dashboard #477

Merged
marcel merged 25 commits from worktree-feat+issue-447-reader-dashboard into main 2026-05-08 15:56:54 +02:00
4 changed files with 18 additions and 2 deletions
Showing only changes of commit 6fd360a381 - Show all commits

View File

@@ -54,7 +54,7 @@ const { persons }: Props = $props();
</div>
<a
href="/persons"
class="self-end font-sans text-sm text-brand-navy underline hover:text-brand-mint"
class="self-end rounded-sm font-sans text-sm text-brand-navy underline hover:text-brand-mint focus-visible:ring-2 focus-visible:ring-brand-navy focus-visible:ring-offset-2 focus-visible:outline-none"
>{m.dashboard_reader_all_persons()}</a
>
</div>

View File

@@ -58,6 +58,14 @@ describe('ReaderPersonChips', () => {
await expect.element(allLink).toHaveAttribute('href', '/persons');
});
it('exposes a focus-visible ring on the "Alle Personen" link', async () => {
render(ReaderPersonChips, { persons: [person1] });
const allLink = page.getByRole('link', { name: /Alle Personen/i });
const cls = ((await allLink.element()) as HTMLElement).className;
expect(cls).toMatch(/focus-visible:ring-2/);
expect(cls).toMatch(/focus-visible:ring-brand-navy/);
});
it('renders empty state without chips when persons array is empty', async () => {
render(ReaderPersonChips, { persons: [] });
const chips = page.getByRole('link', { name: /Müller|Schmidt/ });

View File

@@ -48,7 +48,7 @@ function excerpt(body: string | undefined): string {
</ul>
<a
href="/geschichten"
class="mt-4 block font-sans text-sm text-brand-navy underline hover:text-brand-mint"
class="mt-4 block rounded-sm font-sans text-sm text-brand-navy underline hover:text-brand-mint focus-visible:ring-2 focus-visible:ring-brand-navy focus-visible:ring-offset-2 focus-visible:outline-none"
>
{m.dashboard_reader_all_stories()}
</a>

View File

@@ -57,4 +57,12 @@ describe('ReaderRecentStories', () => {
const allLink = page.getByRole('link', { name: /Alle Geschichten/i });
await expect.element(allLink).toHaveAttribute('href', '/geschichten');
});
it('exposes a focus-visible ring on the "Alle Geschichten" link', async () => {
render(ReaderRecentStories, { stories: [story1] });
const allLink = page.getByRole('link', { name: /Alle Geschichten/i });
const cls = ((await allLink.element()) as HTMLElement).className;
expect(cls).toMatch(/focus-visible:ring-2/);
expect(cls).toMatch(/focus-visible:ring-brand-navy/);
});
});