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,7 @@
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:meta';
22
23
  @use '../../foundations';
23
24
  @use '../../styles/elevation';
24
25
  @use '../../styles/motion';
@@ -26,6 +27,81 @@
26
27
  @use '../../styles/statelayer';
27
28
  @use '../../styles/typography';
28
29
 
30
+ @include elevation.level(0);
31
+ @include elevation.level(1);
32
+ @include elevation.level(2);
33
+ @include elevation.level(3);
34
+ @include elevation.level(4);
35
+
36
+ @include shapes.corner('medium');
37
+
38
+ @include statelayer.token('hover-state-layer-opacity');
39
+ @include statelayer.token('focus-state-layer-opacity');
40
+ @include statelayer.token('pressed-state-layer-opacity');
41
+ @include statelayer.token('dragged-state-layer-opacity');
42
+ @include statelayer.token('disabled-state-layer-opacity');
43
+ @include statelayer.token('focus-indicator-thickness');
44
+ @include statelayer.token('focus-indicator-outer-offset');
45
+ @include statelayer.token('ripple-opacity-factor');
46
+ @include statelayer.token('ripple-duration');
47
+ @include statelayer.property;
48
+ @include statelayer.keyframes;
49
+
50
+ @include typography.scale('title-medium');
51
+ @include typography.scale('body-smallmedium');
52
+
53
+ @mixin card-variant(
54
+ $name,
55
+ $bg-default,
56
+ $elev-default,
57
+ $hover-elev-default,
58
+ $focus-elev-default,
59
+ $pressed-elev-default,
60
+ $dragged-elev-default,
61
+ $inert-bg-default,
62
+ $inert-elev-default
63
+ ) {
64
+ --_card-shape: var(--md-comp-#{$name}-card-container-shape, var(--md-sys-shape-corner-medium));
65
+ --_card-background-color: var(--md-comp-#{$name}-card-container-color, #{$bg-default});
66
+ --_card-elevation: var(--md-comp-#{$name}-card-container-elevation, #{$elev-default});
67
+
68
+ --_card-hover-state-color: var(--md-comp-#{$name}-card-hover-state-layer-color, var(--md-sys-color-on-surface));
69
+ --_card-hover-state-opacity: var(--md-comp-#{$name}-card-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity));
70
+ --_card-hover-elevation: var(--md-comp-#{$name}-card-hover-container-elevation, #{$hover-elev-default});
71
+
72
+ --_card-focus-state-color: var(--md-comp-#{$name}-card-focus-state-layer-color, var(--md-sys-color-on-surface));
73
+ --_card-focus-state-opacity: var(--md-comp-#{$name}-card-focus-state-layer-opacity, var(--md-sys-state-focus-state-layer-opacity));
74
+ --_card-focus-elevation: var(--md-comp-#{$name}-card-focus-container-elevation, #{$focus-elev-default});
75
+
76
+ --_card-pressed-state-color: var(--md-comp-#{$name}-card-pressed-state-layer-color, var(--md-sys-color-on-surface));
77
+ --_card-pressed-state-opacity: var(--md-comp-#{$name}-card-pressed-state-layer-opacity, var(--md-sys-state-pressed-state-layer-opacity));
78
+ --_card-pressed-elevation: var(--md-comp-#{$name}-card-pressed-container-elevation, #{$pressed-elev-default});
79
+
80
+ --_card-dragged-state-color: var(--md-comp-#{$name}-card-dragged-state-layer-color, var(--md-sys-color-on-surface));
81
+ --_card-dragged-state-opacity: var(--md-comp-#{$name}-card-dragged-state-layer-opacity, var(--md-sys-state-dragged-state-layer-opacity));
82
+ --_card-dragged-elevation: var(--md-comp-#{$name}-card-dragged-container-elevation, #{$dragged-elev-default});
83
+
84
+ &[inert] {
85
+ --_card-background-color: var(--md-comp-#{$name}-card-disabled-container-color, #{$inert-bg-default});
86
+ --_card-elevation: var(--md-comp-#{$name}-card-disabled-container-elevation, #{$inert-elev-default});
87
+ --_card-opacity: var(--md-comp-#{$name}-card-disabled-container-opacity, var(--md-sys-state-disabled-state-layer-opacity));
88
+ --_card-pointer-events: none;
89
+ }
90
+ }
91
+
92
+ @mixin card-focus-outline($name) {
93
+ --_card-focus-outline-thickness: var(--md-comp-#{$name}-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
94
+ --_card-focus-outline-color: var(--md-comp-#{$name}-card-focus-indicator-color, var(--md-sys-color-secondary));
95
+ --_card-focus-outline-offset: var(--md-comp-#{$name}-card-focus-indicator-outline-offset, var(--md-sys-state-focus-indicator-outer-offset));
96
+ }
97
+
98
+ @mixin card-interactive($state) {
99
+ &[tabindex='0']:not([inert]):#{$state},
100
+ &:not([tabindex='0']):not([inert]):has(> summary:#{$state}) {
101
+ @content;
102
+ }
103
+ }
104
+
29
105
  :root {
30
106
  --md-comp-card-gap: 8px;
31
107
  --md-comp-card-margin: 8px;
@@ -36,10 +112,10 @@
36
112
  .micl-card-elevated,
37
113
  .micl-card-filled,
38
114
  .micl-card-outlined {
39
- --md-sys-card-motion-spatial: #{motion.$md-sys-motion-expressive-default-spatial};
40
- --md-sys-card-motion-duration: #{motion.$md-sys-motion-expressive-default-spatial-duration};
115
+ --md-comp-card-motion-spatial: #{motion.$md-sys-motion-expressive-default-spatial};
116
+ --md-comp-card-motion-duration: #{motion.$md-sys-motion-expressive-default-spatial-duration};
41
117
 
42
- --_text-color: var(--md-sys-color-on-surface-variant);
118
+ --_card-color: var(--md-sys-color-on-surface-variant);
43
119
 
44
120
  display: flex;
45
121
  flex-direction: column;
@@ -49,12 +125,12 @@
49
125
  overflow: hidden;
50
126
  interpolate-size: allow-keywords;
51
127
 
52
- border-radius: var(--_shape);
53
- background-color: var(--_color);
54
- box-shadow: var(--_elevation);
55
- border: var(--_border, none);
56
- opacity: var(--_opacity, 1);
57
- pointer-events: var(--_pointer-events, auto);
128
+ border-radius: var(--_card-shape);
129
+ background-color: var(--_card-background-color);
130
+ box-shadow: var(--_card-elevation);
131
+ border: var(--_card-border, none);
132
+ opacity: var(--_card-opacity, 1);
133
+ pointer-events: var(--_card-pointer-events, auto);
58
134
 
59
135
  &:not(.micl-card--compact):not(:has(>summary)) {
60
136
  row-gap: var(--md-comp-card-gap, 8px);
@@ -65,73 +141,76 @@
65
141
  --micl-ripple: 1;
66
142
 
67
143
  background-image:
68
- radial-gradient(circle at var(--micl-x, center) var(--micl-y, center), transparent 0%, rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) / 2)) 10%, transparent 10%),
144
+ radial-gradient(
145
+ circle at var(--micl-x, center) var(--micl-y, center),
146
+ transparent 0%,
147
+ rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) * var(--md-sys-state-ripple-opacity-factor))) 10%,
148
+ transparent 10%
149
+ ),
69
150
  linear-gradient(rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)));
70
151
  background-repeat: no-repeat;
71
- background-size: 10000%, 100%;
152
+ background-size: 0%, 100%;
72
153
  transition:
73
- background-size 3000ms,
74
- --statelayer-opacity var(--md-sys-card-motion-duration) linear;
154
+ background-size 0ms,
155
+ --statelayer-opacity var(--md-comp-card-motion-duration) linear;
75
156
 
76
157
  &:hover {
77
- --statelayer-color: var(--_hover-state-color);
78
- --statelayer-opacity: var(--_hover-state-opacity);
79
- --_text-color: var(--md-sys-color-on-surface);
158
+ --statelayer-color: var(--_card-hover-state-color);
159
+ --statelayer-opacity: var(--_card-hover-state-opacity);
160
+ --_card-color: var(--md-sys-color-on-surface);
80
161
  cursor: pointer;
81
162
  }
82
163
  &:focus-visible {
83
- --statelayer-color: var(--_focus-state-color);
84
- --statelayer-opacity: var(--_focus-state-opacity);
85
- --_text-color: var(--md-sys-color-on-surface);
164
+ --statelayer-color: var(--_card-focus-state-color);
165
+ --statelayer-opacity: var(--_card-focus-state-opacity);
166
+ --_card-color: var(--md-sys-color-on-surface);
86
167
  }
87
168
  &:active {
88
- --statelayer-color: var(--_pressed-state-color);
89
- --statelayer-opacity: var(--_pressed-state-opacity);
90
- --_text-color: var(--md-sys-color-on-surface);
91
- background-size: 0%, 100%;
92
- transition: background-size 0ms;
169
+ --statelayer-color: var(--_card-pressed-state-color);
170
+ --statelayer-opacity: var(--_card-pressed-state-opacity);
171
+ --_card-color: var(--md-sys-color-on-surface);
93
172
  }
94
173
  &.micl-card--dragging {
95
- --statelayer-color: var(--_dragged-state-color);
96
- --statelayer-opacity: var(--_dragged-state-opacity);
97
- --_text-color: var(--md-sys-color-on-surface);
174
+ --statelayer-color: var(--_card-dragged-state-color);
175
+ --statelayer-opacity: var(--_card-dragged-state-opacity);
176
+ --_card-color: var(--md-sys-color-on-surface);
98
177
  cursor: grabbing;
99
178
  }
179
+ &.micl-rippling {
180
+ animation: micl-ripple calc(var(--md-sys-state-ripple-duration) / 2) motion.$md-sys-motion-easing-standard;
181
+ }
100
182
 
101
183
  .micl-card__content {
102
184
  background-color: transparent;
103
185
  }
104
186
  }
105
187
 
106
- &[tabindex='0']:not([inert]):hover,
107
- &:not([tabindex='0']):not([inert]):has(> summary:hover) {
108
- box-shadow: var(--_hover-elevation);
109
- border-color: var(--_hover-border-color, var(--_border-color, transparent));
188
+ @include card-interactive('hover') {
189
+ box-shadow: var(--_card-hover-elevation);
190
+ border-color: var(--_card-hover-border-color, var(--_card-border-color, transparent));
110
191
  }
111
- &[tabindex='0']:not([inert]):focus-visible,
112
- &:not([tabindex='0']):not([inert]):has(> summary:focus-visible) {
113
- box-shadow: var(--_focus-elevation);
114
- border-width: var(--_focus-border-width, var(--_border-width, 0));
115
- border-color: var(--_focus-border-color, transparent);
116
- outline: var(--_focus-outline-thickness, 0px) solid var(--_focus-outline-color, transparent);
117
- outline-offset: var(--_focus-outline-offset, 0px);
192
+ @include card-interactive('focus-visible') {
193
+ box-shadow: var(--_card-focus-elevation);
194
+ border-width: var(--_card-focus-border-width, var(--_card-border-width, 0));
195
+ border-color: var(--_card-focus-border-color, transparent);
196
+ outline: var(--_card-focus-outline-thickness, 0px) solid var(--_card-focus-outline-color, transparent);
197
+ outline-offset: var(--_card-focus-outline-offset, 0px);
118
198
  }
119
- &[tabindex='0']:not([inert]):active,
120
- &:not([tabindex='0']):not([inert]):has(> summary:active) {
121
- box-shadow: var(--_pressed-elevation);
122
- border-color: var(--_pressed-border-color, transparent);
199
+ @include card-interactive('active') {
200
+ box-shadow: var(--_card-pressed-elevation);
201
+ border-color: var(--_card-pressed-border-color, transparent);
123
202
  }
124
203
  &[tabindex='0']:not([inert]).micl-card--dragging {
125
- box-shadow: var(--_dragged-elevation);
126
- border-color: var(--_dragged-border-color, transparent);
204
+ box-shadow: var(--_card-dragged-elevation);
205
+ border-color: var(--_card-dragged-border-color, transparent);
127
206
  }
128
207
 
129
208
  &::details-content {
130
209
  block-size: 0;
131
210
  overflow: hidden;
132
211
  transition:
133
- block-size var(--md-sys-card-motion-duration) var(--md-sys-card-motion-spatial),
134
- content-visibility var(--md-sys-card-motion-duration) linear allow-discrete;
212
+ block-size var(--md-comp-card-motion-duration) var(--md-comp-card-motion-spatial),
213
+ content-visibility var(--md-comp-card-motion-duration) linear allow-discrete;
135
214
  }
136
215
  &[open]::details-content {
137
216
  block-size: auto;
@@ -157,7 +236,7 @@
157
236
 
158
237
  .micl-card__image {
159
238
  grid-column: 1;
160
- grid-row: 1 / 5;
239
+ grid-row: 1 / -1;
161
240
  block-size: 100%;
162
241
  background-size: cover;
163
242
  }
@@ -183,103 +262,62 @@
183
262
  }
184
263
 
185
264
  .micl-card-elevated {
186
- --_shape: var(--md-comp-elevated-card-container-shape, var(--md-sys-shape-corner-medium));
187
- --_color: var(--md-comp-elevated-card-container-color, var(--md-sys-color-surface-container-low));
188
- --_elevation: var(--md-comp-elevated-card-container-elevation, var(--md-sys-elevation-level1));
189
-
190
- --_hover-state-color: var(--md-comp-elevated-card-hover-state-layer-color, var(--md-sys-color-on-surface));
191
- --_hover-state-opacity: var(--md-comp-elevated-card-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity));
192
- --_hover-elevation: var(--md-comp-elevated-card-hover-container-elevation, var(--md-sys-elevation-level2));
193
-
194
- --_focus-state-color: var(--md-comp-elevated-card-focus-state-layer-color, var(--md-sys-color-on-surface));
195
- --_focus-state-opacity: var(--md-comp-elevated-card-focus-state-layer-opacity, var(--md-sys-state-focus-state-layer-opacity));
196
- --_focus-elevation: var(--md-comp-elevated-card-focus-container-elevation, var(--md-sys-elevation-level1));
197
- --_focus-outline-thickness: var(--md-comp-elevated-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
198
- --_focus-outline-color: var(--md-comp-elevated-card-focus-indicator-color, var(--md-sys-color-secondary));
199
- --_focus-outline-offset: var(--md-comp-elevated-card-focus-indicator-outline-offset, var(--md-sys-state-focus-indicator-outer-offset));
200
-
201
- --_pressed-state-color: var(--md-comp-elevated-card-pressed-state-layer-color, var(--md-sys-color-on-surface));
202
- --_pressed-state-opacity: var(--md-comp-elevated-card-pressed-state-layer-opacity, var(--md-sys-state-pressed-state-layer-opacity));
203
- --_pressed-elevation: var(--md-comp-elevated-card-pressed-container-elevation, var(--md-sys-elevation-level1));
204
-
205
- --_dragged-state-color: var(--md-comp-elevated-card-dragged-state-layer-color, var(--md-sys-color-on-surface));
206
- --_dragged-state-opacity: var(--md-comp-elevated-card-dragged-state-layer-opacity, var(--md-sys-state-dragged-state-layer-opacity));
207
- --_dragged-elevation: var(--md-comp-elevated-card-dragged-container-elevation, var(--md-sys-elevation-level4));
208
-
209
- &[inert] {
210
- --_color: var(--md-comp-elevated-card-disabled-container-color, var(--md-sys-color-surface));
211
- --_elevation: var(--md-comp-elevated-card-disabled-container-elevation, var(--md-sys-elevation-level1));
212
- --_opacity: var(--md-comp-elevated-card-disabled-container-opacity, var(--md-sys-state-disabled-state-layer-opacity));
213
- --_pointer-events: none;
214
- }
265
+ @include card-variant(
266
+ $name : 'elevated',
267
+ $bg-default : var(--md-sys-color-surface-container-low),
268
+ $elev-default : var(--md-sys-elevation-level1),
269
+ $hover-elev-default : var(--md-sys-elevation-level2),
270
+ $focus-elev-default : var(--md-sys-elevation-level1),
271
+ $pressed-elev-default: var(--md-sys-elevation-level1),
272
+ $dragged-elev-default: var(--md-sys-elevation-level4),
273
+ $inert-bg-default : var(--md-sys-color-surface),
274
+ $inert-elev-default : var(--md-sys-elevation-level1)
275
+ );
276
+ @include card-focus-outline('elevated');
215
277
  }
216
278
 
217
279
  .micl-card-filled {
218
- --_shape: var(--md-comp-filled-card-container-shape, var(--md-sys-shape-corner-medium));
219
- --_color: var(--md-comp-filled-card-container-color, var(--md-sys-color-surface-container-highest));
220
- --_elevation: var(--md-comp-filled-card-container-elevation, var(--md-sys-elevation-level0));
280
+ @include card-variant(
281
+ $name : 'filled',
282
+ $bg-default : var(--md-sys-color-surface-container-highest),
283
+ $elev-default : var(--md-sys-elevation-level0),
284
+ $hover-elev-default : var(--md-sys-elevation-level1),
285
+ $focus-elev-default : var(--md-sys-elevation-level0),
286
+ $pressed-elev-default: var(--md-sys-elevation-level0),
287
+ $dragged-elev-default: var(--md-sys-elevation-level3),
288
+ $inert-bg-default : var(--md-sys-color-surface-variant),
289
+ $inert-elev-default : var(--md-sys-elevation-level0)
290
+ );
291
+ @include card-focus-outline('filled');
292
+ }
221
293
 
222
- --_hover-state-color: var(--md-comp-filled-card-hover-state-layer-color, var(--md-sys-color-on-surface));
223
- --_hover-state-opacity: var(--md-comp-filled-card-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity));
224
- --_hover-elevation: var(--md-comp-filled-card-hover-container-elevation, var(--md-sys-elevation-level1));
294
+ .micl-card-outlined {
295
+ @include card-variant(
296
+ $name : 'outlined',
297
+ $bg-default : var(--md-sys-color-surface),
298
+ $elev-default : var(--md-sys-elevation-level0),
299
+ $hover-elev-default : var(--md-sys-elevation-level1),
300
+ $focus-elev-default : var(--md-sys-elevation-level0),
301
+ $pressed-elev-default: var(--md-sys-elevation-level0),
302
+ $dragged-elev-default: var(--md-sys-elevation-level3),
303
+ $inert-bg-default : var(--md-sys-color-surface),
304
+ $inert-elev-default : var(--md-sys-elevation-level0)
305
+ );
225
306
 
226
- --_focus-state-color: var(--md-comp-filled-card-focus-state-layer-color, var(--md-sys-color-on-surface));
227
- --_focus-state-opacity: var(--md-comp-filled-card-focus-state-layer-opacity, var(--md-sys-state-focus-state-layer-opacity));
228
- --_focus-elevation: var(--md-comp-filled-card-focus-container-elevation, var(--md-sys-elevation-level0));
229
- --_focus-outline-thickness: var(--md-comp-filled-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
230
- --_focus-outline-color: var(--md-comp-filled-card-focus-indicator-color, var(--md-sys-color-secondary));
231
- --_focus-outline-offset: var(--md-comp-filled-card-focus-indicator-outline-offset, var(--md-sys-state-focus-indicator-outer-offset));
307
+ --_card-border-width: var(--md-comp-outlined-card-outline-width, 1px);
308
+ --_card-border: var(--_card-border-width) solid var(--_card-border-color, var(--md-comp-outlined-card-outline-color, var(--md-sys-color-outline-variant)));
232
309
 
233
- --_pressed-state-color: var(--md-comp-filled-card-pressed-state-layer-color, var(--md-sys-color-on-surface));
234
- --_pressed-state-opacity: var(--md-comp-filled-card-pressed-state-layer-opacity, var(--md-sys-state-pressed-state-layer-opacity));
235
- --_pressed-elevation: var(--md-comp-filled-card-pressed-container-elevation, var(--md-sys-elevation-level0));
310
+ --_card-hover-border-color: var(--md-comp-outlined-card-hover-outline-color, var(--md-sys-color-outline-variant));
236
311
 
237
- --_dragged-state-color: var(--md-comp-filled-card-dragged-state-layer-color, var(--md-sys-color-on-surface));
238
- --_dragged-state-opacity: var(--md-comp-filled-card-dragged-state-layer-opacity, var(--md-sys-state-dragged-state-layer-opacity));
239
- --_dragged-elevation: var(--md-comp-filled-card-dragged-container-elevation, var(--md-sys-elevation-level3));
312
+ --_card-focus-border-color: var(--md-comp-outlined-card-focus-indicator-color, var(--md-sys-color-secondary));
313
+ --_card-focus-border-width: var(--md-comp-outlined-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
240
314
 
241
- &[inert] {
242
- --_color: var(--md-comp-filled-card-disabled-container-color, var(--md-sys-color-surface-variant));
243
- --_elevation: var(--md-comp-filled-card-disabled-container-elevation, var(--md-sys-elevation-level0));
244
- --_opacity: var(--md-comp-filled-card-disabled-container-opacity, var(--md-sys-state-disabled-state-layer-opacity));
245
- --_pointer-events: none;
246
- }
247
- }
315
+ --_card-pressed-border-color: var(--md-comp-outlined-card-pressed-outline-color, var(--md-sys-color-outline-variant));
248
316
 
249
- .micl-card-outlined {
250
- --_shape: var(--md-comp-outlined-card-container-shape, var(--md-sys-shape-corner-medium));
251
- --_color: var(--md-comp-outlined-card-container-color, var(--md-sys-color-surface));
252
- --_elevation: var(--md-comp-outlined-card-container-elevation, var(--md-sys-elevation-level0));
253
- --_border-width: var(--md-comp-outlined-card-outline-width, 1px);
254
- --_border: var(--_border-width) solid var(--_border-color, var(--md-comp-outlined-card-outline-color, var(--md-sys-color-outline-variant)));
255
-
256
- --_hover-state-color: var(--md-comp-outlined-card-hover-state-layer-color, var(--md-sys-color-on-surface));
257
- --_hover-state-opacity: var(--md-comp-outlined-card-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity));
258
- --_hover-elevation: var(--md-comp-outlined-card-hover-container-elevation, var(--md-sys-elevation-level1));
259
- --_hover-border-color: var(--md-comp-outlined-card-hover-outline-color, var(--md-sys-color-outline-variant));
260
-
261
- --_focus-state-color: var(--md-comp-outlined-card-focus-state-layer-color, var(--md-sys-color-on-surface));
262
- --_focus-state-opacity: var(--md-comp-outlined-card-focus-state-layer-opacity, var(--md-sys-state-focus-state-layer-opacity));
263
- --_focus-elevation: var(--md-comp-outlined-card-focus-container-elevation, var(--md-sys-elevation-level0));
264
- --_focus-border-color: var(--md-comp-outlined-card-focus-indicator-color, var(--md-sys-color-secondary));
265
- --_focus-border-width: var(--md-comp-outlined-card-focus-indicator-thickness, --md-sys-state-focus-indicator-thickness);
266
-
267
- --_pressed-state-color: var(--md-comp-outlined-card-pressed-state-layer-color, var(--md-sys-color-on-surface));
268
- --_pressed-state-opacity: var(--md-comp-outlined-card-pressed-state-layer-opacity, var(--md-sys-state-pressed-state-layer-opacity));
269
- --_pressed-elevation: var(--md-comp-outlined-card-pressed-container-elevation, var(--md-sys-elevation-level0));
270
- --_pressed-border-color: var(--md-comp-outlined-card-pressed-outline-color, var(--md-sys-color-outline-variant));
271
-
272
- --_dragged-state-color: var(--md-comp-outlined-card-dragged-state-layer-color, var(--md-sys-color-on-surface));
273
- --_dragged-state-opacity: var(--md-comp-outlined-card-dragged-state-layer-opacity, var(--md-sys-state-dragged-state-layer-opacity));
274
- --_dragged-elevation: var(--md-comp-outlined-card-dragged-container-elevation, var(--md-sys-elevation-level3));
275
- --_dragged-border-color: var(--md-comp-outlined-card-dragged-outline-color, var(--md-sys-color-outline-variant));
317
+ --_card-dragged-border-color: var(--md-comp-outlined-card-dragged-outline-color, var(--md-sys-color-outline-variant));
276
318
 
277
319
  &[inert] {
278
- --_border-color: rgb(from var(--md-comp-outlined-card-disabled-outline-color, var(--md-sys-color-outline)) r g b / var(--md-comp-outlined-card-disabled-outline-opacity, 12%));
279
- --_color: var(--md-comp-outlined-card-disabled-container-color, var(--md-sys-color-surface));
280
- --_elevation: var(--md-comp-outlined-card-disabled-container-elevation, var(--md-sys-elevation-level0));
281
- --_opacity: var(--md-comp-outlined-card-disabled-container-opacity, var(--md-sys-state-disabled-state-layer-opacity));
282
- --_pointer-events: none;
320
+ --_card-border-color: rgb(from var(--md-comp-outlined-card-disabled-outline-color, var(--md-sys-color-outline)) r g b / var(--md-comp-outlined-card-disabled-outline-opacity, 12%));
283
321
  }
284
322
  }
285
323
 
@@ -289,7 +327,7 @@
289
327
  background-position: center;
290
328
  background-repeat: no-repeat;
291
329
  background-size: contain;
292
- border-radius: var(--_shape);
330
+ border-radius: var(--_card-shape);
293
331
  }
294
332
 
295
333
  .micl-card-elevated,
@@ -311,7 +349,7 @@
311
349
  display: flex;
312
350
  align-items: center;
313
351
  column-gap: var(--md-comp-card-gap, 8px);
314
- color: var(--_text-color);
352
+ color: var(--_card-color);
315
353
 
316
354
  h1, h2, h3, h4, h5, h6, .micl-heading {
317
355
  flex: 1 2 fit-content;
@@ -330,17 +368,11 @@
330
368
  }
331
369
  }
332
370
 
333
- .micl-card__headline-s h1, .micl-card__headline-s h2, .micl-card__headline-s h3,
334
- .micl-card__headline-s h4, .micl-card__headline-s h5, .micl-card__headline-s h6,
335
- .micl-card__headline-s .micl-heading { @include typography.headline-small; }
336
-
337
- .micl-card__headline-m h1, .micl-card__headline-m h2, .micl-card__headline-m h3,
338
- .micl-card__headline-m h4, .micl-card__headline-m h5, .micl-card__headline-m h6,
339
- .micl-card__headline-m .micl-heading { @include typography.headline-medium; }
340
-
341
- .micl-card__headline-l h1, .micl-card__headline-l h2, .micl-card__headline-l h3,
342
- .micl-card__headline-l h4, .micl-card__headline-l h5, .micl-card__headline-l h6,
343
- .micl-card__headline-l .micl-heading { @include typography.headline-large; }
371
+ @each $abbrev, $size in ('s': 'small', 'm': 'medium', 'l': 'large') {
372
+ .micl-card__headline-#{$abbrev} :is(h1, h2, h3, h4, h5, h6, .micl-heading) {
373
+ @include meta.apply(meta.get-mixin('headline-' + $size, $module: 'typography'));
374
+ }
375
+ }
344
376
 
345
377
  .micl-card__subhead {
346
378
  @include typography.title-medium;
@@ -350,7 +382,7 @@
350
382
  overflow: hidden;
351
383
  text-overflow: ellipsis;
352
384
  white-space: nowrap;
353
- color: var(--_text-color);
385
+ color: var(--_card-color);
354
386
  }
355
387
 
356
388
  .micl-card__supporting-text {
@@ -358,14 +390,13 @@
358
390
  display: block;
359
391
  margin: 0;
360
392
  padding: 0 var(--md-comp-card-padding-inline, 16px);
361
- color: var(--_text-color);
393
+ color: var(--_card-color);
362
394
  }
363
395
 
364
396
  .micl-card__content {
365
397
  box-sizing: border-box;
366
398
  padding-block: var(--md-comp-card-content-padding-block, 16px);
367
399
  padding-inline: var(--md-comp-card-padding-inline, 16px);
368
- background-color: inherit;
369
400
  overflow: clip visible;
370
401
  }
371
402
 
@@ -373,7 +404,8 @@
373
404
  box-sizing: border-box;
374
405
  display: flex;
375
406
  flex-shrink: 0;
376
- column-gap: 8px;
407
+ flex-wrap: wrap;
408
+ gap: 8px;
377
409
  padding-block: 0 var(--md-comp-card-content-padding-block, 16px);
378
410
  padding-inline: var(--md-comp-card-padding-inline, 16px);
379
411
  }
@@ -21,9 +21,26 @@
21
21
 
22
22
  @use '../../foundations';
23
23
  @use '../../styles/motion';
24
+ @use '../../styles/shapes';
24
25
  @use '../../styles/statelayer';
25
26
  @use '../../styles/typography';
26
27
 
28
+ @include shapes.corner('full');
29
+
30
+ @include statelayer.token('layer-size');
31
+ @include statelayer.token('hover-state-layer-opacity');
32
+ @include statelayer.token('focus-state-layer-opacity');
33
+ @include statelayer.token('pressed-state-layer-opacity');
34
+ @include statelayer.token('disabled-state-layer-opacity');
35
+ @include statelayer.token('focus-indicator-thickness');
36
+ @include statelayer.token('ripple-opacity-factor');
37
+ @include statelayer.token('ripple-duration');
38
+ @include statelayer.property;
39
+ @include statelayer.keyframes;
40
+
41
+ @include motion.duration('short3');
42
+ @include motion.duration('long4');
43
+
27
44
  :root {
28
45
  --md-sys-checkbox-border-width: 2px;
29
46
  --md-sys-checkbox-check-thickness: 2px;
@@ -158,13 +175,18 @@ input[type=checkbox].micl-checkbox {
158
175
  --micl-ripple: 1;
159
176
 
160
177
  background-image:
161
- radial-gradient(circle at var(--micl-x, center) var(--micl-y, center), transparent 0%, rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)) 10%, transparent 10%),
178
+ radial-gradient(
179
+ circle at var(--micl-x, center) var(--micl-y, center),
180
+ transparent 0%,
181
+ rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) * var(--md-sys-state-ripple-opacity-factor))) 10%,
182
+ transparent 10%
183
+ ),
162
184
  linear-gradient(rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)));
163
185
  background-repeat: no-repeat;
164
- background-size: 10000%, 100%;
186
+ background-size: 0%, 100%;
165
187
  cursor: pointer;
166
188
  transition:
167
- background-size 3000ms,
189
+ background-size 0ms,
168
190
  --statelayer-opacity var(--md-sys-checkbox-motion-duration) linear;
169
191
 
170
192
  &:hover {
@@ -187,9 +209,6 @@ input[type=checkbox].micl-checkbox {
187
209
  --statelayer-color: var(--md-sys-color-on-surface);
188
210
  --statelayer-opacity: var(--md-sys-state-pressed-state-layer-opacity, 10%);
189
211
 
190
- background-size: 0%, 100%;
191
- transition: background-size 0ms;
192
-
193
212
  &:not(:checked):not(:indeterminate) {
194
213
  --statelayer-color: var(--md-sys-color-primary);
195
214
 
@@ -198,6 +217,9 @@ input[type=checkbox].micl-checkbox {
198
217
  }
199
218
  }
200
219
  }
220
+ &.micl-rippling {
221
+ animation: micl-ripple var(--md-sys-state-ripple-duration) motion.$md-sys-motion-easing-standard;
222
+ }
201
223
  }
202
224
  &:disabled {
203
225
  opacity: var(--md-sys-state-disabled-state-layer-opacity, 38%);
@@ -25,6 +25,19 @@
25
25
  @use '../../styles/statelayer';
26
26
  @use '../../styles/typography';
27
27
 
28
+ @include shapes.corner('large');
29
+ @include shapes.corner('full');
30
+
31
+ @include statelayer.token('hover-state-layer-opacity');
32
+ @include statelayer.token('focus-state-layer-opacity');
33
+ @include statelayer.token('pressed-state-layer-opacity');
34
+ @include statelayer.token('disabled-state-layer-opacity');
35
+ @include statelayer.property;
36
+
37
+ @include typography.scale('headline-large');
38
+ @include typography.scale('body-large');
39
+ @include typography.scale('label-large');
40
+
28
41
  :root {
29
42
  --md-comp-date-picker-docked-container-width: 360px;
30
43
  --md-comp-date-picker-modal-container-width: 360px;
@@ -139,9 +139,9 @@ const renderCalendarHeader = (): DocumentFragment =>
139
139
  const tempDate = new Date();
140
140
  const startOffset = tempDate.getDay() - firstDayOfWeek;
141
141
  tempDate.setDate(tempDate.getDate() - startOffset);
142
-
142
+
143
143
  const fragment = document.createDocumentFragment();
144
-
144
+
145
145
  for (let i = 0; i < 7; i++) {
146
146
  const span = document.createElement('span');
147
147
  span.style.gridArea = `1 / ${i + 1}`;
@@ -179,10 +179,10 @@ const populateContainerWithDays = (
179
179
  const day = days[index];
180
180
  el.dateTime = day.val;
181
181
  el.textContent = day.date.getDate().toString();
182
-
182
+
183
183
  const isSelected = day.date.getTime() === state.selected.getTime();
184
184
  const isToday = day.date.getTime() === today.getTime();
185
-
185
+
186
186
  el.className = '';
187
187
  if (!day.isCurrentMonth) el.classList.add('micl-datepicker__outside');
188
188
  if (isSelected) el.classList.add('micl-datepicker__selected');
@@ -303,7 +303,7 @@ const renderCalendar = (
303
303
 
304
304
  const monthInput = dialog.querySelector<HTMLInputElement>(`.micl-datepicker__months input[value="${state.viewDate.getMonth()}"]`);
305
305
  if (monthInput) monthInput.checked = true;
306
-
306
+
307
307
  const yearInput = dialog.querySelector<HTMLInputElement>(`.micl-datepicker__years input[value="${state.viewDate.getFullYear()}"]`);
308
308
  if (yearInput) yearInput.checked = true;
309
309
  };
@@ -335,7 +335,7 @@ const initPeriodPickers = (dialog: HTMLDialogElement, min: Date, max: Date): voi
335
335
  months.push(current.getMonth());
336
336
  current.setMonth(current.getMonth() + 1);
337
337
  }
338
-
338
+
339
339
  [...new Set(months.sort((a, b) => a - b))].forEach(m => {
340
340
  const label = document.createElement('label');
341
341
  label.innerHTML = `<span class="material-symbols-outlined">check</span><input type="radio" name="miclmonth" value="${m}"> ${formatters.monthLong.format(new Date(2000, m, 1))}`;
@@ -498,7 +498,7 @@ const selectDate = (dialog: HTMLDialogElement, dateStr: string, isLocaleFormatte
498
498
  if (parts.length === 3) {
499
499
  state.selected = new Date(parts[0], parts[1], parts[2]);
500
500
  state.viewDate = new Date(state.selected);
501
-
501
+
502
502
  renderCalendar(dialog, state);
503
503
  }
504
504
  };
@@ -562,7 +562,7 @@ export default (() =>
562
562
  const forMonth = btn.parentElement?.classList.contains('micl-datepicker__month-selector');
563
563
  const isNext = btn.classList.contains('micl-datepicker__next');
564
564
  const isPrev = btn.classList.contains('micl-datepicker__previous');
565
-
565
+
566
566
  if (isNext || isPrev) {
567
567
  changePeriod(dialog, isNext ? 1 : -1, forMonth ? 'month' : 'year');
568
568
  return;
@@ -628,7 +628,7 @@ export default (() =>
628
628
  if (!isInvoker(invoker)) {
629
629
  return;
630
630
  }
631
-
631
+
632
632
  let initialDate = new Date();
633
633
  let min = new Date(1900, 0, 1);
634
634
  let max = new Date(2099, 11, 31);