@omni-design/components 0.10.0 → 0.12.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 (53) 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/index.esm.js +3 -3
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/types/components/Avatar/AvatarGlyph.d.ts +5 -0
  9. package/dist/types/components/Avatar/index.d.ts +1 -0
  10. package/dist/types/components/Button/Button.d.ts +3 -1
  11. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +3 -2
  12. package/dist/types/components/Chip/Chip.d.ts +1 -1
  13. package/dist/types/components/Icon/Icon.d.ts +4 -0
  14. package/dist/types/components/IconBadge/IconBadge.d.ts +1 -1
  15. package/dist/types/components/Loader/Loader.d.ts +66 -0
  16. package/dist/types/components/Loader/index.d.ts +1 -0
  17. package/dist/types/components/MiniSwatch/MiniSwatch.d.ts +7 -0
  18. package/dist/types/components/MiniSwatch/index.d.ts +1 -0
  19. package/dist/types/components/Pagination/Pagination.d.ts +3 -1
  20. package/dist/types/components/Radio/Radio.d.ts +6 -2
  21. package/dist/types/components/Rating/Rating.d.ts +3 -1
  22. package/dist/types/components/Slider/Slider.d.ts +9 -3
  23. package/dist/types/components/Stepper/Stepper.d.ts +3 -1
  24. package/dist/types/components/Swatch/Swatch.d.ts +14 -0
  25. package/dist/types/components/Swatch/index.d.ts +1 -0
  26. package/dist/types/components/Switch/Switch.d.ts +24 -8
  27. package/dist/types/components/Switch/index.d.ts +1 -1
  28. package/dist/types/components/Tabs/Tabs.d.ts +17 -1
  29. package/dist/types/components/ToggleButton/index.d.ts +1 -1
  30. package/dist/types/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +26 -42
  31. package/dist/types/components/index.d.ts +5 -0
  32. package/dist/types/docs/DocPanels.d.ts +39 -0
  33. package/dist/types/docs/components.d.ts +212 -0
  34. package/dist/types/docs/componentsData.d.ts +587 -0
  35. package/dist/types/docs/componentsForms.d.ts +597 -0
  36. package/dist/types/docs/componentsNav.d.ts +420 -0
  37. package/dist/types/docs/componentsOverlays.d.ts +379 -0
  38. package/dist/types/docs/componentsRest.d.ts +158 -0
  39. package/dist/types/docs/componentsSurfaces.d.ts +339 -0
  40. package/dist/types/docs/docsLink.d.ts +32 -0
  41. package/dist/types/docs/examples.d.ts +37 -0
  42. package/dist/types/docs/foundations.d.ts +28 -0
  43. package/dist/types/docs/index.d.ts +5 -0
  44. package/docs/components.md +71 -55
  45. package/package.json +1 -1
  46. package/public/styles/Dark-Mode.css +12056 -13009
  47. package/public/styles/Light-Mode.css +11240 -12370
  48. package/public/styles/base.css +364 -182
  49. package/public/styles/core.css +480 -123
  50. package/public/styles/foundation.css +124 -53
  51. package/public/styles/styles.css +5 -5
  52. package/public/styles/theme.json +2 -2
  53. package/public/styles/typography-tokens.css +686 -158
@@ -1,10 +1,7 @@
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.
@@ -12,199 +9,344 @@
12
9
  */
13
10
 
14
11
  [data-platform="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));
15
17
 
16
- /* Display */
17
- --Font-Family-Display: var(--Platform-Font-Families-Header);
18
- --Display-Small-Font-Size: 42px;
19
- --Display-Small-Font-Weight: 600;
20
- --Display-Small-Line-Height: 42px;
21
- --Display-Small-Letter-Spacing: 0px;
22
- --Font-Family-Display: var(--Platform-Font-Families-Header);
23
- --Display-Medium-Font-Size: 45px;
24
- --Display-Medium-Font-Weight: 600;
25
- --Display-Medium-Line-Height: 45px;
26
- --Display-Medium-Letter-Spacing: 0px;
27
- --Font-Family-Display: var(--Platform-Font-Families-Header);
28
- --Display-Large-Font-Size: 48px;
29
- --Display-Large-Font-Weight: 600;
30
- --Display-Large-Line-Height: 48px;
31
- --Display-Large-Letter-Spacing: 0px;
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;
32
24
 
33
- /* Headers */
34
- --Font-Family-Header: var(--Platform-Font-Families-Header);
35
- --H1-Font-Size: 32px;
36
- --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;
41
- --H2-Font-Weight: 600;
42
- --H2-Line-Height: 28px;
43
- --H2-Letter-Spacing: 1.25px;
44
- --Font-Family-Header: var(--Platform-Font-Families-Header);
45
- --H3-Font-Size: 24px;
46
- --H3-Font-Weight: 600;
47
- --H3-Line-Height: 24px;
48
- --H3-Letter-Spacing: 0px;
49
- --Font-Family-Header: var(--Platform-Font-Families-Header);
50
- --H4-Font-Size: 20px;
51
- --H4-Font-Weight: 600;
52
- --H4-Line-Height: 20px;
53
- --H4-Letter-Spacing: 0px;
54
- --Font-Family-Header: var(--Platform-Font-Families-Header);
55
- --H5-Font-Size: 18px;
56
- --H5-Font-Weight: 600;
57
- --H5-Line-Height: 18px;
58
- --H5-Letter-Spacing: 0px;
59
- --Font-Family-Header: var(--Platform-Font-Families-Header);
60
- --H6-Font-Size: 16px;
61
- --H6-Font-Weight: 600;
62
- --H6-Line-Height: 16px;
63
- --H6-Letter-Spacing: 0px;
25
+ /* Variable-font axes */
26
+ --Font-Grade-Header: 50;
27
+ --Font-Slant-Header: 0;
28
+ --Font-Roundness-Header: 0;
29
+ --Font-Optical-Size-Header: 96;
30
+ --Font-Width-Header: 72;
31
+ --Font-Variation-Header: "GRAD" var(--Font-Grade-Header), "slnt" var(--Font-Slant-Header), "ROND" var(--Font-Roundness-Header), "opsz" var(--Font-Optical-Size-Header), "wdth" var(--Font-Width-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;
64
108
 
65
109
  /* Subtitle */
66
- --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
67
- --Subtitle-Small-Font-Size: 16px;
110
+ --Subtitle-Small-Font-Family: var(--Font-Family-Body);
111
+ --Subtitle-Small-Font-Size: 14px;
68
112
  --Subtitle-Small-Font-Weight: 700;
69
- --Subtitle-Small-Line-Height: 24px;
70
- --Subtitle-Small-Letter-Spacing: 0px;
71
- --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
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);
72
123
  --Subtitle-Large-Font-Size: 18px;
73
124
  --Subtitle-Large-Font-Weight: 700;
74
- --Subtitle-Large-Line-Height: 32px;
75
- --Subtitle-Large-Letter-Spacing: 0px;
125
+ --Subtitle-Large-Line-Height: 27px;
126
+ --Subtitle-Large-Letter-Spacing: 0em;
127
+ --Subtitle-Large-Text-Transform: none;
76
128
 
77
129
  /* Body */
78
- --Font-Family-Body: var(--Platform-Font-Families-Body);
130
+ --Body-Small-Font-Family: var(--Font-Family-Body);
79
131
  --Body-Small-Font-Size: 14px;
80
- --Body-Small-Font-Weight: 500;
132
+ --Body-Small-Font-Weight: var(--Font-Weight-Body);
81
133
  --Body-Small-Line-Height: 21px;
82
- --Body-Small-Letter-Spacing: 0px;
134
+ --Body-Small-Letter-Spacing: 0em;
135
+ --Body-Small-Text-Transform: none;
83
136
  --Body-Small-Semibold-Font-Weight: 600;
84
- --Body-Small-Bold-Font-Weight: 700;
85
- --Font-Family-Body: var(--Platform-Font-Families-Body);
137
+ --Body-Medium-Font-Family: var(--Font-Family-Body);
86
138
  --Body-Medium-Font-Size: 16px;
87
- --Body-Medium-Font-Weight: 500;
139
+ --Body-Medium-Font-Weight: var(--Font-Weight-Body);
88
140
  --Body-Medium-Line-Height: 24px;
89
- --Body-Medium-Letter-Spacing: 0px;
141
+ --Body-Medium-Letter-Spacing: 0em;
142
+ --Body-Medium-Text-Transform: none;
90
143
  --Body-Medium-Semibold-Font-Weight: 600;
91
- --Body-Medium-Bold-Font-Weight: 700;
92
- --Font-Family-Body: var(--Platform-Font-Families-Body);
144
+ --Body-Large-Font-Family: var(--Font-Family-Body);
93
145
  --Body-Large-Font-Size: 18px;
94
- --Body-Large-Font-Weight: 500;
146
+ --Body-Large-Font-Weight: var(--Font-Weight-Body);
95
147
  --Body-Large-Line-Height: 27px;
96
- --Body-Large-Letter-Spacing: 0px;
148
+ --Body-Large-Letter-Spacing: 0em;
149
+ --Body-Large-Text-Transform: none;
97
150
  --Body-Large-Semibold-Font-Weight: 600;
98
- --Body-Large-Bold-Font-Weight: 700;
99
151
 
100
152
  /* Caption */
101
- --Font-Family-Body: var(--Platform-Font-Families-Body);
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);
102
162
  --Caption-Font-Size: 14px;
103
163
  --Caption-Font-Weight: 500;
104
164
  --Caption-Line-Height: 21px;
105
- --Caption-Letter-Spacing: 0px;
165
+ --Caption-Letter-Spacing: 0.0071em;
166
+ --Caption-Text-Transform: none;
106
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;
107
177
 
108
178
  /* Label */
109
- --Font-Family-Label: var(--Platform-Font-Families-Body);
179
+ --Label-ExtraSmall-Font-Family: var(--Font-Family-Body);
110
180
  --Label-ExtraSmall-Font-Size: 11px;
111
181
  --Label-ExtraSmall-Font-Weight: 600;
112
182
  --Label-ExtraSmall-Line-Height: 16.5px;
113
- --Label-ExtraSmall-Letter-Spacing: 0px;
114
- --Font-Family-Label: var(--Platform-Font-Families-Body);
183
+ --Label-ExtraSmall-Letter-Spacing: 0.0455em;
184
+ --Label-ExtraSmall-Text-Transform: none;
185
+ --Label-Small-Font-Family: var(--Font-Family-Body);
115
186
  --Label-Small-Font-Size: 12.5px;
116
187
  --Label-Small-Font-Weight: 600;
117
188
  --Label-Small-Line-Height: 18.75px;
118
- --Label-Small-Letter-Spacing: 0px;
119
- --Font-Family-Label: var(--Platform-Font-Families-Body);
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);
120
198
  --Label-Medium-Font-Size: 16px;
121
199
  --Label-Medium-Font-Weight: 600;
122
200
  --Label-Medium-Line-Height: 24px;
123
- --Label-Medium-Letter-Spacing: 0px;
124
- --Font-Family-Label: var(--Platform-Font-Families-Body);
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);
125
210
  --Label-Large-Font-Size: 18px;
126
211
  --Label-Large-Font-Weight: 600;
127
212
  --Label-Large-Line-Height: 27px;
128
- --Label-Large-Letter-Spacing: 0px;
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;
129
229
 
130
230
  /* Legal */
131
- --Font-Family-Body: var(--Platform-Font-Families-Body);
231
+ --Legal-Font-Family: var(--Font-Family-Body);
132
232
  --Legal-Font-Size: 10px;
133
233
  --Legal-Font-Weight: 400;
134
234
  --Legal-Line-Height: 15px;
135
- --Legal-Letter-Spacing: 0px;
235
+ --Legal-Letter-Spacing: 0em;
236
+ --Legal-Text-Transform: none;
136
237
  --Legal-Semibold-Font-Weight: 600;
238
+ --Legal-Paragraph-Spacing: 20px;
137
239
 
138
- /* Overline */
139
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
140
- --Overline-Small-Font-Size: 14px;
141
- --Overline-Small-Font-Weight: 500;
142
- --Overline-Small-Line-Height: 21px;
143
- --Overline-Small-Letter-Spacing: 0px;
144
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
145
- --Overline-Medium-Font-Size: 16px;
146
- --Overline-Medium-Font-Weight: 600;
147
- --Overline-Medium-Line-Height: 24px;
148
- --Overline-Medium-Letter-Spacing: 0px;
149
- --Font-Family-Overline: var(--Platform-Font-Families-Decorative);
150
- --Overline-Large-Font-Size: 18px;
151
- --Overline-Large-Font-Weight: 600;
152
- --Overline-Large-Line-Height: 27px;
153
- --Overline-Large-Letter-Spacing: 0px;
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);
154
271
 
155
272
  /* Number */
156
- --Font-Family-Number: var(--Platform-Font-Families-Body);
273
+ --Number-Small-Font-Family: var(--Font-Family-Body);
157
274
  --Number-Small-Font-Size: 16px;
158
275
  --Number-Small-Font-Weight: 700;
159
276
  --Number-Small-Line-Height: 16px;
160
- --Number-Small-Letter-Spacing: 0px;
161
- --Font-Family-Number: var(--Platform-Font-Families-Body);
277
+ --Number-Small-Letter-Spacing: 0em;
278
+ --Number-Small-Text-Transform: none;
279
+ --Number-Medium-Font-Family: var(--Font-Family-Body);
162
280
  --Number-Medium-Font-Size: 28px;
163
281
  --Number-Medium-Font-Weight: 700;
164
282
  --Number-Medium-Line-Height: 28px;
165
- --Number-Medium-Letter-Spacing: 0px;
166
- --Font-Family-Number: var(--Platform-Font-Families-Body);
283
+ --Number-Medium-Letter-Spacing: 0em;
284
+ --Number-Medium-Text-Transform: none;
285
+ --Number-Large-Font-Family: var(--Font-Family-Body);
167
286
  --Number-Large-Font-Size: 36px;
168
287
  --Number-Large-Font-Weight: 700;
169
288
  --Number-Large-Line-Height: 36px;
170
- --Number-Large-Letter-Spacing: 0px;
289
+ --Number-Large-Letter-Spacing: 0em;
290
+ --Number-Large-Text-Transform: none;
171
291
 
172
292
  /* Button */
173
- --Font-Family-Button: var(--Platform-Font-Families-Body);
293
+ --Button-ExtraSmall-Font-Family: var(--Font-Family-Body);
174
294
  --Button-ExtraSmall-Font-Size: 11px;
175
295
  --Button-ExtraSmall-Font-Weight: 600;
176
296
  --Button-ExtraSmall-Line-Height: 11px;
177
- --Button-ExtraSmall-Letter-Spacing: 0px;
178
- --Font-Family-Button: var(--Platform-Font-Families-Body);
297
+ --Button-ExtraSmall-Letter-Spacing: 0em;
298
+ --Button-ExtraSmall-Text-Transform: none;
299
+ --Button-Small-Font-Family: var(--Font-Family-Body);
179
300
  --Button-Small-Font-Size: 14px;
180
301
  --Button-Small-Font-Weight: 600;
181
302
  --Button-Small-Line-Height: 14px;
182
- --Button-Small-Letter-Spacing: 0px;
183
- --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;
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;
188
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;
189
329
  }
190
330
 
191
331
  [data-platform="IOS-Mobile"] {
192
332
 
333
+
334
+
193
335
  /* Display */
194
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
195
- --Display-Small-Font-Size: 28px;
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;
196
338
  --Display-Small-Font-Weight: 600;
197
- --Display-Small-Line-Height: 28px;
339
+ --Display-Small-Line-Height: 41px;
198
340
  --Display-Small-Letter-Spacing: 0px;
199
- --Font-Family-Display: var(--Platform-Font-Families-Header);
200
- --Display-Medium-Font-Size: 28px;
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;
201
343
  --Display-Medium-Font-Weight: 600;
202
- --Display-Medium-Line-Height: 28px;
344
+ --Display-Medium-Line-Height: 48px;
203
345
  --Display-Medium-Letter-Spacing: 0px;
204
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
205
- --Display-Large-Font-Size: 28px;
346
+ --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
347
+ --Display-Large-Font-Size: 48px;
206
348
  --Display-Large-Font-Weight: 600;
207
- --Display-Large-Line-Height: 28px;
349
+ --Display-Large-Line-Height: 58px;
208
350
  --Display-Large-Letter-Spacing: 0px;
209
351
 
210
352
  /* Headers */
@@ -276,11 +418,42 @@
276
418
 
277
419
  /* Caption */
278
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;
279
448
  --Caption-Font-Size: 14px;
280
449
  --Caption-Font-Weight: 500;
281
- --Caption-Line-Height: 21px;
450
+ --Caption-Line-Height: 19px;
282
451
  --Caption-Letter-Spacing: 0px;
283
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;
284
457
 
285
458
  /* Label */
286
459
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -304,6 +477,14 @@
304
477
  --Label-Large-Line-Height: 27px;
305
478
  --Label-Large-Letter-Spacing: 0px;
306
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
+
307
488
  /* Legal */
308
489
  --Font-Family-Body: var(--Platform-Font-Families-Body);
309
490
  --Legal-Font-Size: 10px;
@@ -358,30 +539,53 @@
358
539
  --Button-Small-Line-Height: 14px;
359
540
  --Button-Small-Letter-Spacing: 0px;
360
541
  --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;
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;
365
567
 
366
568
  }
367
569
 
368
570
  [data-platform="IOS-Tablet"] {
369
571
 
572
+
573
+
370
574
  /* Display */
371
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
372
- --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;
373
577
  --Display-Small-Font-Weight: 600;
374
- --Display-Small-Line-Height: 28px;
578
+ --Display-Small-Line-Height: 41px;
375
579
  --Display-Small-Letter-Spacing: 0px;
376
- --Font-Family-Display: var(--Platform-Font-Families-Header);
377
- --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;
378
582
  --Display-Medium-Font-Weight: 600;
379
- --Display-Medium-Line-Height: 28px;
583
+ --Display-Medium-Line-Height: 48px;
380
584
  --Display-Medium-Letter-Spacing: 0px;
381
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
382
- --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;
383
587
  --Display-Large-Font-Weight: 600;
384
- --Display-Large-Line-Height: 28px;
588
+ --Display-Large-Line-Height: 58px;
385
589
  --Display-Large-Letter-Spacing: 0px;
386
590
 
387
591
  /* Headers */
@@ -453,11 +657,42 @@
453
657
 
454
658
  /* Caption */
455
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;
456
687
  --Caption-Font-Size: 14px;
457
688
  --Caption-Font-Weight: 500;
458
- --Caption-Line-Height: 21px;
689
+ --Caption-Line-Height: 19px;
459
690
  --Caption-Letter-Spacing: 0px;
460
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;
461
696
 
462
697
  /* Label */
463
698
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -481,6 +716,14 @@
481
716
  --Label-Large-Line-Height: 27px;
482
717
  --Label-Large-Letter-Spacing: 0px;
483
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
+
484
727
  /* Legal */
485
728
  --Font-Family-Body: var(--Platform-Font-Families-Body);
486
729
  --Legal-Font-Size: 10px;
@@ -535,30 +778,53 @@
535
778
  --Button-Small-Line-Height: 16px;
536
779
  --Button-Small-Letter-Spacing: 0px;
537
780
  --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;
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;
542
806
 
543
807
  }
544
808
 
545
809
  [data-platform="Android"] {
546
810
 
811
+
812
+
547
813
  /* Display */
548
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
549
- --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;
550
816
  --Display-Small-Font-Weight: 600;
551
- --Display-Small-Line-Height: 28px;
817
+ --Display-Small-Line-Height: 44px;
552
818
  --Display-Small-Letter-Spacing: 0px;
553
- --Font-Family-Display: var(--Platform-Font-Families-Header);
554
- --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;
555
821
  --Display-Medium-Font-Weight: 600;
556
- --Display-Medium-Line-Height: 28px;
822
+ --Display-Medium-Line-Height: 52px;
557
823
  --Display-Medium-Letter-Spacing: 0px;
558
- --Font-Family-Display: var(--Platform-Font-Families-Decorative);
559
- --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;
560
826
  --Display-Large-Font-Weight: 600;
561
- --Display-Large-Line-Height: 28px;
827
+ --Display-Large-Line-Height: 64px;
562
828
  --Display-Large-Letter-Spacing: 0px;
563
829
 
564
830
  /* Headers */
@@ -630,11 +896,42 @@
630
896
 
631
897
  /* Caption */
632
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;
633
926
  --Caption-Font-Size: 14px;
634
927
  --Caption-Font-Weight: 500;
635
- --Caption-Line-Height: 21px;
928
+ --Caption-Line-Height: 20px;
636
929
  --Caption-Letter-Spacing: 0px;
637
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;
638
935
 
639
936
  /* Label */
640
937
  --Font-Family-Label: var(--Platform-Font-Families-Body);
@@ -658,6 +955,14 @@
658
955
  --Label-Large-Line-Height: 27px;
659
956
  --Label-Large-Letter-Spacing: 0px;
660
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
+
661
966
  /* Legal */
662
967
  --Font-Family-Body: var(--Platform-Font-Families-Body);
663
968
  --Legal-Font-Size: 10px;
@@ -712,9 +1017,232 @@
712
1017
  --Button-Small-Line-Height: 16px;
713
1018
  --Button-Small-Letter-Spacing: 0px;
714
1019
  --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;
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;
1045
+
1046
+ }
1047
+
1048
+ /* ── Platform button metrics ──────────────────────────────────────────────
1049
+ *
1050
+ * Apple's and Google's button sizes, overriding the brand's own on the touch
1051
+ * platforms. Desktop is absent on purpose: there the brand's heights ARE the
1052
+ * answer, and base.css already states them.
1053
+ *
1054
+ * :root[data-platform="…"], not the bare [data-platform="…"] the type ramps
1055
+ * above use, and the difference is load-bearing. --Button-Height is declared
1056
+ * at :root in base.css, which the provider injects at slot 5 — AFTER this file
1057
+ * at slot 3. A bare attribute selector ties with :root at (0,1,0), so the later
1058
+ * file would win and these overrides would do nothing, with no error anywhere.
1059
+ * :root[data-platform] scores (0,2,0) and wins on specificity instead, which
1060
+ * does not depend on anyone preserving the load order.
1061
+ *
1062
+ * The type ramps above can stay as they are: their :root counterpart is in
1063
+ * core.css at slot 2, so they already load later and win.
1064
+ *
1065
+ * --Small-/--Large-Button-Height are NOT restated. base.css declares them as
1066
+ * var(--Sm-Button-Height) / var(--Lg-Button-Height), and a var() in a custom
1067
+ * property resolves against the element it lands on — so the back-compat
1068
+ * spellings follow these overrides on their own.
1069
+ */
1070
+
1071
+ :root[data-platform="IOS-Mobile"] {
1072
+ --Button-Height: 44px;
1073
+ --Sm-Button-Height: 32px;
1074
+ --Lg-Button-Height: 50px;
1075
+ --Button-Icon: 20px;
1076
+ --Sm-Button-Icon: 16px;
1077
+ --Lg-Button-Icon: 24px;
1078
+ }
1079
+
1080
+ :root[data-platform="IOS-Tablet"] {
1081
+ --Button-Height: 44px;
1082
+ --Sm-Button-Height: 32px;
1083
+ --Lg-Button-Height: 50px;
1084
+ --Button-Icon: 20px;
1085
+ --Sm-Button-Icon: 16px;
1086
+ --Lg-Button-Icon: 24px;
1087
+ }
1088
+
1089
+ :root[data-platform="Android"] {
1090
+ --Button-Height: 48px;
1091
+ --Sm-Button-Height: 32px;
1092
+ --Lg-Button-Height: 56px;
1093
+ --Button-Icon: 18px;
1094
+ --Sm-Button-Icon: 18px;
1095
+ --Lg-Button-Icon: 24px;
1096
+ }
1097
+
1098
+
1099
+ /* ---------------------------------------------------------------------------
1100
+ Face re-mapping
1101
+ Display renders in the Display face (it used to follow Header, which left the
1102
+ expressive face with nowhere to appear at size). Overline is the eyebrow spec
1103
+ now, on the Eyebrow face. The lib hard-codes both families, so they are
1104
+ corrected here rather than through a token.
1105
+
1106
+ Both read the face token, which is what keeps decorative mode working:
1107
+ core.css re-points --Font-Family-Eyebrow at the Display face inside
1108
+ [data-decorative], on a higher-specificity selector.
1109
+ --------------------------------------------------------------------------- */
1110
+ .typography.typography-display-large,
1111
+ .typography.typography-display-medium,
1112
+ .typography.typography-display-small {
1113
+ font-family: var(--Font-Family-Display);
1114
+ }
1115
+
1116
+ .typography.typography-overline,
1117
+ .typography.typography-overline-small,
1118
+ .typography.typography-overline-medium,
1119
+ .typography.typography-overline-large {
1120
+ font-family: var(--Font-Family-Eyebrow);
1121
+ }
1122
+
1123
+ /* ---------------------------------------------------------------------------
1124
+ Prose lists — opt in with .typography-list on the <ul> or <ol>.
1125
+
1126
+ The marker takes --Eyebrow: the accent that is already ROTATED off the
1127
+ surface's palette (Primary->Secondary, Secondary->Tertiary, and so on), so a
1128
+ list picks up the same accent as the eyebrow above it instead of the page
1129
+ inventing one. The list TEXT is untouched and stays on --Text; only the
1130
+ bullet or number is accented.
1131
+
1132
+ Opt-in, not a bare li::marker rule, for the same reason nothing else here
1133
+ styles bare elements: importing the CSS must not repaint lists in a
1134
+ consumer's app that never asked for it.
1135
+
1136
+ ::marker only honours a short list of properties. color is one of them;
1137
+ background, padding and size are not, so a bullet that needs a custom size
1138
+ still needs the ::before technique.
1139
+ --------------------------------------------------------------------------- */
1140
+ .typography-list > li::marker {
1141
+ color: var(--Eyebrow);
1142
+ }
1143
+
1144
+ /* ---------------------------------------------------------------------------
1145
+ Alt Display colour — three variants, one pair of stops
1146
+
1147
+ Set data-alt-display on the element or any ancestor:
1148
+ default (or unset) the Alt reads as a heading
1149
+ colored a flat Alt colour
1150
+ gradient the two stops the theme publishes
1151
+
1152
+ The stops are re-published per theme and surface, so every variant follows
1153
+ data-surface without being restated.
1154
+ --------------------------------------------------------------------------- */
1155
+ :root,
1156
+ [data-alt-display="default"] {
1157
+ --Alt-Display-Color-Stop-1: var(--Header);
1158
+ --Alt-Display-Color-Stop-2: var(--Header);
1159
+ }
1160
+
1161
+ [data-alt-display="colored"] {
1162
+ --Alt-Display-Color-Stop-1: var(--Alt-Display-Color, var(--Header));
1163
+ --Alt-Display-Color-Stop-2: var(--Alt-Display-Color, var(--Header));
1164
+ }
1165
+
1166
+ [data-alt-display="gradient"] {
1167
+ --Alt-Display-Color-Stop-1: var(--Alt-Color-Gradient-Stop-1, var(--Alt-Display-Color, var(--Header)));
1168
+ --Alt-Display-Color-Stop-2: var(--Alt-Color-Gradient-Stop-2, var(--Alt-Display-Color, var(--Header)));
1169
+ }
1170
+
1171
+ .typography-alt-display-large,
1172
+ .typography-alt-display-medium,
1173
+ .typography-alt-display-small {
1174
+ /* Stop 1 alone: in the flat variants the two agree, and a plain colour keeps
1175
+ the selection highlight, print, and forced-colors working. */
1176
+ color: var(--Alt-Display-Color-Stop-1);
1177
+ }
1178
+
1179
+ .typography-alt-display-large[data-alt-display="gradient"],
1180
+ [data-alt-display="gradient"] .typography-alt-display-large,
1181
+ .typography-alt-display-medium[data-alt-display="gradient"],
1182
+ [data-alt-display="gradient"] .typography-alt-display-medium,
1183
+ .typography-alt-display-small[data-alt-display="gradient"],
1184
+ [data-alt-display="gradient"] .typography-alt-display-small {
1185
+ background-image: linear-gradient(
1186
+ 90deg,
1187
+ var(--Alt-Display-Color-Stop-1),
1188
+ var(--Alt-Display-Color-Stop-2)
1189
+ );
1190
+ -webkit-background-clip: text;
1191
+ background-clip: text;
1192
+ color: transparent;
1193
+ /* The box carries the paint, not the glyphs, so keep it to the text's own
1194
+ box or a wrapped headline stretches the ramp across empty trailing space. */
1195
+ -webkit-box-decoration-break: clone;
1196
+ box-decoration-break: clone;
1197
+ }
1198
+
1199
+ @media (forced-colors: active) {
1200
+ .typography-alt-display-large[data-alt-display="gradient"],
1201
+ [data-alt-display="gradient"] .typography-alt-display-large,
1202
+ .typography-alt-display-medium[data-alt-display="gradient"],
1203
+ [data-alt-display="gradient"] .typography-alt-display-medium,
1204
+ .typography-alt-display-small[data-alt-display="gradient"],
1205
+ [data-alt-display="gradient"] .typography-alt-display-small {
1206
+ /* The UA drops background-image here, and transparent text would leave
1207
+ nothing on screen. Hand the glyphs back to the system colour. */
1208
+ background-image: none;
1209
+ -webkit-background-clip: border-box;
1210
+ background-clip: border-box;
1211
+ color: CanvasText;
1212
+ forced-color-adjust: auto;
1213
+ }
1214
+ }
1215
+
1216
+ /* ---------------------------------------------------------------------------
1217
+ Paragraph spacing — space only where one paragraph follows another, which is
1218
+ what the Figma token means.
1219
+ --------------------------------------------------------------------------- */
1220
+ .typography-caption-small + .typography-caption-small {
1221
+ margin-block-start: var(--Caption-Small-Paragraph-Spacing);
1222
+ }
1223
+
1224
+ .typography-caption + .typography-caption {
1225
+ margin-block-start: var(--Caption-Paragraph-Spacing);
1226
+ }
1227
+
1228
+ .typography-caption-large + .typography-caption-large {
1229
+ margin-block-start: var(--Caption-Large-Paragraph-Spacing);
1230
+ }
1231
+
1232
+ .typography-legal + .typography-legal {
1233
+ margin-block-start: var(--Legal-Paragraph-Spacing);
1234
+ }
719
1235
 
1236
+ /* ---------------------------------------------------------------------------
1237
+ Variable-font axes
1238
+ wght is deliberately absent — font-weight already carries it, and declaring
1239
+ it in both places lets the two disagree.
1240
+ --------------------------------------------------------------------------- */
1241
+ .typography-h1,
1242
+ .typography-h2,
1243
+ .typography-h3,
1244
+ .typography-h4,
1245
+ .typography-h5,
1246
+ .typography-h6 {
1247
+ font-variation-settings: var(--Font-Variation-Header);
720
1248
  }