Redesign the setup flow and consolidate the CSS into one primitives layer

Onboarding asks explicitly for one or two parents and shows one card per
parent for balances; the balance form is per parent with inline
validation; the partner can be filled from the FK deduction or added
from it. Settings and Dashboard reuse the same form.

CSS: bare buttons carry no colour any more; buttons, cards, choice
cards, fields, alerts, badges, eyebrow and modal chrome are defined once
in primitives.css. Media queries live only in responsive.css. A style
guard test blocks hex, !important and stray media queries. Bilingual
fixes: calendar selects size by content, header no longer wraps. Vitest
is capped at four workers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-19 12:27:29 +02:00
parent e4719cb9ae
commit ae6db7e16f
105 changed files with 5683 additions and 3690 deletions
+30 -4
View File
@@ -43,12 +43,38 @@ export async function fillChildStep(page: Page, childName: string): Promise<void
await expect(page.getByTestId('onboarding-step-family')).toBeVisible()
}
/** From step 2 (family), keeps the default "solo" planning mode, continues
* to step 3 (balances) and skips it — landing on the Dashboard with the
* statutory-assumption balance (no manual fetch, no drained pool). */
/** From step 2 (family) — "Bara jag" is selected by default, so this just
* continues to step 3 (balances) and presses "Klar" without filling
* anything in — landing on the Dashboard with the statutory-assumption
* balance (no manual fetch, no drained pool). */
export async function continueSoloAndSkipBalances(page: Page): Promise<void> {
await page.getByRole('button', { name: 'Fortsätt' }).click()
await expect(page.getByTestId('onboarding-step-balances')).toBeVisible()
await page.getByRole('button', { name: 'Hoppa över för nu' }).click()
await page.getByTestId('onboarding-finish').click()
await expect(page.getByTestId('dashboard')).toBeVisible({ timeout: 15_000 })
}
/** From step 2 (family), selects "Vi är två föräldrar", fills in the other
* parent's name and continues — landing on step 3 (balances) with both
* parents' cards visible. */
export async function chooseTwoParents(page: Page, partnerName: string): Promise<void> {
await page.getByTestId('onboarding-family-couple').click()
await page.getByLabel('Den andra förälderns namn').fill(partnerName)
await page.getByRole('button', { name: 'Fortsätt' }).click()
await expect(page.getByTestId('onboarding-step-balances')).toBeVisible()
}
/** In step 3 (balances), opens "Ange själv" on the parent card matching
* `name` and fills in + saves the three balance fields shown there. */
export async function enterBalancesFor(
page: Page,
name: string,
balances: { sjukpenning: number; lagsta: number; dubbeldagar: number },
): Promise<void> {
const card = page.getByTestId('onboarding-parent-card').filter({ hasText: name })
await card.getByRole('button', { name: 'Ange själv' }).click()
await page.getByLabel(/Sjukpenningnivå/).fill(String(balances.sjukpenning))
await page.getByLabel(/Lägstanivå/).fill(String(balances.lagsta))
await page.getByLabel(/Dubbeldagar/).fill(String(balances.dubbeldagar))
await page.getByRole('button', { name: 'Spara' }).click()
}