Krizaka
Documentation

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.

RoleObsidian Velvet NoirLuminous IvorySet by
--kz-surface-0Obsidian: the page, near-black with a blue cast.#060709#f8fafcKit
--kz-surface-1Panels and cards on the page.#0c0e14#ffffffKit
--kz-surface-2Raised surfaces: inputs, menus, a card's footer.#121520#f1f1f3Kit
--kz-surface-3The highest surface: hovered rows, chips.#1a1e2c#e4e4e7Kit
--kz-border-defaultCard and input edges, tinted towards the obsidian.#1f2438hsl(240 6% 0% / 0.10)Kit
--kz-text-primary#f5f5f5#18181bPlatform
--kz-text-secondary#a0a0a7#64646dPlatform
--kz-text-muted#73737d#808089Platform
--kz-accentVelvet violet: the primary action, the active state, links.#7c3aed#7c3aedKit
--kz-accent-hoverThe accent under the pointer: deeper.#6d28d9#6d28d9Kit
--kz-accent-softA violet wash behind an active item.rgb(139 92 246 / 0.12)rgb(124 58 237 / 0.08)Kit
--kz-accent-text#a78bfa#6d28d9Brand
--kz-accent-2Sensual magenta: the second stop of the signature gradient (`from-accent to-accent-2`).#db2777#db2777Kit
--kz-on-accent#ffffff#ffffffBrand
--kz-ringThe focus ring: a light violet that stands out on obsidian.#a78bfa#7c3aedKit
--kz-success#10b77f#10b77fPlatform
--kz-warning#f59f0a#f59f0aPlatform
--kz-danger#ef4343#ef4343Platform
--kz-info#7c3aed#7c3aedBrand

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.

PairDarkLightMinimum
text-primary on surface-018.48:1Passes AA16.93:1Passes AA4.5:1
text-secondary on surface-07.75:1Passes AA5.60:1Passes AA4.5:1
text-muted on surface-04.30:1Passes AA3.74:1Passes AA3:1
accent-text on surface-07.40:1Passes AA6.79:1Passes AA4.5:1
text-primary on surface-117.70:1Passes AA17.72:1Passes AA4.5:1
text-secondary on surface-17.42:1Passes AA5.86:1Passes AA4.5:1
text-muted on surface-14.11:1Passes AA3.91:1Passes AA3:1
accent-text on surface-17.09:1Passes AA7.10:1Passes AA4.5:1
text-primary on surface-216.69:1Passes AA15.71:1Passes AA4.5:1
text-secondary on surface-27.00:1Passes AA5.19:1Passes AA4.5:1
text-muted on surface-23.88:1Passes AA3.47:1Passes AA3:1
accent-text on surface-26.69:1Passes AA6.30:1Passes AA4.5:1
text-primary on surface-315.21:1Passes AA13.96:1Passes AA4.5:1
text-secondary on surface-36.38:1Passes AA4.62:1Passes AA4.5:1
text-muted on surface-33.54:1Passes AA3.08:1Passes AA3:1
accent-text on surface-36.10:1Passes AA5.60:1Passes AA4.5:1
on-accent on accent5.70:1Passes AA5.70:1Passes AA4.5:1
on-accent on accent-hover7.10:1Passes AA7.10:1Passes AA4.5:1
on-accent on accent-24.60:1Passes AA4.60:1Passes AA4.5:1
ring on surface-07.40:1Passes AA5.45:1Passes AA3:1

Product tokens

What the roles cannot say, prefixed with the product's name — never generic.

TokenValueUse
--orochia-story-ringlinear-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-accent0 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-20 0 25px -5px color-mix(in oklab, var(--kz-accent-2) 40%, transparent)A magenta glow, for the second accent — `shadow-glow-accent`.

Typography

RoleFamilyTokenUse
DisplayOutfit--kz-font-displayHeadings, prices, counters — set by theme.css.
BodyPlus Jakarta Sans--kz-font-sansInterface and reading text — loaded by the web app (next/font, in the repository); the platform default is Inter.
MonoJetBrains Mono--kz-font-monoAmounts 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-react is 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 — StatusBadge replaced LiveBadge for 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 useState alone.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), never window.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…

On this page