Getting started
Theme builder
OPUS colours are CSS variables in oklch, named like shadcn/ui. Pick a hue, chroma and radius — the previews (and, if you flip the switch, this whole site) update live. Copy the CSS into opus.css when you like it.
Presets
Recolours every page and remembers it in this browser.
lightPreview
AActive
Acme workspace
12 members · Pro
Notifications
BadgeOutline
darkPreview
AActive
Acme workspace
12 members · Pro
Notifications
BadgeOutline
paste over the :root / .dark blocks in opus.css
:root,
.light {
--radius: 0.75rem;
--background: oklch(0.992 0.0041 279);
--foreground: oklch(0.18 0.0166 279);
--card: oklch(1 0 0);
--popover: oklch(1 0 0);
--primary: oklch(0.55 0.23 279);
--primary-foreground: oklch(0.99 0.005 279);
--secondary: oklch(0.955 0.0083 279);
--secondary-foreground: oklch(0.24 0.0193 279);
--muted: oklch(0.962 0.0069 279);
--muted-foreground: oklch(0.52 0.0221 279);
--accent: oklch(0.95 0.0184 279);
--accent-foreground: oklch(0.3 0.0805 279);
--border: oklch(0.912 0.0097 279);
--input: oklch(0.885 0.0124 279);
--ring: oklch(0.55 0.23 279 / 0.55);
}
.dark {
--background: oklch(0.145 0.0124 279);
--foreground: oklch(0.965 0.0055 279);
--card: oklch(0.172 0.0152 279);
--popover: oklch(0.19 0.0166 279);
--primary: oklch(0.67 0.2024 279);
--primary-foreground: oklch(0.16 0.03 279);
--secondary: oklch(0.235 0.0166 279);
--secondary-foreground: oklch(0.94 0.0069 279);
--muted: oklch(0.215 0.0152 279);
--muted-foreground: oklch(0.69 0.0221 279);
--accent: oklch(0.26 0.0345 279);
--accent-foreground: oklch(0.95 0.023 279);
--border: oklch(1 0 0 / 0.085);
--input: oklch(1 0 0 / 0.13);
--ring: oklch(0.67 0.2024 279 / 0.6);
}
How tokens work
- Raw values live on
:root(light) and.dark;@theme inlinemaps them to Tailwind colours likebg-primary,text-muted-foregroundandborder-border. - Any element with
class="dark"orclass="light"re-themes its subtree — that’s how the two previews above sit side by side. - Because utilities reference the variables directly, you can also scope a theme inline:
style={{ "--primary": "oklch(0.7 0.2 150)" }}. - Semantic extras beyond shadcn: success, warning, info (each with a foreground), plus easing curves and the keyframes used by effects.