From a3343f898f58573e0d951bcb475e93f56d118c35 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 16 Jun 2026 19:02:17 +0200 Subject: [PATCH] refactor(geschichten): migrate TypeSelector onto SegmentedControl primitive Refs #857 Co-Authored-By: Claude Sonnet 4.6 --- .../geschichten/new/TypeSelector.svelte | 52 +++++-------------- .../new/TypeSelector.svelte.spec.ts | 11 ++-- 2 files changed, 20 insertions(+), 43 deletions(-) diff --git a/frontend/src/routes/geschichten/new/TypeSelector.svelte b/frontend/src/routes/geschichten/new/TypeSelector.svelte index 78c955b4..5936800b 100644 --- a/frontend/src/routes/geschichten/new/TypeSelector.svelte +++ b/frontend/src/routes/geschichten/new/TypeSelector.svelte @@ -1,11 +1,9 @@
@@ -48,31 +37,14 @@ const descs: Record string> = { {m.journey_selector_question()}

-
{ - if (TYPES.includes(v as GeschichteType)) select(v as GeschichteType); + { + if (v === 'STORY' || v === 'JOURNEY') select(v); }} - > - {#each TYPES as type (type)} - - {/each} -
+ label={m.journey_selector_question()} + />
{announcement}
diff --git a/frontend/src/routes/geschichten/new/TypeSelector.svelte.spec.ts b/frontend/src/routes/geschichten/new/TypeSelector.svelte.spec.ts index 9aff1ca9..070f1ad9 100644 --- a/frontend/src/routes/geschichten/new/TypeSelector.svelte.spec.ts +++ b/frontend/src/routes/geschichten/new/TypeSelector.svelte.spec.ts @@ -18,13 +18,18 @@ describe('TypeSelector', () => { await expect.element(page.getByRole('radio', { name: /Lesereise/i })).toBeVisible(); }); - it('radiogroup is correctly labelled', async () => { + it('radiogroup is correctly labelled (via aria-label or aria-labelledby)', async () => { render(TypeSelector, { props: { onweiter: vi.fn() } }); const group = document.querySelector('[role="radiogroup"]'); - const labelledBy = group?.getAttribute('aria-labelledby'); + // SegmentedControl uses aria-label; the old TypeSelector used aria-labelledby. + // Accept either as long as the accessible name is non-empty. + const ariaLabel = group?.getAttribute('aria-label') ?? ''; + const labelledBy = group?.getAttribute('aria-labelledby') ?? ''; const labelEl = labelledBy ? document.getElementById(labelledBy) : null; - expect(labelEl?.textContent?.trim().length).toBeGreaterThan(0); + const hasAccessibleName = + ariaLabel.trim().length > 0 || (labelEl?.textContent?.trim().length ?? 0) > 0; + expect(hasAccessibleName).toBe(true); }); it('Weiter button has aria-disabled=true when nothing is selected', async () => {