Orazaka 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.
Orazaka Orange. Calm obsidian surfaces — the platform's, the krizaka.com values — and the orange of the Orazaka mark as the accent, from the Orazaka brand of @krizaka/tokens. Five named themes sit beside it, orthogonal to dark and light. A theme is a set of token values: theme.css overrides the --kz-* roles, so every @krizaka/ui primitive wears Orazaka 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 | Orazaka Orange — dark | Orazaka Orange — light | Set by |
|---|---|---|---|
--kz-surface-0 | #0c0c0e | #fafafa | |
--kz-surface-1 | #161618 | #ffffff | |
--kz-surface-2 | #1f1f23 | #f1f1f3 | |
--kz-surface-3 | #2a2a2d | #e4e4e7 | |
--kz-border-default | hsl(0 0% 100% / 0.10) | hsl(240 6% 0% / 0.10) | |
--kz-text-primary | #f5f5f5 | #18181b | |
--kz-text-secondary | #a0a0a7 | #64646d | |
--kz-text-muted | #73737d | #808089 | |
--kz-accentThe Orazaka orange: primary actions, the active state, the sent bubble. | #f67e23 | #b45309 | |
--kz-accent-hoverThe accent under the pointer. | #f79245 | #964608 | |
--kz-accent-softAn orange wash behind an active item or a pipeline chip. | hsl(26 92% 55% / 0.12) | hsl(26 90.5% 37.1% / 0.08) | |
--kz-accent-textThe orange as text: links, active labels — AA on every surface. | #f78c3b | #9b4808 | |
--kz-accent-2The second stop of the buttons' gradient. | #f59e0b | #a45904 | |
--kz-on-accentText on the accent: near-black in dark, white in light. | #0c0c0e | #ffffff | |
--kz-ringThe focus ring, in the accent. | #f67e23 | #b45309 | |
--kz-success | #10b77f | #10b77f | |
--kz-warning | #f59f0a | #f59f0a | |
--kz-danger | #ef4343 | #ef4343 | |
--kz-infoBlue, not orange: an orange "info" would read as a warning. | #3b83f7 | #0a64f5 |
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 | 17.93:1Passes AA | 16.97:1Passes AA | 4.5:1 |
text-secondary on surface-0 | 7.52:1Passes AA | 5.61:1Passes AA | 4.5:1 |
text-muted on surface-0 | 4.17:1Passes AA | 3.75:1Passes AA | 3:1 |
accent-text on surface-0 | 8.16:1Passes AA | 6.05:1Passes AA | 4.5:1 |
text-primary on surface-1 | 16.58:1Passes AA | 17.72:1Passes AA | 4.5:1 |
text-secondary on surface-1 | 6.95:1Passes AA | 5.86:1Passes AA | 4.5:1 |
text-muted on surface-1 | 3.85:1Passes AA | 3.91:1Passes AA | 3:1 |
accent-text on surface-1 | 7.55:1Passes AA | 6.32:1Passes AA | 4.5:1 |
text-primary on surface-2 | 15.07:1Passes AA | 15.71:1Passes AA | 4.5:1 |
text-secondary on surface-2 | 6.32:1Passes AA | 5.19:1Passes AA | 4.5:1 |
text-muted on surface-2 | 3.50:1Passes AA | 3.47:1Passes AA | 3:1 |
accent-text on surface-2 | 6.86:1Passes AA | 5.60:1Passes AA | 4.5:1 |
text-primary on surface-3 | 13.13:1Passes AA | 13.96:1Passes AA | 4.5:1 |
text-secondary on surface-3 | 5.51:1Passes AA | 4.62:1Passes AA | 4.5:1 |
text-muted on surface-3 | 3.05:1Passes AA | 3.08:1Passes AA | 3:1 |
accent-text on surface-3 | 5.98:1Passes AA | 4.98:1Passes AA | 4.5:1 |
on-accent on accent | 7.38:1Passes AA | 5.02:1Passes AA | 4.5:1 |
on-accent on accent-hover | 8.52:1Passes AA | 6.61:1Passes AA | 4.5:1 |
on-accent on accent-2 | 9.10:1Passes AA | 5.24:1Passes AA | 4.5:1 |
ring on surface-0 | 7.38:1Passes AA | 4.81:1Passes AA | 3:1 |
Named themes
Chosen by the person, orthogonal to dark and light: each one sets every role, so it reads the same in either mode. Live, with the kit's components.
- Electric BlueAnswered locally3 contracts cited · 0 bytes left the network
.theme-electric— The 2.x identity, kept for the users who chose it.20 of 20 pairs at AA · lowest 3.05:1
- Deep VioletAnswered locally3 contracts cited · 0 bytes left the network
.theme-custom— A violet night theme.20 of 20 pairs at AA · lowest 3.37:1
- Neon MatrixAnswered locally3 contracts cited · 0 bytes left the network
.theme-cyberpunk— Neon green text on violet black, magenta accent.20 of 20 pairs at AA · lowest 3.37:1
- Warm ParchmentAnswered locally3 contracts cited · 0 bytes left the network
.theme-solarized— A light theme on parchment surfaces.20 of 20 pairs at AA · lowest 3.36:1
- Obsidian RazorAnswered locally3 contracts cited · 0 bytes left the network
.theme-krizaka— Pitch-black surfaces, zero radius, a cold-steel accent.20 of 20 pairs at AA · lowest 3.34:1
Product tokens
What the roles cannot say, prefixed with the product's name — never generic.
| Token | Value | Use |
|---|---|---|
--orazaka-grid-color | hsl(0 0% 100% / 0.02) | The faint grid behind the console and the landing sections. |
--orazaka-accent-glow | 0 0 0 3px color-mix(in oklab, var(--kz-accent) 12%, transparent) | The soft accent halo around a focused composer or card. |
--orazaka-space-card | clamp(1rem, 0.8rem + 0.8vw, 1.5rem) | The fluid padding of a card. |
--orazaka-space-section | clamp(1.5rem, 1.2rem + 1.2vw, 2.5rem) | The fluid gap between sections. |
Type scale
--text-xs | clamp(0.6875rem, 0.65rem + 0.15vw, 0.75rem) |
|---|---|
--text-sm | clamp(0.8125rem, 0.77rem + 0.18vw, 0.875rem) |
--text-base | clamp(0.875rem, 0.83rem + 0.2vw, 1rem) |
--text-lg | clamp(1.125rem, 1.05rem + 0.3vw, 1.25rem) |
--text-xl | clamp(1.5rem, 1.3rem + 0.8vw, 2rem) |
--text-2xl | clamp(1.75rem, 1.5rem + 1vw, 2.5rem) |
--text-display | clamp(2rem, 1.6rem + 1.6vw, 3rem) |
--text-primary | var(--kz-text-primary) |
--text-secondary | var(--kz-text-secondary) |
--text-muted | var(--kz-text-muted) |
Typography
| Role | Family | Token | Use |
|---|---|---|---|
| Display | Outfit | --kz-font-display | Headings and figures (h1, h2, .text-display) — Krizaka Display when the app loads it. |
| Body | Inter | --kz-font-sans | Interface and reading text. |
| Mono | JetBrains Mono | --kz-font-mono | Data tables, console nodes, prompt streams, model names. |
Icons and marks
OrazakaLogo(@krizaka/ui) — The brand mark, in the brand's orange — never a placeholder icon.Icon(@krizaka/orazaka-design-system) — The icon registry: every icon of an Orazaka screen, one typed name per concept; no app imports an icon library.SentinelMini(@krizaka/orazaka-design-system) — The Sentinel, the guardian of the pipeline, at 24 px.
Product rules
What every screen of the product respects — each rule quoted from the contract that states it.
- Sovereign by designLocal-first: AI inference runs on the organisation's machines, never in an unsolicited cloud; no network dependency is introduced without being asked. The showcases say it: answered locally, nothing left the network.Orazaka AGENTS.md §0 and §13
- The browser never reaches the engineA web page never calls the router or the model runtime directly: all browser traffic goes through the app's server routes (the BFF).Orazaka AGENTS.md §8
- A persona, not an adminExamples, showcases and recordings speak as a named person with a real need (Eric, finance lead), in a fictional but believable workspace — never an admin account or an internal label.orazaka-ui-kit AGENTS.md
- Input locks while the engine worksText entry surfaces lock while sending or generating: textareas, menus, attachments and submit buttons are disabled (ERR-126).ui_standards §5
- Every state, every sizeEvery interactive element has hover, active, focus and disabled states; mobile-first layouts with touch targets of at least 44 px; an
aria-labelon every icon-only button.ui_standards §1 and §3 - No hard-coded words or coloursNo JSX text: every string comes from the translation dictionary (room for +30 % in French). Colours are roles: no inline hex, no palette class.ui_standards §1 and §3
React Native
The mobile app has its own React Native components and takes the same tokens from @krizaka/orazaka-shared — the Orazaka orange of @krizaka/tokens/native.
import { themes, tokens } from "@krizaka/orazaka-shared";
const t = themes[colorScheme === "light" ? "light" : "dark"];
// t.accent, t.surface1, t.textPrimary…