Problem
Every project here is a data-heavy app: maps, small multiples, tables of numbers, and text that may be Japanese or English. Starting each one from a generic component library meant re-deciding colour scales, Japanese typography, focus styles and dark mode every time, and getting contrast wrong in at least one theme.
Approach
- Tokens first: colours, type, space, radius and motion are written once as DTCG design tokens, in three tiers (primitive, semantic, component) and four themes: light, dark, and a high-contrast variant of each.
- Generated, not hand-copied: a build step turns the tokens into CSS variables, a Tailwind v4 theme, the shadcn/ui variable mapping and typed TypeScript exports.
- Components: the full shadcn/ui set, kept unmodified so upstream updates apply cleanly, plus a few Akari pieces: seal mark, stat card, sparkline, map legend, language switch and theme toggle.
- Checked: contrast for every promised text and UI pair is tested in all four themes, and Storybook stories run through visual and accessibility tests.
- Maps: MapLibre style helpers use the same palette as the charts.
This site is built with it; see the living showcase.
Architecture
Standard pattern: a token-driven design system, where design tokens are the single source and a build generates each platform’s format, with a component kit on top. Customisations: tokens follow the DTCG 2025.10 format with four themes (light, dark and a high-contrast variant of each); the shadcn/ui components stay as upstream source, synced weekly, with Akari’s changes kept as marked hunks; and the map helpers share the chart palette. One package serves React apps, plain CSS pages and Tailwind apps alike.
01 · Tokens
- DTCG JSON, 3 tiers
- 4 themes incl. high contrast
02 · Build
- CSS variables (layered)
- Tailwind v4 theme
- shadcn/ui mapping, TS exports
03 · Kit
- shadcn/ui components
- Akari composites
- MapLibre helpers
04 · Checks
- Contrast tests (WCAG 2.2)
- Visual + axe tests
- Weekly upstream sync
Where it stands
Active, and still growing. The source is private; this site, its living showcase and the projects above are where it can be seen.
Next: committing the visual regression baselines, which must be generated inside the pinned Playwright container. Known cost: the package is about 12 MB, nearly all of it the Japanese Mincho font, although browsers fetch only the slices a page uses.