@omni-design/components 0.12.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 (39) hide show
  1. package/dist/OmniDesignProvider.esm.js +1 -1
  2. package/dist/OmniDesignProvider.esm.js.map +1 -1
  3. package/dist/OmniDesignProvider.js +1 -1
  4. package/dist/OmniDesignProvider.js.map +1 -1
  5. package/dist/index.esm.js +8 -3
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/index.js +8 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/types/components/BackgroundPicker.d.ts +1 -1
  10. package/dist/types/components/BrandIcon/BrandIcon.d.ts +20 -0
  11. package/dist/types/components/BrandIcon/index.d.ts +1 -0
  12. package/dist/types/components/Charts/tokens.d.ts +1 -1
  13. package/dist/types/components/Footer/Footer.d.ts +3 -1
  14. package/dist/types/components/Foundations/FoundationTopic.d.ts +4 -0
  15. package/dist/types/components/Foundations/HowToSlot.d.ts +16 -0
  16. package/dist/types/components/Foundations/TokenRoles.d.ts +19 -0
  17. package/dist/types/components/Foundations/TypographySummary.d.ts +2 -0
  18. package/dist/types/components/ShowcaseHeader.d.ts +5 -0
  19. package/dist/types/components/TextField/TextField.d.ts +1 -1
  20. package/dist/types/components/Typography/Typography.d.ts +54 -1
  21. package/dist/types/components/Typography/index.d.ts +1 -1
  22. package/dist/types/components/_states.d.ts +1 -1
  23. package/dist/types/components/a11yPanel.d.ts +37 -0
  24. package/dist/types/components/index.d.ts +3 -2
  25. package/dist/types/docs/DocPanels.d.ts +0 -14
  26. package/dist/types/docs/components.d.ts +8 -0
  27. package/dist/types/docs/componentsSurfaces.d.ts +100 -10
  28. package/dist/types/docs/examples.d.ts +11 -0
  29. package/dist/types/docs/figmaHowTo.d.ts +28 -0
  30. package/dist/types/docs/figmaLinks.d.ts +58 -0
  31. package/dist/types/docs/foundations.d.ts +12 -0
  32. package/package.json +4 -2
  33. package/public/styles/Dark-Mode.css +6 -0
  34. package/public/styles/Light-Mode.css +6 -0
  35. package/public/styles/base.css +23 -0
  36. package/public/styles/core.css +94 -15
  37. package/public/styles/foundation.css +18 -0
  38. package/public/styles/typography-tokens.css +262 -13
  39. package/dist/types/theme/useThemeMode.d.ts +0 -4
@@ -170,6 +170,8 @@ body { margin: 0; }
170
170
  * ======================================== */
171
171
 
172
172
  /* Theme: Default - Surfaces */
173
+ :root,
174
+ [data-surface="Surface"],
173
175
  [data-theme="Default"],
174
176
  [data-theme="Default"][data-surface="Surface"] {
175
177
  --Background: var(--Neutral-Color-1);
@@ -338,6 +340,7 @@ body { margin: 0; }
338
340
  }
339
341
 
340
342
  /* Theme: Default - Surfaces-Dim */
343
+ [data-surface="Surface-Dim"],
341
344
  [data-theme="Default"] [data-surface="Surface-Dim"],
342
345
  [data-theme="Default"][data-surface="Surface-Dim"] {
343
346
  --Background: var(--Neutral-Color-1);
@@ -506,6 +509,7 @@ body { margin: 0; }
506
509
  }
507
510
 
508
511
  /* Theme: Default - Surfaces-Dimmest */
512
+ [data-surface="Surface-Dimmest"],
509
513
  [data-theme="Default"] [data-surface="Surface-Dimmest"],
510
514
  [data-theme="Default"][data-surface="Surface-Dimmest"] {
511
515
  --Background: var(--Neutral-Color-3);
@@ -674,6 +678,7 @@ body { margin: 0; }
674
678
  }
675
679
 
676
680
  /* Theme: Default - Surfaces-Bright */
681
+ [data-surface="Surface-Bright"],
677
682
  [data-theme="Default"] [data-surface="Surface-Bright"],
678
683
  [data-theme="Default"][data-surface="Surface-Bright"] {
679
684
  --Background: var(--Neutral-Color-3);
@@ -842,6 +847,7 @@ body { margin: 0; }
842
847
  }
843
848
 
844
849
  /* Theme: Default - Surfaces-Brightest */
850
+ [data-surface="Surface-Brightest"],
845
851
  [data-theme="Default"] [data-surface="Surface-Brightest"],
846
852
  [data-theme="Default"][data-surface="Surface-Brightest"] {
847
853
  --Background: var(--Neutral-Color-11);
@@ -170,6 +170,8 @@ body { margin: 0; }
170
170
  * ======================================== */
171
171
 
172
172
  /* Theme: Default - Surfaces */
173
+ :root,
174
+ [data-surface="Surface"],
173
175
  [data-theme="Default"],
174
176
  [data-theme="Default"][data-surface="Surface"] {
175
177
  --Background: var(--Neutral-Color-12);
@@ -347,6 +349,7 @@ body { margin: 0; }
347
349
  }
348
350
 
349
351
  /* Theme: Default - Surfaces-Dim */
352
+ [data-surface="Surface-Dim"],
350
353
  [data-theme="Default"] [data-surface="Surface-Dim"],
351
354
  [data-theme="Default"][data-surface="Surface-Dim"] {
352
355
  --Background: var(--Neutral-Color-11);
@@ -524,6 +527,7 @@ body { margin: 0; }
524
527
  }
525
528
 
526
529
  /* Theme: Default - Surfaces-Dimmest */
530
+ [data-surface="Surface-Dimmest"],
527
531
  [data-theme="Default"] [data-surface="Surface-Dimmest"],
528
532
  [data-theme="Default"][data-surface="Surface-Dimmest"] {
529
533
  --Background: var(--Neutral-Color-3);
@@ -701,6 +705,7 @@ body { margin: 0; }
701
705
  }
702
706
 
703
707
  /* Theme: Default - Surfaces-Bright */
708
+ [data-surface="Surface-Bright"],
704
709
  [data-theme="Default"] [data-surface="Surface-Bright"],
705
710
  [data-theme="Default"][data-surface="Surface-Bright"] {
706
711
  --Background: var(--Neutral-Color-12);
@@ -878,6 +883,7 @@ body { margin: 0; }
878
883
  }
879
884
 
880
885
  /* Theme: Default - Surfaces-Brightest */
886
+ [data-surface="Surface-Brightest"],
881
887
  [data-theme="Default"] [data-surface="Surface-Brightest"],
882
888
  [data-theme="Default"][data-surface="Surface-Brightest"] {
883
889
  --Background: var(--Neutral-Color-12);
@@ -295,6 +295,9 @@
295
295
  --Dropdown-Frame-Radius: 2px;
296
296
  --Menu-Item-Radius: 0px;
297
297
  --Menu-Focus-Radius: 0px;
298
+ --Sm-Menu-Swatch: 16px;
299
+ --Menu-Swatch: 24px;
300
+ --Lg-Menu-Swatch: 32px;
298
301
  --Disabled: 0.38;
299
302
  --Rail-Width: 80px;
300
303
  --Sm-Rail-Width: 72px;
@@ -426,18 +429,38 @@
426
429
  --Background: var(--Container);
427
430
  }
428
431
 
432
+ [data-theme][data-surface="Container"] {
433
+ --Background: var(--Container);
434
+ }
435
+
429
436
  [data-surface="Container-Low"] {
430
437
  --Background: var(--Container-Low);
431
438
  }
432
439
 
440
+ [data-theme][data-surface="Container-Low"] {
441
+ --Background: var(--Container-Low);
442
+ }
443
+
433
444
  [data-surface="Container-Lowest"] {
434
445
  --Background: var(--Container-Lowest);
435
446
  }
436
447
 
448
+ [data-theme][data-surface="Container-Lowest"] {
449
+ --Background: var(--Container-Lowest);
450
+ }
451
+
437
452
  [data-surface="Container-High"] {
438
453
  --Background: var(--Container-High);
439
454
  }
440
455
 
456
+ [data-theme][data-surface="Container-High"] {
457
+ --Background: var(--Container-High);
458
+ }
459
+
441
460
  [data-surface="Container-Highest"] {
442
461
  --Background: var(--Container-Highest);
443
462
  }
463
+
464
+ [data-theme][data-surface="Container-Highest"] {
465
+ --Background: var(--Container-Highest);
466
+ }
@@ -23,7 +23,7 @@
23
23
  }
24
24
 
25
25
  /* Platform Font Overrides */
26
- [data-platform="IOS-Mobile"][data-fonts] {
26
+ [data-device="IOS-Mobile"][data-fonts] {
27
27
  --Body-Font-Family: var(--Set-Font-Family-Body);
28
28
  --Header-Font-Family: var(--Set-Font-Family-Header);
29
29
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -33,7 +33,7 @@
33
33
  --Body-Semibold-Font-Weight: var(--Set-Font-Family-Body-Semibold-Weight);
34
34
  --Body-Bold-Font-Weight: var(--Set-Font-Family-Body-Bold-Weight);
35
35
  }
36
- [data-platform="IOS-Tablet"][data-fonts] {
36
+ [data-device="IOS-Tablet"][data-fonts] {
37
37
  --Body-Font-Family: var(--Set-Font-Family-Body);
38
38
  --Header-Font-Family: var(--Set-Font-Family-Header);
39
39
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -43,7 +43,7 @@
43
43
  --Body-Semibold-Font-Weight: var(--Set-Font-Family-Body-Semibold-Weight);
44
44
  --Body-Bold-Font-Weight: var(--Set-Font-Family-Body-Bold-Weight);
45
45
  }
46
- [data-platform="Android"][data-fonts] {
46
+ [data-device="Android"][data-fonts] {
47
47
  --Body-Font-Family: var(--Set-Font-Family-Body);
48
48
  --Header-Font-Family: var(--Set-Font-Family-Header);
49
49
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -54,7 +54,7 @@
54
54
  --Body-Bold-Font-Weight: var(--Set-Font-Family-Body-Bold-Weight);
55
55
  }
56
56
 
57
- [data-platform="IOS-Mobile"][data-fonts="Default"] {
57
+ [data-device="IOS-Mobile"][data-fonts="Default"] {
58
58
  --Body-Font-Family: "SF Pro";
59
59
  --Header-Font-Family: "SF Pro";
60
60
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -64,7 +64,7 @@
64
64
  --Body-Semibold-Font-Weight: var(--Set-Font-Family-Body-Semibold-Weight);
65
65
  --Body-Bold-Font-Weight: var(--Set-Font-Family-Body-Bold-Weight);
66
66
  }
67
- [data-platform="IOS-Tablet"][data-fonts="Default"] {
67
+ [data-device="IOS-Tablet"][data-fonts="Default"] {
68
68
  --Body-Font-Family: "SF Pro";
69
69
  --Header-Font-Family: "SF Pro";
70
70
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -74,7 +74,7 @@
74
74
  --Body-Semibold-Font-Weight: var(--Set-Font-Family-Body-Semibold-Weight);
75
75
  --Body-Bold-Font-Weight: var(--Set-Font-Family-Body-Bold-Weight);
76
76
  }
77
- [data-platform="Android"][data-fonts="Default"] {
77
+ [data-device="Android"][data-fonts="Default"] {
78
78
  --Body-Font-Family: "Roboto";
79
79
  --Header-Font-Family: "Roboto";
80
80
  --Header-Font-Weight: var(--Set-Font-Family-Header-Weight);
@@ -113,7 +113,7 @@
113
113
  --Body-Line-Height: 24px;
114
114
  --Body-Paragraph-Spacing: 16px;
115
115
  /* Per-style ramp — generated from the same type scale that produces
116
- typography-tokens.css, so a consumer that never sets data-platform gets
116
+ typography-tokens.css, so a consumer that never sets data-device gets
117
117
  the identical Desktop values. Editing sizes here is wrong; edit
118
118
  src/utils/typeScale.ts. */
119
119
  /* Faces */
@@ -130,12 +130,12 @@
130
130
  --Header-Clamped-Weight: 640;
131
131
 
132
132
  /* Variable-font axes */
133
- --Font-Grade-Header: 50;
134
133
  --Font-Slant-Header: 0;
134
+ --Font-Grade-Header: 50;
135
+ --Font-Width-Header: 72;
135
136
  --Font-Roundness-Header: 0;
136
137
  --Font-Optical-Size-Header: 96;
137
- --Font-Width-Header: 72;
138
- --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);
138
+ --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);
139
139
 
140
140
  /* 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. */
141
141
  --Display-Large-Font-Family: var(--Font-Family-Display);
@@ -441,7 +441,7 @@
441
441
  --Button-Line-Height: 20px;
442
442
  /* Bevel geometry for ALL THREE sizes — derived from THIS platform's button
443
443
  heights, which is why it lives beside them rather than in foundation.css.
444
- Each [data-platform] block below re-emits all three for its own heights.
444
+ Each [data-device] block below re-emits all three for its own heights.
445
445
  It used to re-emit the MEDIUM set only, so a small or large button wore
446
446
  Desktop's bevel on every platform. */
447
447
  --Button-Highlight-Offset-x: 0px;
@@ -483,7 +483,7 @@
483
483
  }
484
484
 
485
485
  /* iOS Mobile */
486
- [data-platform="IOS-Mobile"] {
486
+ [data-device="IOS-Mobile"] {
487
487
  --Container-Padding: var(--Sizing-2);
488
488
  --Platform-Label: "IOS-Mobile";
489
489
  --Button-Height: 44px;
@@ -555,7 +555,7 @@
555
555
  }
556
556
 
557
557
  /* iOS Tablet */
558
- [data-platform="IOS-Tablet"] {
558
+ [data-device="IOS-Tablet"] {
559
559
  --Container-Padding: var(--Sizing-3);
560
560
  --Platform-Label: "IOS-Tablet";
561
561
  --Button-Height: 44px;
@@ -626,8 +626,87 @@
626
626
  --Button-Line-Height: 21px;
627
627
  }
628
628
 
629
- /* Android */
630
- [data-platform="Android"] {
629
+ /* Android, a block each.
630
+ Android-Tablet and Android-Mobile carry identical METRICS — Figma gives
631
+ both a 48px button and a 12px spacer — so these two blocks hold the same
632
+ values. They are written separately rather than sharing a selector list
633
+ because every other platform has a block of its own, and a reader checking
634
+ "is this platform covered" should find one answer in one shape. The two
635
+ exist as separate devices because TYPOGRAPHY differs between them. */
636
+ /* Android tablet */
637
+ [data-device="Android-Tablet"] {
638
+ --Container-Padding: var(--Sizing-2);
639
+ --Platform-Label: "Android";
640
+ --Button-Height: 48px;
641
+ --Min-Stack-Gap: 12px;
642
+ --Button-Highlight-Offset-x: 0px;
643
+ --Button-Highlight-Offset-y: 0px;
644
+ --Button-Highlight-Blur-Radius: 0px;
645
+ --Button-Highlight-Spread: 0px;
646
+ --Button-Lowlight-Offset-x: 0px;
647
+ --Button-Lowlight-Offset-y: 0px;
648
+ --Button-Lowlight-Blur-Radius: 0px;
649
+ --Button-Lowlight-Spread: 0px;
650
+ --Sm-Button-Highlight-Offset-x: 0px;
651
+ --Sm-Button-Highlight-Offset-y: 0px;
652
+ --Sm-Button-Highlight-Blur-Radius: 0px;
653
+ --Sm-Button-Highlight-Spread: 0px;
654
+ --Sm-Button-Lowlight-Offset-x: 0px;
655
+ --Sm-Button-Lowlight-Offset-y: 0px;
656
+ --Sm-Button-Lowlight-Blur-Radius: 0px;
657
+ --Sm-Button-Lowlight-Spread: 0px;
658
+ --Lg-Button-Highlight-Offset-x: 0px;
659
+ --Lg-Button-Highlight-Offset-y: 0px;
660
+ --Lg-Button-Highlight-Blur-Radius: 0px;
661
+ --Lg-Button-Highlight-Spread: 0px;
662
+ --Lg-Button-Lowlight-Offset-x: 0px;
663
+ --Lg-Button-Lowlight-Offset-y: 0px;
664
+ --Lg-Button-Lowlight-Blur-Radius: 0px;
665
+ --Lg-Button-Lowlight-Spread: 0px;
666
+ --Target: 48px;
667
+ --Platform-Spacer: 12px;
668
+ /* Floating overlays — the platform's chrome plus room for a shadow */
669
+ --SnackBar-Top: 112px;
670
+ --SnackBar-Bottom: 48px;
671
+ --Overlay-Clearance: 24px;
672
+ --Body-Font-Size: 16px;
673
+ --Body-Line-Height: 24px;
674
+ --Body-Letter-Spacing: .5px;
675
+ --Body-Paragraph-Spacing: 16px;
676
+ --H1-Font-Size: 36px;
677
+ --H1-Line-Height: 40px;
678
+ --H1-Letter-Spacing: -.5px;
679
+ --H1-Paragraph-Spacing: 20px;
680
+ --H2-Font-Size: 28px;
681
+ --H2-Line-Height: 36px;
682
+ --H2-Letter-Spacing: -.5px;
683
+ --H2-Paragraph-Spacing: 20px;
684
+ --H3-Font-Size: 24px;
685
+ --H3-Line-Height: 32px;
686
+ --H3-Letter-Spacing: 0px;
687
+ --H3-Paragraph-Spacing: 16px;
688
+ --H4-Font-Size: 20px;
689
+ --H4-Line-Height: 28px;
690
+ --H4-Letter-Spacing: 0px;
691
+ --H4-Paragraph-Spacing: 12px;
692
+ --H5-Font-Size: 18px;
693
+ --H5-Line-Height: 26px;
694
+ --H5-Letter-Spacing: 0px;
695
+ --H5-Paragraph-Spacing: 12px;
696
+ --H6-Font-Size: 16px;
697
+ --H6-Line-Height: 24px;
698
+ --H6-Letter-Spacing: .5px;
699
+ --H6-Paragraph-Spacing: 8px;
700
+ --Label-Font-Size: 13px;
701
+ --Label-Line-Height: 18px;
702
+ --Label-Letter-Spacing: 0px;
703
+ --Label-Paragraph-Spacing: 4px;
704
+ --Button-Font-Size: 16px;
705
+ --Button-Line-Height: 20px;
706
+ }
707
+
708
+ /* Android phone */
709
+ [data-device="Android-Mobile"] {
631
710
  --Container-Padding: var(--Sizing-2);
632
711
  --Platform-Label: "Android";
633
712
  --Button-Height: 48px;
@@ -5,6 +5,24 @@
5
5
 
6
6
  :root {
7
7
 
8
+ /* ── The brand's CORE colours ────────────────────────────────────────────
9
+ The three hexes the user actually picked, verbatim.
10
+
11
+ Nothing else in the published CSS says which colour a brand chose.
12
+ generateScaledTones writes the pick into the tone NEAREST ITS LIGHTNESS,
13
+ so the index differs per colour — a dark pick lands low, a pale one high
14
+ — and no fixed tone can stand for it. Color-Vibrant is not it either: that
15
+ is hardcoded to Color-8, which on a light brand is a pale tint. The
16
+ library's own Colors page showed Color-11 and then Color-8 and was wrong
17
+ both times, because the information was never published.
18
+
19
+ Emitted here rather than derived, so a consumer can show the brand's
20
+ colours without reaching into Firestore — which a published stylesheet
21
+ cannot do. */
22
+ --Primary-Core: #849054;
23
+ --Secondary-Core: #e49090;
24
+ --Tertiary-Core: #f0b484;
25
+
8
26
  /* Button */
9
27
  --Button-Radius: 2px;
10
28
  --Sm-Button-Radius: 2px;
@@ -5,10 +5,10 @@
5
5
 
6
6
  /* typography-tokens.css
7
7
  * Auto-generated — do not edit by hand.
8
- * Apply [data-platform="Desktop"] etc to your root element.
8
+ * Apply [data-device="Desktop"] etc to your root element.
9
9
  */
10
10
 
11
- [data-platform="Desktop"] {
11
+ [data-device="Desktop"] {
12
12
  /* Faces */
13
13
  --Font-Family-Display: var(--Set-Font-Family-Display, var(--Platform-Font-Families-Decorative, var(--Set-Font-Family-Decorative)));
14
14
  --Font-Family-Header: var(--Platform-Font-Families-Header, var(--Set-Font-Family-Header));
@@ -23,12 +23,12 @@
23
23
  --Header-Clamped-Weight: 640;
24
24
 
25
25
  /* Variable-font axes */
26
- --Font-Grade-Header: 50;
27
26
  --Font-Slant-Header: 0;
27
+ --Font-Grade-Header: 50;
28
+ --Font-Width-Header: 72;
28
29
  --Font-Roundness-Header: 0;
29
30
  --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);
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
32
 
33
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
34
  --Display-Large-Font-Family: var(--Font-Family-Display);
@@ -328,7 +328,7 @@
328
328
  --Badge-Text-Transform: none;
329
329
  }
330
330
 
331
- [data-platform="IOS-Mobile"] {
331
+ [data-device="IOS-Mobile"] {
332
332
 
333
333
 
334
334
 
@@ -567,7 +567,7 @@
567
567
 
568
568
  }
569
569
 
570
- [data-platform="IOS-Tablet"] {
570
+ [data-device="IOS-Tablet"] {
571
571
 
572
572
 
573
573
 
@@ -806,7 +806,247 @@
806
806
 
807
807
  }
808
808
 
809
- [data-platform="Android"] {
809
+ [data-device="Android-Tablet"] {
810
+
811
+
812
+
813
+ /* Display */
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;
816
+ --Display-Small-Font-Weight: 600;
817
+ --Display-Small-Line-Height: 44px;
818
+ --Display-Small-Letter-Spacing: 0px;
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;
821
+ --Display-Medium-Font-Weight: 600;
822
+ --Display-Medium-Line-Height: 52px;
823
+ --Display-Medium-Letter-Spacing: 0px;
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;
826
+ --Display-Large-Font-Weight: 600;
827
+ --Display-Large-Line-Height: 64px;
828
+ --Display-Large-Letter-Spacing: 0px;
829
+
830
+ /* Headers */
831
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
832
+ --H1-Font-Size: 28px;
833
+ --H1-Font-Weight: 600;
834
+ --H1-Line-Height: 28px;
835
+ --H1-Letter-Spacing: 0px;
836
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
837
+ --H2-Font-Size: 26px;
838
+ --H2-Font-Weight: 600;
839
+ --H2-Line-Height: 26px;
840
+ --H2-Letter-Spacing: 0px;
841
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
842
+ --H3-Font-Size: 24px;
843
+ --H3-Font-Weight: 600;
844
+ --H3-Line-Height: 24px;
845
+ --H3-Letter-Spacing: 0px;
846
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
847
+ --H4-Font-Size: 20px;
848
+ --H4-Font-Weight: 600;
849
+ --H4-Line-Height: 20px;
850
+ --H4-Letter-Spacing: 0px;
851
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
852
+ --H5-Font-Size: 18px;
853
+ --H5-Font-Weight: 600;
854
+ --H5-Line-Height: 18px;
855
+ --H5-Letter-Spacing: 0px;
856
+ --Font-Family-Body: var(--Platform-Font-Families-Decorative);
857
+ --H6-Font-Size: 16px;
858
+ --H6-Font-Weight: 600;
859
+ --H6-Line-Height: 16px;
860
+ --H6-Letter-Spacing: 0px;
861
+
862
+ /* Subtitle */
863
+ --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
864
+ --Subtitle-Small-Font-Size: 16px;
865
+ --Subtitle-Small-Font-Weight: 700;
866
+ --Subtitle-Small-Line-Height: 24px;
867
+ --Subtitle-Small-Letter-Spacing: 0px;
868
+ --Font-Family-Subtitle: var(--Platform-Font-Families-Body);
869
+ --Subtitle-Large-Font-Size: 18px;
870
+ --Subtitle-Large-Font-Weight: 700;
871
+ --Subtitle-Large-Line-Height: 32px;
872
+ --Subtitle-Large-Letter-Spacing: 0px;
873
+
874
+ /* Body */
875
+ --Font-Family-Body: var(--Platform-Font-Families-Body);
876
+ --Body-Small-Font-Size: 14px;
877
+ --Body-Small-Font-Weight: 500;
878
+ --Body-Small-Line-Height: 21px;
879
+ --Body-Small-Letter-Spacing: 0px;
880
+ --Body-Small-Semibold-Font-Weight: 600;
881
+ --Body-Small-Bold-Font-Weight: 700;
882
+ --Font-Family-Body: var(--Platform-Font-Families-Body);
883
+ --Body-Medium-Font-Size: 16px;
884
+ --Body-Medium-Font-Weight: 500;
885
+ --Body-Medium-Line-Height: 24px;
886
+ --Body-Medium-Letter-Spacing: 0px;
887
+ --Body-Medium-Semibold-Font-Weight: 600;
888
+ --Body-Medium-Bold-Font-Weight: 700;
889
+ --Font-Family-Body: var(--Platform-Font-Families-Body);
890
+ --Body-Large-Font-Size: 18px;
891
+ --Body-Large-Font-Weight: 600;
892
+ --Body-Large-Line-Height: 27px;
893
+ --Body-Large-Letter-Spacing: 0px;
894
+ --Body-Large-Semibold-Font-Weight: 600;
895
+ --Body-Large-Bold-Font-Weight: 700;
896
+
897
+ /* Caption */
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;
926
+ --Caption-Font-Size: 14px;
927
+ --Caption-Font-Weight: 500;
928
+ --Caption-Line-Height: 20px;
929
+ --Caption-Letter-Spacing: 0px;
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;
935
+
936
+ /* Label */
937
+ --Font-Family-Label: var(--Platform-Font-Families-Body);
938
+ --Label-ExtraSmall-Font-Size: 11px;
939
+ --Label-ExtraSmall-Font-Weight: 600;
940
+ --Label-ExtraSmall-Line-Height: 16.5px;
941
+ --Label-ExtraSmall-Letter-Spacing: 0px;
942
+ --Font-Family-Label: var(--Platform-Font-Families-Body);
943
+ --Label-Small-Font-Size: 12.5px;
944
+ --Label-Small-Font-Weight: 600;
945
+ --Label-Small-Line-Height: 18.75px;
946
+ --Label-Small-Letter-Spacing: 0px;
947
+ --Font-Family-Label: var(--Platform-Font-Families-Body);
948
+ --Label-Medium-Font-Size: 16px;
949
+ --Label-Medium-Font-Weight: 600;
950
+ --Label-Medium-Line-Height: 24px;
951
+ --Label-Medium-Letter-Spacing: 0px;
952
+ --Font-Family-Label: var(--Platform-Font-Families-Body);
953
+ --Label-Large-Font-Size: 18px;
954
+ --Label-Large-Font-Weight: 600;
955
+ --Label-Large-Line-Height: 27px;
956
+ --Label-Large-Letter-Spacing: 0px;
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
+
966
+ /* Legal */
967
+ --Font-Family-Body: var(--Platform-Font-Families-Body);
968
+ --Legal-Font-Size: 10px;
969
+ --Legal-Font-Weight: 400;
970
+ --Legal-Line-Height: 15px;
971
+ --Legal-Letter-Spacing: 0px;
972
+ --Legal-Semibold-Font-Weight: 600;
973
+
974
+ /* Overline */
975
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
976
+ --Overline-Small-Font-Size: 14px;
977
+ --Overline-Small-Font-Weight: 500;
978
+ --Overline-Small-Line-Height: 21px;
979
+ --Overline-Small-Letter-Spacing: 0px;
980
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
981
+ --Overline-Medium-Font-Size: 16px;
982
+ --Overline-Medium-Font-Weight: 600;
983
+ --Overline-Medium-Line-Height: 24px;
984
+ --Overline-Medium-Letter-Spacing: 0px;
985
+ --Font-Family-Overline: var(--Platform-Font-Families-Body);
986
+ --Overline-Large-Font-Size: 18px;
987
+ --Overline-Large-Font-Weight: 600;
988
+ --Overline-Large-Line-Height: 27px;
989
+ --Overline-Large-Letter-Spacing: 0px;
990
+
991
+ /* Number */
992
+ --Font-Family-Number: var(--Platform-Font-Families-Body);
993
+ --Number-Small-Font-Size: 16px;
994
+ --Number-Small-Font-Weight: 700;
995
+ --Number-Small-Line-Height: 16px;
996
+ --Number-Small-Letter-Spacing: 0px;
997
+ --Font-Family-Number: var(--Platform-Font-Families-Body);
998
+ --Number-Medium-Font-Size: 28px;
999
+ --Number-Medium-Font-Weight: 700;
1000
+ --Number-Medium-Line-Height: 16px;
1001
+ --Number-Medium-Letter-Spacing: 0px;
1002
+ --Font-Family-Number: var(--Platform-Font-Families-Body);
1003
+ --Number-Large-Font-Size: 36px;
1004
+ --Number-Large-Font-Weight: 700;
1005
+ --Number-Large-Line-Height: 36px;
1006
+ --Number-Large-Letter-Spacing: 0px;
1007
+
1008
+ /* Button */
1009
+ --Font-Family-Button: var(--Platform-Font-Families-Body);
1010
+ --Button-ExtraSmall-Font-Size: 11px;
1011
+ --Button-ExtraSmall-Font-Weight: 600;
1012
+ --Button-ExtraSmall-Line-Height: 28px;
1013
+ --Button-ExtraSmall-Letter-Spacing: 0px;
1014
+ --Font-Family-Button: var(--Platform-Font-Families-Body);
1015
+ --Button-Small-Font-Size: 14px;
1016
+ --Button-Small-Font-Weight: 600;
1017
+ --Button-Small-Line-Height: 16px;
1018
+ --Button-Small-Letter-Spacing: 0px;
1019
+ --Font-Family-Button: var(--Platform-Font-Families-Body);
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
+
1049
+ [data-device="Android-Mobile"] {
810
1050
 
811
1051
 
812
1052
 
@@ -1051,12 +1291,12 @@
1051
1291
  * platforms. Desktop is absent on purpose: there the brand's heights ARE the
1052
1292
  * answer, and base.css already states them.
1053
1293
  *
1054
- * :root[data-platform="…"], not the bare [data-platform="…"] the type ramps
1294
+ * :root[data-device="…"], not the bare [data-device="…"] the type ramps
1055
1295
  * above use, and the difference is load-bearing. --Button-Height is declared
1056
1296
  * at :root in base.css, which the provider injects at slot 5 — AFTER this file
1057
1297
  * at slot 3. A bare attribute selector ties with :root at (0,1,0), so the later
1058
1298
  * 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
1299
+ * :root[data-device] scores (0,2,0) and wins on specificity instead, which
1060
1300
  * does not depend on anyone preserving the load order.
1061
1301
  *
1062
1302
  * The type ramps above can stay as they are: their :root counterpart is in
@@ -1068,7 +1308,7 @@
1068
1308
  * spellings follow these overrides on their own.
1069
1309
  */
1070
1310
 
1071
- :root[data-platform="IOS-Mobile"] {
1311
+ :root[data-device="IOS-Mobile"] {
1072
1312
  --Button-Height: 44px;
1073
1313
  --Sm-Button-Height: 32px;
1074
1314
  --Lg-Button-Height: 50px;
@@ -1077,7 +1317,7 @@
1077
1317
  --Lg-Button-Icon: 24px;
1078
1318
  }
1079
1319
 
1080
- :root[data-platform="IOS-Tablet"] {
1320
+ :root[data-device="IOS-Tablet"] {
1081
1321
  --Button-Height: 44px;
1082
1322
  --Sm-Button-Height: 32px;
1083
1323
  --Lg-Button-Height: 50px;
@@ -1086,7 +1326,16 @@
1086
1326
  --Lg-Button-Icon: 24px;
1087
1327
  }
1088
1328
 
1089
- :root[data-platform="Android"] {
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"] {
1090
1339
  --Button-Height: 48px;
1091
1340
  --Sm-Button-Height: 32px;
1092
1341
  --Lg-Button-Height: 56px;