material-inspired-component-library 8.0.0 → 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 (84) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/CLAUDE.md +13 -2
  3. package/components/alert/index.scss +5 -0
  4. package/components/appbar/index.scss +12 -0
  5. package/components/badge/index.scss +2 -0
  6. package/components/bottomsheet/index.scss +9 -0
  7. package/components/button/index.scss +23 -0
  8. package/components/card/index.scss +23 -0
  9. package/components/checkbox/index.scss +17 -0
  10. package/components/datepicker/index.scss +13 -0
  11. package/components/dialog/index.scss +16 -0
  12. package/components/iconbutton/index.scss +18 -0
  13. package/components/list/index.scss +25 -0
  14. package/components/menu/index.scss +18 -0
  15. package/components/navigationrail/index.scss +17 -0
  16. package/components/progressindicator/README.md +88 -0
  17. package/components/progressindicator/index.scss +225 -0
  18. package/components/progressindicator/index.ts +77 -0
  19. package/components/radio/index.scss +13 -0
  20. package/components/select/index.scss +6 -0
  21. package/components/shape/README.md +103 -0
  22. package/components/shape/_paths.generated.scss +64 -0
  23. package/components/shape/index.scss +66 -0
  24. package/components/shape/master.scss +28 -0
  25. package/components/sidesheet/index.scss +11 -0
  26. package/components/slider/index.scss +13 -0
  27. package/components/snackbar/index.scss +12 -0
  28. package/components/stepper/index.scss +2 -0
  29. package/components/switch/index.scss +9 -0
  30. package/components/textfield/index.scss +9 -0
  31. package/components/timepicker/index.scss +16 -0
  32. package/dist/alert.css +1 -1
  33. package/dist/appbar.css +1 -1
  34. package/dist/badge.css +1 -1
  35. package/dist/bottomsheet.css +1 -1
  36. package/dist/button.css +1 -1
  37. package/dist/card.css +1 -1
  38. package/dist/checkbox.css +1 -1
  39. package/dist/components/progressindicator/index.d.ts +6 -0
  40. package/dist/datepicker.css +1 -1
  41. package/dist/dialog.css +1 -1
  42. package/dist/foundations/form/index.js +1 -0
  43. package/dist/iconbutton.css +1 -1
  44. package/dist/layout.css +1 -1
  45. package/dist/list.css +1 -1
  46. package/dist/menu.css +1 -1
  47. package/dist/micl.css +1 -1
  48. package/dist/micl.js +1 -1
  49. package/dist/navigationrail.css +1 -1
  50. package/dist/progressindicator.css +1 -0
  51. package/dist/progressindicator.js +1 -0
  52. package/dist/radio.css +1 -1
  53. package/dist/select.css +1 -1
  54. package/dist/shape.css +1 -0
  55. package/dist/shape.js +1 -0
  56. package/dist/sidesheet.css +1 -1
  57. package/dist/slider.css +1 -1
  58. package/dist/snackbar.css +1 -1
  59. package/dist/stepper.css +1 -1
  60. package/dist/switch.css +1 -1
  61. package/dist/textfield.css +1 -1
  62. package/dist/timepicker.css +1 -1
  63. package/docs/datepicker.html +21 -21
  64. package/docs/index.html +1 -0
  65. package/docs/micl.css +1 -1
  66. package/docs/micl.js +1 -1
  67. package/docs/progressindicator.html +288 -0
  68. package/docs/shape.css +1 -0
  69. package/docs/shape.js +1 -0
  70. package/docs/shapes.html +86 -21
  71. package/foundations/layout/README.md +1 -1
  72. package/foundations/layout/index.scss +3 -0
  73. package/micl.ts +2 -0
  74. package/package.json +4 -2
  75. package/styles/README.md +86 -8
  76. package/styles/elevation.scss +46 -13
  77. package/styles/motion.scss +51 -47
  78. package/styles/shapes.scss +38 -104
  79. package/styles/statelayer.scss +88 -41
  80. package/styles/typography.scss +120 -322
  81. package/styles.scss +10 -6
  82. package/tools/shapes/check.mjs +42 -0
  83. package/tools/shapes/generate.mjs +834 -0
  84. package/webpack.config.js +16 -1
@@ -19,54 +19,101 @@
19
19
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  // SOFTWARE.
21
21
 
22
- $md-sys-state-layer-size: 40px;
23
- $md-sys-target-size: 48px;
22
+ @use 'sass:map';
24
23
 
25
- $md-sys-state-hover-state-layer-opacity: 8%;
26
- $md-sys-state-focus-state-layer-opacity: 10%;
27
- $md-sys-state-pressed-state-layer-opacity: 10%;
28
- $md-sys-state-dragged-state-layer-opacity: 16%;
29
- $md-sys-state-disabled-state-layer-opacity: 38%;
30
- $md-sys-state-backdrop-opacity: 32%;
31
-
32
- $md-sys-state-focus-indicator-inner-offset: -3px;
33
- $md-sys-state-focus-indicator-outer-offset: 2px;
34
- $md-sys-state-focus-indicator-thickness: 3px;
35
-
36
- $md-sys-state-ripple-duration: 5000ms;
37
-
38
- :root {
39
- --md-sys-state-layer-size: #{$md-sys-state-layer-size};
40
- --md-sys-target-size: #{$md-sys-target-size};
41
-
42
- --md-sys-state-hover-state-layer-opacity: #{$md-sys-state-hover-state-layer-opacity};
43
- --md-sys-state-focus-state-layer-opacity: #{$md-sys-state-focus-state-layer-opacity};
44
- --md-sys-state-pressed-state-layer-opacity: #{$md-sys-state-pressed-state-layer-opacity};
45
- --md-sys-state-dragged-state-layer-opacity: #{$md-sys-state-dragged-state-layer-opacity};
46
- --md-sys-state-disabled-state-layer-opacity: #{$md-sys-state-disabled-state-layer-opacity};
47
- --md-sys-state-backdrop-opacity: #{$md-sys-state-backdrop-opacity};
24
+ //
25
+ // Set $master: true (via @use ... with) to install every state-layer token, the @property
26
+ // registrations, and the ripple keyframes — used by the master bundle. When false (default),
27
+ // components opt into individual tokens via @include token('hover-state-layer-opacity'),
28
+ // the animatable @property registrations via @include property, and the ripple keyframes via
29
+ // @include keyframes — so per-component CSS bundles only carry what they actually reference.
30
+ //
31
+ $master: false !default;
48
32
 
49
- --md-sys-state-focus-indicator-inner-offset: #{$md-sys-state-focus-indicator-inner-offset};
50
- --md-sys-state-focus-indicator-outer-offset: #{$md-sys-state-focus-indicator-outer-offset};
51
- --md-sys-state-focus-indicator-thickness: #{$md-sys-state-focus-indicator-thickness};
33
+ $_tokens: (
34
+ layer-size: 40px,
35
+ target-size: 48px,
36
+ hover-state-layer-opacity: 8%,
37
+ focus-state-layer-opacity: 10%,
38
+ pressed-state-layer-opacity: 10%,
39
+ dragged-state-layer-opacity: 16%,
40
+ // TODO: misnamed vs M3 spec — value 38% matches DisabledLabelTextOpacity / DisabledIconOpacity
41
+ // (content fade), but M3's `disabled.state-layer.opacity` is 12% (container background).
42
+ // Either rename to --md-sys-state-disabled-opacity (breaking) or split into two tokens.
43
+ disabled-state-layer-opacity: 38%,
44
+ focus-indicator-inner-offset: -3px,
45
+ focus-indicator-outer-offset: 2px,
46
+ focus-indicator-thickness: 3px,
47
+ backdrop-opacity: 32%,
48
+ ripple-opacity-factor: 0.6,
49
+ // TODO: 5000ms is well outside M3's motion scale (max DurationExtraLong4 = 1000ms;
50
+ // standard ripples ~300ms). Used here as an upper-bound cap on the @keyframes spread,
51
+ // not as a perceived animation duration. Consider renaming to ripple-spread-cap or
52
+ // aligning with an M3 motion token.
53
+ ripple-duration: 5000ms,
54
+ );
52
55
 
53
- --md-sys-state-ripple-opacity-factor: 0.6;
54
- --md-sys-state-ripple-duration: #{$md-sys-state-ripple-duration};
56
+ @mixin token($name) {
57
+ @if not $master {
58
+ :root {
59
+ --md-sys-state-#{$name}: #{map.get($_tokens, $name)};
60
+ }
61
+ }
55
62
  }
56
63
 
57
- @property --statelayer-color {
58
- syntax: '<color>';
59
- initial-value: transparent;
60
- inherits: false;
64
+ //
65
+ // CSS @property registrations for the ripple animation. Components that animate --statelayer-color
66
+ // or --statelayer-opacity (typed-property interpolation) must include this mixin; otherwise the
67
+ // variables fall back to untyped strings and the browser cannot transition between values.
68
+ //
69
+ @mixin property {
70
+ @if not $master {
71
+ @property --statelayer-color {
72
+ syntax: '<color>';
73
+ initial-value: transparent;
74
+ inherits: false;
75
+ }
76
+ @property --statelayer-opacity {
77
+ syntax: '<percentage>';
78
+ initial-value: 0%;
79
+ inherits: false;
80
+ }
81
+ }
61
82
  }
62
83
 
63
- @property --statelayer-opacity {
64
- syntax: '<percentage>';
65
- initial-value: 0%;
66
- inherits: false;
84
+ //
85
+ // Ripple keyframes only required by components that actually run the ripple background-size
86
+ // animation.
87
+ //
88
+ @mixin keyframes {
89
+ @if not $master {
90
+ @keyframes micl-ripple {
91
+ from { background-size: 0%, 100%; }
92
+ to { background-size: 10000%, 100%; }
93
+ }
94
+ }
67
95
  }
68
96
 
69
- @keyframes micl-ripple {
70
- from { background-size: 0%, 100%; }
71
- to { background-size: 10000%, 100%; }
97
+ @if $master {
98
+ :root {
99
+ @each $name, $value in $_tokens {
100
+ --md-sys-state-#{$name}: #{$value};
101
+ }
102
+ }
103
+
104
+ @property --statelayer-color {
105
+ syntax: '<color>';
106
+ initial-value: transparent;
107
+ inherits: false;
108
+ }
109
+ @property --statelayer-opacity {
110
+ syntax: '<percentage>';
111
+ initial-value: 0%;
112
+ inherits: false;
113
+ }
114
+
115
+ @keyframes micl-ripple {
116
+ from { background-size: 0%, 100%; }
117
+ to { background-size: 10000%, 100%; }
118
+ }
72
119
  }
@@ -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';