@omni-design/components 0.12.0 → 0.14.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 (59) 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 +23 -0
  11. package/dist/types/components/BrandIcon/BrandIconShowcase.d.ts +2 -0
  12. package/dist/types/components/BrandIcon/index.d.ts +2 -0
  13. package/dist/types/components/Button/Button.d.ts +35 -66
  14. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +3 -1
  15. package/dist/types/components/Charts/tokens.d.ts +1 -1
  16. package/dist/types/components/CodeBlock/index.d.ts +1 -0
  17. package/dist/types/components/Footer/Footer.d.ts +3 -1
  18. package/dist/types/components/Foundations/FoundationTopic.d.ts +4 -0
  19. package/dist/types/components/Foundations/HowToSlot.d.ts +16 -0
  20. package/dist/types/components/Foundations/TokenRoles.d.ts +19 -0
  21. package/dist/types/components/Foundations/TypographySummary.d.ts +2 -0
  22. package/dist/types/components/List/List.d.ts +2 -1
  23. package/dist/types/components/Rail/Rail.d.ts +2 -1
  24. package/dist/types/components/ShowcaseHeader.d.ts +5 -0
  25. package/dist/types/components/Slider/Slider.d.ts +6 -3
  26. package/dist/types/components/TextField/TextField.d.ts +1 -1
  27. package/dist/types/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +8 -5
  28. package/dist/types/components/ToggleButtonGroup/ToggleButtonGroupShowcase.d.ts +2 -0
  29. package/dist/types/components/ToggleButtonGroup/index.d.ts +2 -0
  30. package/dist/types/components/Typography/Typography.d.ts +54 -1
  31. package/dist/types/components/Typography/index.d.ts +1 -1
  32. package/dist/types/components/_states.d.ts +1 -1
  33. package/dist/types/components/a11yPanel.d.ts +58 -0
  34. package/dist/types/components/index.d.ts +3 -2
  35. package/dist/types/docs/DocPanels.d.ts +0 -14
  36. package/dist/types/docs/components.d.ts +131 -0
  37. package/dist/types/docs/componentsNav.d.ts +29 -13
  38. package/dist/types/docs/componentsSurfaces.d.ts +113 -10
  39. package/dist/types/docs/examples.d.ts +55 -34
  40. package/dist/types/docs/examples.lead.d.ts +89 -0
  41. package/dist/types/docs/figmaHowTo.d.ts +28 -0
  42. package/dist/types/docs/figmaLinks.d.ts +59 -0
  43. package/dist/types/docs/foundations.d.ts +12 -0
  44. package/dist/types/docs/samples.buttongroup.d.ts +22 -0
  45. package/dist/types/docs/samples.core.d.ts +104 -0
  46. package/dist/types/docs/samples.d.ts +27 -0
  47. package/dist/types/docs/samples.forms.d.ts +69 -0
  48. package/dist/types/docs/samples.nav.d.ts +70 -0
  49. package/dist/types/docs/samples.slider.d.ts +12 -0
  50. package/dist/types/docs/samples.surfaces.d.ts +69 -0
  51. package/package.json +4 -2
  52. package/public/styles/Dark-Mode.css +6 -0
  53. package/public/styles/Light-Mode.css +6 -0
  54. package/public/styles/README.md +1 -1
  55. package/public/styles/base.css +64 -19
  56. package/public/styles/core.css +94 -15
  57. package/public/styles/foundation.css +18 -0
  58. package/public/styles/typography-tokens.css +269 -20
  59. package/dist/types/theme/useThemeMode.d.ts +0 -4
@@ -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 colors ────────────────────────────────────────────
9
+ The three hexes the user actually picked, verbatim.
10
+
11
+ Nothing else in the published CSS says which color a brand chose.
12
+ generateScaledTones writes the pick into the tone NEAREST ITS LIGHTNESS,
13
+ so the index differs per color — 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
+ colors 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
 
@@ -551,7 +551,7 @@
551
551
 
552
552
  /* Alt Display — mirrors Display step for step. The pairing sets one word
553
553
  on one baseline ("Omni" + "Design"), so the two must not diverge in
554
- size or leading; colour is what separates them. */
554
+ size or leading; color is what separates them. */
555
555
  --Alt-Display-Small-Font-Size: 34px;
556
556
  --Alt-Display-Small-Font-Weight: 900;
557
557
  --Alt-Display-Small-Line-Height: 41px;
@@ -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
 
@@ -790,7 +790,7 @@
790
790
 
791
791
  /* Alt Display — mirrors Display step for step. The pairing sets one word
792
792
  on one baseline ("Omni" + "Design"), so the two must not diverge in
793
- size or leading; colour is what separates them. */
793
+ size or leading; color is what separates them. */
794
794
  --Alt-Display-Small-Font-Size: 34px;
795
795
  --Alt-Display-Small-Font-Weight: 900;
796
796
  --Alt-Display-Small-Line-Height: 41px;
@@ -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; color 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
 
@@ -1029,7 +1269,7 @@
1029
1269
 
1030
1270
  /* Alt Display — mirrors Display step for step. The pairing sets one word
1031
1271
  on one baseline ("Omni" + "Design"), so the two must not diverge in
1032
- size or leading; colour is what separates them. */
1272
+ size or leading; color is what separates them. */
1033
1273
  --Alt-Display-Small-Font-Size: 36px;
1034
1274
  --Alt-Display-Small-Font-Weight: 900;
1035
1275
  --Alt-Display-Small-Line-Height: 44px;
@@ -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;
@@ -1142,11 +1391,11 @@
1142
1391
  }
1143
1392
 
1144
1393
  /* ---------------------------------------------------------------------------
1145
- Alt Display colour — three variants, one pair of stops
1394
+ Alt Display color — three variants, one pair of stops
1146
1395
 
1147
1396
  Set data-alt-display on the element or any ancestor:
1148
1397
  default (or unset) the Alt reads as a heading
1149
- colored a flat Alt colour
1398
+ colored a flat Alt color
1150
1399
  gradient the two stops the theme publishes
1151
1400
 
1152
1401
  The stops are re-published per theme and surface, so every variant follows
@@ -1171,7 +1420,7 @@
1171
1420
  .typography-alt-display-large,
1172
1421
  .typography-alt-display-medium,
1173
1422
  .typography-alt-display-small {
1174
- /* Stop 1 alone: in the flat variants the two agree, and a plain colour keeps
1423
+ /* Stop 1 alone: in the flat variants the two agree, and a plain color keeps
1175
1424
  the selection highlight, print, and forced-colors working. */
1176
1425
  color: var(--Alt-Display-Color-Stop-1);
1177
1426
  }
@@ -1204,7 +1453,7 @@
1204
1453
  .typography-alt-display-small[data-alt-display="gradient"],
1205
1454
  [data-alt-display="gradient"] .typography-alt-display-small {
1206
1455
  /* The UA drops background-image here, and transparent text would leave
1207
- nothing on screen. Hand the glyphs back to the system colour. */
1456
+ nothing on screen. Hand the glyphs back to the system color. */
1208
1457
  background-image: none;
1209
1458
  -webkit-background-clip: border-box;
1210
1459
  background-clip: border-box;
@@ -1,4 +0,0 @@
1
- export function useThemeMode(initialMode?: string): {
2
- mode: string;
3
- switchMode: (newMode: any) => void;
4
- };