@omni-design/components 0.11.0 → 0.13.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.
Files changed (64) hide show
  1. package/.claude/commands/ScanComponents.md +1 -1
  2. package/.claude/commands/ShareComponent.md +1 -1
  3. package/CLAUDE.md +5 -3
  4. package/dist/OmniDesignProvider.esm.js +1 -1
  5. package/dist/OmniDesignProvider.esm.js.map +1 -1
  6. package/dist/OmniDesignProvider.js +1 -1
  7. package/dist/OmniDesignProvider.js.map +1 -1
  8. package/dist/index.esm.js +8 -3
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +8 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/types/components/BackgroundPicker.d.ts +1 -1
  13. package/dist/types/components/BrandIcon/BrandIcon.d.ts +20 -0
  14. package/dist/types/components/BrandIcon/index.d.ts +1 -0
  15. package/dist/types/components/Button/Button.d.ts +3 -1
  16. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +3 -2
  17. package/dist/types/components/Charts/tokens.d.ts +1 -1
  18. package/dist/types/components/Chip/Chip.d.ts +1 -1
  19. package/dist/types/components/Footer/Footer.d.ts +3 -1
  20. package/dist/types/components/Foundations/FoundationTopic.d.ts +4 -0
  21. package/dist/types/components/Foundations/HowToSlot.d.ts +16 -0
  22. package/dist/types/components/Foundations/TokenRoles.d.ts +19 -0
  23. package/dist/types/components/Foundations/TypographySummary.d.ts +2 -0
  24. package/dist/types/components/IconBadge/IconBadge.d.ts +1 -1
  25. package/dist/types/components/Loader/Loader.d.ts +66 -0
  26. package/dist/types/components/Loader/index.d.ts +1 -0
  27. package/dist/types/components/MiniSwatch/MiniSwatch.d.ts +7 -0
  28. package/dist/types/components/MiniSwatch/index.d.ts +1 -0
  29. package/dist/types/components/ShowcaseHeader.d.ts +5 -0
  30. package/dist/types/components/Swatch/Swatch.d.ts +14 -0
  31. package/dist/types/components/Swatch/index.d.ts +1 -0
  32. package/dist/types/components/Switch/Switch.d.ts +24 -8
  33. package/dist/types/components/Switch/index.d.ts +1 -1
  34. package/dist/types/components/TextField/TextField.d.ts +1 -1
  35. package/dist/types/components/Typography/Typography.d.ts +54 -1
  36. package/dist/types/components/Typography/index.d.ts +1 -1
  37. package/dist/types/components/_states.d.ts +1 -1
  38. package/dist/types/components/a11yPanel.d.ts +37 -0
  39. package/dist/types/components/index.d.ts +7 -1
  40. package/dist/types/docs/DocPanels.d.ts +25 -0
  41. package/dist/types/docs/components.d.ts +220 -0
  42. package/dist/types/docs/componentsData.d.ts +587 -0
  43. package/dist/types/docs/componentsForms.d.ts +597 -0
  44. package/dist/types/docs/componentsNav.d.ts +420 -0
  45. package/dist/types/docs/componentsOverlays.d.ts +379 -0
  46. package/dist/types/docs/componentsRest.d.ts +158 -0
  47. package/dist/types/docs/componentsSurfaces.d.ts +429 -0
  48. package/dist/types/docs/docsLink.d.ts +32 -0
  49. package/dist/types/docs/examples.d.ts +48 -0
  50. package/dist/types/docs/figmaHowTo.d.ts +28 -0
  51. package/dist/types/docs/figmaLinks.d.ts +58 -0
  52. package/dist/types/docs/foundations.d.ts +40 -0
  53. package/dist/types/docs/index.d.ts +5 -0
  54. package/docs/components.md +71 -55
  55. package/package.json +4 -2
  56. package/public/styles/Dark-Mode.css +12062 -13009
  57. package/public/styles/Light-Mode.css +11246 -12370
  58. package/public/styles/base.css +387 -182
  59. package/public/styles/core.css +569 -133
  60. package/public/styles/foundation.css +142 -53
  61. package/public/styles/styles.css +5 -5
  62. package/public/styles/theme.json +2 -2
  63. package/public/styles/typography-tokens.css +873 -96
  64. package/dist/types/theme/useThemeMode.d.ts +0 -4
@@ -1,62 +1,381 @@
1
- /* ============================================================================
2
- * typography-tokens.css — STATIC: lib-owned, do not regenerate per design system.
3
- * Platform-scaled type sizes (Desktop / IOS-Mobile / etc.) — does NOT
4
- * reference any brand value, so the same file works for every design system.
5
- * The "Auto-generated" note below refers to the template itself being
6
- * auto-generated upstream, not per-design-system regeneration.
7
- * ============================================================================ */
1
+ @import url('https://fonts.googleapis.com/css2?family=Google+Sans+Flex:GRAD,ROND,opsz,slnt,wdth,wght@0..100,0..100,6..144,-10..0,25..151,1..1000&display=swap');
2
+ @import url('https://fonts.googleapis.com/css2?family=Raleway:wght@400&display=swap');
3
+ @import url('https://fonts.googleapis.com/css2?family=Google+Sans+Flex:wght@640&display=swap');
4
+ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap');
8
5
 
9
6
  /* typography-tokens.css
10
7
  * Auto-generated — do not edit by hand.
11
- * Apply [data-platform="Desktop"] etc to your root element.
8
+ * Apply [data-device="Desktop"] etc to your root element.
12
9
  */
13
10
 
14
- [data-platform="Desktop"] {
11
+ [data-device="Desktop"] {
12
+ /* Faces */
13
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
14
+ --Font-Family-Header: var(--Platform-Font-Families-Header, var(--Set-Font-Family-Header));
15
+ --Font-Family-Eyebrow: var(--Set-Font-Family-Eyebrow, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
16
+ --Font-Family-Body: var(--Platform-Font-Families-Body, var(--Set-Font-Family-Body));
17
+
18
+ /* Face weights */
19
+ --Font-Weight-Display: 400;
20
+ --Font-Weight-Header: 640;
21
+ --Font-Weight-Eyebrow: 400;
22
+ --Font-Weight-Body: 400;
23
+ --Header-Clamped-Weight: 640;
24
+
25
+ /* Variable-font axes */
26
+ --Font-Slant-Header: 0;
27
+ --Font-Grade-Header: 50;
28
+ --Font-Width-Header: 72;
29
+ --Font-Roundness-Header: 0;
30
+ --Font-Optical-Size-Header: 96;
31
+ --Font-Variation-Header: "slnt" var(--Font-Slant-Header), "GRAD" var(--Font-Grade-Header), "wdth" var(--Font-Width-Header), "ROND" var(--Font-Roundness-Header), "opsz" var(--Font-Optical-Size-Header);
32
+
33
+ /* Display — Large and Medium belong in Header or Hero areas. Small is the one sized to sit inside a component — a card title, a stat, a pull quote. */
34
+ --Display-Large-Font-Family: var(--Font-Family-Display);
35
+ --Display-Large-Font-Size: 72px;
36
+ --Display-Large-Font-Weight: var(--Font-Weight-Display);
37
+ --Display-Large-Line-Height: 88px;
38
+ --Display-Large-Letter-Spacing: 0em;
39
+ --Display-Large-Text-Transform: none;
40
+ --Display-Medium-Font-Family: var(--Font-Family-Display);
41
+ --Display-Medium-Font-Size: 60px;
42
+ --Display-Medium-Font-Weight: var(--Font-Weight-Display);
43
+ --Display-Medium-Line-Height: 76px;
44
+ --Display-Medium-Letter-Spacing: 0em;
45
+ --Display-Medium-Text-Transform: none;
46
+ --Display-Small-Font-Family: var(--Font-Family-Display);
47
+ --Display-Small-Font-Size: 48px;
48
+ --Display-Small-Font-Weight: var(--Font-Weight-Display);
49
+ --Display-Small-Line-Height: 60px;
50
+ --Display-Small-Letter-Spacing: 0em;
51
+ --Display-Small-Text-Transform: none;
52
+ --Alt-Display-Large-Font-Family: var(--Font-Family-Display);
53
+ --Alt-Display-Large-Font-Size: 72px;
54
+ --Alt-Display-Large-Font-Weight: 900;
55
+ --Alt-Display-Large-Line-Height: 88px;
56
+ --Alt-Display-Large-Letter-Spacing: 0em;
57
+ --Alt-Display-Large-Text-Transform: none;
58
+ --Alt-Display-Medium-Font-Family: var(--Font-Family-Display);
59
+ --Alt-Display-Medium-Font-Size: 60px;
60
+ --Alt-Display-Medium-Font-Weight: 900;
61
+ --Alt-Display-Medium-Line-Height: 76px;
62
+ --Alt-Display-Medium-Letter-Spacing: 0em;
63
+ --Alt-Display-Medium-Text-Transform: none;
64
+ --Alt-Display-Small-Font-Family: var(--Font-Family-Display);
65
+ --Alt-Display-Small-Font-Size: 48px;
66
+ --Alt-Display-Small-Font-Weight: 900;
67
+ --Alt-Display-Small-Line-Height: 60px;
68
+ --Alt-Display-Small-Letter-Spacing: 0em;
69
+ --Alt-Display-Small-Text-Transform: none;
70
+
71
+ /* Header */
72
+ --H1-Font-Family: var(--Font-Family-Header);
73
+ --H1-Font-Size: 48px;
74
+ --H1-Font-Weight: var(--Font-Weight-Header);
75
+ --H1-Line-Height: 56px;
76
+ --H1-Letter-Spacing: -0.0217em;
77
+ --H1-Text-Transform: none;
78
+ --H2-Font-Family: var(--Font-Family-Header);
79
+ --H2-Font-Size: 40px;
80
+ --H2-Font-Weight: var(--Font-Weight-Header);
81
+ --H2-Line-Height: 48px;
82
+ --H2-Letter-Spacing: -0.0163em;
83
+ --H2-Text-Transform: none;
84
+ --H3-Font-Family: var(--Font-Family-Header);
85
+ --H3-Font-Size: 32px;
86
+ --H3-Font-Weight: var(--Font-Weight-Header);
87
+ --H3-Line-Height: 40px;
88
+ --H3-Letter-Spacing: -0.011em;
89
+ --H3-Text-Transform: none;
90
+ --H4-Font-Family: var(--Font-Family-Header);
91
+ --H4-Font-Size: 24px;
92
+ --H4-Font-Weight: var(--Header-Clamped-Weight);
93
+ --H4-Line-Height: 32px;
94
+ --H4-Letter-Spacing: -0.0057em;
95
+ --H4-Text-Transform: none;
96
+ --H5-Font-Family: var(--Font-Family-Header);
97
+ --H5-Font-Size: 20px;
98
+ --H5-Font-Weight: var(--Header-Clamped-Weight);
99
+ --H5-Line-Height: 28px;
100
+ --H5-Letter-Spacing: -0.003em;
101
+ --H5-Text-Transform: none;
102
+ --H6-Font-Family: var(--Font-Family-Header);
103
+ --H6-Font-Size: 18px;
104
+ --H6-Font-Weight: var(--Header-Clamped-Weight);
105
+ --H6-Line-Height: 24px;
106
+ --H6-Letter-Spacing: -0.0017em;
107
+ --H6-Text-Transform: none;
108
+
109
+ /* Subtitle */
110
+ --Subtitle-Small-Font-Family: var(--Font-Family-Body);
111
+ --Subtitle-Small-Font-Size: 14px;
112
+ --Subtitle-Small-Font-Weight: 700;
113
+ --Subtitle-Small-Line-Height: 21px;
114
+ --Subtitle-Small-Letter-Spacing: 0em;
115
+ --Subtitle-Small-Text-Transform: none;
116
+ --Subtitle-Medium-Font-Family: var(--Font-Family-Body);
117
+ --Subtitle-Medium-Font-Size: 16px;
118
+ --Subtitle-Medium-Font-Weight: 700;
119
+ --Subtitle-Medium-Line-Height: 24px;
120
+ --Subtitle-Medium-Letter-Spacing: 0em;
121
+ --Subtitle-Medium-Text-Transform: none;
122
+ --Subtitle-Large-Font-Family: var(--Font-Family-Body);
123
+ --Subtitle-Large-Font-Size: 18px;
124
+ --Subtitle-Large-Font-Weight: 700;
125
+ --Subtitle-Large-Line-Height: 27px;
126
+ --Subtitle-Large-Letter-Spacing: 0em;
127
+ --Subtitle-Large-Text-Transform: none;
128
+
129
+ /* Body */
130
+ --Body-Small-Font-Family: var(--Font-Family-Body);
131
+ --Body-Small-Font-Size: 14px;
132
+ --Body-Small-Font-Weight: var(--Font-Weight-Body);
133
+ --Body-Small-Line-Height: 21px;
134
+ --Body-Small-Letter-Spacing: 0em;
135
+ --Body-Small-Text-Transform: none;
136
+ --Body-Small-Semibold-Font-Weight: 600;
137
+ --Body-Medium-Font-Family: var(--Font-Family-Body);
138
+ --Body-Medium-Font-Size: 16px;
139
+ --Body-Medium-Font-Weight: var(--Font-Weight-Body);
140
+ --Body-Medium-Line-Height: 24px;
141
+ --Body-Medium-Letter-Spacing: 0em;
142
+ --Body-Medium-Text-Transform: none;
143
+ --Body-Medium-Semibold-Font-Weight: 600;
144
+ --Body-Large-Font-Family: var(--Font-Family-Body);
145
+ --Body-Large-Font-Size: 18px;
146
+ --Body-Large-Font-Weight: var(--Font-Weight-Body);
147
+ --Body-Large-Line-Height: 27px;
148
+ --Body-Large-Letter-Spacing: 0em;
149
+ --Body-Large-Text-Transform: none;
150
+ --Body-Large-Semibold-Font-Weight: 600;
151
+
152
+ /* Caption */
153
+ --Caption-Small-Font-Family: var(--Font-Family-Body);
154
+ --Caption-Small-Font-Size: 12px;
155
+ --Caption-Small-Font-Weight: 500;
156
+ --Caption-Small-Line-Height: 18px;
157
+ --Caption-Small-Letter-Spacing: 0.0083em;
158
+ --Caption-Small-Text-Transform: none;
159
+ --Caption-Small-Bold-Font-Weight: 700;
160
+ --Caption-Small-Paragraph-Spacing: 24px;
161
+ --Caption-Font-Family: var(--Font-Family-Body);
162
+ --Caption-Font-Size: 14px;
163
+ --Caption-Font-Weight: 500;
164
+ --Caption-Line-Height: 21px;
165
+ --Caption-Letter-Spacing: 0.0071em;
166
+ --Caption-Text-Transform: none;
167
+ --Caption-Bold-Font-Weight: 700;
168
+ --Caption-Paragraph-Spacing: 28px;
169
+ --Caption-Large-Font-Family: var(--Font-Family-Body);
170
+ --Caption-Large-Font-Size: 16px;
171
+ --Caption-Large-Font-Weight: 500;
172
+ --Caption-Large-Line-Height: 24px;
173
+ --Caption-Large-Letter-Spacing: 0.0063em;
174
+ --Caption-Large-Text-Transform: none;
175
+ --Caption-Large-Bold-Font-Weight: 700;
176
+ --Caption-Large-Paragraph-Spacing: 32px;
177
+
178
+ /* Label */
179
+ --Label-ExtraSmall-Font-Family: var(--Font-Family-Body);
180
+ --Label-ExtraSmall-Font-Size: 11px;
181
+ --Label-ExtraSmall-Font-Weight: 600;
182
+ --Label-ExtraSmall-Line-Height: 16.5px;
183
+ --Label-ExtraSmall-Letter-Spacing: 0.0455em;
184
+ --Label-ExtraSmall-Text-Transform: none;
185
+ --Label-Small-Font-Family: var(--Font-Family-Body);
186
+ --Label-Small-Font-Size: 12.5px;
187
+ --Label-Small-Font-Weight: 600;
188
+ --Label-Small-Line-Height: 18.75px;
189
+ --Label-Small-Letter-Spacing: 0.02em;
190
+ --Label-Small-Text-Transform: none;
191
+ --Label-Small-All-Caps-Font-Family: var(--Font-Family-Body);
192
+ --Label-Small-All-Caps-Font-Size: 12.5px;
193
+ --Label-Small-All-Caps-Font-Weight: 600;
194
+ --Label-Small-All-Caps-Line-Height: 18.75px;
195
+ --Label-Small-All-Caps-Letter-Spacing: 0.02em;
196
+ --Label-Small-All-Caps-Text-Transform: uppercase;
197
+ --Label-Medium-Font-Family: var(--Font-Family-Body);
198
+ --Label-Medium-Font-Size: 16px;
199
+ --Label-Medium-Font-Weight: 600;
200
+ --Label-Medium-Line-Height: 24px;
201
+ --Label-Medium-Letter-Spacing: 0em;
202
+ --Label-Medium-Text-Transform: none;
203
+ --Label-Medium-All-Caps-Font-Family: var(--Font-Family-Body);
204
+ --Label-Medium-All-Caps-Font-Size: 16px;
205
+ --Label-Medium-All-Caps-Font-Weight: 600;
206
+ --Label-Medium-All-Caps-Line-Height: 24px;
207
+ --Label-Medium-All-Caps-Letter-Spacing: 0em;
208
+ --Label-Medium-All-Caps-Text-Transform: uppercase;
209
+ --Label-Large-Font-Family: var(--Font-Family-Body);
210
+ --Label-Large-Font-Size: 18px;
211
+ --Label-Large-Font-Weight: 600;
212
+ --Label-Large-Line-Height: 27px;
213
+ --Label-Large-Letter-Spacing: 0em;
214
+ --Label-Large-Text-Transform: none;
215
+ --Label-Large-All-Caps-Font-Family: var(--Font-Family-Body);
216
+ --Label-Large-All-Caps-Font-Size: 18px;
217
+ --Label-Large-All-Caps-Font-Weight: 600;
218
+ --Label-Large-All-Caps-Line-Height: 27px;
219
+ --Label-Large-All-Caps-Letter-Spacing: 0em;
220
+ --Label-Large-All-Caps-Text-Transform: uppercase;
221
+
222
+ /* Mobile-Nav-Label */
223
+ --Mobile-Nav-Label-Font-Family: var(--Font-Family-Body);
224
+ --Mobile-Nav-Label-Font-Size: 11px;
225
+ --Mobile-Nav-Label-Font-Weight: 600;
226
+ --Mobile-Nav-Label-Line-Height: 16.5px;
227
+ --Mobile-Nav-Label-Letter-Spacing: 0.0455em;
228
+ --Mobile-Nav-Label-Text-Transform: none;
229
+
230
+ /* Legal */
231
+ --Legal-Font-Family: var(--Font-Family-Body);
232
+ --Legal-Font-Size: 10px;
233
+ --Legal-Font-Weight: 400;
234
+ --Legal-Line-Height: 15px;
235
+ --Legal-Letter-Spacing: 0em;
236
+ --Legal-Text-Transform: none;
237
+ --Legal-Semibold-Font-Weight: 600;
238
+ --Legal-Paragraph-Spacing: 20px;
239
+
240
+ /* Eyebrow — Eyebrow label — uppercase and tracked. Sits above a heading. */
241
+ --Eyebrow-Small-Font-Size: 12px;
242
+ --Eyebrow-Small-Font-Weight: 600;
243
+ --Eyebrow-Small-Line-Height: 18px;
244
+ --Eyebrow-Small-Letter-Spacing: 0.06em;
245
+ --Eyebrow-Small-Text-Transform: uppercase;
246
+ --Overline-Small-Font-Size: var(--Eyebrow-Small-Font-Size);
247
+ --Overline-Small-Font-Weight: var(--Eyebrow-Small-Font-Weight);
248
+ --Overline-Small-Line-Height: var(--Eyebrow-Small-Line-Height);
249
+ --Overline-Small-Letter-Spacing: var(--Eyebrow-Small-Letter-Spacing);
250
+ --Overline-Small-Text-Transform: var(--Eyebrow-Small-Text-Transform);
251
+ --Eyebrow-Medium-Font-Size: 16px;
252
+ --Eyebrow-Medium-Font-Weight: 600;
253
+ --Eyebrow-Medium-Line-Height: 24px;
254
+ --Eyebrow-Medium-Letter-Spacing: 0.05em;
255
+ --Eyebrow-Medium-Text-Transform: uppercase;
256
+ --Overline-Medium-Font-Size: var(--Eyebrow-Medium-Font-Size);
257
+ --Overline-Medium-Font-Weight: var(--Eyebrow-Medium-Font-Weight);
258
+ --Overline-Medium-Line-Height: var(--Eyebrow-Medium-Line-Height);
259
+ --Overline-Medium-Letter-Spacing: var(--Eyebrow-Medium-Letter-Spacing);
260
+ --Overline-Medium-Text-Transform: var(--Eyebrow-Medium-Text-Transform);
261
+ --Eyebrow-Large-Font-Size: 18px;
262
+ --Eyebrow-Large-Font-Weight: 600;
263
+ --Eyebrow-Large-Line-Height: 27px;
264
+ --Eyebrow-Large-Letter-Spacing: 0.04em;
265
+ --Eyebrow-Large-Text-Transform: uppercase;
266
+ --Overline-Large-Font-Size: var(--Eyebrow-Large-Font-Size);
267
+ --Overline-Large-Font-Weight: var(--Eyebrow-Large-Font-Weight);
268
+ --Overline-Large-Line-Height: var(--Eyebrow-Large-Line-Height);
269
+ --Overline-Large-Letter-Spacing: var(--Eyebrow-Large-Letter-Spacing);
270
+ --Overline-Large-Text-Transform: var(--Eyebrow-Large-Text-Transform);
271
+
272
+ /* Number */
273
+ --Number-Small-Font-Family: var(--Font-Family-Body);
274
+ --Number-Small-Font-Size: 16px;
275
+ --Number-Small-Font-Weight: 700;
276
+ --Number-Small-Line-Height: 16px;
277
+ --Number-Small-Letter-Spacing: 0em;
278
+ --Number-Small-Text-Transform: none;
279
+ --Number-Medium-Font-Family: var(--Font-Family-Body);
280
+ --Number-Medium-Font-Size: 28px;
281
+ --Number-Medium-Font-Weight: 700;
282
+ --Number-Medium-Line-Height: 28px;
283
+ --Number-Medium-Letter-Spacing: 0em;
284
+ --Number-Medium-Text-Transform: none;
285
+ --Number-Large-Font-Family: var(--Font-Family-Body);
286
+ --Number-Large-Font-Size: 36px;
287
+ --Number-Large-Font-Weight: 700;
288
+ --Number-Large-Line-Height: 36px;
289
+ --Number-Large-Letter-Spacing: 0em;
290
+ --Number-Large-Text-Transform: none;
291
+
292
+ /* Button */
293
+ --Button-ExtraSmall-Font-Family: var(--Font-Family-Body);
294
+ --Button-ExtraSmall-Font-Size: 11px;
295
+ --Button-ExtraSmall-Font-Weight: 600;
296
+ --Button-ExtraSmall-Line-Height: 11px;
297
+ --Button-ExtraSmall-Letter-Spacing: 0em;
298
+ --Button-ExtraSmall-Text-Transform: none;
299
+ --Button-Small-Font-Family: var(--Font-Family-Body);
300
+ --Button-Small-Font-Size: 14px;
301
+ --Button-Small-Font-Weight: 600;
302
+ --Button-Small-Line-Height: 14px;
303
+ --Button-Small-Letter-Spacing: 0em;
304
+ --Button-Small-Text-Transform: none;
305
+ --Button-Medium-Font-Family: var(--Font-Family-Body);
306
+ --Button-Medium-Font-Size: 16px;
307
+ --Button-Medium-Font-Weight: 600;
308
+ --Button-Medium-Line-Height: 16px;
309
+ --Button-Medium-Letter-Spacing: 0em;
310
+ --Button-Medium-Text-Transform: none;
311
+ --Button-Standard-Font-Size: var(--Button-Medium-Font-Size);
312
+ --Button-Standard-Font-Weight: var(--Button-Medium-Font-Weight);
313
+ --Button-Standard-Line-Height: var(--Button-Medium-Line-Height);
314
+ --Button-Standard-Letter-Spacing: var(--Button-Medium-Letter-Spacing);
315
+ --Button-Large-Font-Family: var(--Font-Family-Body);
316
+ --Button-Large-Font-Size: 24px;
317
+ --Button-Large-Font-Weight: 600;
318
+ --Button-Large-Line-Height: 24px;
319
+ --Button-Large-Letter-Spacing: 0em;
320
+ --Button-Large-Text-Transform: none;
321
+
322
+ /* Badge */
323
+ --Badge-Font-Family: var(--Font-Family-Body);
324
+ --Badge-Font-Size: 11px;
325
+ --Badge-Font-Weight: 600;
326
+ --Badge-Line-Height: 12px;
327
+ --Badge-Letter-Spacing: 0em;
328
+ --Badge-Text-Transform: none;
329
+ }
330
+
331
+ [data-device="IOS-Mobile"] {
332
+
333
+
15
334
 
16
335
  /* Display */
17
- --Font-Family-Display: var(--Platform-Font-Families-Header);
18
- --Display-Small-Font-Size: 42px;
336
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
337
+ --Display-Small-Font-Size: 34px;
19
338
  --Display-Small-Font-Weight: 600;
20
- --Display-Small-Line-Height: 42px;
339
+ --Display-Small-Line-Height: 41px;
21
340
  --Display-Small-Letter-Spacing: 0px;
22
- --Font-Family-Display: var(--Platform-Font-Families-Header);
23
- --Display-Medium-Font-Size: 45px;
341
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
342
+ --Display-Medium-Font-Size: 40px;
24
343
  --Display-Medium-Font-Weight: 600;
25
- --Display-Medium-Line-Height: 45px;
344
+ --Display-Medium-Line-Height: 48px;
26
345
  --Display-Medium-Letter-Spacing: 0px;
27
- --Font-Family-Display: var(--Platform-Font-Families-Header);
346
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
28
347
  --Display-Large-Font-Size: 48px;
29
348
  --Display-Large-Font-Weight: 600;
30
- --Display-Large-Line-Height: 48px;
349
+ --Display-Large-Line-Height: 58px;
31
350
  --Display-Large-Letter-Spacing: 0px;
32
351
 
33
352
  /* Headers */
34
- --Font-Family-Header: var(--Platform-Font-Families-Header);
35
- --H1-Font-Size: 32px;
353
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
354
+ --H1-Font-Size: 28px;
36
355
  --H1-Font-Weight: 600;
37
- --H1-Line-Height: 32px;
38
- --H1-Letter-Spacing: 1.25px;
39
- --Font-Family-Header: var(--Platform-Font-Families-Header);
40
- --H2-Font-Size: 28px;
356
+ --H1-Line-Height: 28px;
357
+ --H1-Letter-Spacing: 0px;
358
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
359
+ --H2-Font-Size: 26px;
41
360
  --H2-Font-Weight: 600;
42
- --H2-Line-Height: 28px;
43
- --H2-Letter-Spacing: 1.25px;
44
- --Font-Family-Header: var(--Platform-Font-Families-Header);
361
+ --H2-Line-Height: 26px;
362
+ --H2-Letter-Spacing: 0px;
363
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
45
364
  --H3-Font-Size: 24px;
46
365
  --H3-Font-Weight: 600;
47
366
  --H3-Line-Height: 24px;
48
367
  --H3-Letter-Spacing: 0px;
49
- --Font-Family-Header: var(--Platform-Font-Families-Header);
368
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
50
369
  --H4-Font-Size: 20px;
51
370
  --H4-Font-Weight: 600;
52
371
  --H4-Line-Height: 20px;
53
372
  --H4-Letter-Spacing: 0px;
54
- --Font-Family-Header: var(--Platform-Font-Families-Header);
373
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
55
374
  --H5-Font-Size: 18px;
56
375
  --H5-Font-Weight: 600;
57
376
  --H5-Line-Height: 18px;
58
377
  --H5-Letter-Spacing: 0px;
59
- --Font-Family-Header: var(--Platform-Font-Families-Header);
378
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
60
379
  --H6-Font-Size: 16px;
61
380
  --H6-Font-Weight: 600;
62
381
  --H6-Line-Height: 16px;
@@ -69,9 +388,9 @@
69
388
  --Subtitle-Small-Line-Height: 24px;
70
389
  --Subtitle-Small-Letter-Spacing: 0px;
71
390
  --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
72
- --Subtitle-Large-Font-Size: 18px;
391
+ --Subtitle-Large-Font-Size: 16px;
73
392
  --Subtitle-Large-Font-Weight: 700;
74
- --Subtitle-Large-Line-Height: 32px;
393
+ --Subtitle-Large-Line-Height: 24px;
75
394
  --Subtitle-Large-Letter-Spacing: 0px;
76
395
 
77
396
  /* Body */
@@ -84,14 +403,14 @@
84
403
  --Body-Small-Bold-Font-Weight: 700;
85
404
  --Font-Family-Body: var(--Platform-Font-Families-Body);
86
405
  --Body-Medium-Font-Size: 16px;
87
- --Body-Medium-Font-Weight: 500;
406
+ --Body-Medium-Font-Weight: 600;
88
407
  --Body-Medium-Line-Height: 24px;
89
408
  --Body-Medium-Letter-Spacing: 0px;
90
409
  --Body-Medium-Semibold-Font-Weight: 600;
91
410
  --Body-Medium-Bold-Font-Weight: 700;
92
411
  --Font-Family-Body: var(--Platform-Font-Families-Body);
93
412
  --Body-Large-Font-Size: 18px;
94
- --Body-Large-Font-Weight: 500;
413
+ --Body-Large-Font-Weight: 600;
95
414
  --Body-Large-Line-Height: 27px;
96
415
  --Body-Large-Letter-Spacing: 0px;
97
416
  --Body-Large-Semibold-Font-Weight: 600;
@@ -99,11 +418,42 @@
99
418
 
100
419
  /* Caption */
101
420
  --Font-Family-Body: var(--Platform-Font-Families-Body);
421
+ /* Leading here is the PLATFORM's, not the brand's 1.5 — Apple's Dynamic Type's own
422
+ table at 12 / 14 / 16. The Figma payload computes these same numbers for
423
+ every non-Desktop device (typographyPlatform.ts, "LINE HEIGHT is COMPUTED,
424
+ not read"), while this block declared a flat 21 at every size, so one
425
+ caption read 19 in the file and 21 in the stylesheet and nothing could
426
+ see it. Declared rather than left to compute so the two sides state the
427
+ same value instead of arriving at it separately.
428
+
429
+ EVERY property is restated, tracking included, because the payload's
430
+ device-floor merge replaces a style WHOLE — `{...desktopStyles, ...own}`
431
+ keys on the STYLE, not on the property — so a step this block declares
432
+ partially loses whatever it leaves out instead of inheriting it from
433
+ Desktop. That variable then exists on Desktop and nowhere else, and one
434
+ missing on six of seven devices resolves to nothing there, silently. The
435
+ CSS cascade would have carried it; the payload does not, and the payload
436
+ is the half that fails without a sound.
437
+
438
+ The 0px is this block's existing answer for Caption, extended to the two
439
+ new steps rather than importing Desktop's 0.1px nudge — which would leave
440
+ the ramp reading 0.0996 / 0 / 0.1008, three steps of one style disagreeing
441
+ about whether the brand tracks captions at all. Whether mobile SHOULD zero
442
+ it is a brand decision and still open; this only stops the ramp from
443
+ contradicting itself. */
444
+ --Caption-Small-Font-Size: 12px;
445
+ --Caption-Small-Font-Weight: 500;
446
+ --Caption-Small-Letter-Spacing: 0px;
447
+ --Caption-Small-Line-Height: 16px;
102
448
  --Caption-Font-Size: 14px;
103
449
  --Caption-Font-Weight: 500;
104
- --Caption-Line-Height: 21px;
450
+ --Caption-Line-Height: 19px;
105
451
  --Caption-Letter-Spacing: 0px;
106
452
  --Caption-Bold-Font-Weight: 700;
453
+ --Caption-Large-Font-Size: 16px;
454
+ --Caption-Large-Font-Weight: 500;
455
+ --Caption-Large-Letter-Spacing: 0px;
456
+ --Caption-Large-Line-Height: 21px;
107
457
 
108
458
  /* Label */
109
459
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -127,6 +477,14 @@
127
477
  --Label-Large-Line-Height: 27px;
128
478
  --Label-Large-Letter-Spacing: 0px;
129
479
 
480
+
481
+ /* Mobile Nav Label — Apple's tab-bar label: 10pt, untracked. */
482
+ --Font-Family-Mobile-Nav-Label: var(--Platform-Font-Families-Body);
483
+ --Mobile-Nav-Label-Font-Size: 10px;
484
+ --Mobile-Nav-Label-Font-Weight: 600;
485
+ --Mobile-Nav-Label-Line-Height: 10px;
486
+ --Mobile-Nav-Label-Letter-Spacing: 0px;
487
+
130
488
  /* Legal */
131
489
  --Font-Family-Body: var(--Platform-Font-Families-Body);
132
490
  --Legal-Font-Size: 10px;
@@ -136,17 +494,17 @@
136
494
  --Legal-Semibold-Font-Weight: 600;
137
495
 
138
496
  /* Overline */
139
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
497
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
140
498
  --Overline-Small-Font-Size: 14px;
141
499
  --Overline-Small-Font-Weight: 500;
142
500
  --Overline-Small-Line-Height: 21px;
143
501
  --Overline-Small-Letter-Spacing: 0px;
144
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
502
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
145
503
  --Overline-Medium-Font-Size: 16px;
146
504
  --Overline-Medium-Font-Weight: 600;
147
505
  --Overline-Medium-Line-Height: 24px;
148
506
  --Overline-Medium-Letter-Spacing: 0px;
149
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
507
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
150
508
  --Overline-Large-Font-Size: 18px;
151
509
  --Overline-Large-Font-Weight: 600;
152
510
  --Overline-Large-Line-Height: 27px;
@@ -164,9 +522,9 @@
164
522
  --Number-Medium-Line-Height: 28px;
165
523
  --Number-Medium-Letter-Spacing: 0px;
166
524
  --Font-Family-Number: var(--Platform-Font-Families-Body);
167
- --Number-Large-Font-Size: 36px;
525
+ --Number-Large-Font-Size: 18px;
168
526
  --Number-Large-Font-Weight: 700;
169
- --Number-Large-Line-Height: 36px;
527
+ --Number-Large-Line-Height: 27px;
170
528
  --Number-Large-Letter-Spacing: 0px;
171
529
 
172
530
  /* Button */
@@ -181,30 +539,53 @@
181
539
  --Button-Small-Line-Height: 14px;
182
540
  --Button-Small-Letter-Spacing: 0px;
183
541
  --Font-Family-Button: var(--Platform-Font-Families-Body);
184
- --Button-Standard-Font-Size: 16px;
185
- --Button-Standard-Font-Weight: 600;
186
- --Button-Standard-Line-Height: 16px;
187
- --Button-Standard-Letter-Spacing: 0px;
542
+ --Button-Medium-Font-Size: 16px;
543
+ --Button-Medium-Font-Weight: 600;
544
+ --Button-Medium-Line-Height: 16px;
545
+ --Button-Medium-Letter-Spacing: 0px;
546
+ /* was Button-Standard — kept so frozen stylesheets keep resolving. */
547
+ --Button-Standard-Font-Size: var(--Button-Medium-Font-Size);
548
+ --Button-Standard-Font-Weight: var(--Button-Medium-Font-Weight);
549
+ --Button-Standard-Line-Height: var(--Button-Medium-Line-Height);
550
+ --Button-Standard-Letter-Spacing: var(--Button-Medium-Letter-Spacing);
551
+
552
+ /* Alt Display — mirrors Display step for step. The pairing sets one word
553
+ on one baseline ("Omni" + "Design"), so the two must not diverge in
554
+ size or leading; colour is what separates them. */
555
+ --Alt-Display-Small-Font-Size: 34px;
556
+ --Alt-Display-Small-Font-Weight: 900;
557
+ --Alt-Display-Small-Line-Height: 41px;
558
+ --Alt-Display-Small-Letter-Spacing: 0px;
559
+ --Alt-Display-Medium-Font-Size: 40px;
560
+ --Alt-Display-Medium-Font-Weight: 900;
561
+ --Alt-Display-Medium-Line-Height: 48px;
562
+ --Alt-Display-Medium-Letter-Spacing: 0px;
563
+ --Alt-Display-Large-Font-Size: 48px;
564
+ --Alt-Display-Large-Font-Weight: 900;
565
+ --Alt-Display-Large-Line-Height: 58px;
566
+ --Alt-Display-Large-Letter-Spacing: 0px;
188
567
 
189
568
  }
190
569
 
191
- [data-platform="IOS-Mobile"] {
570
+ [data-device="IOS-Tablet"] {
571
+
572
+
192
573
 
193
574
  /* Display */
194
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
195
- --Display-Small-Font-Size: 28px;
575
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
576
+ --Display-Small-Font-Size: 34px;
196
577
  --Display-Small-Font-Weight: 600;
197
- --Display-Small-Line-Height: 28px;
578
+ --Display-Small-Line-Height: 41px;
198
579
  --Display-Small-Letter-Spacing: 0px;
199
- --Font-Family-Display: var(--Platform-Font-Families-Header);
200
- --Display-Medium-Font-Size: 28px;
580
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
581
+ --Display-Medium-Font-Size: 40px;
201
582
  --Display-Medium-Font-Weight: 600;
202
- --Display-Medium-Line-Height: 28px;
583
+ --Display-Medium-Line-Height: 48px;
203
584
  --Display-Medium-Letter-Spacing: 0px;
204
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
205
- --Display-Large-Font-Size: 28px;
585
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
586
+ --Display-Large-Font-Size: 48px;
206
587
  --Display-Large-Font-Weight: 600;
207
- --Display-Large-Line-Height: 28px;
588
+ --Display-Large-Line-Height: 58px;
208
589
  --Display-Large-Letter-Spacing: 0px;
209
590
 
210
591
  /* Headers */
@@ -246,9 +627,9 @@
246
627
  --Subtitle-Small-Line-Height: 24px;
247
628
  --Subtitle-Small-Letter-Spacing: 0px;
248
629
  --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
249
- --Subtitle-Large-Font-Size: 16px;
630
+ --Subtitle-Large-Font-Size: 18px;
250
631
  --Subtitle-Large-Font-Weight: 700;
251
- --Subtitle-Large-Line-Height: 24px;
632
+ --Subtitle-Large-Line-Height: 32px;
252
633
  --Subtitle-Large-Letter-Spacing: 0px;
253
634
 
254
635
  /* Body */
@@ -261,7 +642,7 @@
261
642
  --Body-Small-Bold-Font-Weight: 700;
262
643
  --Font-Family-Body: var(--Platform-Font-Families-Body);
263
644
  --Body-Medium-Font-Size: 16px;
264
- --Body-Medium-Font-Weight: 600;
645
+ --Body-Medium-Font-Weight: 500;
265
646
  --Body-Medium-Line-Height: 24px;
266
647
  --Body-Medium-Letter-Spacing: 0px;
267
648
  --Body-Medium-Semibold-Font-Weight: 600;
@@ -276,11 +657,42 @@
276
657
 
277
658
  /* Caption */
278
659
  --Font-Family-Body: var(--Platform-Font-Families-Body);
660
+ /* Leading here is the PLATFORM's, not the brand's 1.5 — Apple's Dynamic Type's own
661
+ table at 12 / 14 / 16. The Figma payload computes these same numbers for
662
+ every non-Desktop device (typographyPlatform.ts, "LINE HEIGHT is COMPUTED,
663
+ not read"), while this block declared a flat 21 at every size, so one
664
+ caption read 19 in the file and 21 in the stylesheet and nothing could
665
+ see it. Declared rather than left to compute so the two sides state the
666
+ same value instead of arriving at it separately.
667
+
668
+ EVERY property is restated, tracking included, because the payload's
669
+ device-floor merge replaces a style WHOLE — `{...desktopStyles, ...own}`
670
+ keys on the STYLE, not on the property — so a step this block declares
671
+ partially loses whatever it leaves out instead of inheriting it from
672
+ Desktop. That variable then exists on Desktop and nowhere else, and one
673
+ missing on six of seven devices resolves to nothing there, silently. The
674
+ CSS cascade would have carried it; the payload does not, and the payload
675
+ is the half that fails without a sound.
676
+
677
+ The 0px is this block's existing answer for Caption, extended to the two
678
+ new steps rather than importing Desktop's 0.1px nudge — which would leave
679
+ the ramp reading 0.0996 / 0 / 0.1008, three steps of one style disagreeing
680
+ about whether the brand tracks captions at all. Whether mobile SHOULD zero
681
+ it is a brand decision and still open; this only stops the ramp from
682
+ contradicting itself. */
683
+ --Caption-Small-Font-Size: 12px;
684
+ --Caption-Small-Font-Weight: 500;
685
+ --Caption-Small-Letter-Spacing: 0px;
686
+ --Caption-Small-Line-Height: 16px;
279
687
  --Caption-Font-Size: 14px;
280
688
  --Caption-Font-Weight: 500;
281
- --Caption-Line-Height: 21px;
689
+ --Caption-Line-Height: 19px;
282
690
  --Caption-Letter-Spacing: 0px;
283
691
  --Caption-Bold-Font-Weight: 700;
692
+ --Caption-Large-Font-Size: 16px;
693
+ --Caption-Large-Font-Weight: 500;
694
+ --Caption-Large-Letter-Spacing: 0px;
695
+ --Caption-Large-Line-Height: 21px;
284
696
 
285
697
  /* Label */
286
698
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -304,6 +716,14 @@
304
716
  --Label-Large-Line-Height: 27px;
305
717
  --Label-Large-Letter-Spacing: 0px;
306
718
 
719
+
720
+ /* Mobile Nav Label — same as iPhone; the tab bar does not resize. */
721
+ --Font-Family-Mobile-Nav-Label: var(--Platform-Font-Families-Body);
722
+ --Mobile-Nav-Label-Font-Size: 10px;
723
+ --Mobile-Nav-Label-Font-Weight: 600;
724
+ --Mobile-Nav-Label-Line-Height: 10px;
725
+ --Mobile-Nav-Label-Letter-Spacing: 0px;
726
+
307
727
  /* Legal */
308
728
  --Font-Family-Body: var(--Platform-Font-Families-Body);
309
729
  --Legal-Font-Size: 10px;
@@ -338,50 +758,73 @@
338
758
  --Font-Family-Number: var(--Platform-Font-Families-Body);
339
759
  --Number-Medium-Font-Size: 28px;
340
760
  --Number-Medium-Font-Weight: 700;
341
- --Number-Medium-Line-Height: 28px;
761
+ --Number-Medium-Line-Height: 16px;
342
762
  --Number-Medium-Letter-Spacing: 0px;
343
763
  --Font-Family-Number: var(--Platform-Font-Families-Body);
344
- --Number-Large-Font-Size: 18px;
764
+ --Number-Large-Font-Size: 36px;
345
765
  --Number-Large-Font-Weight: 700;
346
- --Number-Large-Line-Height: 27px;
766
+ --Number-Large-Line-Height: 36px;
347
767
  --Number-Large-Letter-Spacing: 0px;
348
768
 
349
769
  /* Button */
350
770
  --Font-Family-Button: var(--Platform-Font-Families-Body);
351
771
  --Button-ExtraSmall-Font-Size: 11px;
352
772
  --Button-ExtraSmall-Font-Weight: 600;
353
- --Button-ExtraSmall-Line-Height: 11px;
773
+ --Button-ExtraSmall-Line-Height: 28px;
354
774
  --Button-ExtraSmall-Letter-Spacing: 0px;
355
775
  --Font-Family-Button: var(--Platform-Font-Families-Body);
356
776
  --Button-Small-Font-Size: 14px;
357
777
  --Button-Small-Font-Weight: 600;
358
- --Button-Small-Line-Height: 14px;
778
+ --Button-Small-Line-Height: 16px;
359
779
  --Button-Small-Letter-Spacing: 0px;
360
780
  --Font-Family-Button: var(--Platform-Font-Families-Body);
361
- --Button-Standard-Font-Size: 16px;
362
- --Button-Standard-Font-Weight: 600;
363
- --Button-Standard-Line-Height: 16px;
364
- --Button-Standard-Letter-Spacing: 0px;
781
+ --Button-Medium-Font-Size: 16px;
782
+ --Button-Medium-Font-Weight: 600;
783
+ --Button-Medium-Line-Height: 16px;
784
+ --Button-Medium-Letter-Spacing: 0px;
785
+ /* was Button-Standard — kept so frozen stylesheets keep resolving. */
786
+ --Button-Standard-Font-Size: var(--Button-Medium-Font-Size);
787
+ --Button-Standard-Font-Weight: var(--Button-Medium-Font-Weight);
788
+ --Button-Standard-Line-Height: var(--Button-Medium-Line-Height);
789
+ --Button-Standard-Letter-Spacing: var(--Button-Medium-Letter-Spacing);
790
+
791
+ /* Alt Display — mirrors Display step for step. The pairing sets one word
792
+ on one baseline ("Omni" + "Design"), so the two must not diverge in
793
+ size or leading; colour is what separates them. */
794
+ --Alt-Display-Small-Font-Size: 34px;
795
+ --Alt-Display-Small-Font-Weight: 900;
796
+ --Alt-Display-Small-Line-Height: 41px;
797
+ --Alt-Display-Small-Letter-Spacing: 0px;
798
+ --Alt-Display-Medium-Font-Size: 40px;
799
+ --Alt-Display-Medium-Font-Weight: 900;
800
+ --Alt-Display-Medium-Line-Height: 48px;
801
+ --Alt-Display-Medium-Letter-Spacing: 0px;
802
+ --Alt-Display-Large-Font-Size: 48px;
803
+ --Alt-Display-Large-Font-Weight: 900;
804
+ --Alt-Display-Large-Line-Height: 58px;
805
+ --Alt-Display-Large-Letter-Spacing: 0px;
365
806
 
366
807
  }
367
808
 
368
- [data-platform="IOS-Tablet"] {
809
+ [data-device="Android-Tablet"] {
810
+
811
+
369
812
 
370
813
  /* Display */
371
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
372
- --Display-Small-Font-Size: 28px;
814
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
815
+ --Display-Small-Font-Size: 36px;
373
816
  --Display-Small-Font-Weight: 600;
374
- --Display-Small-Line-Height: 28px;
817
+ --Display-Small-Line-Height: 44px;
375
818
  --Display-Small-Letter-Spacing: 0px;
376
- --Font-Family-Display: var(--Platform-Font-Families-Header);
377
- --Display-Medium-Font-Size: 28px;
819
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
820
+ --Display-Medium-Font-Size: 45px;
378
821
  --Display-Medium-Font-Weight: 600;
379
- --Display-Medium-Line-Height: 28px;
822
+ --Display-Medium-Line-Height: 52px;
380
823
  --Display-Medium-Letter-Spacing: 0px;
381
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
382
- --Display-Large-Font-Size: 28px;
824
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
825
+ --Display-Large-Font-Size: 57px;
383
826
  --Display-Large-Font-Weight: 600;
384
- --Display-Large-Line-Height: 28px;
827
+ --Display-Large-Line-Height: 64px;
385
828
  --Display-Large-Letter-Spacing: 0px;
386
829
 
387
830
  /* Headers */
@@ -453,11 +896,42 @@
453
896
 
454
897
  /* Caption */
455
898
  --Font-Family-Body: var(--Platform-Font-Families-Body);
899
+ /* Leading here is the PLATFORM's, not the brand's 1.5 — Material 3's own
900
+ table at 12 / 14 / 16. The Figma payload computes these same numbers for
901
+ every non-Desktop device (typographyPlatform.ts, "LINE HEIGHT is COMPUTED,
902
+ not read"), while this block declared a flat 21 at every size, so one
903
+ caption read 20 in the file and 21 in the stylesheet and nothing could
904
+ see it. Declared rather than left to compute so the two sides state the
905
+ same value instead of arriving at it separately.
906
+
907
+ EVERY property is restated, tracking included, because the payload's
908
+ device-floor merge replaces a style WHOLE — `{...desktopStyles, ...own}`
909
+ keys on the STYLE, not on the property — so a step this block declares
910
+ partially loses whatever it leaves out instead of inheriting it from
911
+ Desktop. That variable then exists on Desktop and nowhere else, and one
912
+ missing on six of seven devices resolves to nothing there, silently. The
913
+ CSS cascade would have carried it; the payload does not, and the payload
914
+ is the half that fails without a sound.
915
+
916
+ The 0px is this block's existing answer for Caption, extended to the two
917
+ new steps rather than importing Desktop's 0.1px nudge — which would leave
918
+ the ramp reading 0.0996 / 0 / 0.1008, three steps of one style disagreeing
919
+ about whether the brand tracks captions at all. Whether mobile SHOULD zero
920
+ it is a brand decision and still open; this only stops the ramp from
921
+ contradicting itself. */
922
+ --Caption-Small-Font-Size: 12px;
923
+ --Caption-Small-Font-Weight: 500;
924
+ --Caption-Small-Letter-Spacing: 0px;
925
+ --Caption-Small-Line-Height: 16px;
456
926
  --Caption-Font-Size: 14px;
457
927
  --Caption-Font-Weight: 500;
458
- --Caption-Line-Height: 21px;
928
+ --Caption-Line-Height: 20px;
459
929
  --Caption-Letter-Spacing: 0px;
460
930
  --Caption-Bold-Font-Weight: 700;
931
+ --Caption-Large-Font-Size: 16px;
932
+ --Caption-Large-Font-Weight: 500;
933
+ --Caption-Large-Letter-Spacing: 0px;
934
+ --Caption-Large-Line-Height: 24px;
461
935
 
462
936
  /* Label */
463
937
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -481,6 +955,14 @@
481
955
  --Label-Large-Line-Height: 27px;
482
956
  --Label-Large-Letter-Spacing: 0px;
483
957
 
958
+
959
+ /* Mobile Nav Label — Material's navigation label: 12sp on 16, 0.5 tracking. */
960
+ --Font-Family-Mobile-Nav-Label: var(--Platform-Font-Families-Body);
961
+ --Mobile-Nav-Label-Font-Size: 12px;
962
+ --Mobile-Nav-Label-Font-Weight: 600;
963
+ --Mobile-Nav-Label-Line-Height: 16px;
964
+ --Mobile-Nav-Label-Letter-Spacing: 0.5px;
965
+
484
966
  /* Legal */
485
967
  --Font-Family-Body: var(--Platform-Font-Families-Body);
486
968
  --Legal-Font-Size: 10px;
@@ -535,30 +1017,54 @@
535
1017
  --Button-Small-Line-Height: 16px;
536
1018
  --Button-Small-Letter-Spacing: 0px;
537
1019
  --Font-Family-Button: var(--Platform-Font-Families-Body);
538
- --Button-Standard-Font-Size: 16px;
539
- --Button-Standard-Font-Weight: 600;
540
- --Button-Standard-Line-Height: 16px;
541
- --Button-Standard-Letter-Spacing: 0px;
1020
+ --Button-Medium-Font-Size: 16px;
1021
+ --Button-Medium-Font-Weight: 600;
1022
+ --Button-Medium-Line-Height: 16px;
1023
+ --Button-Medium-Letter-Spacing: 0px;
1024
+ /* was Button-Standard — kept so frozen stylesheets keep resolving. */
1025
+ --Button-Standard-Font-Size: var(--Button-Medium-Font-Size);
1026
+ --Button-Standard-Font-Weight: var(--Button-Medium-Font-Weight);
1027
+ --Button-Standard-Line-Height: var(--Button-Medium-Line-Height);
1028
+ --Button-Standard-Letter-Spacing: var(--Button-Medium-Letter-Spacing);
1029
+
1030
+ /* Alt Display — mirrors Display step for step. The pairing sets one word
1031
+ on one baseline ("Omni" + "Design"), so the two must not diverge in
1032
+ size or leading; colour is what separates them. */
1033
+ --Alt-Display-Small-Font-Size: 36px;
1034
+ --Alt-Display-Small-Font-Weight: 900;
1035
+ --Alt-Display-Small-Line-Height: 44px;
1036
+ --Alt-Display-Small-Letter-Spacing: 0px;
1037
+ --Alt-Display-Medium-Font-Size: 45px;
1038
+ --Alt-Display-Medium-Font-Weight: 900;
1039
+ --Alt-Display-Medium-Line-Height: 52px;
1040
+ --Alt-Display-Medium-Letter-Spacing: 0px;
1041
+ --Alt-Display-Large-Font-Size: 57px;
1042
+ --Alt-Display-Large-Font-Weight: 900;
1043
+ --Alt-Display-Large-Line-Height: 64px;
1044
+ --Alt-Display-Large-Letter-Spacing: 0px;
542
1045
 
543
1046
  }
544
1047
 
545
- [data-platform="Android"] {
1048
+
1049
+ [data-device="Android-Mobile"] {
1050
+
1051
+
546
1052
 
547
1053
  /* Display */
548
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
549
- --Display-Small-Font-Size: 28px;
1054
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
1055
+ --Display-Small-Font-Size: 36px;
550
1056
  --Display-Small-Font-Weight: 600;
551
- --Display-Small-Line-Height: 28px;
1057
+ --Display-Small-Line-Height: 44px;
552
1058
  --Display-Small-Letter-Spacing: 0px;
553
- --Font-Family-Display: var(--Platform-Font-Families-Header);
554
- --Display-Medium-Font-Size: 28px;
1059
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
1060
+ --Display-Medium-Font-Size: 45px;
555
1061
  --Display-Medium-Font-Weight: 600;
556
- --Display-Medium-Line-Height: 28px;
1062
+ --Display-Medium-Line-Height: 52px;
557
1063
  --Display-Medium-Letter-Spacing: 0px;
558
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
559
- --Display-Large-Font-Size: 28px;
1064
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
1065
+ --Display-Large-Font-Size: 57px;
560
1066
  --Display-Large-Font-Weight: 600;
561
- --Display-Large-Line-Height: 28px;
1067
+ --Display-Large-Line-Height: 64px;
562
1068
  --Display-Large-Letter-Spacing: 0px;
563
1069
 
564
1070
  /* Headers */
@@ -630,11 +1136,42 @@
630
1136
 
631
1137
  /* Caption */
632
1138
  --Font-Family-Body: var(--Platform-Font-Families-Body);
1139
+ /* Leading here is the PLATFORM's, not the brand's 1.5 — Material 3's own
1140
+ table at 12 / 14 / 16. The Figma payload computes these same numbers for
1141
+ every non-Desktop device (typographyPlatform.ts, "LINE HEIGHT is COMPUTED,
1142
+ not read"), while this block declared a flat 21 at every size, so one
1143
+ caption read 20 in the file and 21 in the stylesheet and nothing could
1144
+ see it. Declared rather than left to compute so the two sides state the
1145
+ same value instead of arriving at it separately.
1146
+
1147
+ EVERY property is restated, tracking included, because the payload's
1148
+ device-floor merge replaces a style WHOLE — `{...desktopStyles, ...own}`
1149
+ keys on the STYLE, not on the property — so a step this block declares
1150
+ partially loses whatever it leaves out instead of inheriting it from
1151
+ Desktop. That variable then exists on Desktop and nowhere else, and one
1152
+ missing on six of seven devices resolves to nothing there, silently. The
1153
+ CSS cascade would have carried it; the payload does not, and the payload
1154
+ is the half that fails without a sound.
1155
+
1156
+ The 0px is this block's existing answer for Caption, extended to the two
1157
+ new steps rather than importing Desktop's 0.1px nudge — which would leave
1158
+ the ramp reading 0.0996 / 0 / 0.1008, three steps of one style disagreeing
1159
+ about whether the brand tracks captions at all. Whether mobile SHOULD zero
1160
+ it is a brand decision and still open; this only stops the ramp from
1161
+ contradicting itself. */
1162
+ --Caption-Small-Font-Size: 12px;
1163
+ --Caption-Small-Font-Weight: 500;
1164
+ --Caption-Small-Letter-Spacing: 0px;
1165
+ --Caption-Small-Line-Height: 16px;
633
1166
  --Caption-Font-Size: 14px;
634
1167
  --Caption-Font-Weight: 500;
635
- --Caption-Line-Height: 21px;
1168
+ --Caption-Line-Height: 20px;
636
1169
  --Caption-Letter-Spacing: 0px;
637
1170
  --Caption-Bold-Font-Weight: 700;
1171
+ --Caption-Large-Font-Size: 16px;
1172
+ --Caption-Large-Font-Weight: 500;
1173
+ --Caption-Large-Letter-Spacing: 0px;
1174
+ --Caption-Large-Line-Height: 24px;
638
1175
 
639
1176
  /* Label */
640
1177
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -658,6 +1195,14 @@
658
1195
  --Label-Large-Line-Height: 27px;
659
1196
  --Label-Large-Letter-Spacing: 0px;
660
1197
 
1198
+
1199
+ /* Mobile Nav Label — Material's navigation label: 12sp on 16, 0.5 tracking. */
1200
+ --Font-Family-Mobile-Nav-Label: var(--Platform-Font-Families-Body);
1201
+ --Mobile-Nav-Label-Font-Size: 12px;
1202
+ --Mobile-Nav-Label-Font-Weight: 600;
1203
+ --Mobile-Nav-Label-Line-Height: 16px;
1204
+ --Mobile-Nav-Label-Letter-Spacing: 0.5px;
1205
+
661
1206
  /* Legal */
662
1207
  --Font-Family-Body: var(--Platform-Font-Families-Body);
663
1208
  --Legal-Font-Size: 10px;
@@ -712,9 +1257,241 @@
712
1257
  --Button-Small-Line-Height: 16px;
713
1258
  --Button-Small-Letter-Spacing: 0px;
714
1259
  --Font-Family-Button: var(--Platform-Font-Families-Body);
715
- --Button-Standard-Font-Size: 16px;
716
- --Button-Standard-Font-Weight: 600;
717
- --Button-Standard-Line-Height: 16px;
718
- --Button-Standard-Letter-Spacing: 0px;
1260
+ --Button-Medium-Font-Size: 16px;
1261
+ --Button-Medium-Font-Weight: 600;
1262
+ --Button-Medium-Line-Height: 16px;
1263
+ --Button-Medium-Letter-Spacing: 0px;
1264
+ /* was Button-Standard — kept so frozen stylesheets keep resolving. */
1265
+ --Button-Standard-Font-Size: var(--Button-Medium-Font-Size);
1266
+ --Button-Standard-Font-Weight: var(--Button-Medium-Font-Weight);
1267
+ --Button-Standard-Line-Height: var(--Button-Medium-Line-Height);
1268
+ --Button-Standard-Letter-Spacing: var(--Button-Medium-Letter-Spacing);
1269
+
1270
+ /* Alt Display — mirrors Display step for step. The pairing sets one word
1271
+ on one baseline ("Omni" + "Design"), so the two must not diverge in
1272
+ size or leading; colour is what separates them. */
1273
+ --Alt-Display-Small-Font-Size: 36px;
1274
+ --Alt-Display-Small-Font-Weight: 900;
1275
+ --Alt-Display-Small-Line-Height: 44px;
1276
+ --Alt-Display-Small-Letter-Spacing: 0px;
1277
+ --Alt-Display-Medium-Font-Size: 45px;
1278
+ --Alt-Display-Medium-Font-Weight: 900;
1279
+ --Alt-Display-Medium-Line-Height: 52px;
1280
+ --Alt-Display-Medium-Letter-Spacing: 0px;
1281
+ --Alt-Display-Large-Font-Size: 57px;
1282
+ --Alt-Display-Large-Font-Weight: 900;
1283
+ --Alt-Display-Large-Line-Height: 64px;
1284
+ --Alt-Display-Large-Letter-Spacing: 0px;
1285
+
1286
+ }
1287
+
1288
+ /* ── Platform button metrics ──────────────────────────────────────────────
1289
+ *
1290
+ * Apple's and Google's button sizes, overriding the brand's own on the touch
1291
+ * platforms. Desktop is absent on purpose: there the brand's heights ARE the
1292
+ * answer, and base.css already states them.
1293
+ *
1294
+ * :root[data-device="…"], not the bare [data-device="…"] the type ramps
1295
+ * above use, and the difference is load-bearing. --Button-Height is declared
1296
+ * at :root in base.css, which the provider injects at slot 5 — AFTER this file
1297
+ * at slot 3. A bare attribute selector ties with :root at (0,1,0), so the later
1298
+ * file would win and these overrides would do nothing, with no error anywhere.
1299
+ * :root[data-device] scores (0,2,0) and wins on specificity instead, which
1300
+ * does not depend on anyone preserving the load order.
1301
+ *
1302
+ * The type ramps above can stay as they are: their :root counterpart is in
1303
+ * core.css at slot 2, so they already load later and win.
1304
+ *
1305
+ * --Small-/--Large-Button-Height are NOT restated. base.css declares them as
1306
+ * var(--Sm-Button-Height) / var(--Lg-Button-Height), and a var() in a custom
1307
+ * property resolves against the element it lands on — so the back-compat
1308
+ * spellings follow these overrides on their own.
1309
+ */
1310
+
1311
+ :root[data-device="IOS-Mobile"] {
1312
+ --Button-Height: 44px;
1313
+ --Sm-Button-Height: 32px;
1314
+ --Lg-Button-Height: 50px;
1315
+ --Button-Icon: 20px;
1316
+ --Sm-Button-Icon: 16px;
1317
+ --Lg-Button-Icon: 24px;
1318
+ }
1319
+
1320
+ :root[data-device="IOS-Tablet"] {
1321
+ --Button-Height: 44px;
1322
+ --Sm-Button-Height: 32px;
1323
+ --Lg-Button-Height: 50px;
1324
+ --Button-Icon: 20px;
1325
+ --Sm-Button-Icon: 16px;
1326
+ --Lg-Button-Icon: 24px;
1327
+ }
1328
+
1329
+ :root[data-device="Android-Tablet"] {
1330
+ --Button-Height: 48px;
1331
+ --Sm-Button-Height: 32px;
1332
+ --Lg-Button-Height: 56px;
1333
+ --Button-Icon: 18px;
1334
+ --Sm-Button-Icon: 18px;
1335
+ --Lg-Button-Icon: 24px;
1336
+ }
1337
+
1338
+ :root[data-device="Android-Mobile"] {
1339
+ --Button-Height: 48px;
1340
+ --Sm-Button-Height: 32px;
1341
+ --Lg-Button-Height: 56px;
1342
+ --Button-Icon: 18px;
1343
+ --Sm-Button-Icon: 18px;
1344
+ --Lg-Button-Icon: 24px;
1345
+ }
1346
+
1347
+
1348
+ /* ---------------------------------------------------------------------------
1349
+ Face re-mapping
1350
+ Display renders in the Display face (it used to follow Header, which left the
1351
+ expressive face with nowhere to appear at size). Overline is the eyebrow spec
1352
+ now, on the Eyebrow face. The lib hard-codes both families, so they are
1353
+ corrected here rather than through a token.
1354
+
1355
+ Both read the face token, which is what keeps decorative mode working:
1356
+ core.css re-points --Font-Family-Eyebrow at the Display face inside
1357
+ [data-decorative], on a higher-specificity selector.
1358
+ --------------------------------------------------------------------------- */
1359
+ .typography.typography-display-large,
1360
+ .typography.typography-display-medium,
1361
+ .typography.typography-display-small {
1362
+ font-family: var(--Font-Family-Display);
1363
+ }
1364
+
1365
+ .typography.typography-overline,
1366
+ .typography.typography-overline-small,
1367
+ .typography.typography-overline-medium,
1368
+ .typography.typography-overline-large {
1369
+ font-family: var(--Font-Family-Eyebrow);
1370
+ }
1371
+
1372
+ /* ---------------------------------------------------------------------------
1373
+ Prose lists — opt in with .typography-list on the <ul> or <ol>.
1374
+
1375
+ The marker takes --Eyebrow: the accent that is already ROTATED off the
1376
+ surface's palette (Primary->Secondary, Secondary->Tertiary, and so on), so a
1377
+ list picks up the same accent as the eyebrow above it instead of the page
1378
+ inventing one. The list TEXT is untouched and stays on --Text; only the
1379
+ bullet or number is accented.
1380
+
1381
+ Opt-in, not a bare li::marker rule, for the same reason nothing else here
1382
+ styles bare elements: importing the CSS must not repaint lists in a
1383
+ consumer's app that never asked for it.
1384
+
1385
+ ::marker only honours a short list of properties. color is one of them;
1386
+ background, padding and size are not, so a bullet that needs a custom size
1387
+ still needs the ::before technique.
1388
+ --------------------------------------------------------------------------- */
1389
+ .typography-list > li::marker {
1390
+ color: var(--Eyebrow);
1391
+ }
1392
+
1393
+ /* ---------------------------------------------------------------------------
1394
+ Alt Display colour — three variants, one pair of stops
1395
+
1396
+ Set data-alt-display on the element or any ancestor:
1397
+ default (or unset) the Alt reads as a heading
1398
+ colored a flat Alt colour
1399
+ gradient the two stops the theme publishes
1400
+
1401
+ The stops are re-published per theme and surface, so every variant follows
1402
+ data-surface without being restated.
1403
+ --------------------------------------------------------------------------- */
1404
+ :root,
1405
+ [data-alt-display="default"] {
1406
+ --Alt-Display-Color-Stop-1: var(--Header);
1407
+ --Alt-Display-Color-Stop-2: var(--Header);
1408
+ }
1409
+
1410
+ [data-alt-display="colored"] {
1411
+ --Alt-Display-Color-Stop-1: var(--Alt-Display-Color, var(--Header));
1412
+ --Alt-Display-Color-Stop-2: var(--Alt-Display-Color, var(--Header));
1413
+ }
1414
+
1415
+ [data-alt-display="gradient"] {
1416
+ --Alt-Display-Color-Stop-1: var(--Alt-Color-Gradient-Stop-1, var(--Alt-Display-Color, var(--Header)));
1417
+ --Alt-Display-Color-Stop-2: var(--Alt-Color-Gradient-Stop-2, var(--Alt-Display-Color, var(--Header)));
1418
+ }
1419
+
1420
+ .typography-alt-display-large,
1421
+ .typography-alt-display-medium,
1422
+ .typography-alt-display-small {
1423
+ /* Stop 1 alone: in the flat variants the two agree, and a plain colour keeps
1424
+ the selection highlight, print, and forced-colors working. */
1425
+ color: var(--Alt-Display-Color-Stop-1);
1426
+ }
1427
+
1428
+ .typography-alt-display-large[data-alt-display="gradient"],
1429
+ [data-alt-display="gradient"] .typography-alt-display-large,
1430
+ .typography-alt-display-medium[data-alt-display="gradient"],
1431
+ [data-alt-display="gradient"] .typography-alt-display-medium,
1432
+ .typography-alt-display-small[data-alt-display="gradient"],
1433
+ [data-alt-display="gradient"] .typography-alt-display-small {
1434
+ background-image: linear-gradient(
1435
+ 90deg,
1436
+ var(--Alt-Display-Color-Stop-1),
1437
+ var(--Alt-Display-Color-Stop-2)
1438
+ );
1439
+ -webkit-background-clip: text;
1440
+ background-clip: text;
1441
+ color: transparent;
1442
+ /* The box carries the paint, not the glyphs, so keep it to the text's own
1443
+ box or a wrapped headline stretches the ramp across empty trailing space. */
1444
+ -webkit-box-decoration-break: clone;
1445
+ box-decoration-break: clone;
1446
+ }
1447
+
1448
+ @media (forced-colors: active) {
1449
+ .typography-alt-display-large[data-alt-display="gradient"],
1450
+ [data-alt-display="gradient"] .typography-alt-display-large,
1451
+ .typography-alt-display-medium[data-alt-display="gradient"],
1452
+ [data-alt-display="gradient"] .typography-alt-display-medium,
1453
+ .typography-alt-display-small[data-alt-display="gradient"],
1454
+ [data-alt-display="gradient"] .typography-alt-display-small {
1455
+ /* The UA drops background-image here, and transparent text would leave
1456
+ nothing on screen. Hand the glyphs back to the system colour. */
1457
+ background-image: none;
1458
+ -webkit-background-clip: border-box;
1459
+ background-clip: border-box;
1460
+ color: CanvasText;
1461
+ forced-color-adjust: auto;
1462
+ }
1463
+ }
1464
+
1465
+ /* ---------------------------------------------------------------------------
1466
+ Paragraph spacing — space only where one paragraph follows another, which is
1467
+ what the Figma token means.
1468
+ --------------------------------------------------------------------------- */
1469
+ .typography-caption-small + .typography-caption-small {
1470
+ margin-block-start: var(--Caption-Small-Paragraph-Spacing);
1471
+ }
1472
+
1473
+ .typography-caption + .typography-caption {
1474
+ margin-block-start: var(--Caption-Paragraph-Spacing);
1475
+ }
1476
+
1477
+ .typography-caption-large + .typography-caption-large {
1478
+ margin-block-start: var(--Caption-Large-Paragraph-Spacing);
1479
+ }
1480
+
1481
+ .typography-legal + .typography-legal {
1482
+ margin-block-start: var(--Legal-Paragraph-Spacing);
1483
+ }
719
1484
 
1485
+ /* ---------------------------------------------------------------------------
1486
+ Variable-font axes
1487
+ wght is deliberately absent — font-weight already carries it, and declaring
1488
+ it in both places lets the two disagree.
1489
+ --------------------------------------------------------------------------- */
1490
+ .typography-h1,
1491
+ .typography-h2,
1492
+ .typography-h3,
1493
+ .typography-h4,
1494
+ .typography-h5,
1495
+ .typography-h6 {
1496
+ font-variation-settings: var(--Font-Variation-Header);
720
1497
  }