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
+14 -1
View File
@@ -111,7 +111,20 @@ export function CalendarDay({
title={title}
className={className}
onKeyDown={handleKeyDown}
onPointerDown={() => onPointerDown?.(date)}
onPointerDown={(e) => {
// Touch browsers implicitly capture the pointer to the element it
// went down on, so subsequent `pointermove`s never fire
// `pointerenter` on the cells the finger drags across — collapsing
// a multi-day drag into a single-day tap. Releasing capture
// immediately restores normal hover-style `pointerenter` targeting
// for the rest of the drag. jsdom (unit tests) doesn't implement
// the Pointer Capture API at all, hence the guards.
const target = e.currentTarget
if (typeof target.hasPointerCapture === 'function' && target.hasPointerCapture(e.pointerId)) {
target.releasePointerCapture(e.pointerId)
}
onPointerDown?.(date)
}}
onPointerEnter={() => onPointerEnter?.(date)}
>
<div className="calendar-day__number">{dayNum}</div>