1.3.0
High-contrast theme and the motion token collapse.
- addedHigh-contrast theme as a modifier on light or dark.
- addedReduced-motion collapses durations to 1ms so transitionend still fires.
- fixedFocus ring was clipped inside overflow containers.
A token-driven component set with three themes, built accessible rather than audited afterwards.
Most component libraries hand you components and leave the system to you. This is the other way round: a token layer with light, dark and high-contrast themes, a motion language with reduced-motion built in, and primitives that make an inaccessible interface hard to build by accident.
Component gallery in light theme
Colour in OKLCH, type, space, radius, motion, z-index and containers. Nothing hardcoded.
Light, dark and high-contrast, plus reduced-motion. Dark is a re-mapping, not an inversion.
Focus handled globally, icons require a decorative-or-labelled decision, forms wire their own ARIA.
Transform and opacity, sub-150ms on the interaction path. No layout animation.
A raw palette feeds a semantic layer, which feeds the utility bindings components consume. A component may only reference the semantic layer, which is what makes a rebrand a one-file change and a theme swap a data attribute.
palette (--neutral-9) → semantic (--ut-surface) → utility (bg-surface)
never in a component what components use generatedsrc/
styles/
tokens/ palette · scale · typography · motion
themes/ light · dark · high-contrast
theme.css entry point and Tailwind binding
components/ primitives
lib/ cn · feature flagsThe archive contains the full source. There is no installer and no post-install script.
unzip ut-ui-library.zip
cd ut-ui-librarypnpm installCopy the example file and fill in the variables listed under Environment variables.
cp .env.example .envpnpm devRuns formatting, lint, type-check, tests and a production build.
pnpm check| Variable | Required | Description |
|---|
Rotate the brand hue in the palette. Because colour is authored in OKLCH, the whole scale stays perceptually even and contrast holds.
src/styles/tokens/palette.cssA new file in themes/ and a data-theme value. No component changes.
src/styles/themes/| Technology | Versions | Status |
|---|---|---|
| React | ≥ 18 | Supported |
| Tailwind CSS | ≥ 4 | Supported |
| Tailwind CSS | 3.x | Not supported The token layer relies on CSS-first configuration introduced in v4. |
High-contrast theme and the motion token collapse.
High-contrast theme and the motion token collapse.
Tailwind v4 migration.
≥ 18Sorting, selection and bulk actions with the accessibility contract intact.
Series distinguished by shape as well as colour.
No. The token layer is delivered through Tailwind v4 CSS-first configuration, and the utilities are generated from it.
No component is copied. The primitives are fewer and stricter — there is no className escape hatch carrying arbitrary values through the system.
Curated by us, not inferred — these are the ones that genuinely pair with it.
Products that share a framework with this one.