SoroPass
Components

Theming

Restyle the entire SoroPass UI through one OKLCH token file — pick a skin or override tokens, while the components never change.

One OKLCH token file is the only styling surface. Pick a skin, override tokens, done — the components never change.

Skins

Three skins ship by default. Set [data-theme] on any wrapping element; dark and teal override only the values that change.

<div data-theme="dark"> … </div>

Theme builder

Tweak the axes — the real component re-themes live, and the :root block updates to paste into your app.

Interactive create preview

The real component runs in mock mode on the demo. Open the demo →

The builder exposes four axes — skin (light / dark / teal), brand accent, corner radius, and density — and emits a :root override like the following:

:root {
  --pk-color-brand: oklch(0.55 0.18 264);
  --pk-radius-lg: 16px;
  --pk-radius-md: 12px;
  --pk-space-6: 24px;
}

Token reference

~70 tokens across these groups. The shipped tokens.css is canonical (note --pk-progress-duration: 1400ms).

GroupTokensPurpose
Color--pk-color-brand / -hover / -active / -on-brand / -softPrimary button, focus, accents
Color--pk-color-background / -surface / -surface-sunkenPage, card, wells
Color--pk-color-text / -muted / -faintText scale
Color--pk-color-border / -border-strongHairlines, inputs
Status--pk-color-success / -error / -info (+ -soft)Distinct: errors assertive, progress calm
Shape--pk-radius-none … -fullCorner scale
Space--pk-space-0 … -10Spacing scale
Type--pk-font-sans / -mono, --pk-text-xs … -xl, --pk-weight-*Family, size, weight, leading
Focus--pk-focus-color / -width / -offset / -haloVisible focus ring
Busy--pk-busy-opacity, --pk-scrim, --pk-disabled-opacityOS-sheet dim + scrim
Spinner--pk-spinner-* , --pk-progress-* (--pk-progress-duration 1400ms)We're-working looks
Elevation--pk-shadow-sm/md/lg, --pk-z-card/overlay/toastLayers under the OS sheet
Motion--pk-ease, --pk-duration-fast/base/slow, --pk-pulse-durationTransitions + reduced-motion fallback

The token gate

A machine-enforced CI gate means passkey.css references only var() tokens — restyle the whole set by overriding tokens, never by editing components.

On this page