material-inspired-component-library 7.0.2 → 8.0.1

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 (104) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/CLAUDE.md +53 -0
  3. package/README.md +6 -0
  4. package/components/accordion/README.md +6 -3
  5. package/components/alert/index.scss +5 -0
  6. package/components/appbar/index.scss +12 -0
  7. package/components/badge/index.scss +2 -0
  8. package/components/bottomsheet/index.scss +9 -0
  9. package/components/button/index.scss +33 -6
  10. package/components/card/README.md +4 -0
  11. package/components/card/index.scss +182 -150
  12. package/components/checkbox/index.scss +28 -6
  13. package/components/datepicker/index.scss +13 -0
  14. package/components/datepicker/index.ts +9 -9
  15. package/components/dialog/index.scss +21 -6
  16. package/components/iconbutton/index.scss +28 -6
  17. package/components/list/README.md +191 -32
  18. package/components/list/index.scss +281 -190
  19. package/components/list/index.ts +100 -100
  20. package/components/menu/README.md +199 -10
  21. package/components/menu/index.scss +242 -47
  22. package/components/menu/index.ts +74 -37
  23. package/components/navigationrail/index.scss +91 -68
  24. package/components/progressindicator/README.md +88 -0
  25. package/components/progressindicator/index.scss +225 -0
  26. package/components/progressindicator/index.ts +77 -0
  27. package/components/radio/index.scss +24 -6
  28. package/components/select/README.md +42 -5
  29. package/components/select/index.scss +45 -79
  30. package/components/shape/README.md +103 -0
  31. package/components/shape/_paths.generated.scss +64 -0
  32. package/components/shape/index.scss +66 -0
  33. package/components/shape/master.scss +28 -0
  34. package/components/sidesheet/index.scss +11 -0
  35. package/components/slider/index.scss +13 -0
  36. package/components/snackbar/index.scss +12 -0
  37. package/components/stepper/index.scss +3 -5
  38. package/components/switch/index.scss +9 -0
  39. package/components/textfield/index.scss +10 -1
  40. package/components/textfield/index.ts +2 -2
  41. package/components/timepicker/index.scss +16 -0
  42. package/dist/alert.css +1 -1
  43. package/dist/appbar.css +1 -1
  44. package/dist/badge.css +1 -1
  45. package/dist/bottomsheet.css +1 -1
  46. package/dist/button.css +1 -1
  47. package/dist/card.css +1 -1
  48. package/dist/checkbox.css +1 -1
  49. package/dist/components/list/index.d.ts +2 -2
  50. package/dist/components/progressindicator/index.d.ts +6 -0
  51. package/dist/datepicker.css +1 -1
  52. package/dist/dialog.css +1 -1
  53. package/dist/divider.css +1 -1
  54. package/dist/foundations/form/index.js +1 -0
  55. package/dist/foundations.css +1 -1
  56. package/dist/iconbutton.css +1 -1
  57. package/dist/layout.css +1 -1
  58. package/dist/list.css +1 -1
  59. package/dist/menu.css +1 -1
  60. package/dist/micl.css +1 -1
  61. package/dist/micl.js +1 -1
  62. package/dist/navigationrail.css +1 -1
  63. package/dist/progressindicator.css +1 -0
  64. package/dist/progressindicator.js +1 -0
  65. package/dist/radio.css +1 -1
  66. package/dist/select.css +1 -1
  67. package/dist/shape.css +1 -0
  68. package/dist/shape.js +1 -0
  69. package/dist/sidesheet.css +1 -1
  70. package/dist/slider.css +1 -1
  71. package/dist/snackbar.css +1 -1
  72. package/dist/stepper.css +1 -1
  73. package/dist/switch.css +1 -1
  74. package/dist/textfield.css +1 -1
  75. package/dist/timepicker.css +1 -1
  76. package/docs/accordion.html +24 -24
  77. package/docs/bottomsheet.html +1 -4
  78. package/docs/datepicker.html +21 -21
  79. package/docs/dialog.html +1 -1
  80. package/docs/index.html +5 -4
  81. package/docs/list.html +38 -22
  82. package/docs/menu.html +246 -41
  83. package/docs/micl.css +1 -1
  84. package/docs/micl.js +1 -1
  85. package/docs/progressindicator.html +288 -0
  86. package/docs/select.html +68 -19
  87. package/docs/shape.css +1 -0
  88. package/docs/shape.js +1 -0
  89. package/docs/shapes.html +150 -0
  90. package/foundations/index.scss +0 -1
  91. package/foundations/layout/README.md +1 -1
  92. package/foundations/layout/index.scss +3 -0
  93. package/micl.ts +8 -1
  94. package/package.json +6 -4
  95. package/styles/README.md +90 -12
  96. package/styles/elevation.scss +46 -13
  97. package/styles/motion.scss +51 -47
  98. package/styles/shapes.scss +41 -26
  99. package/styles/statelayer.scss +93 -36
  100. package/styles/typography.scss +120 -322
  101. package/styles.scss +10 -6
  102. package/tools/shapes/check.mjs +42 -0
  103. package/tools/shapes/generate.mjs +834 -0
  104. package/webpack.config.js +16 -1
@@ -19,6 +19,17 @@
19
19
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  // SOFTWARE.
21
21
 
22
+ @use 'sass:map';
23
+
24
+ //
25
+ // Set $master: true (via @use ... with) to install every typescale token, the @supports
26
+ // narrow-tracking overrides, and the .md-sys-typescale-* utility classes — used by the
27
+ // master bundle. When false (default), components opt into individual typescales via @include
28
+ // scale('body-large'), so per-component CSS bundles only carry the typescale tokens they
29
+ // actually reference.
30
+ //
31
+ $master: false !default;
32
+
22
33
  :root {
23
34
  --md-ref-typeface-plain: Google Sans, system-ui, sans-serif;
24
35
  --md-ref-typeface-plain-narrow: 0;
@@ -26,212 +37,85 @@
26
37
  --md-ref-typeface-weight-regular: 400;
27
38
  --md-ref-typeface-weight-medium: 500;
28
39
  --md-ref-typeface-weight-bold: 700;
40
+ }
29
41
 
30
- --md-sys-typescale-display-large-font: var(--md-ref-typeface-brand);
31
- --md-sys-typescale-display-large-size: 3.5625rem; // 57px
32
- --md-sys-typescale-display-large-line-height: 4rem; // 64px
33
- --md-sys-typescale-display-large-weight: var(--md-ref-typeface-weight-regular);
34
- --md-sys-typescale-display-large-tracking: -0.015625rem; // ~0.25px letter-spacing
35
-
36
- --md-sys-typescale-display-medium-font: var(--md-ref-typeface-brand);
37
- --md-sys-typescale-display-medium-size: 2.8125rem; // 45px
38
- --md-sys-typescale-display-medium-line-height: 3.25rem; // 52px
39
- --md-sys-typescale-display-medium-weight: var(--md-ref-typeface-weight-regular);
40
- --md-sys-typescale-display-medium-tracking: 0;
41
-
42
- --md-sys-typescale-display-small-font: var(--md-ref-typeface-brand);
43
- --md-sys-typescale-display-small-size: 2.25rem; // 36px
44
- --md-sys-typescale-display-small-line-height: 2.75rem; // 44px
45
- --md-sys-typescale-display-small-weight: var(--md-ref-typeface-weight-regular);
46
- --md-sys-typescale-display-small-tracking: 0;
47
-
48
- --md-sys-typescale-headline-large-font: var(--md-ref-typeface-brand);
49
- --md-sys-typescale-headline-large-size: 2rem; // 32px
50
- --md-sys-typescale-headline-large-line-height: 2.5rem; // 40px
51
- --md-sys-typescale-headline-large-weight: var(--md-ref-typeface-weight-regular);
52
- --md-sys-typescale-headline-large-tracking: 0;
53
-
54
- --md-sys-typescale-headline-medium-font: var(--md-ref-typeface-brand);
55
- --md-sys-typescale-headline-medium-size: 1.75rem; // 28px
56
- --md-sys-typescale-headline-medium-line-height: 2.25rem; // 36px
57
- --md-sys-typescale-headline-medium-weight: var(--md-ref-typeface-weight-regular);
58
- --md-sys-typescale-headline-medium-tracking: 0;
59
-
60
- --md-sys-typescale-headline-small-font: var(--md-ref-typeface-brand);
61
- --md-sys-typescale-headline-small-size: 1.5rem; // 24px
62
- --md-sys-typescale-headline-small-line-height: 2rem; // 32px
63
- --md-sys-typescale-headline-small-weight: var(--md-ref-typeface-weight-regular);
64
- --md-sys-typescale-headline-small-tracking: 0;
65
-
66
- --md-sys-typescale-title-large-font: var(--md-ref-typeface-brand);
67
- --md-sys-typescale-title-large-size: 1.375rem; // 22px
68
- --md-sys-typescale-title-large-line-height: 1.75rem; // 28px
69
- --md-sys-typescale-title-large-weight: var(--md-ref-typeface-weight-regular);
70
- --md-sys-typescale-title-large-tracking: 0;
71
-
72
- --md-sys-typescale-title-medium-font: var(--md-ref-typeface-plain);
73
- --md-sys-typescale-title-medium-size: 1rem; // 16px
74
- --md-sys-typescale-title-medium-line-height: 1.5rem; // 24px
75
- --md-sys-typescale-title-medium-weight: var(--md-ref-typeface-weight-medium);
76
- --md-sys-typescale-title-medium-tracking: 0.009375rem; // ~0.15px letter-spacing
77
-
78
- --md-sys-typescale-title-small-font: var(--md-ref-typeface-plain);
79
- --md-sys-typescale-title-small-size: 0.875rem; // 14px
80
- --md-sys-typescale-title-small-line-height: 1.25rem; // 20px
81
- --md-sys-typescale-title-small-weight: var(--md-ref-typeface-weight-medium);
82
- --md-sys-typescale-title-small-tracking: 0.00625rem; // ~0.1px letter-spacing
83
-
84
- --md-sys-typescale-body-large-font: var(--md-ref-typeface-plain);
85
- --md-sys-typescale-body-large-size: 1rem; // 16px
86
- --md-sys-typescale-body-large-line-height: 1.5rem; // 24px
87
- --md-sys-typescale-body-large-weight: var(--md-ref-typeface-weight-regular);
88
- --md-sys-typescale-body-large-tracking: 0.03125rem; // ~0.5px letter-spacing
89
-
90
- --md-sys-typescale-body-medium-font: var(--md-ref-typeface-plain);
91
- --md-sys-typescale-body-medium-size: 0.875rem; // 14px
92
- --md-sys-typescale-body-medium-line-height: 1.25rem; // 20px
93
- --md-sys-typescale-body-medium-weight: var(--md-ref-typeface-weight-regular);
94
- --md-sys-typescale-body-medium-tracking: 0.015625rem; // ~0.25px letter-spacing
95
-
96
- --md-sys-typescale-body-smallmedium-font: var(--md-ref-typeface-plain);
97
- --md-sys-typescale-body-smallmedium-size: 0.8125rem; // 13px
98
- --md-sys-typescale-body-smallmedium-line-height: 1.125rem; // 18px
99
- --md-sys-typescale-body-smallmedium-weight: var(--md-ref-typeface-weight-regular);
100
- --md-sys-typescale-body-smallmedium-tracking: 0.025rem; // ~0.4px letter-spacing
101
-
102
- --md-sys-typescale-body-small-font: var(--md-ref-typeface-plain);
103
- --md-sys-typescale-body-small-size: 0.75rem; // 12px
104
- --md-sys-typescale-body-small-line-height: 1rem; // 16px
105
- --md-sys-typescale-body-small-weight: var(--md-ref-typeface-weight-regular);
106
- --md-sys-typescale-body-small-tracking: 0.025rem; // ~0.4px letter-spacing
107
-
108
- --md-sys-typescale-label-large-font: var(--md-ref-typeface-plain);
109
- --md-sys-typescale-label-large-size: 0.875rem; // 14px
110
- --md-sys-typescale-label-large-line-height: 1.25rem; // 20px
111
- --md-sys-typescale-label-large-weight: var(--md-ref-typeface-weight-medium);
112
- --md-sys-typescale-label-large-tracking: 0.00625rem; // ~0.1px letter-spacing
113
-
114
- --md-sys-typescale-label-medium-font: var(--md-ref-typeface-plain);
115
- --md-sys-typescale-label-medium-size: 0.75rem; // 12px
116
- --md-sys-typescale-label-medium-line-height: 1rem; // 16px
117
- --md-sys-typescale-label-medium-weight: var(--md-ref-typeface-weight-medium);
118
- --md-sys-typescale-label-medium-tracking: 0.03125rem; // ~0.5px letter-spacing
119
-
120
- --md-sys-typescale-label-small-font: var(--md-ref-typeface-plain);
121
- --md-sys-typescale-label-small-size: 0.6875rem; // 11px
122
- --md-sys-typescale-label-small-line-height: 1rem; // 16px
123
- --md-sys-typescale-label-small-weight: var(--md-ref-typeface-weight-medium);
124
- --md-sys-typescale-label-small-tracking: 0.03125rem; // ~0.5px letter-spacing
125
-
126
- --md-sys-typescale-emphasized-display-large-font: var(--md-ref-typeface-brand);
127
- --md-sys-typescale-emphasized-display-large-size: 3.5625rem; // 57px
128
- --md-sys-typescale-emphasized-display-large-line-height: 4rem; // 64px
129
- --md-sys-typescale-emphasized-display-large-weight: var(--md-ref-typeface-weight-medium);
130
- --md-sys-typescale-emphasized-display-large-tracking: -0.015625rem; // ~0.25px letter-spacing
131
-
132
- --md-sys-typescale-emphasized-display-medium-font: var(--md-ref-typeface-brand);
133
- --md-sys-typescale-emphasized-display-medium-size: 2.8125rem; // 45px
134
- --md-sys-typescale-emphasized-display-medium-line-height: 3.25rem; // 52px
135
- --md-sys-typescale-emphasized-display-medium-weight: var(--md-ref-typeface-weight-medium);
136
- --md-sys-typescale-emphasized-display-medium-tracking: 0;
137
-
138
- --md-sys-typescale-emphasized-display-small-font: var(--md-ref-typeface-brand);
139
- --md-sys-typescale-emphasized-display-small-size: 2.25rem; // 36px
140
- --md-sys-typescale-emphasized-display-small-line-height: 2.75rem; // 44px
141
- --md-sys-typescale-emphasized-display-small-weight: var(--md-ref-typeface-weight-medium);
142
- --md-sys-typescale-emphasized-display-small-tracking: 0;
143
-
144
- --md-sys-typescale-emphasized-headline-large-font: var(--md-ref-typeface-brand);
145
- --md-sys-typescale-emphasized-headline-large-size: 2rem; // 32px
146
- --md-sys-typescale-emphasized-headline-large-line-height: 2.5rem; // 40px
147
- --md-sys-typescale-emphasized-headline-large-weight: var(--md-ref-typeface-weight-medium);
148
- --md-sys-typescale-emphasized-headline-large-tracking: 0;
149
-
150
- --md-sys-typescale-emphasized-headline-medium-font: var(--md-ref-typeface-brand);
151
- --md-sys-typescale-emphasized-headline-medium-size: 1.75rem; // 28px
152
- --md-sys-typescale-emphasized-headline-medium-line-height: 2.25rem; // 36px
153
- --md-sys-typescale-emphasized-headline-medium-weight: var(--md-ref-typeface-weight-medium);
154
- --md-sys-typescale-emphasized-headline-medium-tracking: 0;
155
-
156
- --md-sys-typescale-emphasized-headline-small-font: var(--md-ref-typeface-brand);
157
- --md-sys-typescale-emphasized-headline-small-size: 1.5rem; // 24px
158
- --md-sys-typescale-emphasized-headline-small-line-height: 2rem; // 32px
159
- --md-sys-typescale-emphasized-headline-small-weight: var(--md-ref-typeface-weight-medium);
160
- --md-sys-typescale-emphasized-headline-small-tracking: 0;
161
-
162
- --md-sys-typescale-emphasized-title-large-font: var(--md-ref-typeface-brand);
163
- --md-sys-typescale-emphasized-title-large-size: 1.375rem; // 22px
164
- --md-sys-typescale-emphasized-title-large-line-height: 1.75rem; // 28px
165
- --md-sys-typescale-emphasized-title-large-weight: var(--md-ref-typeface-weight-medium);
166
- --md-sys-typescale-emphasized-title-large-tracking: 0;
167
-
168
- --md-sys-typescale-emphasized-title-medium-font: var(--md-ref-typeface-plain);
169
- --md-sys-typescale-emphasized-title-medium-size: 1rem; // 16px
170
- --md-sys-typescale-emphasized-title-medium-line-height: 1.5rem; // 24px
171
- --md-sys-typescale-emphasized-title-medium-weight: var(--md-ref-typeface-weight-bold);
172
- --md-sys-typescale-emphasized-title-medium-tracking: 0.009375rem; // ~0.15px letter-spacing
173
-
174
- --md-sys-typescale-emphasized-title-small-font: var(--md-ref-typeface-plain);
175
- --md-sys-typescale-emphasized-title-small-size: 0.875rem; // 14px
176
- --md-sys-typescale-emphasized-title-small-line-height: 1.25rem; // 20px
177
- --md-sys-typescale-emphasized-title-small-weight: var(--md-ref-typeface-weight-bold);
178
- --md-sys-typescale-emphasized-title-small-tracking: 0.00625rem; // ~0.1px letter-spacing
179
-
180
- --md-sys-typescale-emphasized-body-large-font: var(--md-ref-typeface-plain);
181
- --md-sys-typescale-emphasized-body-large-size: 1rem; // 16px
182
- --md-sys-typescale-emphasized-body-large-line-height: 1.5rem; // 24px
183
- --md-sys-typescale-emphasized-body-large-weight: var(--md-ref-typeface-weight-medium);
184
- --md-sys-typescale-emphasized-body-large-tracking: 0.03125rem; // ~0.5px letter-spacing
185
-
186
- --md-sys-typescale-emphasized-body-medium-font: var(--md-ref-typeface-plain);
187
- --md-sys-typescale-emphasized-body-medium-size: 0.875rem; // 14px
188
- --md-sys-typescale-emphasized-body-medium-line-height: 1.25rem; // 20px
189
- --md-sys-typescale-emphasized-body-medium-weight: var(--md-ref-typeface-weight-medium);
190
- --md-sys-typescale-emphasized-body-medium-tracking: 0.015625rem; // ~0.25px letter-spacing
191
-
192
- --md-sys-typescale-emphasized-body-small-font: var(--md-ref-typeface-plain);
193
- --md-sys-typescale-emphasized-body-small-size: 0.75rem; // 12px
194
- --md-sys-typescale-emphasized-body-small-line-height: 1rem; // 16px
195
- --md-sys-typescale-emphasized-body-small-weight: var(--md-ref-typeface-weight-medium);
196
- --md-sys-typescale-emphasized-body-small-tracking: 0.025rem; // ~0.4px letter-spacing
197
-
198
- --md-sys-typescale-emphasized-label-large-font: var(--md-ref-typeface-plain);
199
- --md-sys-typescale-emphasized-label-large-size: 0.875rem; // 14px
200
- --md-sys-typescale-emphasized-label-large-line-height: 1.25rem; // 20px
201
- --md-sys-typescale-emphasized-label-large-weight: var(--md-ref-typeface-weight-bold);
202
- --md-sys-typescale-emphasized-label-large-tracking: 0.00625rem; // ~0.1px letter-spacing
203
-
204
- --md-sys-typescale-emphasized-label-medium-font: var(--md-ref-typeface-plain);
205
- --md-sys-typescale-emphasized-label-medium-size: 0.75rem; // 12px
206
- --md-sys-typescale-emphasized-label-medium-line-height: 1rem; // 16px
207
- --md-sys-typescale-emphasized-label-medium-weight: var(--md-ref-typeface-weight-bold);
208
- --md-sys-typescale-emphasized-label-medium-tracking: 0.03125rem; // ~0.5px letter-spacing
209
-
210
- --md-sys-typescale-emphasized-label-small-font: var(--md-ref-typeface-plain);
211
- --md-sys-typescale-emphasized-label-small-size: 0.6875rem; // 11px
212
- --md-sys-typescale-emphasized-label-small-line-height: 1rem; // 16px
213
- --md-sys-typescale-emphasized-label-small-weight: var(--md-ref-typeface-weight-bold);
214
- --md-sys-typescale-emphasized-label-small-tracking: 0.03125rem; // ~0.5px letter-spacing
215
- }
216
- @supports (letter-spacing: if(style(--md-ref-typeface-plain-narrow: 1): 0; else: 0)) {
42
+ $_scales: (
43
+ display-large: (font: brand, size: 3.5625rem, line-height: 4rem, weight: regular, tracking: -0.0125rem),
44
+ display-medium: (font: brand, size: 2.8125rem, line-height: 3.25rem, weight: regular, tracking: 0),
45
+ display-small: (font: brand, size: 2.25rem, line-height: 2.75rem, weight: regular, tracking: 0),
46
+ headline-large: (font: brand, size: 2rem, line-height: 2.5rem, weight: regular, tracking: 0),
47
+ headline-medium: (font: brand, size: 1.75rem, line-height: 2.25rem, weight: regular, tracking: 0),
48
+ headline-small: (font: brand, size: 1.5rem, line-height: 2rem, weight: regular, tracking: 0),
49
+ title-large: (font: brand, size: 1.375rem, line-height: 1.75rem, weight: regular, tracking: 0),
50
+ title-medium: (font: plain, size: 1rem, line-height: 1.5rem, weight: medium, tracking: 0.0125rem),
51
+ title-small: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: medium, tracking: 0.00625rem),
52
+ body-large: (font: plain, size: 1rem, line-height: 1.5rem, weight: regular, tracking: 0.03125rem),
53
+ body-medium: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: regular, tracking: 0.0125rem),
54
+ body-smallmedium: (font: plain, size: 0.8125rem, line-height: 1.125rem, weight: regular, tracking: 0.025rem),
55
+ body-small: (font: plain, size: 0.75rem, line-height: 1rem, weight: regular, tracking: 0.025rem),
56
+ label-large: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: medium, tracking: 0.00625rem),
57
+ label-medium: (font: plain, size: 0.75rem, line-height: 1rem, weight: medium, tracking: 0.03125rem),
58
+ label-small: (font: plain, size: 0.6875rem, line-height: 1rem, weight: medium, tracking: 0.03125rem),
59
+ emphasized-display-large: (font: brand, size: 3.5625rem, line-height: 4rem, weight: medium, tracking: 0),
60
+ emphasized-display-medium: (font: brand, size: 2.8125rem, line-height: 3.25rem, weight: medium, tracking: 0),
61
+ emphasized-display-small: (font: brand, size: 2.25rem, line-height: 2.75rem, weight: medium, tracking: 0),
62
+ emphasized-headline-large: (font: brand, size: 2rem, line-height: 2.5rem, weight: medium, tracking: 0),
63
+ emphasized-headline-medium: (font: brand, size: 1.75rem, line-height: 2.25rem, weight: medium, tracking: 0),
64
+ emphasized-headline-small: (font: brand, size: 1.5rem, line-height: 2rem, weight: medium, tracking: 0),
65
+ emphasized-title-large: (font: brand, size: 1.375rem, line-height: 1.75rem, weight: medium, tracking: 0),
66
+ emphasized-title-medium: (font: plain, size: 1rem, line-height: 1.5rem, weight: bold, tracking: 0.009375rem),
67
+ emphasized-title-small: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: bold, tracking: 0.00625rem),
68
+ emphasized-body-large: (font: plain, size: 1rem, line-height: 1.5rem, weight: medium, tracking: 0.009375rem),
69
+ emphasized-body-medium: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: medium, tracking: 0.015625rem),
70
+ emphasized-body-small: (font: plain, size: 0.75rem, line-height: 1rem, weight: medium, tracking: 0.025rem),
71
+ emphasized-label-large: (font: plain, size: 0.875rem, line-height: 1.25rem, weight: bold, tracking: 0.00625rem),
72
+ emphasized-label-medium: (font: plain, size: 0.75rem, line-height: 1rem, weight: bold, tracking: 0.03125rem),
73
+ emphasized-label-small: (font: plain, size: 0.6875rem, line-height: 1rem, weight: bold, tracking: 0.03125rem),
74
+ );
75
+
76
+ $_narrow-tracking: (
77
+ title-medium, title-small,
78
+ body-large, body-medium, body-smallmedium, body-small,
79
+ label-large, label-medium, label-small,
80
+ emphasized-title-medium, emphasized-title-small,
81
+ emphasized-body-large, emphasized-body-medium, emphasized-body-small,
82
+ emphasized-label-large, emphasized-label-medium, emphasized-label-small
83
+ );
84
+
85
+ @mixin _emit-scale-tokens($name) {
86
+ $s: map.get($_scales, $name);
87
+ --md-sys-typescale-#{$name}-font: var(--md-ref-typeface-#{map.get($s, 'font')});
88
+ --md-sys-typescale-#{$name}-size: #{map.get($s, 'size')};
89
+ --md-sys-typescale-#{$name}-line-height: #{map.get($s, 'line-height')};
90
+ --md-sys-typescale-#{$name}-weight: var(--md-ref-typeface-weight-#{map.get($s, 'weight')});
91
+ --md-sys-typescale-#{$name}-tracking: #{map.get($s, 'tracking')};
92
+ }
93
+
94
+ @mixin scale($name) {
95
+ @if not $master {
96
+ @if not map.has-key($_scales, $name) {
97
+ @error "Unknown typescale '#{$name}'. Available: #{map.keys($_scales)}.";
98
+ }
99
+ :root {
100
+ @include _emit-scale-tokens($name);
101
+ }
102
+ }
103
+ }
104
+
105
+ @if $master {
217
106
  :root {
218
- --md-sys-typescale-title-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.009375rem; else: 0px);
219
- --md-sys-typescale-title-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.00625rem; else: 0px);
220
- --md-sys-typescale-body-large-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
221
- --md-sys-typescale-body-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.015625rem; else: 0px);
222
- --md-sys-typescale-body-smallmedium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.025rem; else: 0px);
223
- --md-sys-typescale-body-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.025rem; else: 0px);
224
- --md-sys-typescale-label-large-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.00625rem; else: 0px);
225
- --md-sys-typescale-label-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
226
- --md-sys-typescale-label-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
227
- --md-sys-typescale-emphasized-title-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.009375rem; else: 0px);
228
- --md-sys-typescale-emphasized-title-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.00625rem; else: 0px);
229
- --md-sys-typescale-emphasized-body-large-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
230
- --md-sys-typescale-emphasized-body-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.015625rem; else: 0px);
231
- --md-sys-typescale-emphasized-body-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.025rem; else: 0px);
232
- --md-sys-typescale-emphasized-label-large-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.00625rem; else: 0px);
233
- --md-sys-typescale-emphasized-label-medium-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
234
- --md-sys-typescale-emphasized-label-small-tracking: if(style(--md-ref-typeface-plain-narrow: 1): 0.03125rem; else: 0px);
107
+ @each $name, $_ in $_scales {
108
+ @include _emit-scale-tokens($name);
109
+ }
110
+ }
111
+
112
+ @supports (letter-spacing: if(style(--md-ref-typeface-plain-narrow: 1): 0; else: 0)) {
113
+ :root {
114
+ @each $name in $_narrow-tracking {
115
+ $t: map.get(map.get($_scales, $name), 'tracking');
116
+ --md-sys-typescale-#{$name}-tracking: if(style(--md-ref-typeface-plain-narrow: 1): #{$t}; else: 0px);
117
+ }
118
+ }
235
119
  }
236
120
  }
237
121
 
@@ -483,122 +367,36 @@
483
367
  letter-spacing: var(--md-sys-typescale-emphasized-label-small-tracking);
484
368
  }
485
369
 
486
- .md-sys-typescale-display-large {
487
- @include display-large;
488
- }
489
-
490
- .md-sys-typescale-display-medium {
491
- @include display-medium;
492
- }
493
-
494
- .md-sys-typescale-display-small {
495
- @include display-small;
496
- }
497
-
498
- .md-sys-typescale-headline-large {
499
- @include headline-large;
500
- }
501
-
502
- .md-sys-typescale-headline-medium {
503
- @include headline-medium;
504
- }
505
-
506
- .md-sys-typescale-headline-small {
507
- @include headline-small;
508
- }
509
-
510
- .md-sys-typescale-title-large {
511
- @include title-large;
512
- }
513
-
514
- .md-sys-typescale-title-medium {
515
- @include title-medium;
516
- }
517
-
518
- .md-sys-typescale-title-small {
519
- @include title-small;
520
- }
521
-
522
- .md-sys-typescale-body-large {
523
- @include body-large;
524
- }
525
-
526
- .md-sys-typescale-body-medium {
527
- @include body-medium;
528
- }
529
-
530
- .md-sys-typescale-body-small {
531
- @include body-small;
532
- }
533
-
534
- .md-sys-typescale-label-large {
535
- @include label-large;
536
- }
537
-
538
- .md-sys-typescale-label-medium {
539
- @include label-medium;
540
- }
541
-
542
- .md-sys-typescale-label-small {
543
- @include label-small;
544
- }
545
-
546
- .md-sys-typescale-emphasized-display-large {
547
- @include emphasized-display-large;
548
- }
549
-
550
- .md-sys-typescale-emphasized-display-medium {
551
- @include emphasized-display-medium;
552
- }
553
-
554
- .md-sys-typescale-emphasized-display-small {
555
- @include emphasized-display-small;
556
- }
557
-
558
- .md-sys-typescale-emphasized-headline-large {
559
- @include emphasized-headline-large;
560
- }
561
-
562
- .md-sys-typescale-emphasized-headline-medium {
563
- @include emphasized-headline-medium;
564
- }
565
-
566
- .md-sys-typescale-emphasized-headline-small {
567
- @include emphasized-headline-small;
568
- }
569
-
570
- .md-sys-typescale-emphasized-title-large {
571
- @include emphasized-title-large;
572
- }
573
-
574
- .md-sys-typescale-emphasized-title-medium {
575
- @include emphasized-title-medium;
576
- }
577
-
578
- .md-sys-typescale-emphasized-title-small {
579
- @include emphasized-title-small;
580
- }
581
-
582
- .md-sys-typescale-emphasized-body-large {
583
- @include emphasized-body-large;
584
- }
585
-
586
- .md-sys-typescale-emphasized-body-medium {
587
- @include emphasized-body-medium;
588
- }
589
-
590
- .md-sys-typescale-emphasized-body-small {
591
- @include emphasized-body-small;
592
- }
593
-
594
- .md-sys-typescale-emphasized-label-large {
595
- @include emphasized-label-large;
596
- }
597
-
598
- .md-sys-typescale-emphasized-label-medium {
599
- @include emphasized-label-medium;
600
- }
601
-
602
- .md-sys-typescale-emphasized-label-small {
603
- @include emphasized-label-small;
370
+ @if $master {
371
+ .md-sys-typescale-display-large { @include display-large; }
372
+ .md-sys-typescale-display-medium { @include display-medium; }
373
+ .md-sys-typescale-display-small { @include display-small; }
374
+ .md-sys-typescale-headline-large { @include headline-large; }
375
+ .md-sys-typescale-headline-medium { @include headline-medium; }
376
+ .md-sys-typescale-headline-small { @include headline-small; }
377
+ .md-sys-typescale-title-large { @include title-large; }
378
+ .md-sys-typescale-title-medium { @include title-medium; }
379
+ .md-sys-typescale-title-small { @include title-small; }
380
+ .md-sys-typescale-body-large { @include body-large; }
381
+ .md-sys-typescale-body-medium { @include body-medium; }
382
+ .md-sys-typescale-body-smallmedium { @include body-smallmedium; }
383
+ .md-sys-typescale-body-small { @include body-small; }
384
+ .md-sys-typescale-label-large { @include label-large; }
385
+ .md-sys-typescale-label-medium { @include label-medium; }
386
+ .md-sys-typescale-label-small { @include label-small; }
387
+ .md-sys-typescale-emphasized-display-large { @include emphasized-display-large; }
388
+ .md-sys-typescale-emphasized-display-medium { @include emphasized-display-medium; }
389
+ .md-sys-typescale-emphasized-display-small { @include emphasized-display-small; }
390
+ .md-sys-typescale-emphasized-headline-large { @include emphasized-headline-large; }
391
+ .md-sys-typescale-emphasized-headline-medium { @include emphasized-headline-medium; }
392
+ .md-sys-typescale-emphasized-headline-small { @include emphasized-headline-small; }
393
+ .md-sys-typescale-emphasized-title-large { @include emphasized-title-large; }
394
+ .md-sys-typescale-emphasized-title-medium { @include emphasized-title-medium; }
395
+ .md-sys-typescale-emphasized-title-small { @include emphasized-title-small; }
396
+ .md-sys-typescale-emphasized-body-large { @include emphasized-body-large; }
397
+ .md-sys-typescale-emphasized-body-medium { @include emphasized-body-medium; }
398
+ .md-sys-typescale-emphasized-body-small { @include emphasized-body-small; }
399
+ .md-sys-typescale-emphasized-label-large { @include emphasized-label-large; }
400
+ .md-sys-typescale-emphasized-label-medium { @include emphasized-label-medium; }
401
+ .md-sys-typescale-emphasized-label-small { @include emphasized-label-small; }
604
402
  }
package/styles.scss CHANGED
@@ -19,16 +19,19 @@
19
19
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  // SOFTWARE.
21
21
 
22
+ // Configured imports first: $master must be set on each module before any
23
+ // transitive consumer (e.g. foundations/layout) loads it with defaults,
24
+ // otherwise Sass errors with "module already loaded".
25
+ @use 'styles/shapes' with ($master: true);
26
+ @use 'styles/elevation' with ($master: true);
27
+ @use 'styles/statelayer' with ($master: true);
28
+ @use 'styles/typography' with ($master: true);
29
+ @use 'styles/motion' with ($master: true);
30
+
22
31
  @use 'foundations';
23
32
  @use 'foundations/layout';
24
33
  @use 'foundations/scrollbar';
25
34
 
26
- @use 'styles/typography';
27
- @use 'styles/shapes';
28
- @use 'styles/elevation';
29
- @use 'styles/motion';
30
- @use 'styles/statelayer';
31
-
32
35
  @use 'components/divider';
33
36
  @use 'components/alert';
34
37
  @use 'components/radio';
@@ -49,6 +52,7 @@
49
52
  @use 'components/sidesheet';
50
53
  @use 'components/bottomsheet';
51
54
  @use 'components/navigationrail';
55
+ @use 'components/progressindicator';
52
56
  @use 'components/stepper';
53
57
  @use 'components/datepicker';
54
58
  @use 'components/timepicker';
@@ -0,0 +1,42 @@
1
+ //
2
+ // Copyright © 2025 Hermana AS
3
+ //
4
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ // of this software and associated documentation files (the "Software"), to deal
6
+ // in the Software without restriction, including without limitation the rights
7
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ // copies of the Software, and to permit persons to whom the Software is
9
+ // furnished to do so, subject to the following conditions:
10
+ //
11
+ // The above copyright notice and this permission notice shall be included in all
12
+ // copies or substantial portions of the Software.
13
+ //
14
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ // SOFTWARE.
21
+
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import { generatePathsScss, TARGET_PATH } from './generate.mjs';
25
+
26
+ //
27
+ // CI staleness gate. Compares the on-disk components/shape/_paths.generated.scss
28
+ // against what the generator would produce now. Exits non-zero if they differ,
29
+ // instructing the developer to run `npm run gen:shapes` and commit the result.
30
+ //
31
+
32
+ const expected = generatePathsScss();
33
+ const actual = fs.existsSync(TARGET_PATH) ? fs.readFileSync(TARGET_PATH, 'utf8') : '';
34
+
35
+ if (expected !== actual) {
36
+ const rel = path.relative(process.cwd(), TARGET_PATH);
37
+ console.error(`✗ ${rel} is out of date.`);
38
+ console.error(' Run `npm run gen:shapes` and commit the regenerated file.');
39
+ process.exit(1);
40
+ }
41
+
42
+ console.log('✓ Shape paths up to date.');