Orochia UI — Foundations
The palette, both modes and their contrasts, the product tokens, the typography, the icons and the product rules — read from the kit's tokens at every build.
Obsidian Velvet Noir. Dark-first obsidian surfaces, a velvet violet accent and a sensual magenta second accent, with Outfit for display. The light theme, Luminous Ivory, is first-class. A theme is a set of token values: theme.css overrides the --kz-* roles of @krizaka/tokens, so every @krizaka/ui primitive wears Orochia without a class of its own.
Palette
Every role as an app resolves it: the platform, then the brand, then the kit. The roles the product sets are marked.
| Role | Obsidian Velvet Noir | Luminous Ivory | Set by |
|---|---|---|---|
--kz-surface-0Obsidian: the page, near-black with a blue cast. | #060709 | #f8fafc | |
--kz-surface-1Panels and cards on the page. | #0c0e14 | #ffffff | |
--kz-surface-2Raised surfaces: inputs, menus, a card's footer. | #121520 | #f1f1f3 | |
--kz-surface-3The highest surface: hovered rows, chips. | #1a1e2c | #e4e4e7 | |
--kz-border-defaultCard and input edges, tinted towards the obsidian. | #1f2438 | hsl(240 6% 0% / 0.10) | |
--kz-text-primary | #f5f5f5 | #18181b | |
--kz-text-secondary | #a0a0a7 | #64646d | |
--kz-text-muted | #73737d | #808089 | |
--kz-accentVelvet violet: the primary action, the active state, links. | #7c3aed | #7c3aed | |
--kz-accent-hoverThe accent under the pointer: deeper. | #6d28d9 | #6d28d9 | |
--kz-accent-softA violet wash behind an active item. | rgb(139 92 246 / 0.12) | rgb(124 58 237 / 0.08) | |
--kz-accent-text | #a78bfa | #6d28d9 | |
--kz-accent-2Sensual magenta: the second stop of the signature gradient (`from-accent to-accent-2`). | #db2777 | #db2777 | |
--kz-on-accent | #ffffff | #ffffff | |
--kz-ringThe focus ring: a light violet that stands out on obsidian. | #a78bfa | #7c3aed | |
--kz-success | #10b77f | #10b77f | |
--kz-warning | #f59f0a | #f59f0a | |
--kz-danger | #ef4343 | #ef4343 | |
--kz-info | #7c3aed | #7c3aed |
Contrasts
The pairs every Krizaka theme is held to (WCAG 2.2): text on every surface, text on the accent, the accent as text, the focus ring.
| Pair | Dark | Light | Minimum |
|---|---|---|---|
text-primary on surface-0 | 18.48:1Passes AA | 16.93:1Passes AA | 4.5:1 |
text-secondary on surface-0 | 7.75:1Passes AA | 5.60:1Passes AA | 4.5:1 |
text-muted on surface-0 | 4.30:1Passes AA | 3.74:1Passes AA | 3:1 |
accent-text on surface-0 | 7.40:1Passes AA | 6.79:1Passes AA | 4.5:1 |
text-primary on surface-1 | 17.70:1Passes AA | 17.72:1Passes AA | 4.5:1 |
text-secondary on surface-1 | 7.42:1Passes AA | 5.86:1Passes AA | 4.5:1 |
text-muted on surface-1 | 4.11:1Passes AA | 3.91:1Passes AA | 3:1 |
accent-text on surface-1 | 7.09:1Passes AA | 7.10:1Passes AA | 4.5:1 |
text-primary on surface-2 | 16.69:1Passes AA | 15.71:1Passes AA | 4.5:1 |
text-secondary on surface-2 | 7.00:1Passes AA | 5.19:1Passes AA | 4.5:1 |
text-muted on surface-2 | 3.88:1Passes AA | 3.47:1Passes AA | 3:1 |
accent-text on surface-2 | 6.69:1Passes AA | 6.30:1Passes AA | 4.5:1 |
text-primary on surface-3 | 15.21:1Passes AA | 13.96:1Passes AA | 4.5:1 |
text-secondary on surface-3 | 6.38:1Passes AA | 4.62:1Passes AA | 4.5:1 |
text-muted on surface-3 | 3.54:1Passes AA | 3.08:1Passes AA | 3:1 |
accent-text on surface-3 | 6.10:1Passes AA | 5.60:1Passes AA | 4.5:1 |
on-accent on accent | 5.70:1Passes AA | 5.70:1Passes AA | 4.5:1 |
on-accent on accent-hover | 7.10:1Passes AA | 7.10:1Passes AA | 4.5:1 |
on-accent on accent-2 | 4.60:1Passes AA | 4.60:1Passes AA | 4.5:1 |
ring on surface-0 | 7.40:1Passes AA | 5.45:1Passes AA | 3:1 |
Product tokens
What the roles cannot say, prefixed with the product's name — never generic.
| Token | Value | Use |
|---|---|---|
--orochia-story-ring | linear-gradient(135deg, var(--kz-accent), var(--kz-accent-2)) | The ring around a creator's avatar when they have a story — `bg-story-ring`. |
--orochia-glow-accent | 0 0 25px -5px color-mix(in oklab, var(--kz-accent) 40%, transparent) | A violet glow under a featured card — `shadow-glow-primary`. |
--orochia-glow-accent-2 | 0 0 25px -5px color-mix(in oklab, var(--kz-accent-2) 40%, transparent) | A magenta glow, for the second accent — `shadow-glow-accent`. |
Typography
| Role | Family | Token | Use |
|---|---|---|---|
| Display | Outfit | --kz-font-display | Headings, prices, counters — set by theme.css. |
| Body | Plus Jakarta Sans | --kz-font-sans | Interface and reading text — loaded by the web app (next/font, in the repository); the platform default is Inter. |
| Mono | JetBrains Mono | --kz-font-mono | Amounts aligned in tables, codes — the platform's. |
Icons and marks
OrochiaLogo(@krizaka/ui) — The brand mark — the serpent and the flame, animated; never a placeholder icon. It stops under reduced motion.@krizaka/icons(@krizaka/icons) — Every interface icon (<Name>Icon, the Krizaka signature);lucide-reactis being retired screen by screen.SocialIcon(@krizaka/orochia-design-system) — The networks a creator links from their profile.
Product rules
What every screen of the product respects — each rule quoted from the contract that states it.
- Never "live"Orochia has no live streaming: no screen, badge or message says "live". An auction is open, a challenge takes pledges —
StatusBadgereplacedLiveBadgefor that reason.orochia-design-system AGENTS.md §3 - 18+, checked by the serverThe date of birth is checked 18+ by the server at registration; adult ratings are veiled for visitors whose age the server has not checked; only verified creators upload.Orochia AGENTS.md §3 (absolute invariants)
- The address is the stateEvery place a person can be is a URL they can copy, share and reload: tabs, settings sections, filters, detail views. Tabs are links — never
useStatealone.Orochia AGENTS.md §6 - Quick actions where the thing is shownEdit a photo on the photo, a cover on the cover, a title on the title. Settings pages are for preferences.Orochia AGENTS.md §6
- Words come from the appComponents take their words as props; every string lives in the app's messages. Destructive actions confirm with a second tap (
ConfirmButton), neverwindow.confirm.orochia-design-system AGENTS.md §3 - Roles only, both themesNo raw palette colour, no
light:/dark:, no[var(--…)]: surfaces, text and accents use the roles, which change with the theme. Every hover and focus reads in both themes.Orochia AGENTS.md §6
React Native
The mobile app (Expo) takes the theme, not the components: nativeTheme is the @krizaka/tokens native roles with the Orochia overrides — the same values as theme.css (a test keeps them equal).
import { nativeTheme, gradientStops } from "@krizaka/orochia-design-system/tokens";
const t = nativeTheme[colorScheme === "light" ? "light" : "dark"];
// t.surface0, t.textPrimary, t.accent, t.accent2…