Orazaka UI — Fondations
La palette, les deux modes et leurs contrastes, les tokens produit, la typographie, les icônes et les règles produit — lus dans les tokens du kit à chaque 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
Chaque rôle tel qu'une app le résout : la plateforme, puis la marque, puis le kit. Les rôles que le produit fixe sont signalés.
| Rôle | Orazaka Orange — dark | Orazaka Orange — light | Fixé par |
|---|---|---|---|
--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 |
Contrastes
Les paires que tout thème Krizaka respecte (WCAG 2.2) : le texte sur chaque surface, le texte sur l'accent, l'accent en texte, l'anneau de focus.
| Paire | Sombre | Clair | Minimum |
|---|---|---|---|
text-primary sur surface-0 | 17.93:1Conforme AA | 16.97:1Conforme AA | 4.5:1 |
text-secondary sur surface-0 | 7.52:1Conforme AA | 5.61:1Conforme AA | 4.5:1 |
text-muted sur surface-0 | 4.17:1Conforme AA | 3.75:1Conforme AA | 3:1 |
accent-text sur surface-0 | 8.16:1Conforme AA | 6.05:1Conforme AA | 4.5:1 |
text-primary sur surface-1 | 16.58:1Conforme AA | 17.72:1Conforme AA | 4.5:1 |
text-secondary sur surface-1 | 6.95:1Conforme AA | 5.86:1Conforme AA | 4.5:1 |
text-muted sur surface-1 | 3.85:1Conforme AA | 3.91:1Conforme AA | 3:1 |
accent-text sur surface-1 | 7.55:1Conforme AA | 6.32:1Conforme AA | 4.5:1 |
text-primary sur surface-2 | 15.07:1Conforme AA | 15.71:1Conforme AA | 4.5:1 |
text-secondary sur surface-2 | 6.32:1Conforme AA | 5.19:1Conforme AA | 4.5:1 |
text-muted sur surface-2 | 3.50:1Conforme AA | 3.47:1Conforme AA | 3:1 |
accent-text sur surface-2 | 6.86:1Conforme AA | 5.60:1Conforme AA | 4.5:1 |
text-primary sur surface-3 | 13.13:1Conforme AA | 13.96:1Conforme AA | 4.5:1 |
text-secondary sur surface-3 | 5.51:1Conforme AA | 4.62:1Conforme AA | 4.5:1 |
text-muted sur surface-3 | 3.05:1Conforme AA | 3.08:1Conforme AA | 3:1 |
accent-text sur surface-3 | 5.98:1Conforme AA | 4.98:1Conforme AA | 4.5:1 |
on-accent sur accent | 7.38:1Conforme AA | 5.02:1Conforme AA | 4.5:1 |
on-accent sur accent-hover | 8.52:1Conforme AA | 6.61:1Conforme AA | 4.5:1 |
on-accent sur accent-2 | 9.10:1Conforme AA | 5.24:1Conforme AA | 4.5:1 |
ring sur surface-0 | 7.38:1Conforme AA | 4.81:1Conforme AA | 3:1 |
Thèmes nommés
Choisis par la personne, indépendants du mode sombre ou clair : chacun fixe tous les rôles, il se lit pareil dans les deux modes. En direct, avec les composants du kit.
- Electric BlueRépondu en local3 contrats cités · 0 octet n'a quitté le réseau
.theme-electric— The 2.x identity, kept for the users who chose it.20 paires sur 20 conformes AA · minimum 3.05:1
- Deep VioletRépondu en local3 contrats cités · 0 octet n'a quitté le réseau
.theme-custom— A violet night theme.20 paires sur 20 conformes AA · minimum 3.37:1
- Neon MatrixRépondu en local3 contrats cités · 0 octet n'a quitté le réseau
.theme-cyberpunk— Neon green text on violet black, magenta accent.20 paires sur 20 conformes AA · minimum 3.37:1
- Warm ParchmentRépondu en local3 contrats cités · 0 octet n'a quitté le réseau
.theme-solarized— A light theme on parchment surfaces.20 paires sur 20 conformes AA · minimum 3.36:1
- Obsidian RazorRépondu en local3 contrats cités · 0 octet n'a quitté le réseau
.theme-krizaka— Pitch-black surfaces, zero radius, a cold-steel accent.20 paires sur 20 conformes AA · minimum 3.34:1
Tokens produit
Ce que les rôles ne savent pas dire, préfixé du nom du produit — jamais générique.
| Token | Valeur | Usage |
|---|---|---|
--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. |
Échelle typographique
--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) |
Typographie
| Rôle | Famille | Token | Usage |
|---|---|---|---|
| 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. |
Icônes et marques
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.
Règles produit
Ce que chaque écran du produit respecte — chaque règle citée depuis le contrat qui l'énonce.
- 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…