Done — merged to main (53c9810).
Added web/src/components/ui/skeletons.tsx with three shared recipes built on the existing Skeleton, each a `role="status" aria-busy aria-label={t("com…
Done — merged to main (f45f1d8).
Added web/src/components/ui/select.tsx (Base UI Select) styled to match ui/Input — same h-8/rounded-lg/border-input/padding and a real…
Done — merged to main (28e444c). All the compounding data-loss/duplicate-record risks are closed.
Foundation: migrated the app to a React Router data router (createBrowserRouter,…
Done — merged to main (b7242ca). The header now carries real wayfinding.
Breadcrumb (left): a page-driven useBreadcrumb(trail) hook + BreadcrumbProvider (parallel to the #57 title…
Done — merged to main (9b3a587).
Typography hierarchy + page <h1>:
- New
PageTitlecomponent (web/src/components/ui/page-title.tsx) — a semantic<h1>at `text-2xl font-semibold…
Shipped — merged to main (9323c60). Took the "ship it" path (the #49 token migration made the screens dark-ready).
What landed:
- Tri-state toggle (Light / Dark / System) — an icon…
Fixed — merged to main (d0e3772).
LabelEditor.onChange now preserves non-default-language entries instead of collapsing the record to a single default-language label:
onChange([
…