@krizaka/tokens 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/BRAND.md CHANGED
@@ -140,3 +140,47 @@ Rules (also `rules` of `@krizaka/fonts`, on krizaka.com/docs/ui/typography): dis
140
140
  display from 20 px at 600–800, text from 12 px at 400–700; one display line per block; tabular figures for amounts; the
141
141
  scale, not one-off sizes; products may override the display role only.
142
142
 
143
+
144
+ ## 6. Surfaces & materials — the signature of the components
145
+
146
+ Session DSV (2026-10). The primitives had the right roles but read flat and interchangeable. The Krizaka signature is
147
+ one idea, applied everywhere and always in tokens: **light comes from above.**
148
+
149
+ | Lever | Rule | Tokens → utilities |
150
+ | :-- | :-- | :-- |
151
+ | **What you press rises** | A raised surface (button, card, chip, key, the active segment) carries a **sheen** — its top a little lighter — a **1-px edge of light** along its top, and an **ink-tinted shadow** in two or three layers. | `--kz-surface-sheen`, `--kz-edge-light`, `--kz-shadow-raised` → `bg-sheen inset-shadow-edge shadow-raised` |
152
+ | **What you fill sinks** | A field, a track, a checkbox is a **well**: an inner shade at its top. | `--kz-edge-well` → `inset-shadow-well` |
153
+ | **What floats is glass** | Menus, popovers, tooltips, dialogs, toasts, the sticky header of a table: frosted glass at 88 % — the text stays AA over anything that passes under (tested against the page's own text). | `--kz-glass-*` → `glass shadow-floating` / `shadow-overlay` |
154
+ | **Only what acts glows** | The accent fill is lit along its top edge and shaded at its bottom (on-accent stays ≥ 4.5:1 there, tested in every brand) and sits on the **brand's glow** — composed where it is used, so a `.brand-<id>` section has its own. Selection, the checked box, the current page glow too; nothing else. | `--kz-fill-shade`, `--kz-edge-on-fill` → `bg-fill-shade inset-shadow-edge-fill shadow-glow` |
155
+ | **The node marks a state** | The core of the marks, a small lit diamond: a badge's dot, the chosen radio, the switch's thumb when on, today in a calendar, an error's mark. | `node`, `node-lit` |
156
+ | **The focus is the brand's ring** | A crisp ring of `--kz-ring`, 2 px off the element, in a halo of the same colour — it follows the corners, cut ones included. On a field it lies on the border. | `--kz-ring-*` → `focus-visible:focus-ring`, `focus-ring-inset` |
157
+ | **Motion answers the hand** | A short spring (`ease-spring`), never more than 200 ms: a press compresses (0.97), a toggle springs across, a check pops in. Under `prefers-reduced-motion` every duration is 0 ms: instant, never absent. | `--kz-ease-spring`, `--kz-duration-*` |
158
+ | **Type in three voices** | Display for titles (tracking tightened), text for reading, **mono for labels**: badges, table headers, menu labels, stat labels, weekdays. | `font-mono`, `tracking-[0.06em]` |
159
+ | **Density** | Comfortable by default; `data-density="compact"` on a subtree tightens every control (a console, a dense table). | `--kz-control-*` |
160
+ | **Status tints** | One tint per status, the primary text and the status text AA on it: badges, alerts, rows. A rail of the status colour that glows marks alerts and toasts. | `--kz-*-soft` |
161
+
162
+ Restraint is part of it: a page has one spotlight card, one glowing call to action; the rest is quiet material.
163
+
164
+ ### 6.1 The griffe — the 45° cut corner
165
+
166
+ The angle of the hexagon, the chamfer of the icons: **the cut corner is the claw mark of the brand.** It is
167
+ `corner-shape: bevel` (the border, the edge light, the shadow and the focus ring all follow it; browsers without
168
+ `corner-shape` show the rounded corner), sized by `--kz-cut-size` (10 px on a control), shaped by `--kz-cut-shape`.
169
+
170
+ | Where | How |
171
+ | :-- | :-- |
172
+ | **The call to action** | `Button` `primary` and `gradient` are cut **by default** (`shape="auto"`, `--kz-cut-shape`); a node lights in the cut corner under the pointer. `rounded` / `pill` stay options. |
173
+ | **The status badge** | `Badge` `success` / `warning` / `danger` are cut by default (`shape="auto"`); `shape="cut"` on any tone. |
174
+ | **The card that matters** | `Card` `variant="spotlight"` has its top-right corner cut; `cut` on any card. |
175
+ | **The active tab** | The raised segment of `Tabs variant="segmented"` and the light of `pills` are cut. |
176
+ | **The focused field** | A field's top-right corner cuts itself when it has the focus. |
177
+ | **The toast** | Its top-right corner is cut. |
178
+
179
+ Sparingly: the griffe marks **what matters on the screen** — the action, the state, the chosen — never every box. An app
180
+ that must not wear it (a third-party embed) sets `--kz-cut-shape: round`; everything returns to rounded corners.
181
+ React Native has no `corner-shape`: the native primitives keep their rounded corners, and `cut.size` of
182
+ `@krizaka/tokens/native` is there for a drawn shape (react-native-svg) where a product needs one.
183
+
184
+ Captures of the material, the three brands in dark and light, are in the pull request that introduced it
185
+ (krizaka/krizaka-ui, "signature visual language"); the living reference is the showcase at the top of
186
+ [krizaka.com/docs/ui](https://www.krizaka.com/docs/ui).
package/README.md CHANGED
@@ -118,6 +118,23 @@ under every product override.
118
118
  | `--kz-font-display` | `fontDisplay` | Headings; a product theme may override it | → `font-sans` | → `font-sans` |
119
119
  | `--kz-font-mono` | `fontMono` | Code, aligned amounts | `"JetBrains Mono", ui-monospace, monospace` | = dark |
120
120
 
121
+ ### The material (BRAND.md §6)
122
+
123
+ | Token | Key | Usage | Dark | Light |
124
+ | :-- | :-- | :-- | :-- | :-- |
125
+ | `--kz-radius-xs`, `--kz-radius-2xl` | `radiusXs`, `radius2xl` | Checkbox, key, cut badge · sheet | `6px`, `28px` | = dark |
126
+ | `--kz-shadow-raised` · `-floating` · `-overlay` | `shadowRaised`… | Raised (button, card) · floating (menu, tooltip) · over the page (dialog, toast) — ink-tinted, 2–3 layers; native: `shadows.<theme>.raised` (`boxShadow`) | `hsl(240 30% 2% / …)` | `hsl(232 25% 25% / …)` |
127
+ | `--kz-surface-sheen` | `surfaceSheen` | The top of a raised surface (`bg-sheen`) | `hsl(0 0% 100% / 0.045)` | `hsl(0 0% 100% / 0.7)` |
128
+ | `--kz-fill-shade` | `fillShade` | The bottom of an accent or status fill (`bg-fill-shade`) | `hsl(0 0% 0% / 0.12)` | = dark |
129
+ | `--kz-edge-light` · `-on-fill` · `-well` | `edgeLight`… | The 1-px top edge of a raised surface · of a fill · the inner shade of a well | `/ 0.07` · `/ 0.22` · ink `/ 0.5` | `/ 0.9` · = · ink `/ 0.08` |
130
+ | `--kz-glass-bg` · `-border` · `-blur` | `glassBg`… | Frosted glass: menus, popovers, dialogs, toasts (88 %: text AA over anything) | `hsl(240 5% 12% / 0.88)` | `hsl(0 0% 100% / 0.88)` |
131
+ | `--kz-success-soft` · `warning-soft` · `danger-soft` | `successSoft`… | Status tints: badges, alerts, rows | `/ 0.14` | `/ 0.10–0.12` |
132
+ | `--kz-ring-width` · `-offset` · `-halo` | `ringWidth`… | The signature focus ring (`focus-ring`) | `2px` · `2px` · `4px` | = dark |
133
+ | `--kz-control-sm` · `md` · `lg` · `field` | `controlSm`… | Control heights; `[data-density="compact"]` tightens them | `32` · `40` · `48` · `44px` | compact `28` · `34` · `40` · `36px` |
134
+ | `--kz-cut-shape` · `--kz-cut-size` | `cutShape`, `cutSize` | **The griffe**: the 45° cut corner (`corner-shape`); `round` turns it off; native: `cut.size` | `bevel` · `10px` | = dark |
135
+ | `--kz-ease-spring` | `easeSpring` | A short spring: a press, a toggle, a selection; native `motion.spring` | `cubic-bezier(0.34, 1.36, 0.64, 1)` | = dark |
136
+ | `--kz-duration-instant` · `fast` · `base` | `durationFast`… | Micro-interactions ≤ 200 ms; **0 ms under `prefers-reduced-motion`**; native `motion.duration` | `90` · `150` · `200ms` | = dark |
137
+
121
138
  Contrast is **tested**, not assumed: `pnpm turbo run check` fails if `text-primary` / `text-secondary` drop under 4.5:1 or
122
139
  `text-muted` under 3:1 on any surface, or `on-accent` under 4.5:1 on the accent, in either theme (WCAG 2.x).
123
140
  No accent can carry white text at 4.5:1 *and* be read at 4.5:1 as text on `surface-0`: the accent favours the text
package/dist/index.d.ts CHANGED
@@ -26,24 +26,53 @@ export declare const tokens: {
26
26
  readonly brandGradientTo: "var(--kz-brand-gradient-to)";
27
27
  readonly success: "var(--kz-success)";
28
28
  readonly successText: "var(--kz-success-text)";
29
+ readonly successSoft: "var(--kz-success-soft)";
29
30
  readonly warning: "var(--kz-warning)";
30
31
  readonly warningText: "var(--kz-warning-text)";
32
+ readonly warningSoft: "var(--kz-warning-soft)";
31
33
  readonly danger: "var(--kz-danger)";
32
34
  readonly dangerText: "var(--kz-danger-text)";
35
+ readonly dangerSoft: "var(--kz-danger-soft)";
33
36
  readonly info: "var(--kz-info)";
34
37
  readonly infoText: "var(--kz-info-text)";
35
38
  readonly scrim: "var(--kz-scrim)";
36
39
  readonly scrimStrong: "var(--kz-scrim-strong)";
37
40
  readonly overlay: "var(--kz-overlay)";
41
+ readonly radiusXs: "var(--kz-radius-xs)";
38
42
  readonly radiusSm: "var(--kz-radius-sm)";
39
43
  readonly radiusMd: "var(--kz-radius-md)";
40
44
  readonly radiusLg: "var(--kz-radius-lg)";
41
45
  readonly radiusXl: "var(--kz-radius-xl)";
46
+ readonly radius2xl: "var(--kz-radius-2xl)";
42
47
  readonly radiusFull: "var(--kz-radius-full)";
43
48
  readonly shadowSm: "var(--kz-shadow-sm)";
44
49
  readonly shadowMd: "var(--kz-shadow-md)";
45
50
  readonly shadowLg: "var(--kz-shadow-lg)";
51
+ readonly shadowRaised: "var(--kz-shadow-raised)";
52
+ readonly shadowFloating: "var(--kz-shadow-floating)";
53
+ readonly shadowOverlay: "var(--kz-shadow-overlay)";
54
+ readonly surfaceSheen: "var(--kz-surface-sheen)";
55
+ readonly fillShade: "var(--kz-fill-shade)";
56
+ readonly edgeLight: "var(--kz-edge-light)";
57
+ readonly edgeOnFill: "var(--kz-edge-on-fill)";
58
+ readonly edgeWell: "var(--kz-edge-well)";
59
+ readonly glassBg: "var(--kz-glass-bg)";
60
+ readonly glassBorder: "var(--kz-glass-border)";
61
+ readonly glassBlur: "var(--kz-glass-blur)";
62
+ readonly ringWidth: "var(--kz-ring-width)";
63
+ readonly ringOffset: "var(--kz-ring-offset)";
64
+ readonly ringHalo: "var(--kz-ring-halo)";
65
+ readonly controlSm: "var(--kz-control-sm)";
66
+ readonly controlMd: "var(--kz-control-md)";
67
+ readonly controlLg: "var(--kz-control-lg)";
68
+ readonly controlField: "var(--kz-control-field)";
69
+ readonly cutShape: "var(--kz-cut-shape)";
70
+ readonly cutSize: "var(--kz-cut-size)";
46
71
  readonly ease: "var(--kz-ease)";
72
+ readonly easeSpring: "var(--kz-ease-spring)";
73
+ readonly durationInstant: "var(--kz-duration-instant)";
74
+ readonly durationFast: "var(--kz-duration-fast)";
75
+ readonly durationBase: "var(--kz-duration-base)";
47
76
  readonly fontSans: "var(--kz-font-sans)";
48
77
  readonly fontText: "var(--kz-font-text)";
49
78
  readonly fontDisplay: "var(--kz-font-display)";
package/dist/index.js CHANGED
@@ -26,24 +26,53 @@ export const tokens = /* @__PURE__ */ Object.freeze({
26
26
  "brandGradientTo": "var(--kz-brand-gradient-to)",
27
27
  "success": "var(--kz-success)",
28
28
  "successText": "var(--kz-success-text)",
29
+ "successSoft": "var(--kz-success-soft)",
29
30
  "warning": "var(--kz-warning)",
30
31
  "warningText": "var(--kz-warning-text)",
32
+ "warningSoft": "var(--kz-warning-soft)",
31
33
  "danger": "var(--kz-danger)",
32
34
  "dangerText": "var(--kz-danger-text)",
35
+ "dangerSoft": "var(--kz-danger-soft)",
33
36
  "info": "var(--kz-info)",
34
37
  "infoText": "var(--kz-info-text)",
35
38
  "scrim": "var(--kz-scrim)",
36
39
  "scrimStrong": "var(--kz-scrim-strong)",
37
40
  "overlay": "var(--kz-overlay)",
41
+ "radiusXs": "var(--kz-radius-xs)",
38
42
  "radiusSm": "var(--kz-radius-sm)",
39
43
  "radiusMd": "var(--kz-radius-md)",
40
44
  "radiusLg": "var(--kz-radius-lg)",
41
45
  "radiusXl": "var(--kz-radius-xl)",
46
+ "radius2xl": "var(--kz-radius-2xl)",
42
47
  "radiusFull": "var(--kz-radius-full)",
43
48
  "shadowSm": "var(--kz-shadow-sm)",
44
49
  "shadowMd": "var(--kz-shadow-md)",
45
50
  "shadowLg": "var(--kz-shadow-lg)",
51
+ "shadowRaised": "var(--kz-shadow-raised)",
52
+ "shadowFloating": "var(--kz-shadow-floating)",
53
+ "shadowOverlay": "var(--kz-shadow-overlay)",
54
+ "surfaceSheen": "var(--kz-surface-sheen)",
55
+ "fillShade": "var(--kz-fill-shade)",
56
+ "edgeLight": "var(--kz-edge-light)",
57
+ "edgeOnFill": "var(--kz-edge-on-fill)",
58
+ "edgeWell": "var(--kz-edge-well)",
59
+ "glassBg": "var(--kz-glass-bg)",
60
+ "glassBorder": "var(--kz-glass-border)",
61
+ "glassBlur": "var(--kz-glass-blur)",
62
+ "ringWidth": "var(--kz-ring-width)",
63
+ "ringOffset": "var(--kz-ring-offset)",
64
+ "ringHalo": "var(--kz-ring-halo)",
65
+ "controlSm": "var(--kz-control-sm)",
66
+ "controlMd": "var(--kz-control-md)",
67
+ "controlLg": "var(--kz-control-lg)",
68
+ "controlField": "var(--kz-control-field)",
69
+ "cutShape": "var(--kz-cut-shape)",
70
+ "cutSize": "var(--kz-cut-size)",
46
71
  "ease": "var(--kz-ease)",
72
+ "easeSpring": "var(--kz-ease-spring)",
73
+ "durationInstant": "var(--kz-duration-instant)",
74
+ "durationFast": "var(--kz-duration-fast)",
75
+ "durationBase": "var(--kz-duration-base)",
47
76
  "fontSans": "var(--kz-font-sans)",
48
77
  "fontText": "var(--kz-font-text)",
49
78
  "fontDisplay": "var(--kz-font-display)",
@@ -132,24 +161,53 @@ export const values = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
132
161
  "brandGradientTo": "hsl(240 6% 5%)",
133
162
  "success": "hsl(160 84% 39%)",
134
163
  "successText": "hsl(158 64% 52%)",
164
+ "successSoft": "hsl(160 84% 39% / 0.14)",
135
165
  "warning": "hsl(38 92% 50%)",
136
166
  "warningText": "hsl(38 92% 55%)",
167
+ "warningSoft": "hsl(38 92% 50% / 0.14)",
137
168
  "danger": "hsl(0 84% 60%)",
138
169
  "dangerText": "hsl(0 91% 71%)",
170
+ "dangerSoft": "hsl(0 84% 60% / 0.14)",
139
171
  "info": "hsl(217 92% 53%)",
140
172
  "infoText": "hsl(217 92% 68%)",
141
173
  "scrim": "hsl(0 0% 0% / 0.60)",
142
174
  "scrimStrong": "hsl(0 0% 0% / 0.80)",
143
175
  "overlay": "hsl(0 0% 0% / 0.70)",
176
+ "radiusXs": "6px",
144
177
  "radiusSm": "8px",
145
178
  "radiusMd": "12px",
146
179
  "radiusLg": "16px",
147
180
  "radiusXl": "20px",
181
+ "radius2xl": "28px",
148
182
  "radiusFull": "9999px",
149
183
  "shadowSm": "0 1px 3px hsl(0 0% 0% / 0.12), 0 1px 2px hsl(0 0% 0% / 0.06)",
150
184
  "shadowMd": "0 4px 12px hsl(0 0% 0% / 0.15), 0 2px 4px hsl(0 0% 0% / 0.08)",
151
185
  "shadowLg": "0 8px 24px hsl(0 0% 0% / 0.18), 0 4px 8px hsl(0 0% 0% / 0.08)",
186
+ "shadowRaised": "0 1px 2px hsl(240 30% 2% / 0.45), 0 2px 6px -2px hsl(240 30% 2% / 0.3)",
187
+ "shadowFloating": "0 2px 4px hsl(240 30% 2% / 0.35), 0 12px 24px -6px hsl(240 30% 2% / 0.45), 0 24px 48px -12px hsl(240 30% 2% / 0.35)",
188
+ "shadowOverlay": "0 4px 8px hsl(240 30% 2% / 0.4), 0 24px 48px -12px hsl(240 30% 2% / 0.5), 0 48px 96px -24px hsl(240 30% 2% / 0.45)",
189
+ "surfaceSheen": "hsl(0 0% 100% / 0.045)",
190
+ "fillShade": "hsl(0 0% 0% / 0.12)",
191
+ "edgeLight": "hsl(0 0% 100% / 0.07)",
192
+ "edgeOnFill": "hsl(0 0% 100% / 0.22)",
193
+ "edgeWell": "hsl(240 30% 2% / 0.5)",
194
+ "glassBg": "hsl(240 5% 12% / 0.88)",
195
+ "glassBorder": "hsl(0 0% 100% / 0.1)",
196
+ "glassBlur": "24px",
197
+ "ringWidth": "2px",
198
+ "ringOffset": "2px",
199
+ "ringHalo": "4px",
200
+ "controlSm": "32px",
201
+ "controlMd": "40px",
202
+ "controlLg": "48px",
203
+ "controlField": "44px",
204
+ "cutShape": "bevel",
205
+ "cutSize": "10px",
152
206
  "ease": "cubic-bezier(0.16, 1, 0.3, 1)",
207
+ "easeSpring": "cubic-bezier(0.34, 1.36, 0.64, 1)",
208
+ "durationInstant": "90ms",
209
+ "durationFast": "150ms",
210
+ "durationBase": "200ms",
153
211
  "fontSans": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
154
212
  "fontText": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
155
213
  "fontDisplay": "\"Plus Jakarta Sans\", \"Plus Jakarta Sans Fallback\", Inter, system-ui, sans-serif",
@@ -235,24 +293,53 @@ export const values = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
235
293
  "brandGradientTo": "hsl(0 0% 98%)",
236
294
  "success": "hsl(160 84% 39%)",
237
295
  "successText": "hsl(160 84% 24%)",
296
+ "successSoft": "hsl(160 84% 39% / 0.1)",
238
297
  "warning": "hsl(38 92% 50%)",
239
298
  "warningText": "hsl(32 95% 30%)",
299
+ "warningSoft": "hsl(38 92% 50% / 0.12)",
240
300
  "danger": "hsl(0 84% 60%)",
241
301
  "dangerText": "hsl(0 72% 40%)",
302
+ "dangerSoft": "hsl(0 84% 60% / 0.1)",
242
303
  "info": "hsl(217 92% 50%)",
243
304
  "infoText": "hsl(217 92% 42%)",
244
305
  "scrim": "hsl(0 0% 0% / 0.60)",
245
306
  "scrimStrong": "hsl(0 0% 0% / 0.80)",
246
307
  "overlay": "hsl(0 0% 0% / 0.70)",
308
+ "radiusXs": "6px",
247
309
  "radiusSm": "8px",
248
310
  "radiusMd": "12px",
249
311
  "radiusLg": "16px",
250
312
  "radiusXl": "20px",
313
+ "radius2xl": "28px",
251
314
  "radiusFull": "9999px",
252
315
  "shadowSm": "0 1px 3px hsl(240 6% 0% / 0.06), 0 1px 2px hsl(240 6% 0% / 0.04)",
253
316
  "shadowMd": "0 4px 12px hsl(240 6% 0% / 0.08), 0 2px 4px hsl(240 6% 0% / 0.04)",
254
317
  "shadowLg": "0 8px 24px hsl(240 6% 0% / 0.10), 0 4px 8px hsl(240 6% 0% / 0.05)",
318
+ "shadowRaised": "0 1px 2px hsl(232 25% 25% / 0.08), 0 2px 6px -2px hsl(232 25% 25% / 0.08)",
319
+ "shadowFloating": "0 2px 4px hsl(232 25% 25% / 0.06), 0 12px 24px -6px hsl(232 25% 25% / 0.1), 0 24px 48px -12px hsl(232 25% 25% / 0.1)",
320
+ "shadowOverlay": "0 4px 8px hsl(232 25% 25% / 0.08), 0 24px 48px -12px hsl(232 25% 25% / 0.14), 0 48px 96px -24px hsl(232 25% 25% / 0.14)",
321
+ "surfaceSheen": "hsl(0 0% 100% / 0.7)",
322
+ "fillShade": "hsl(0 0% 0% / 0.12)",
323
+ "edgeLight": "hsl(0 0% 100% / 0.9)",
324
+ "edgeOnFill": "hsl(0 0% 100% / 0.22)",
325
+ "edgeWell": "hsl(232 25% 25% / 0.08)",
326
+ "glassBg": "hsl(0 0% 100% / 0.88)",
327
+ "glassBorder": "hsl(240 6% 0% / 0.08)",
328
+ "glassBlur": "24px",
329
+ "ringWidth": "2px",
330
+ "ringOffset": "2px",
331
+ "ringHalo": "4px",
332
+ "controlSm": "32px",
333
+ "controlMd": "40px",
334
+ "controlLg": "48px",
335
+ "controlField": "44px",
336
+ "cutShape": "bevel",
337
+ "cutSize": "10px",
255
338
  "ease": "cubic-bezier(0.16, 1, 0.3, 1)",
339
+ "easeSpring": "cubic-bezier(0.34, 1.36, 0.64, 1)",
340
+ "durationInstant": "90ms",
341
+ "durationFast": "150ms",
342
+ "durationBase": "200ms",
256
343
  "fontSans": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
257
344
  "fontText": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
258
345
  "fontDisplay": "\"Plus Jakarta Sans\", \"Plus Jakarta Sans Fallback\", Inter, system-ui, sans-serif",
package/dist/native.d.ts CHANGED
@@ -26,25 +26,37 @@ export type Theme = {
26
26
  readonly brandGradientTo: string;
27
27
  readonly success: string;
28
28
  readonly successText: string;
29
+ readonly successSoft: string;
29
30
  readonly warning: string;
30
31
  readonly warningText: string;
32
+ readonly warningSoft: string;
31
33
  readonly danger: string;
32
34
  readonly dangerText: string;
35
+ readonly dangerSoft: string;
33
36
  readonly info: string;
34
37
  readonly infoText: string;
35
38
  readonly scrim: string;
36
39
  readonly scrimStrong: string;
37
40
  readonly overlay: string;
41
+ readonly surfaceSheen: string;
42
+ readonly fillShade: string;
43
+ readonly edgeLight: string;
44
+ readonly edgeOnFill: string;
45
+ readonly edgeWell: string;
46
+ readonly glassBg: string;
47
+ readonly glassBorder: string;
38
48
  };
39
49
  export type ThemeName = "dark" | "light";
40
50
  /** Colour roles per theme, resolved for React Native (`#rrggbb`, `rgba()` when translucent). */
41
51
  export declare const themes: { readonly dark: Theme; readonly light: Theme };
42
52
  /** Corner radii, in dp. */
43
53
  export declare const radius: {
54
+ readonly xs: 6;
44
55
  readonly sm: 8;
45
56
  readonly md: 12;
46
57
  readonly lg: 16;
47
58
  readonly xl: 20;
59
+ readonly "2xl": 28;
48
60
  readonly full: 9999;
49
61
  };
50
62
  /** Font families: the first family of each web stack (React Native takes a single name). */
@@ -54,8 +66,16 @@ export declare const typography: {
54
66
  readonly display: "Plus Jakarta Sans";
55
67
  readonly mono: "JetBrains Mono";
56
68
  };
57
- /** Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`). */
58
- export declare const motion: { readonly ease: readonly [number, number, number, number] };
69
+ /** Motion: the ease and the spring (cubic-bezier control points) and the micro-interaction durations, in ms. */
70
+ export declare const motion: {
71
+ readonly ease: readonly [number, number, number, number];
72
+ readonly spring: readonly [number, number, number, number];
73
+ readonly duration: {
74
+ readonly instant: 90;
75
+ readonly fast: 150;
76
+ readonly base: 200;
77
+ };
78
+ };
59
79
  /** A step of the type scale, in dp. */
60
80
  export interface NativeTypeStep {
61
81
  readonly role: "display" | "text" | "mono";
@@ -66,6 +86,19 @@ export interface NativeTypeStep {
66
86
  }
67
87
  /** The type scale in dp (React Native): fontSize, lineHeight and letterSpacing absolute, the role whose family sets it. */
68
88
  export declare const typeScale: { readonly [K in "display2xl" | "displayXl" | "displayLg" | "displayMd" | "displaySm" | "titleLg" | "titleMd" | "bodyLg" | "bodyMd" | "bodySm" | "caption" | "overline" | "monoMd" | "monoSm"]: NativeTypeStep };
89
+ /** The shadows of one theme, as React Native `boxShadow` strings. */
90
+ export type Shadows = {
91
+ readonly sm: string;
92
+ readonly md: string;
93
+ readonly lg: string;
94
+ readonly raised: string;
95
+ readonly floating: string;
96
+ readonly overlay: string;
97
+ };
98
+ /** The shadows per theme as React Native `boxShadow` strings (RN ≥ 0.76). */
99
+ export declare const shadows: { readonly dark: Shadows; readonly light: Shadows };
100
+ /** The griffe: the size of the 45° cut corner of a control, in dp. */
101
+ export declare const cut: { readonly size: number };
69
102
 
70
103
  /** A Krizaka brand. */
71
104
  export type BrandId = "krizaka" | "orazaka" | "orochia";
package/dist/native.js CHANGED
@@ -26,15 +26,25 @@ export const themes = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
26
26
  "brandGradientTo": "#0c0c0e",
27
27
  "success": "#10b77f",
28
28
  "successText": "#36d399",
29
+ "successSoft": "rgba(16,183,127,0.14)",
29
30
  "warning": "#f59f0a",
30
31
  "warningText": "#f6a823",
32
+ "warningSoft": "rgba(245,159,10,0.14)",
31
33
  "danger": "#ef4343",
32
34
  "dangerText": "#f87272",
35
+ "dangerSoft": "rgba(239,67,67,0.14)",
33
36
  "info": "#196df5",
34
37
  "infoText": "#629cf8",
35
38
  "scrim": "rgba(0,0,0,0.6)",
36
39
  "scrimStrong": "rgba(0,0,0,0.8)",
37
- "overlay": "rgba(0,0,0,0.7)"
40
+ "overlay": "rgba(0,0,0,0.7)",
41
+ "surfaceSheen": "rgba(255,255,255,0.045)",
42
+ "fillShade": "rgba(0,0,0,0.12)",
43
+ "edgeLight": "rgba(255,255,255,0.07)",
44
+ "edgeOnFill": "rgba(255,255,255,0.22)",
45
+ "edgeWell": "rgba(4,4,7,0.5)",
46
+ "glassBg": "rgba(29,29,32,0.88)",
47
+ "glassBorder": "rgba(255,255,255,0.1)"
38
48
  }), light: /* @__PURE__ */ Object.freeze({
39
49
  "surface0": "#fafafa",
40
50
  "surface1": "#ffffff",
@@ -60,23 +70,35 @@ export const themes = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
60
70
  "brandGradientTo": "#fafafa",
61
71
  "success": "#10b77f",
62
72
  "successText": "#0a714e",
73
+ "successSoft": "rgba(16,183,127,0.1)",
63
74
  "warning": "#f59f0a",
64
75
  "warningText": "#955104",
76
+ "warningSoft": "rgba(245,159,10,0.12)",
65
77
  "danger": "#ef4343",
66
78
  "dangerText": "#af1d1d",
79
+ "dangerSoft": "rgba(239,67,67,0.1)",
67
80
  "info": "#0a64f5",
68
81
  "infoText": "#0954ce",
69
82
  "scrim": "rgba(0,0,0,0.6)",
70
83
  "scrimStrong": "rgba(0,0,0,0.8)",
71
- "overlay": "rgba(0,0,0,0.7)"
84
+ "overlay": "rgba(0,0,0,0.7)",
85
+ "surfaceSheen": "rgba(255,255,255,0.7)",
86
+ "fillShade": "rgba(0,0,0,0.12)",
87
+ "edgeLight": "rgba(255,255,255,0.9)",
88
+ "edgeOnFill": "rgba(255,255,255,0.22)",
89
+ "edgeWell": "rgba(48,52,80,0.08)",
90
+ "glassBg": "rgba(255,255,255,0.88)",
91
+ "glassBorder": "rgba(0,0,0,0.08)"
72
92
  }) });
73
93
 
74
94
  /** Corner radii, in dp. */
75
95
  export const radius = /* @__PURE__ */ Object.freeze({
96
+ "xs": 6,
76
97
  "sm": 8,
77
98
  "md": 12,
78
99
  "lg": 16,
79
100
  "xl": 20,
101
+ "2xl": 28,
80
102
  "full": 9999
81
103
  });
82
104
 
@@ -88,8 +110,11 @@ export const typography = /* @__PURE__ */ Object.freeze({
88
110
  "mono": "JetBrains Mono"
89
111
  });
90
112
 
91
- /** Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`). */
92
- export const motion = /* @__PURE__ */ Object.freeze({ ease: /* @__PURE__ */ Object.freeze([0.16,1,0.3,1]) });
113
+ /**
114
+ * Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`), the short spring of what answers the hand
115
+ * (`motion.spring`) and the micro-interaction durations in ms (`motion.duration.fast`) — 0 when the system reduces motion.
116
+ */
117
+ export const motion = /* @__PURE__ */ Object.freeze({ ease: /* @__PURE__ */ Object.freeze([0.16,1,0.3,1]), spring: /* @__PURE__ */ Object.freeze([0.34,1.36,0.64,1]), duration: /* @__PURE__ */ Object.freeze({"instant":90,"fast":150,"base":200}) });
93
118
 
94
119
  /**
95
120
  * The type scale in dp: fontSize, lineHeight and letterSpacing absolute (React Native has no em), fontWeight as a string,
@@ -196,6 +221,31 @@ export const typeScale = /* @__PURE__ */ Object.freeze({
196
221
  }
197
222
  });
198
223
 
224
+ /**
225
+ * The shadows per theme as React Native `boxShadow` strings (RN ≥ 0.76): `raised` (a button, a card), `floating`
226
+ * (a menu, a popover), `overlay` (a sheet, a toast) — ink-tinted, several layers, as on the web.
227
+ */
228
+ export const shadows = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Object.freeze({
229
+ "sm": "0 1px 3px 0 rgba(0,0,0,0.12), 0 1px 2px 0 rgba(0,0,0,0.06)",
230
+ "md": "0 4px 12px 0 rgba(0,0,0,0.15), 0 2px 4px 0 rgba(0,0,0,0.08)",
231
+ "lg": "0 8px 24px 0 rgba(0,0,0,0.18), 0 4px 8px 0 rgba(0,0,0,0.08)",
232
+ "raised": "0 1px 2px 0 rgba(4,4,7,0.45), 0 2px 6px -2px rgba(4,4,7,0.3)",
233
+ "floating": "0 2px 4px 0 rgba(4,4,7,0.35), 0 12px 24px -6px rgba(4,4,7,0.45), 0 24px 48px -12px rgba(4,4,7,0.35)",
234
+ "overlay": "0 4px 8px 0 rgba(4,4,7,0.4), 0 24px 48px -12px rgba(4,4,7,0.5), 0 48px 96px -24px rgba(4,4,7,0.45)"
235
+ }), light: /* @__PURE__ */ Object.freeze({
236
+ "sm": "0 1px 3px 0 rgba(0,0,0,0.06), 0 1px 2px 0 rgba(0,0,0,0.04)",
237
+ "md": "0 4px 12px 0 rgba(0,0,0,0.08), 0 2px 4px 0 rgba(0,0,0,0.04)",
238
+ "lg": "0 8px 24px 0 rgba(0,0,0,0.1), 0 4px 8px 0 rgba(0,0,0,0.05)",
239
+ "raised": "0 1px 2px 0 rgba(48,52,80,0.08), 0 2px 6px -2px rgba(48,52,80,0.08)",
240
+ "floating": "0 2px 4px 0 rgba(48,52,80,0.06), 0 12px 24px -6px rgba(48,52,80,0.1), 0 24px 48px -12px rgba(48,52,80,0.1)",
241
+ "overlay": "0 4px 8px 0 rgba(48,52,80,0.08), 0 24px 48px -12px rgba(48,52,80,0.14), 0 48px 96px -24px rgba(48,52,80,0.14)"
242
+ }) });
243
+
244
+ /** The griffe (BRAND.md §6.1): the size of the 45° cut corner of a control, in dp. */
245
+ export const cut = /* @__PURE__ */ Object.freeze({
246
+ "size": 10
247
+ });
248
+
199
249
  /** The brand themes as ThemeProvider overrides (`overrides={brands.orazaka}`): the accent family per theme. */
200
250
  export const brands = /* @__PURE__ */ Object.freeze({
201
251
  "krizaka": {
package/dist/tokens.css CHANGED
@@ -35,15 +35,30 @@
35
35
  --kz-brand-gradient-via: hsl(232 24% 7%); /* Section : la teinte intermédiaire */
36
36
  --kz-brand-gradient-to: var(--kz-surface-0); /* Section : l'arrivée, un alias de la surface de page — la section suivante y enchaîne, même quand un produit change --kz-surface-0 */
37
37
  --kz-success-text: hsl(158 64% 52%); /* Statut succès en texte (petit texte, libellé) : ≥ 4.5:1 sur chaque surface */
38
+ --kz-success-soft: hsl(160 84% 39% / 0.14); /* Fond teinté success (texte primaire ≥ 4.5:1) */
38
39
  --kz-warning-text: hsl(38 92% 55%); /* Statut avertissement en texte : ≥ 4.5:1 sur chaque surface */
40
+ --kz-warning-soft: hsl(38 92% 50% / 0.14); /* Fond teinté warning (texte primaire ≥ 4.5:1) */
39
41
  --kz-danger-text: hsl(0 91% 71%); /* Statut erreur en texte (message d'erreur, compte à rebours urgent) : ≥ 4.5:1 sur chaque surface */
42
+ --kz-danger-soft: hsl(0 84% 60% / 0.14); /* Fond teinté danger (texte primaire ≥ 4.5:1) */
40
43
  --kz-info: var(--kz-accent); /* Statut : information */
41
44
  --kz-info-text: var(--kz-accent-text); /* Statut information en texte : l'accent en texte par défaut (≥ 4.5:1) */
42
45
 
43
- /* Ombres (web uniquement) */
46
+ /* Ombres (web uniquement) ; raised/floating/overlay : teintées d'encre, multi-couches */
44
47
  --kz-shadow-sm: 0 1px 3px hsl(0 0% 0% / 0.12), 0 1px 2px hsl(0 0% 0% / 0.06); /* Champ, bouton au repos */
45
48
  --kz-shadow-md: 0 4px 12px hsl(0 0% 0% / 0.15), 0 2px 4px hsl(0 0% 0% / 0.08); /* Menu, popover, carte au survol */
46
49
  --kz-shadow-lg: 0 8px 24px hsl(0 0% 0% / 0.18), 0 4px 8px hsl(0 0% 0% / 0.08); /* Dialogue, feuille */
50
+ --kz-shadow-raised: 0 1px 2px hsl(240 30% 2% / 0.45), 0 2px 6px -2px hsl(240 30% 2% / 0.3); /* Surélevé : bouton, carte */
51
+ --kz-shadow-floating: 0 2px 4px hsl(240 30% 2% / 0.35), 0 12px 24px -6px hsl(240 30% 2% / 0.45), 0 24px 48px -12px hsl(240 30% 2% / 0.35); /* Flottant : menu, popover, info-bulle */
52
+ --kz-shadow-overlay: 0 4px 8px hsl(240 30% 2% / 0.4), 0 24px 48px -12px hsl(240 30% 2% / 0.5), 0 48px 96px -24px hsl(240 30% 2% / 0.45); /* Au-dessus : dialogue, toast, palette */
53
+ --kz-surface-sheen: hsl(0 0% 100% / 0.045); /* Reflet en haut d'une surface (bg-sheen) */
54
+
55
+ /* Arêtes : un filet intérieur d'1 px */
56
+ --kz-edge-light: hsl(0 0% 100% / 0.07); /* Arête lumineuse du haut (inset-shadow-edge) */
57
+ --kz-edge-well: hsl(240 30% 2% / 0.5); /* Ombre intérieure d'un puits : champ, piste (inset-shadow-well) */
58
+
59
+ /* Verre dépoli de ce qui flotte : 88 %, texte secondaire ≥ 4.5:1 sur tout fond */
60
+ --kz-glass-bg: hsl(240 5% 12% / 0.88); /* Le fond du verre */
61
+ --kz-glass-border: hsl(0 0% 100% / 0.1); /* Le contour du verre */
47
62
 
48
63
  /* Typographie — les trois familles de @krizaka/fonts, chacune suivie de son repli aux métriques ajustées */
49
64
  --kz-font-text: var(--kz-font-sans); /* Alias de sans : le rôle texte */
@@ -70,11 +85,22 @@ html.light {
70
85
  --kz-brand-gradient-from: hsl(214 95% 93%); /* Section : la teinte de départ (haut de section, halo) */
71
86
  --kz-brand-gradient-via: hsl(220 60% 97%); /* Section : la teinte intermédiaire */
72
87
  --kz-success-text: hsl(160 84% 24%); /* Statut succès en texte (petit texte, libellé) : ≥ 4.5:1 sur chaque surface */
88
+ --kz-success-soft: hsl(160 84% 39% / 0.1); /* Fond teinté success (texte primaire ≥ 4.5:1) */
73
89
  --kz-warning-text: hsl(32 95% 30%); /* Statut avertissement en texte : ≥ 4.5:1 sur chaque surface */
90
+ --kz-warning-soft: hsl(38 92% 50% / 0.12); /* Fond teinté warning (texte primaire ≥ 4.5:1) */
74
91
  --kz-danger-text: hsl(0 72% 40%); /* Statut erreur en texte (message d'erreur, compte à rebours urgent) : ≥ 4.5:1 sur chaque surface */
92
+ --kz-danger-soft: hsl(0 84% 60% / 0.1); /* Fond teinté danger (texte primaire ≥ 4.5:1) */
75
93
  --kz-shadow-sm: 0 1px 3px hsl(240 6% 0% / 0.06), 0 1px 2px hsl(240 6% 0% / 0.04); /* Champ, bouton au repos */
76
94
  --kz-shadow-md: 0 4px 12px hsl(240 6% 0% / 0.08), 0 2px 4px hsl(240 6% 0% / 0.04); /* Menu, popover, carte au survol */
77
95
  --kz-shadow-lg: 0 8px 24px hsl(240 6% 0% / 0.10), 0 4px 8px hsl(240 6% 0% / 0.05); /* Dialogue, feuille */
96
+ --kz-shadow-raised: 0 1px 2px hsl(232 25% 25% / 0.08), 0 2px 6px -2px hsl(232 25% 25% / 0.08); /* Surélevé : bouton, carte */
97
+ --kz-shadow-floating: 0 2px 4px hsl(232 25% 25% / 0.06), 0 12px 24px -6px hsl(232 25% 25% / 0.1), 0 24px 48px -12px hsl(232 25% 25% / 0.1); /* Flottant : menu, popover, info-bulle */
98
+ --kz-shadow-overlay: 0 4px 8px hsl(232 25% 25% / 0.08), 0 24px 48px -12px hsl(232 25% 25% / 0.14), 0 48px 96px -24px hsl(232 25% 25% / 0.14); /* Au-dessus : dialogue, toast, palette */
99
+ --kz-surface-sheen: hsl(0 0% 100% / 0.7); /* Reflet en haut d'une surface (bg-sheen) */
100
+ --kz-edge-light: hsl(0 0% 100% / 0.9); /* Arête lumineuse du haut (inset-shadow-edge) */
101
+ --kz-edge-well: hsl(232 25% 25% / 0.08); /* Ombre intérieure d'un puits : champ, piste (inset-shadow-well) */
102
+ --kz-glass-bg: hsl(0 0% 100% / 0.88); /* Le fond du verre */
103
+ --kz-glass-border: hsl(240 6% 0% / 0.08); /* Le contour du verre */
78
104
  }
79
105
 
80
106
  /* `.theme-light` : les valeurs claires, alias compris, sur un sous-arbre — un aperçu reste clair dans une page
@@ -102,13 +128,24 @@ html.light {
102
128
  --kz-brand-gradient-via: hsl(220 60% 97%); /* Section : la teinte intermédiaire */
103
129
  --kz-brand-gradient-to: var(--kz-surface-0); /* Section : l'arrivée, un alias de la surface de page — la section suivante y enchaîne, même quand un produit change --kz-surface-0 */
104
130
  --kz-success-text: hsl(160 84% 24%); /* Statut succès en texte (petit texte, libellé) : ≥ 4.5:1 sur chaque surface */
131
+ --kz-success-soft: hsl(160 84% 39% / 0.1); /* Fond teinté success (texte primaire ≥ 4.5:1) */
105
132
  --kz-warning-text: hsl(32 95% 30%); /* Statut avertissement en texte : ≥ 4.5:1 sur chaque surface */
133
+ --kz-warning-soft: hsl(38 92% 50% / 0.12); /* Fond teinté warning (texte primaire ≥ 4.5:1) */
106
134
  --kz-danger-text: hsl(0 72% 40%); /* Statut erreur en texte (message d'erreur, compte à rebours urgent) : ≥ 4.5:1 sur chaque surface */
135
+ --kz-danger-soft: hsl(0 84% 60% / 0.1); /* Fond teinté danger (texte primaire ≥ 4.5:1) */
107
136
  --kz-info: var(--kz-accent); /* Statut : information */
108
137
  --kz-info-text: var(--kz-accent-text); /* Statut information en texte : l'accent en texte par défaut (≥ 4.5:1) */
109
138
  --kz-shadow-sm: 0 1px 3px hsl(240 6% 0% / 0.06), 0 1px 2px hsl(240 6% 0% / 0.04); /* Champ, bouton au repos */
110
139
  --kz-shadow-md: 0 4px 12px hsl(240 6% 0% / 0.08), 0 2px 4px hsl(240 6% 0% / 0.04); /* Menu, popover, carte au survol */
111
140
  --kz-shadow-lg: 0 8px 24px hsl(240 6% 0% / 0.10), 0 4px 8px hsl(240 6% 0% / 0.05); /* Dialogue, feuille */
141
+ --kz-shadow-raised: 0 1px 2px hsl(232 25% 25% / 0.08), 0 2px 6px -2px hsl(232 25% 25% / 0.08); /* Surélevé : bouton, carte */
142
+ --kz-shadow-floating: 0 2px 4px hsl(232 25% 25% / 0.06), 0 12px 24px -6px hsl(232 25% 25% / 0.1), 0 24px 48px -12px hsl(232 25% 25% / 0.1); /* Flottant : menu, popover, info-bulle */
143
+ --kz-shadow-overlay: 0 4px 8px hsl(232 25% 25% / 0.08), 0 24px 48px -12px hsl(232 25% 25% / 0.14), 0 48px 96px -24px hsl(232 25% 25% / 0.14); /* Au-dessus : dialogue, toast, palette */
144
+ --kz-surface-sheen: hsl(0 0% 100% / 0.7); /* Reflet en haut d'une surface (bg-sheen) */
145
+ --kz-edge-light: hsl(0 0% 100% / 0.9); /* Arête lumineuse du haut (inset-shadow-edge) */
146
+ --kz-edge-well: hsl(232 25% 25% / 0.08); /* Ombre intérieure d'un puits : champ, piste (inset-shadow-well) */
147
+ --kz-glass-bg: hsl(0 0% 100% / 0.88); /* Le fond du verre */
148
+ --kz-glass-border: hsl(240 6% 0% / 0.08); /* Le contour du verre */
112
149
  --kz-font-text: var(--kz-font-sans); /* Alias de sans : le rôle texte */
113
150
  }
114
151
 
@@ -127,12 +164,42 @@ html.light {
127
164
  --kz-overlay: hsl(0 0% 0% / 0.70); /* fond d'un dialogue */
128
165
 
129
166
  /* Rayons */
167
+ --kz-radius-xs: 6px; /* Case à cocher, touche, badge coupé */
130
168
  --kz-radius-sm: 8px; /* Champ, puce */
131
169
  --kz-radius-md: 12px; /* Bouton, menu */
132
170
  --kz-radius-lg: 16px; /* Carte */
133
171
  --kz-radius-xl: 20px; /* Dialogue, feuille */
172
+ --kz-radius-2xl: 28px; /* Feuille, grande surface flottante */
134
173
  --kz-radius-full: 9999px; /* Pastille, avatar */
174
+ --kz-fill-shade: hsl(0 0% 0% / 0.12); /* Bas d'un aplat (bg-fill-shade), on-accent ≥ 4.5:1 */
175
+
176
+ /* Arêtes : un filet intérieur d'1 px */
177
+ --kz-edge-on-fill: hsl(0 0% 100% / 0.22); /* Arête lumineuse sur un aplat */
178
+
179
+ /* Verre dépoli de ce qui flotte : 88 %, texte secondaire ≥ 4.5:1 sur tout fond */
180
+ --kz-glass-blur: 24px; /* Le flou de ce qui passe dessous */
181
+
182
+ /* Anneau de focus signature : net, décollé, dans un halo (focus-ring) */
183
+ --kz-ring-width: 2px; /* Épaisseur */
184
+ --kz-ring-offset: 2px; /* Écart */
185
+ --kz-ring-halo: 4px; /* Halo au-delà */
186
+
187
+ /* Hauteurs des contrôles ; resserrées sous [data-density=compact] */
188
+ --kz-control-sm: 32px; /* Petit bouton, onglet segmenté */
189
+ --kz-control-md: 40px; /* Bouton */
190
+ --kz-control-lg: 48px; /* Grand bouton */
191
+ --kz-control-field: 44px; /* Champ de saisie, sélecteur */
192
+
193
+ /* La griffe : le coin coupé à 45° (BRAND.md §6.1) ; --kz-cut-shape: round l'éteint pour une app */
194
+ --kz-cut-shape: bevel; /* La forme des coins signés : bevel (coupé) ou round */
195
+ --kz-cut-size: 10px; /* La taille de la coupe d'un contrôle */
135
196
  --kz-ease: cubic-bezier(0.16, 1, 0.3, 1); /* Courbe par défaut de la signature de mouvement */
197
+ --kz-ease-spring: cubic-bezier(0.34, 1.36, 0.64, 1); /* Ressort court : pression, bascule, sélection */
198
+
199
+ /* Micro-interactions ≤ 200 ms ; 0 ms en mouvement réduit */
200
+ --kz-duration-instant: 90ms; /* La compression d'un clic */
201
+ --kz-duration-fast: 150ms; /* Survol, couleur, ombre */
202
+ --kz-duration-base: 200ms; /* Une bascule, un indicateur qui glisse */
136
203
 
137
204
  /* Typographie — les trois familles de @krizaka/fonts, chacune suivie de son repli aux métriques ajustées */
138
205
  --kz-font-sans: Inter, "Inter Fallback", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; /* Texte : interface et lecture (Inter) */
@@ -223,3 +290,20 @@ html.light {
223
290
  --kz-type-mono-sm-weight: 400;
224
291
  --kz-type-mono-sm-tracking: 0em;
225
292
  }
293
+
294
+ /* Densité compacte : [data-density="compact"] sur un sous-arbre resserre les contrôles (tableau dense, console). */
295
+ [data-density="compact"] {
296
+ --kz-control-sm: 28px;
297
+ --kz-control-md: 34px;
298
+ --kz-control-lg: 40px;
299
+ --kz-control-field: 36px;
300
+ }
301
+
302
+ /* Mouvement réduit : les micro-interactions deviennent instantanées. */
303
+ @media (prefers-reduced-motion: reduce) {
304
+ :root {
305
+ --kz-duration-instant: 0ms;
306
+ --kz-duration-fast: 0ms;
307
+ --kz-duration-base: 0ms;
308
+ }
309
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krizaka/tokens",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "The Krizaka semantic design tokens (--kz-*) and the brand themes (Krizaka, Orazaka, Orochia): one DTCG source compiled to CSS (dark, light, media invariants), typed constants and React Native themes.",
5
5
  "keywords": [
6
6
  "krizaka",
@@ -73,7 +73,7 @@
73
73
  {
74
74
  "name": "./tokens.css",
75
75
  "path": "dist/tokens.css",
76
- "limit": "3.1 kB",
76
+ "limit": "4.3 kB",
77
77
  "gzip": true,
78
78
  "rolldown": false
79
79
  },
@@ -94,13 +94,13 @@
94
94
  {
95
95
  "name": ".",
96
96
  "path": "dist/index.js",
97
- "limit": "3 kB",
97
+ "limit": "3.5 kB",
98
98
  "gzip": true
99
99
  },
100
100
  {
101
101
  "name": "./native",
102
102
  "path": "dist/native.js",
103
- "limit": "1.5 kB",
103
+ "limit": "1.85 kB",
104
104
  "gzip": true
105
105
  }
106
106
  ],