@krizaka/tokens 2.3.0 → 2.4.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
@@ -1,7 +1,7 @@
1
1
  # The Krizaka brand system
2
2
 
3
- One identity for the parent and its products: **one colour per brand**, one family of marks, one icon language and one
4
- visual language for pages. The values live in `src/brands/<id>.brand.json` (DTCG) and ship as
3
+ One identity for the parent and its products: **one colour per brand**, one family of marks, one icon language, one
4
+ typography (§5) and one visual language for pages. The values live in `src/brands/<id>.brand.json` (DTCG) and ship as
5
5
  `@krizaka/tokens/brands/<id>.css`, `brands` (web, raw CSS) and `brands` (`@krizaka/tokens/native`, ThemeProvider
6
6
  overrides). A product never re-invents its values: it imports its brand.
7
7
 
@@ -103,3 +103,40 @@ What M2/M3/M4 (the homes of Orochia, Orazaka and krizaka.com) apply. Restrained,
103
103
  loops fast; everything stops under `prefers-reduced-motion`.
104
104
  - **Text on these backgrounds** uses the text roles (`text-fg`, `text-fg-secondary`, `text-fg-accent`): AA is tested
105
105
  on every gradient stop, in both themes.
106
+
107
+ ## 5. Typography — three families, one voice
108
+
109
+ `@krizaka/fonts` (2026-10, session TY) ships them, self-hosted; `@krizaka/tokens` names them (`--kz-font-display`,
110
+ `--kz-font-text` = `--kz-font-sans`, `--kz-font-mono`) and sets the scale (`type.*` → `text-display-xl`, `text-body-md`…
111
+ in `@krizaka/tailwind`, `typeScale` in `/native`). Only faces under the **SIL Open Font License 1.1**: redistributable,
112
+ bundled in apps, subset by us (no Reserved Font Name on any of the three).
113
+
114
+ | Role | Family | Why this one |
115
+ | :-- | :-- | :-- |
116
+ | **Display** — headlines, figures, names | **Plus Jakarta Sans** (500–800) | Already the headline face of krizaka.com — no gratuitous change to the parent brand. Compact, slightly squared bowls and flat terminals: it echoes the cut corners of the marks and icons, and stays dense and premium at 800. |
117
+ | **Text** — reading and interface | **Inter** (400–700, cut at the text optical size) | Drawn for screens: tall x-height, open apertures, tabular figures for amounts. Already the default of the tokens and Orazaka's text; krizaka.com's body already asked for its character variants (`cv02`–`cv04`). |
118
+ | **Mono** — code, identifiers, overlines | **JetBrains Mono** (400–700) | Already on every Krizaka surface. Unambiguous 0/O and 1/l/I at 12 px; rectangular forms that sit next to the chamfers. |
119
+
120
+ What we weighed:
121
+
122
+ - **Continuity first.** The inventory (krizaka.com: Jakarta + JetBrains Mono; Orochia: Jakarta text + Outfit display;
123
+ Orazaka: Inter + Outfit as a stand-in "Krizaka Display" + JetBrains Mono; the tokens: Inter; the mobile apps: system
124
+ faces) has three faces in common use. The decision keeps all three and gives each one job, so every surface moves by
125
+ one role at most: krizaka.com changes its body (Jakarta → Inter), Orazaka its headlines (Outfit → Jakarta), Orochia its
126
+ body (Jakarta → Inter) — and **keeps Outfit as its product display face**, a theme override of `--kz-font-display`
127
+ like its violet.
128
+ - **Outfit as the Krizaka display** was the alternative: rounder and friendlier, it reads as Orochia's voice, and moving
129
+ the parent's headlines to it is the visible change we wanted to avoid.
130
+ - **Screen and French.** Every file covers latin and latin-ext (é è à ç ô œ « » ’ — French is in the latin file; the
131
+ browser fetches latin-ext only when a page needs it). Each family has a local fallback whose metrics are adjusted to
132
+ it (`… Fallback`, size-adjust and ascent/descent overrides): the text does not move when the font arrives (CLS 0).
133
+
134
+ **Signature.** The Krizaka signature in type is the **wordmark**, drawn, inside the logo (`KrizakaLogo`) — never the name
135
+ set in a font. No typeface is drawn from scratch: a cut-corner stylistic set (a chamfered `K`, `z`, `a` as alternates
136
+ of the display face, under the OFL as a modified version with its own name) is a foundry project for later, tracked as
137
+ an issue, not a dependency of anything today.
138
+
139
+ Rules (also `rules` of `@krizaka/fonts`, on krizaka.com/docs/ui/typography): display speaks, text reads, mono labels;
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
+ scale, not one-off sizes; products may override the display role only.
142
+
package/dist/index.d.ts CHANGED
@@ -45,8 +45,65 @@ export declare const tokens: {
45
45
  readonly shadowLg: "var(--kz-shadow-lg)";
46
46
  readonly ease: "var(--kz-ease)";
47
47
  readonly fontSans: "var(--kz-font-sans)";
48
+ readonly fontText: "var(--kz-font-text)";
48
49
  readonly fontDisplay: "var(--kz-font-display)";
49
50
  readonly fontMono: "var(--kz-font-mono)";
51
+ readonly typeDisplay2xlSize: "var(--kz-type-display-2xl-size)";
52
+ readonly typeDisplay2xlLineHeight: "var(--kz-type-display-2xl-line-height)";
53
+ readonly typeDisplay2xlWeight: "var(--kz-type-display-2xl-weight)";
54
+ readonly typeDisplay2xlTracking: "var(--kz-type-display-2xl-tracking)";
55
+ readonly typeDisplayXlSize: "var(--kz-type-display-xl-size)";
56
+ readonly typeDisplayXlLineHeight: "var(--kz-type-display-xl-line-height)";
57
+ readonly typeDisplayXlWeight: "var(--kz-type-display-xl-weight)";
58
+ readonly typeDisplayXlTracking: "var(--kz-type-display-xl-tracking)";
59
+ readonly typeDisplayLgSize: "var(--kz-type-display-lg-size)";
60
+ readonly typeDisplayLgLineHeight: "var(--kz-type-display-lg-line-height)";
61
+ readonly typeDisplayLgWeight: "var(--kz-type-display-lg-weight)";
62
+ readonly typeDisplayLgTracking: "var(--kz-type-display-lg-tracking)";
63
+ readonly typeDisplayMdSize: "var(--kz-type-display-md-size)";
64
+ readonly typeDisplayMdLineHeight: "var(--kz-type-display-md-line-height)";
65
+ readonly typeDisplayMdWeight: "var(--kz-type-display-md-weight)";
66
+ readonly typeDisplayMdTracking: "var(--kz-type-display-md-tracking)";
67
+ readonly typeDisplaySmSize: "var(--kz-type-display-sm-size)";
68
+ readonly typeDisplaySmLineHeight: "var(--kz-type-display-sm-line-height)";
69
+ readonly typeDisplaySmWeight: "var(--kz-type-display-sm-weight)";
70
+ readonly typeDisplaySmTracking: "var(--kz-type-display-sm-tracking)";
71
+ readonly typeTitleLgSize: "var(--kz-type-title-lg-size)";
72
+ readonly typeTitleLgLineHeight: "var(--kz-type-title-lg-line-height)";
73
+ readonly typeTitleLgWeight: "var(--kz-type-title-lg-weight)";
74
+ readonly typeTitleLgTracking: "var(--kz-type-title-lg-tracking)";
75
+ readonly typeTitleMdSize: "var(--kz-type-title-md-size)";
76
+ readonly typeTitleMdLineHeight: "var(--kz-type-title-md-line-height)";
77
+ readonly typeTitleMdWeight: "var(--kz-type-title-md-weight)";
78
+ readonly typeTitleMdTracking: "var(--kz-type-title-md-tracking)";
79
+ readonly typeBodyLgSize: "var(--kz-type-body-lg-size)";
80
+ readonly typeBodyLgLineHeight: "var(--kz-type-body-lg-line-height)";
81
+ readonly typeBodyLgWeight: "var(--kz-type-body-lg-weight)";
82
+ readonly typeBodyLgTracking: "var(--kz-type-body-lg-tracking)";
83
+ readonly typeBodyMdSize: "var(--kz-type-body-md-size)";
84
+ readonly typeBodyMdLineHeight: "var(--kz-type-body-md-line-height)";
85
+ readonly typeBodyMdWeight: "var(--kz-type-body-md-weight)";
86
+ readonly typeBodyMdTracking: "var(--kz-type-body-md-tracking)";
87
+ readonly typeBodySmSize: "var(--kz-type-body-sm-size)";
88
+ readonly typeBodySmLineHeight: "var(--kz-type-body-sm-line-height)";
89
+ readonly typeBodySmWeight: "var(--kz-type-body-sm-weight)";
90
+ readonly typeBodySmTracking: "var(--kz-type-body-sm-tracking)";
91
+ readonly typeCaptionSize: "var(--kz-type-caption-size)";
92
+ readonly typeCaptionLineHeight: "var(--kz-type-caption-line-height)";
93
+ readonly typeCaptionWeight: "var(--kz-type-caption-weight)";
94
+ readonly typeCaptionTracking: "var(--kz-type-caption-tracking)";
95
+ readonly typeOverlineSize: "var(--kz-type-overline-size)";
96
+ readonly typeOverlineLineHeight: "var(--kz-type-overline-line-height)";
97
+ readonly typeOverlineWeight: "var(--kz-type-overline-weight)";
98
+ readonly typeOverlineTracking: "var(--kz-type-overline-tracking)";
99
+ readonly typeMonoMdSize: "var(--kz-type-mono-md-size)";
100
+ readonly typeMonoMdLineHeight: "var(--kz-type-mono-md-line-height)";
101
+ readonly typeMonoMdWeight: "var(--kz-type-mono-md-weight)";
102
+ readonly typeMonoMdTracking: "var(--kz-type-mono-md-tracking)";
103
+ readonly typeMonoSmSize: "var(--kz-type-mono-sm-size)";
104
+ readonly typeMonoSmLineHeight: "var(--kz-type-mono-sm-line-height)";
105
+ readonly typeMonoSmWeight: "var(--kz-type-mono-sm-weight)";
106
+ readonly typeMonoSmTracking: "var(--kz-type-mono-sm-tracking)";
50
107
  };
51
108
  /** A token's camelCase name. */
52
109
  export type TokenName = keyof typeof tokens;
@@ -54,6 +111,23 @@ export type TokenName = keyof typeof tokens;
54
111
  export type TokenValues = { readonly [K in TokenName]: string };
55
112
  /** The raw CSS values per theme (aliases resolved), for canvas, charts and e-mails. */
56
113
  export declare const values: { readonly dark: TokenValues; readonly light: TokenValues };
114
+ /** The role of a step of the type scale: the family it is set in. */
115
+ export type TypeRole = "display" | "text" | "mono";
116
+ /** A step of the type scale. */
117
+ export interface TypeStep {
118
+ readonly name: "display-2xl" | "display-xl" | "display-lg" | "display-md" | "display-sm" | "title-lg" | "title-md" | "body-lg" | "body-md" | "body-sm" | "caption" | "overline" | "mono-md" | "mono-sm";
119
+ readonly role: TypeRole;
120
+ readonly description: string;
121
+ /** `72px`. */
122
+ readonly size: string;
123
+ /** Unitless: `1.05`. */
124
+ readonly lineHeight: number;
125
+ readonly weight: number;
126
+ /** `-0.03em`. */
127
+ readonly tracking: string;
128
+ }
129
+ /** The type scale: each step's role (the family), size, line height, weight and tracking — `text-<name>` in @krizaka/tailwind. */
130
+ export declare const typeScale: readonly TypeStep[];
57
131
 
58
132
  /** A Krizaka brand. */
59
133
  export type BrandId = "krizaka" | "orazaka" | "orochia";
package/dist/index.js CHANGED
@@ -45,8 +45,65 @@ export const tokens = /* @__PURE__ */ Object.freeze({
45
45
  "shadowLg": "var(--kz-shadow-lg)",
46
46
  "ease": "var(--kz-ease)",
47
47
  "fontSans": "var(--kz-font-sans)",
48
+ "fontText": "var(--kz-font-text)",
48
49
  "fontDisplay": "var(--kz-font-display)",
49
- "fontMono": "var(--kz-font-mono)"
50
+ "fontMono": "var(--kz-font-mono)",
51
+ "typeDisplay2xlSize": "var(--kz-type-display-2xl-size)",
52
+ "typeDisplay2xlLineHeight": "var(--kz-type-display-2xl-line-height)",
53
+ "typeDisplay2xlWeight": "var(--kz-type-display-2xl-weight)",
54
+ "typeDisplay2xlTracking": "var(--kz-type-display-2xl-tracking)",
55
+ "typeDisplayXlSize": "var(--kz-type-display-xl-size)",
56
+ "typeDisplayXlLineHeight": "var(--kz-type-display-xl-line-height)",
57
+ "typeDisplayXlWeight": "var(--kz-type-display-xl-weight)",
58
+ "typeDisplayXlTracking": "var(--kz-type-display-xl-tracking)",
59
+ "typeDisplayLgSize": "var(--kz-type-display-lg-size)",
60
+ "typeDisplayLgLineHeight": "var(--kz-type-display-lg-line-height)",
61
+ "typeDisplayLgWeight": "var(--kz-type-display-lg-weight)",
62
+ "typeDisplayLgTracking": "var(--kz-type-display-lg-tracking)",
63
+ "typeDisplayMdSize": "var(--kz-type-display-md-size)",
64
+ "typeDisplayMdLineHeight": "var(--kz-type-display-md-line-height)",
65
+ "typeDisplayMdWeight": "var(--kz-type-display-md-weight)",
66
+ "typeDisplayMdTracking": "var(--kz-type-display-md-tracking)",
67
+ "typeDisplaySmSize": "var(--kz-type-display-sm-size)",
68
+ "typeDisplaySmLineHeight": "var(--kz-type-display-sm-line-height)",
69
+ "typeDisplaySmWeight": "var(--kz-type-display-sm-weight)",
70
+ "typeDisplaySmTracking": "var(--kz-type-display-sm-tracking)",
71
+ "typeTitleLgSize": "var(--kz-type-title-lg-size)",
72
+ "typeTitleLgLineHeight": "var(--kz-type-title-lg-line-height)",
73
+ "typeTitleLgWeight": "var(--kz-type-title-lg-weight)",
74
+ "typeTitleLgTracking": "var(--kz-type-title-lg-tracking)",
75
+ "typeTitleMdSize": "var(--kz-type-title-md-size)",
76
+ "typeTitleMdLineHeight": "var(--kz-type-title-md-line-height)",
77
+ "typeTitleMdWeight": "var(--kz-type-title-md-weight)",
78
+ "typeTitleMdTracking": "var(--kz-type-title-md-tracking)",
79
+ "typeBodyLgSize": "var(--kz-type-body-lg-size)",
80
+ "typeBodyLgLineHeight": "var(--kz-type-body-lg-line-height)",
81
+ "typeBodyLgWeight": "var(--kz-type-body-lg-weight)",
82
+ "typeBodyLgTracking": "var(--kz-type-body-lg-tracking)",
83
+ "typeBodyMdSize": "var(--kz-type-body-md-size)",
84
+ "typeBodyMdLineHeight": "var(--kz-type-body-md-line-height)",
85
+ "typeBodyMdWeight": "var(--kz-type-body-md-weight)",
86
+ "typeBodyMdTracking": "var(--kz-type-body-md-tracking)",
87
+ "typeBodySmSize": "var(--kz-type-body-sm-size)",
88
+ "typeBodySmLineHeight": "var(--kz-type-body-sm-line-height)",
89
+ "typeBodySmWeight": "var(--kz-type-body-sm-weight)",
90
+ "typeBodySmTracking": "var(--kz-type-body-sm-tracking)",
91
+ "typeCaptionSize": "var(--kz-type-caption-size)",
92
+ "typeCaptionLineHeight": "var(--kz-type-caption-line-height)",
93
+ "typeCaptionWeight": "var(--kz-type-caption-weight)",
94
+ "typeCaptionTracking": "var(--kz-type-caption-tracking)",
95
+ "typeOverlineSize": "var(--kz-type-overline-size)",
96
+ "typeOverlineLineHeight": "var(--kz-type-overline-line-height)",
97
+ "typeOverlineWeight": "var(--kz-type-overline-weight)",
98
+ "typeOverlineTracking": "var(--kz-type-overline-tracking)",
99
+ "typeMonoMdSize": "var(--kz-type-mono-md-size)",
100
+ "typeMonoMdLineHeight": "var(--kz-type-mono-md-line-height)",
101
+ "typeMonoMdWeight": "var(--kz-type-mono-md-weight)",
102
+ "typeMonoMdTracking": "var(--kz-type-mono-md-tracking)",
103
+ "typeMonoSmSize": "var(--kz-type-mono-sm-size)",
104
+ "typeMonoSmLineHeight": "var(--kz-type-mono-sm-line-height)",
105
+ "typeMonoSmWeight": "var(--kz-type-mono-sm-weight)",
106
+ "typeMonoSmTracking": "var(--kz-type-mono-sm-tracking)"
50
107
  });
51
108
 
52
109
  /** The raw CSS values per theme (aliases resolved), for canvas, charts and e-mails. */
@@ -93,9 +150,66 @@ export const values = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
93
150
  "shadowMd": "0 4px 12px hsl(0 0% 0% / 0.15), 0 2px 4px hsl(0 0% 0% / 0.08)",
94
151
  "shadowLg": "0 8px 24px hsl(0 0% 0% / 0.18), 0 4px 8px hsl(0 0% 0% / 0.08)",
95
152
  "ease": "cubic-bezier(0.16, 1, 0.3, 1)",
96
- "fontSans": "Inter, system-ui, sans-serif",
97
- "fontDisplay": "Inter, system-ui, sans-serif",
98
- "fontMono": "\"JetBrains Mono\", ui-monospace, monospace"
153
+ "fontSans": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
154
+ "fontText": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
155
+ "fontDisplay": "\"Plus Jakarta Sans\", \"Plus Jakarta Sans Fallback\", Inter, system-ui, sans-serif",
156
+ "fontMono": "\"JetBrains Mono\", \"JetBrains Mono Fallback\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
157
+ "typeDisplay2xlSize": "72px",
158
+ "typeDisplay2xlLineHeight": "1.02",
159
+ "typeDisplay2xlWeight": "800",
160
+ "typeDisplay2xlTracking": "-0.035em",
161
+ "typeDisplayXlSize": "56px",
162
+ "typeDisplayXlLineHeight": "1.05",
163
+ "typeDisplayXlWeight": "800",
164
+ "typeDisplayXlTracking": "-0.03em",
165
+ "typeDisplayLgSize": "44px",
166
+ "typeDisplayLgLineHeight": "1.1",
167
+ "typeDisplayLgWeight": "700",
168
+ "typeDisplayLgTracking": "-0.025em",
169
+ "typeDisplayMdSize": "34px",
170
+ "typeDisplayMdLineHeight": "1.15",
171
+ "typeDisplayMdWeight": "700",
172
+ "typeDisplayMdTracking": "-0.02em",
173
+ "typeDisplaySmSize": "26px",
174
+ "typeDisplaySmLineHeight": "1.2",
175
+ "typeDisplaySmWeight": "700",
176
+ "typeDisplaySmTracking": "-0.015em",
177
+ "typeTitleLgSize": "20px",
178
+ "typeTitleLgLineHeight": "1.35",
179
+ "typeTitleLgWeight": "700",
180
+ "typeTitleLgTracking": "-0.01em",
181
+ "typeTitleMdSize": "17px",
182
+ "typeTitleMdLineHeight": "1.4",
183
+ "typeTitleMdWeight": "600",
184
+ "typeTitleMdTracking": "-0.012em",
185
+ "typeBodyLgSize": "18px",
186
+ "typeBodyLgLineHeight": "1.6",
187
+ "typeBodyLgWeight": "400",
188
+ "typeBodyLgTracking": "-0.014em",
189
+ "typeBodyMdSize": "16px",
190
+ "typeBodyMdLineHeight": "1.6",
191
+ "typeBodyMdWeight": "400",
192
+ "typeBodyMdTracking": "-0.011em",
193
+ "typeBodySmSize": "14px",
194
+ "typeBodySmLineHeight": "1.5",
195
+ "typeBodySmWeight": "400",
196
+ "typeBodySmTracking": "-0.006em",
197
+ "typeCaptionSize": "12px",
198
+ "typeCaptionLineHeight": "1.4",
199
+ "typeCaptionWeight": "500",
200
+ "typeCaptionTracking": "0em",
201
+ "typeOverlineSize": "11px",
202
+ "typeOverlineLineHeight": "1.3",
203
+ "typeOverlineWeight": "600",
204
+ "typeOverlineTracking": "0.12em",
205
+ "typeMonoMdSize": "14px",
206
+ "typeMonoMdLineHeight": "1.6",
207
+ "typeMonoMdWeight": "400",
208
+ "typeMonoMdTracking": "0em",
209
+ "typeMonoSmSize": "12px",
210
+ "typeMonoSmLineHeight": "1.5",
211
+ "typeMonoSmWeight": "400",
212
+ "typeMonoSmTracking": "0em"
99
213
  }), light: /* @__PURE__ */ Object.freeze({
100
214
  "surface0": "hsl(0 0% 98%)",
101
215
  "surface1": "hsl(0 0% 100%)",
@@ -139,11 +253,198 @@ export const values = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Obje
139
253
  "shadowMd": "0 4px 12px hsl(240 6% 0% / 0.08), 0 2px 4px hsl(240 6% 0% / 0.04)",
140
254
  "shadowLg": "0 8px 24px hsl(240 6% 0% / 0.10), 0 4px 8px hsl(240 6% 0% / 0.05)",
141
255
  "ease": "cubic-bezier(0.16, 1, 0.3, 1)",
142
- "fontSans": "Inter, system-ui, sans-serif",
143
- "fontDisplay": "Inter, system-ui, sans-serif",
144
- "fontMono": "\"JetBrains Mono\", ui-monospace, monospace"
256
+ "fontSans": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
257
+ "fontText": "Inter, \"Inter Fallback\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
258
+ "fontDisplay": "\"Plus Jakarta Sans\", \"Plus Jakarta Sans Fallback\", Inter, system-ui, sans-serif",
259
+ "fontMono": "\"JetBrains Mono\", \"JetBrains Mono Fallback\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
260
+ "typeDisplay2xlSize": "72px",
261
+ "typeDisplay2xlLineHeight": "1.02",
262
+ "typeDisplay2xlWeight": "800",
263
+ "typeDisplay2xlTracking": "-0.035em",
264
+ "typeDisplayXlSize": "56px",
265
+ "typeDisplayXlLineHeight": "1.05",
266
+ "typeDisplayXlWeight": "800",
267
+ "typeDisplayXlTracking": "-0.03em",
268
+ "typeDisplayLgSize": "44px",
269
+ "typeDisplayLgLineHeight": "1.1",
270
+ "typeDisplayLgWeight": "700",
271
+ "typeDisplayLgTracking": "-0.025em",
272
+ "typeDisplayMdSize": "34px",
273
+ "typeDisplayMdLineHeight": "1.15",
274
+ "typeDisplayMdWeight": "700",
275
+ "typeDisplayMdTracking": "-0.02em",
276
+ "typeDisplaySmSize": "26px",
277
+ "typeDisplaySmLineHeight": "1.2",
278
+ "typeDisplaySmWeight": "700",
279
+ "typeDisplaySmTracking": "-0.015em",
280
+ "typeTitleLgSize": "20px",
281
+ "typeTitleLgLineHeight": "1.35",
282
+ "typeTitleLgWeight": "700",
283
+ "typeTitleLgTracking": "-0.01em",
284
+ "typeTitleMdSize": "17px",
285
+ "typeTitleMdLineHeight": "1.4",
286
+ "typeTitleMdWeight": "600",
287
+ "typeTitleMdTracking": "-0.012em",
288
+ "typeBodyLgSize": "18px",
289
+ "typeBodyLgLineHeight": "1.6",
290
+ "typeBodyLgWeight": "400",
291
+ "typeBodyLgTracking": "-0.014em",
292
+ "typeBodyMdSize": "16px",
293
+ "typeBodyMdLineHeight": "1.6",
294
+ "typeBodyMdWeight": "400",
295
+ "typeBodyMdTracking": "-0.011em",
296
+ "typeBodySmSize": "14px",
297
+ "typeBodySmLineHeight": "1.5",
298
+ "typeBodySmWeight": "400",
299
+ "typeBodySmTracking": "-0.006em",
300
+ "typeCaptionSize": "12px",
301
+ "typeCaptionLineHeight": "1.4",
302
+ "typeCaptionWeight": "500",
303
+ "typeCaptionTracking": "0em",
304
+ "typeOverlineSize": "11px",
305
+ "typeOverlineLineHeight": "1.3",
306
+ "typeOverlineWeight": "600",
307
+ "typeOverlineTracking": "0.12em",
308
+ "typeMonoMdSize": "14px",
309
+ "typeMonoMdLineHeight": "1.6",
310
+ "typeMonoMdWeight": "400",
311
+ "typeMonoMdTracking": "0em",
312
+ "typeMonoSmSize": "12px",
313
+ "typeMonoSmLineHeight": "1.5",
314
+ "typeMonoSmWeight": "400",
315
+ "typeMonoSmTracking": "0em"
145
316
  }) });
146
317
 
318
+ /** The type scale: each step's role (the family), size, line height, weight and tracking — `text-<name>` in @krizaka/tailwind. */
319
+ export const typeScale = /* @__PURE__ */ Object.freeze([
320
+ {
321
+ "name": "display-2xl",
322
+ "role": "display",
323
+ "description": "The hero of a home page",
324
+ "size": "72px",
325
+ "lineHeight": 1.02,
326
+ "weight": 800,
327
+ "tracking": "-0.035em"
328
+ },
329
+ {
330
+ "name": "display-xl",
331
+ "role": "display",
332
+ "description": "The hero of a page",
333
+ "size": "56px",
334
+ "lineHeight": 1.05,
335
+ "weight": 800,
336
+ "tracking": "-0.03em"
337
+ },
338
+ {
339
+ "name": "display-lg",
340
+ "role": "display",
341
+ "description": "The title of a page",
342
+ "size": "44px",
343
+ "lineHeight": 1.1,
344
+ "weight": 700,
345
+ "tracking": "-0.025em"
346
+ },
347
+ {
348
+ "name": "display-md",
349
+ "role": "display",
350
+ "description": "The title of a section",
351
+ "size": "34px",
352
+ "lineHeight": 1.15,
353
+ "weight": 700,
354
+ "tracking": "-0.02em"
355
+ },
356
+ {
357
+ "name": "display-sm",
358
+ "role": "display",
359
+ "description": "A sub-section, a big figure",
360
+ "size": "26px",
361
+ "lineHeight": 1.2,
362
+ "weight": 700,
363
+ "tracking": "-0.015em"
364
+ },
365
+ {
366
+ "name": "title-lg",
367
+ "role": "display",
368
+ "description": "The title of a card or a dialog",
369
+ "size": "20px",
370
+ "lineHeight": 1.35,
371
+ "weight": 700,
372
+ "tracking": "-0.01em"
373
+ },
374
+ {
375
+ "name": "title-md",
376
+ "role": "text",
377
+ "description": "The title of a list or a panel",
378
+ "size": "17px",
379
+ "lineHeight": 1.4,
380
+ "weight": 600,
381
+ "tracking": "-0.012em"
382
+ },
383
+ {
384
+ "name": "body-lg",
385
+ "role": "text",
386
+ "description": "The lead, a paragraph that stands out",
387
+ "size": "18px",
388
+ "lineHeight": 1.6,
389
+ "weight": 400,
390
+ "tracking": "-0.014em"
391
+ },
392
+ {
393
+ "name": "body-md",
394
+ "role": "text",
395
+ "description": "Running text",
396
+ "size": "16px",
397
+ "lineHeight": 1.6,
398
+ "weight": 400,
399
+ "tracking": "-0.011em"
400
+ },
401
+ {
402
+ "name": "body-sm",
403
+ "role": "text",
404
+ "description": "Dense interface, secondary text",
405
+ "size": "14px",
406
+ "lineHeight": 1.5,
407
+ "weight": 400,
408
+ "tracking": "-0.006em"
409
+ },
410
+ {
411
+ "name": "caption",
412
+ "role": "text",
413
+ "description": "Captions, help, metadata",
414
+ "size": "12px",
415
+ "lineHeight": 1.4,
416
+ "weight": 500,
417
+ "tracking": "0em"
418
+ },
419
+ {
420
+ "name": "overline",
421
+ "role": "mono",
422
+ "description": "The overline of a section, uppercase",
423
+ "size": "11px",
424
+ "lineHeight": 1.3,
425
+ "weight": 600,
426
+ "tracking": "0.12em"
427
+ },
428
+ {
429
+ "name": "mono-md",
430
+ "role": "mono",
431
+ "description": "Code blocks",
432
+ "size": "14px",
433
+ "lineHeight": 1.6,
434
+ "weight": 400,
435
+ "tracking": "0em"
436
+ },
437
+ {
438
+ "name": "mono-sm",
439
+ "role": "mono",
440
+ "description": "Identifiers, endpoints, versions",
441
+ "size": "12px",
442
+ "lineHeight": 1.5,
443
+ "weight": 400,
444
+ "tracking": "0em"
445
+ }
446
+ ]);
447
+
147
448
  /** The brand themes: the accent family of each Krizaka brand, raw CSS per theme (aliases resolved). */
148
449
  export const brands = /* @__PURE__ */ Object.freeze({
149
450
  "krizaka": {
package/dist/native.d.ts CHANGED
@@ -50,11 +50,22 @@ export declare const radius: {
50
50
  /** Font families: the first family of each web stack (React Native takes a single name). */
51
51
  export declare const typography: {
52
52
  readonly sans: "Inter";
53
- readonly display: "Inter";
53
+ readonly text: "Inter";
54
+ readonly display: "Plus Jakarta Sans";
54
55
  readonly mono: "JetBrains Mono";
55
56
  };
56
57
  /** Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`). */
57
58
  export declare const motion: { readonly ease: readonly [number, number, number, number] };
59
+ /** A step of the type scale, in dp. */
60
+ export interface NativeTypeStep {
61
+ readonly role: "display" | "text" | "mono";
62
+ readonly fontSize: number;
63
+ readonly lineHeight: number;
64
+ readonly fontWeight: "400" | "500" | "600" | "700" | "800";
65
+ readonly letterSpacing: number;
66
+ }
67
+ /** The type scale in dp (React Native): fontSize, lineHeight and letterSpacing absolute, the role whose family sets it. */
68
+ export declare const typeScale: { readonly [K in "display2xl" | "displayXl" | "displayLg" | "displayMd" | "displaySm" | "titleLg" | "titleMd" | "bodyLg" | "bodyMd" | "bodySm" | "caption" | "overline" | "monoMd" | "monoSm"]: NativeTypeStep };
58
69
 
59
70
  /** A Krizaka brand. */
60
71
  export type BrandId = "krizaka" | "orazaka" | "orochia";
package/dist/native.js CHANGED
@@ -83,13 +83,119 @@ export const radius = /* @__PURE__ */ Object.freeze({
83
83
  /** Font families: the first family of each web stack (React Native takes a single name). */
84
84
  export const typography = /* @__PURE__ */ Object.freeze({
85
85
  "sans": "Inter",
86
- "display": "Inter",
86
+ "text": "Inter",
87
+ "display": "Plus Jakarta Sans",
87
88
  "mono": "JetBrains Mono"
88
89
  });
89
90
 
90
91
  /** Motion: the cubic-bezier control points (`Easing.bezier(...motion.ease)`). */
91
92
  export const motion = /* @__PURE__ */ Object.freeze({ ease: /* @__PURE__ */ Object.freeze([0.16,1,0.3,1]) });
92
93
 
94
+ /**
95
+ * The type scale in dp: fontSize, lineHeight and letterSpacing absolute (React Native has no em), fontWeight as a string,
96
+ * and the role whose family sets it — with @krizaka/fonts: `{ ...typeScale.bodyMd, fontFamily: fontFamily(role, weight) }`.
97
+ */
98
+ export const typeScale = /* @__PURE__ */ Object.freeze({
99
+ "display2xl": {
100
+ "role": "display",
101
+ "fontSize": 72,
102
+ "lineHeight": 73,
103
+ "fontWeight": "800",
104
+ "letterSpacing": -2.52
105
+ },
106
+ "displayXl": {
107
+ "role": "display",
108
+ "fontSize": 56,
109
+ "lineHeight": 59,
110
+ "fontWeight": "800",
111
+ "letterSpacing": -1.68
112
+ },
113
+ "displayLg": {
114
+ "role": "display",
115
+ "fontSize": 44,
116
+ "lineHeight": 48,
117
+ "fontWeight": "700",
118
+ "letterSpacing": -1.1
119
+ },
120
+ "displayMd": {
121
+ "role": "display",
122
+ "fontSize": 34,
123
+ "lineHeight": 39,
124
+ "fontWeight": "700",
125
+ "letterSpacing": -0.68
126
+ },
127
+ "displaySm": {
128
+ "role": "display",
129
+ "fontSize": 26,
130
+ "lineHeight": 31,
131
+ "fontWeight": "700",
132
+ "letterSpacing": -0.39
133
+ },
134
+ "titleLg": {
135
+ "role": "display",
136
+ "fontSize": 20,
137
+ "lineHeight": 27,
138
+ "fontWeight": "700",
139
+ "letterSpacing": -0.2
140
+ },
141
+ "titleMd": {
142
+ "role": "text",
143
+ "fontSize": 17,
144
+ "lineHeight": 24,
145
+ "fontWeight": "600",
146
+ "letterSpacing": -0.2
147
+ },
148
+ "bodyLg": {
149
+ "role": "text",
150
+ "fontSize": 18,
151
+ "lineHeight": 29,
152
+ "fontWeight": "400",
153
+ "letterSpacing": -0.25
154
+ },
155
+ "bodyMd": {
156
+ "role": "text",
157
+ "fontSize": 16,
158
+ "lineHeight": 26,
159
+ "fontWeight": "400",
160
+ "letterSpacing": -0.18
161
+ },
162
+ "bodySm": {
163
+ "role": "text",
164
+ "fontSize": 14,
165
+ "lineHeight": 21,
166
+ "fontWeight": "400",
167
+ "letterSpacing": -0.08
168
+ },
169
+ "caption": {
170
+ "role": "text",
171
+ "fontSize": 12,
172
+ "lineHeight": 17,
173
+ "fontWeight": "500",
174
+ "letterSpacing": 0
175
+ },
176
+ "overline": {
177
+ "role": "mono",
178
+ "fontSize": 11,
179
+ "lineHeight": 14,
180
+ "fontWeight": "600",
181
+ "letterSpacing": 1.32
182
+ },
183
+ "monoMd": {
184
+ "role": "mono",
185
+ "fontSize": 14,
186
+ "lineHeight": 22,
187
+ "fontWeight": "400",
188
+ "letterSpacing": 0
189
+ },
190
+ "monoSm": {
191
+ "role": "mono",
192
+ "fontSize": 12,
193
+ "lineHeight": 18,
194
+ "fontWeight": "400",
195
+ "letterSpacing": 0
196
+ }
197
+ });
198
+
93
199
  /** The brand themes as ThemeProvider overrides (`overrides={brands.orazaka}`): the accent family per theme. */
94
200
  export const brands = /* @__PURE__ */ Object.freeze({
95
201
  "krizaka": {
package/dist/tokens.css CHANGED
@@ -45,8 +45,8 @@
45
45
  --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
46
  --kz-shadow-lg: 0 8px 24px hsl(0 0% 0% / 0.18), 0 4px 8px hsl(0 0% 0% / 0.08); /* Dialogue, feuille */
47
47
 
48
- /* Typographie */
49
- --kz-font-display: var(--kz-font-sans); /* Titres ; égal à sans par défaut, surchargé par le thème produit */
48
+ /* Typographie — les trois familles de @krizaka/fonts, chacune suivie de son repli aux métriques ajustées */
49
+ --kz-font-text: var(--kz-font-sans); /* Alias de sans : le rôle texte */
50
50
  }
51
51
 
52
52
  /* Light. */
@@ -109,7 +109,7 @@ html.light {
109
109
  --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
110
  --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
111
  --kz-shadow-lg: 0 8px 24px hsl(240 6% 0% / 0.10), 0 4px 8px hsl(240 6% 0% / 0.05); /* Dialogue, feuille */
112
- --kz-font-display: var(--kz-font-sans); /* Titres ; égal à sans par défaut, surchargé par le thème produit */
112
+ --kz-font-text: var(--kz-font-sans); /* Alias de sans : le rôle texte */
113
113
  }
114
114
 
115
115
  /* Invariants : identiques dans les deux thèmes. Tout ce qui se pose SUR un média les utilise. */
@@ -134,7 +134,92 @@ html.light {
134
134
  --kz-radius-full: 9999px; /* Pastille, avatar */
135
135
  --kz-ease: cubic-bezier(0.16, 1, 0.3, 1); /* Courbe par défaut de la signature de mouvement */
136
136
 
137
- /* Typographie */
138
- --kz-font-sans: Inter, system-ui, sans-serif; /* Interface et texte courant */
139
- --kz-font-mono: "JetBrains Mono", ui-monospace, monospace; /* Code, montants alignés */
137
+ /* Typographie — les trois familles de @krizaka/fonts, chacune suivie de son repli aux métriques ajustées */
138
+ --kz-font-sans: Inter, "Inter Fallback", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; /* Texte : interface et lecture (Inter) */
139
+ --kz-font-display: "Plus Jakarta Sans", "Plus Jakarta Sans Fallback", Inter, system-ui, sans-serif; /* Affichage : titres, chiffres (Plus Jakarta Sans) ; surchargé par le thème produit */
140
+ --kz-font-mono: "JetBrains Mono", "JetBrains Mono Fallback", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; /* Code, identifiants, surtitres (JetBrains Mono) */
141
+
142
+ /* The hero of a home page */
143
+ --kz-type-display-2xl-size: 72px;
144
+ --kz-type-display-2xl-line-height: 1.02;
145
+ --kz-type-display-2xl-weight: 800;
146
+ --kz-type-display-2xl-tracking: -0.035em;
147
+
148
+ /* The hero of a page */
149
+ --kz-type-display-xl-size: 56px;
150
+ --kz-type-display-xl-line-height: 1.05;
151
+ --kz-type-display-xl-weight: 800;
152
+ --kz-type-display-xl-tracking: -0.03em;
153
+
154
+ /* The title of a page */
155
+ --kz-type-display-lg-size: 44px;
156
+ --kz-type-display-lg-line-height: 1.1;
157
+ --kz-type-display-lg-weight: 700;
158
+ --kz-type-display-lg-tracking: -0.025em;
159
+
160
+ /* The title of a section */
161
+ --kz-type-display-md-size: 34px;
162
+ --kz-type-display-md-line-height: 1.15;
163
+ --kz-type-display-md-weight: 700;
164
+ --kz-type-display-md-tracking: -0.02em;
165
+
166
+ /* A sub-section, a big figure */
167
+ --kz-type-display-sm-size: 26px;
168
+ --kz-type-display-sm-line-height: 1.2;
169
+ --kz-type-display-sm-weight: 700;
170
+ --kz-type-display-sm-tracking: -0.015em;
171
+
172
+ /* The title of a card or a dialog */
173
+ --kz-type-title-lg-size: 20px;
174
+ --kz-type-title-lg-line-height: 1.35;
175
+ --kz-type-title-lg-weight: 700;
176
+ --kz-type-title-lg-tracking: -0.01em;
177
+
178
+ /* The title of a list or a panel */
179
+ --kz-type-title-md-size: 17px;
180
+ --kz-type-title-md-line-height: 1.4;
181
+ --kz-type-title-md-weight: 600;
182
+ --kz-type-title-md-tracking: -0.012em;
183
+
184
+ /* The lead, a paragraph that stands out */
185
+ --kz-type-body-lg-size: 18px;
186
+ --kz-type-body-lg-line-height: 1.6;
187
+ --kz-type-body-lg-weight: 400;
188
+ --kz-type-body-lg-tracking: -0.014em;
189
+
190
+ /* Running text */
191
+ --kz-type-body-md-size: 16px;
192
+ --kz-type-body-md-line-height: 1.6;
193
+ --kz-type-body-md-weight: 400;
194
+ --kz-type-body-md-tracking: -0.011em;
195
+
196
+ /* Dense interface, secondary text */
197
+ --kz-type-body-sm-size: 14px;
198
+ --kz-type-body-sm-line-height: 1.5;
199
+ --kz-type-body-sm-weight: 400;
200
+ --kz-type-body-sm-tracking: -0.006em;
201
+
202
+ /* Captions, help, metadata */
203
+ --kz-type-caption-size: 12px;
204
+ --kz-type-caption-line-height: 1.4;
205
+ --kz-type-caption-weight: 500;
206
+ --kz-type-caption-tracking: 0em;
207
+
208
+ /* The overline of a section, uppercase */
209
+ --kz-type-overline-size: 11px;
210
+ --kz-type-overline-line-height: 1.3;
211
+ --kz-type-overline-weight: 600;
212
+ --kz-type-overline-tracking: 0.12em;
213
+
214
+ /* Code blocks */
215
+ --kz-type-mono-md-size: 14px;
216
+ --kz-type-mono-md-line-height: 1.6;
217
+ --kz-type-mono-md-weight: 400;
218
+ --kz-type-mono-md-tracking: 0em;
219
+
220
+ /* Identifiers, endpoints, versions */
221
+ --kz-type-mono-sm-size: 12px;
222
+ --kz-type-mono-sm-line-height: 1.5;
223
+ --kz-type-mono-sm-weight: 400;
224
+ --kz-type-mono-sm-tracking: 0em;
140
225
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krizaka/tokens",
3
- "version": "2.3.0",
3
+ "version": "2.4.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": "2.5 kB",
76
+ "limit": "3.1 kB",
77
77
  "gzip": true,
78
78
  "rolldown": false
79
79
  },
@@ -94,7 +94,7 @@
94
94
  {
95
95
  "name": ".",
96
96
  "path": "dist/index.js",
97
- "limit": "2 kB",
97
+ "limit": "3 kB",
98
98
  "gzip": true
99
99
  },
100
100
  {