material-inspired-component-library 7.0.1 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CLAUDE.md +42 -0
  2. package/README.md +6 -0
  3. package/components/accordion/README.md +6 -3
  4. package/components/appbar/index.scss +1 -1
  5. package/components/button/index.scss +10 -6
  6. package/components/card/README.md +4 -0
  7. package/components/card/index.scss +160 -151
  8. package/components/checkbox/index.scss +11 -6
  9. package/components/datepicker/index.ts +9 -9
  10. package/components/dialog/index.scss +5 -6
  11. package/components/iconbutton/index.scss +10 -6
  12. package/components/list/README.md +191 -32
  13. package/components/list/index.scss +256 -190
  14. package/components/list/index.ts +100 -100
  15. package/components/menu/README.md +199 -10
  16. package/components/menu/index.scss +224 -47
  17. package/components/menu/index.ts +74 -37
  18. package/components/navigationrail/index.scss +75 -69
  19. package/components/radio/index.scss +11 -6
  20. package/components/select/README.md +42 -5
  21. package/components/select/index.scss +39 -79
  22. package/components/stepper/index.scss +1 -5
  23. package/components/stepper/index.ts +1 -1
  24. package/components/textfield/index.scss +1 -1
  25. package/components/textfield/index.ts +2 -2
  26. package/components/timepicker/index.ts +2 -2
  27. package/dist/alert.css +1 -1
  28. package/dist/appbar.css +1 -1
  29. package/dist/badge.css +1 -1
  30. package/dist/bottomsheet.css +1 -1
  31. package/dist/button.css +1 -1
  32. package/dist/card.css +1 -1
  33. package/dist/checkbox.css +1 -1
  34. package/dist/components/list/index.d.ts +2 -2
  35. package/dist/datepicker.css +1 -1
  36. package/dist/dialog.css +1 -1
  37. package/dist/divider.css +1 -1
  38. package/dist/foundations.css +1 -1
  39. package/dist/iconbutton.css +1 -1
  40. package/dist/list.css +1 -1
  41. package/dist/menu.css +1 -1
  42. package/dist/micl.css +1 -1
  43. package/dist/micl.js +1 -1
  44. package/dist/navigationrail.css +1 -1
  45. package/dist/radio.css +1 -1
  46. package/dist/select.css +1 -1
  47. package/dist/sidesheet.css +1 -1
  48. package/dist/slider.css +1 -1
  49. package/dist/snackbar.css +1 -1
  50. package/dist/stepper.css +1 -1
  51. package/dist/switch.css +1 -1
  52. package/dist/textfield.css +1 -1
  53. package/dist/timepicker.css +1 -1
  54. package/docs/accordion.html +24 -24
  55. package/docs/bottomsheet.html +1 -4
  56. package/docs/dialog.html +1 -1
  57. package/docs/index.html +5 -5
  58. package/docs/list.html +38 -22
  59. package/docs/menu.html +246 -41
  60. package/docs/micl.css +1 -1
  61. package/docs/micl.js +1 -1
  62. package/docs/select.html +68 -19
  63. package/docs/shapes.html +85 -0
  64. package/foundations/index.scss +0 -1
  65. package/micl.ts +54 -36
  66. package/package.json +3 -3
  67. package/styles/README.md +14 -4
  68. package/styles/shapes.scss +81 -0
  69. package/styles/statelayer.scss +10 -0
  70. package/styles/typography.scss +38 -2
  71. package/tsconfig.json +4 -4
package/CLAUDE.md ADDED
@@ -0,0 +1,42 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ MICL is a Material Design 3 UI component library written in TypeScript and Sass. It compiles to a UMD bundle (`dist/micl.js`) and a CSS file (`dist/micl.css`) with zero runtime dependencies.
8
+
9
+ ## Commands
10
+
11
+ ```bash
12
+ npm run build # Compiles TypeScript + Sass via webpack, outputs to /dist/ and /docs/
13
+ ```
14
+
15
+ There is no test suite, linter script, or dev server configured.
16
+
17
+ ## Architecture
18
+
19
+ ### Entry Points
20
+
21
+ - **`micl.ts`** — Main orchestrator. Initializes components lazily via a `MutationObserver` that watches for DOM insertions/removals. Handles event delegation for `input`, `change`, and `keydown` events, applies the ripple effect, and sets scrollbar CSS custom properties.
22
+ - **`styles.scss`** — Master stylesheet that imports all component and foundation Sass partials.
23
+
24
+ ### Component Structure
25
+
26
+ Each component lives in `components/<name>/` and exports:
27
+ - A CSS selector string (e.g., `buttonSelector = 'button.micl-button--toggle'`)
28
+ - A handler object with `initialize(element)` / `cleanup(element)` methods and optional event handlers (`input`, `change`, `keydown`, `command`)
29
+
30
+ `micl.ts` imports every component handler, maps selectors to handlers, and drives the lifecycle using the MutationObserver + event delegation pattern.
31
+
32
+ ### Styling System
33
+
34
+ - Sass uses `@use` (not `@import`); partials are namespaced.
35
+ - Theming is done entirely via CSS custom properties with `--md-sys-*` prefixes.
36
+ - `themes/` contains 11 colour themes, each with light, dark, and high-contrast variants.
37
+ - `styles/` contains Material Design tokens: typography, shapes, elevation, motion, state layers.
38
+ - `foundations/` contains the responsive layout system (breakpoints: compact ≤599 px, medium 600–839 px, expanded 840–1199 px, large 1200–1599 px, extra-large ≥1600 px).
39
+
40
+ ### Build
41
+
42
+ `webpack.config.js` produces two identical outputs: one to `/dist/` (npm distribution) and one to `/docs/` (live demo). TypeScript target is ES2022 with strict mode and declaration-file generation enabled.
package/README.md CHANGED
@@ -124,6 +124,12 @@ The library currently consists of the following components:
124
124
 
125
125
  ## Change Log ↪️
126
126
 
127
+ ### 8.0.0 (05.05.2026)
128
+ - **BREAKING**: Renamed many CSS custom properties from --md-sys- to --md-comp-.
129
+ - **List, Menu, Accordion, Select**: Aligned with latest MD3 spec.
130
+ - **Ripple**: Now starts on pointer-down.
131
+ - **Text field**: Outlined version uses CSS variable instead of inherited background.
132
+
127
133
  ### 7.0.0 (08.03.2026)
128
134
  - **BREAKING**: Use `<a>` instead of `<label>` inside Navigation rail.
129
135
  - **BREAKING**: Use `inert` for disabled cards instead of `micl-card--disabled`.
@@ -68,9 +68,9 @@ To ensure that only one accordion item within a group can be open at a time, add
68
68
  </div>
69
69
  </div>
70
70
  </details>
71
- <hr class="micl-divider">
71
+ <hr class="micl-divider-inset">
72
72
  <details name="mygroup">
73
- <summary class="micl-list-item-two" tabindex="-1">
73
+ <summary class="micl-list-item-two">
74
74
  <span class="micl-list-item__text">
75
75
  <span class="micl-list-item__headline">Country</span>
76
76
  <span class="micl-list-item__supporting-text">The country of residence.</span>
@@ -110,6 +110,9 @@ Use a [Divider component](../divider/README.md) to separate neighbouring accordi
110
110
 
111
111
  Since the Accordion is based on the List component, you can use the same utility classes for content structure and styling. Refer to the [List component documentation](../list/README.md) for details on how to add icons, avatars, images, and other features to your accordion items.
112
112
 
113
+ ## Keyboard
114
+ Each `<summary>` is a tab stop in document order — `Tab` and `Shift+Tab` move focus through the accordion headers. While focus is on a header, `Enter` or `Space` toggles the panel open or closed. As an optional enhancement, `ArrowDown` and `ArrowUp` move focus to the next or previous header in the same group; focus wraps around at the ends.
115
+
113
116
  ## Customizations
114
117
  You can customize the appearance of the Accordion component by overriding its own global CSS variables and those from the List component. These variables are declared on the `:root` pseudo-class and can be changed on any appropriate parent element to affect its child accordions.
115
118
 
@@ -131,4 +134,4 @@ You can customize the appearance of the Accordion component by overriding its ow
131
134
  ```
132
135
 
133
136
  ## Compatibility
134
- The Card component uses the `interpolate-size` CSS property to smoothly open and close the detail area of a Details disclosure element, which might not be supported in your browser. Please check [Browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/interpolate-size#browser_compatibility) for details.
137
+ The Accordion component uses the `interpolate-size` CSS property to smoothly open and close the detail area of a Details disclosure element, which might not be supported in your browser. Please check [Browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/interpolate-size#browser_compatibility) for details.
@@ -55,7 +55,7 @@
55
55
  padding-inline: var(--md-sys-appbar-padding-inline);
56
56
  border-start-start-radius: inherit;
57
57
  border-start-end-radius: inherit;
58
- background-color: var(--md-sys-color-surface);
58
+ background-color: inherit;
59
59
  box-shadow: var(--md-sys-elevation-level0);
60
60
  z-index: 8;
61
61
 
@@ -69,15 +69,20 @@ button.micl-button-outlined-xl {
69
69
  border: none;
70
70
  border-radius: calc(var(--micl-height) / 2);
71
71
  background-image:
72
- 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%),
72
+ radial-gradient(
73
+ circle at var(--micl-x, center) var(--micl-y, center),
74
+ transparent 0%,
75
+ rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) * var(--md-sys-state-ripple-opacity-factor))) 10%,
76
+ transparent 10%
77
+ ),
73
78
  linear-gradient(rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)));
74
79
  background-repeat: no-repeat;
75
- background-size: 10000%, 100%;
80
+ background-size: 0%, 100%;
76
81
  -webkit-tap-highlight-color: transparent;
77
82
  cursor: pointer;
78
83
  transition:
79
84
  border-radius var(--md-sys-button-motion-duration) var(--md-sys-button-motion-effects),
80
- background-size 3000ms,
85
+ background-size 0ms,
81
86
  --statelayer-opacity var(--md-sys-button-motion-duration) linear;
82
87
 
83
88
  &:disabled {
@@ -91,9 +96,8 @@ button.micl-button-outlined-xl {
91
96
  outline: var(--md-sys-state-focus-indicator-thickness, 3px) solid var(--md-sys-color-secondary);
92
97
  outline-offset: 3px;
93
98
  }
94
- &:active {
95
- background-size: 0%, 100%;
96
- transition: background-size 0ms;
99
+ &.micl-rippling {
100
+ animation: micl-ripple var(--md-sys-state-ripple-duration) motion.$md-sys-motion-easing-standard;
97
101
  }
98
102
  }
99
103
  .micl-button__icon {
@@ -126,6 +126,7 @@ The Card component supports the following CSS variables, as defined in the [Mate
126
126
  --md-comp-elevated-card-container-shape
127
127
  --md-comp-elevated-card-disabled-container-elevation
128
128
  --md-comp-elevated-card-disabled-container-color
129
+ --md-comp-elevated-card-disabled-container-opacity
129
130
  --md-comp-elevated-card-hover-container-elevation
130
131
  --md-comp-elevated-card-hover-state-layer-color
131
132
  --md-comp-elevated-card-hover-state-layer-opacity
@@ -146,6 +147,7 @@ The Card component supports the following CSS variables, as defined in the [Mate
146
147
  --md-comp-filled-card-container-shape
147
148
  --md-comp-filled-card-disabled-container-elevation
148
149
  --md-comp-filled-card-disabled-container-color
150
+ --md-comp-filled-card-disabled-container-opacity
149
151
  --md-comp-filled-card-hover-container-elevation
150
152
  --md-comp-filled-card-hover-state-layer-color
151
153
  --md-comp-filled-card-hover-state-layer-opacity
@@ -166,7 +168,9 @@ The Card component supports the following CSS variables, as defined in the [Mate
166
168
  --md-comp-outlined-card-container-shape
167
169
  --md-comp-outlined-card-outline-width
168
170
  --md-comp-outlined-card-outline-color
171
+ --md-comp-outlined-card-disabled-container-color
169
172
  --md-comp-outlined-card-disabled-container-elevation
173
+ --md-comp-outlined-card-disabled-container-opacity
170
174
  --md-comp-outlined-card-disabled-outline-color
171
175
  --md-comp-outlined-card-disabled-outline-opacity
172
176
  --md-comp-outlined-card-hover-container-elevation
@@ -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,58 @@
26
27
  @use '../../styles/statelayer';
27
28
  @use '../../styles/typography';
28
29
 
30
+ @mixin card-variant(
31
+ $name,
32
+ $bg-default,
33
+ $elev-default,
34
+ $hover-elev-default,
35
+ $focus-elev-default,
36
+ $pressed-elev-default,
37
+ $dragged-elev-default,
38
+ $inert-bg-default,
39
+ $inert-elev-default
40
+ ) {
41
+ --_card-shape: var(--md-comp-#{$name}-card-container-shape, var(--md-sys-shape-corner-medium));
42
+ --_card-background-color: var(--md-comp-#{$name}-card-container-color, #{$bg-default});
43
+ --_card-elevation: var(--md-comp-#{$name}-card-container-elevation, #{$elev-default});
44
+
45
+ --_card-hover-state-color: var(--md-comp-#{$name}-card-hover-state-layer-color, var(--md-sys-color-on-surface));
46
+ --_card-hover-state-opacity: var(--md-comp-#{$name}-card-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity));
47
+ --_card-hover-elevation: var(--md-comp-#{$name}-card-hover-container-elevation, #{$hover-elev-default});
48
+
49
+ --_card-focus-state-color: var(--md-comp-#{$name}-card-focus-state-layer-color, var(--md-sys-color-on-surface));
50
+ --_card-focus-state-opacity: var(--md-comp-#{$name}-card-focus-state-layer-opacity, var(--md-sys-state-focus-state-layer-opacity));
51
+ --_card-focus-elevation: var(--md-comp-#{$name}-card-focus-container-elevation, #{$focus-elev-default});
52
+
53
+ --_card-pressed-state-color: var(--md-comp-#{$name}-card-pressed-state-layer-color, var(--md-sys-color-on-surface));
54
+ --_card-pressed-state-opacity: var(--md-comp-#{$name}-card-pressed-state-layer-opacity, var(--md-sys-state-pressed-state-layer-opacity));
55
+ --_card-pressed-elevation: var(--md-comp-#{$name}-card-pressed-container-elevation, #{$pressed-elev-default});
56
+
57
+ --_card-dragged-state-color: var(--md-comp-#{$name}-card-dragged-state-layer-color, var(--md-sys-color-on-surface));
58
+ --_card-dragged-state-opacity: var(--md-comp-#{$name}-card-dragged-state-layer-opacity, var(--md-sys-state-dragged-state-layer-opacity));
59
+ --_card-dragged-elevation: var(--md-comp-#{$name}-card-dragged-container-elevation, #{$dragged-elev-default});
60
+
61
+ &[inert] {
62
+ --_card-background-color: var(--md-comp-#{$name}-card-disabled-container-color, #{$inert-bg-default});
63
+ --_card-elevation: var(--md-comp-#{$name}-card-disabled-container-elevation, #{$inert-elev-default});
64
+ --_card-opacity: var(--md-comp-#{$name}-card-disabled-container-opacity, var(--md-sys-state-disabled-state-layer-opacity));
65
+ --_card-pointer-events: none;
66
+ }
67
+ }
68
+
69
+ @mixin card-focus-outline($name) {
70
+ --_card-focus-outline-thickness: var(--md-comp-#{$name}-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
71
+ --_card-focus-outline-color: var(--md-comp-#{$name}-card-focus-indicator-color, var(--md-sys-color-secondary));
72
+ --_card-focus-outline-offset: var(--md-comp-#{$name}-card-focus-indicator-outline-offset, var(--md-sys-state-focus-indicator-outer-offset));
73
+ }
74
+
75
+ @mixin card-interactive($state) {
76
+ &[tabindex='0']:not([inert]):#{$state},
77
+ &:not([tabindex='0']):not([inert]):has(> summary:#{$state}) {
78
+ @content;
79
+ }
80
+ }
81
+
29
82
  :root {
30
83
  --md-comp-card-gap: 8px;
31
84
  --md-comp-card-margin: 8px;
@@ -36,10 +89,10 @@
36
89
  .micl-card-elevated,
37
90
  .micl-card-filled,
38
91
  .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};
92
+ --md-comp-card-motion-spatial: #{motion.$md-sys-motion-expressive-default-spatial};
93
+ --md-comp-card-motion-duration: #{motion.$md-sys-motion-expressive-default-spatial-duration};
41
94
 
42
- --_text-color: var(--md-sys-color-on-surface-variant);
95
+ --_card-color: var(--md-sys-color-on-surface-variant);
43
96
 
44
97
  display: flex;
45
98
  flex-direction: column;
@@ -49,12 +102,12 @@
49
102
  overflow: hidden;
50
103
  interpolate-size: allow-keywords;
51
104
 
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);
105
+ border-radius: var(--_card-shape);
106
+ background-color: var(--_card-background-color);
107
+ box-shadow: var(--_card-elevation);
108
+ border: var(--_card-border, none);
109
+ opacity: var(--_card-opacity, 1);
110
+ pointer-events: var(--_card-pointer-events, auto);
58
111
 
59
112
  &:not(.micl-card--compact):not(:has(>summary)) {
60
113
  row-gap: var(--md-comp-card-gap, 8px);
@@ -65,73 +118,76 @@
65
118
  --micl-ripple: 1;
66
119
 
67
120
  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%),
121
+ radial-gradient(
122
+ circle at var(--micl-x, center) var(--micl-y, center),
123
+ transparent 0%,
124
+ rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) * var(--md-sys-state-ripple-opacity-factor))) 10%,
125
+ transparent 10%
126
+ ),
69
127
  linear-gradient(rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)));
70
128
  background-repeat: no-repeat;
71
- background-size: 10000%, 100%;
129
+ background-size: 0%, 100%;
72
130
  transition:
73
- background-size 3000ms,
74
- --statelayer-opacity var(--md-sys-card-motion-duration) linear;
131
+ background-size 0ms,
132
+ --statelayer-opacity var(--md-comp-card-motion-duration) linear;
75
133
 
76
134
  &:hover {
77
- --statelayer-color: var(--_hover-state-color);
78
- --statelayer-opacity: var(--_hover-state-opacity);
79
- --_text-color: var(--md-sys-color-on-surface);
135
+ --statelayer-color: var(--_card-hover-state-color);
136
+ --statelayer-opacity: var(--_card-hover-state-opacity);
137
+ --_card-color: var(--md-sys-color-on-surface);
80
138
  cursor: pointer;
81
139
  }
82
140
  &: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);
141
+ --statelayer-color: var(--_card-focus-state-color);
142
+ --statelayer-opacity: var(--_card-focus-state-opacity);
143
+ --_card-color: var(--md-sys-color-on-surface);
86
144
  }
87
145
  &: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;
146
+ --statelayer-color: var(--_card-pressed-state-color);
147
+ --statelayer-opacity: var(--_card-pressed-state-opacity);
148
+ --_card-color: var(--md-sys-color-on-surface);
93
149
  }
94
150
  &.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);
151
+ --statelayer-color: var(--_card-dragged-state-color);
152
+ --statelayer-opacity: var(--_card-dragged-state-opacity);
153
+ --_card-color: var(--md-sys-color-on-surface);
98
154
  cursor: grabbing;
99
155
  }
156
+ &.micl-rippling {
157
+ animation: micl-ripple calc(var(--md-sys-state-ripple-duration) / 2) motion.$md-sys-motion-easing-standard;
158
+ }
100
159
 
101
160
  .micl-card__content {
102
161
  background-color: transparent;
103
162
  }
104
163
  }
105
164
 
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));
165
+ @include card-interactive('hover') {
166
+ box-shadow: var(--_card-hover-elevation);
167
+ border-color: var(--_card-hover-border-color, var(--_card-border-color, transparent));
110
168
  }
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);
169
+ @include card-interactive('focus-visible') {
170
+ box-shadow: var(--_card-focus-elevation);
171
+ border-width: var(--_card-focus-border-width, var(--_card-border-width, 0));
172
+ border-color: var(--_card-focus-border-color, transparent);
173
+ outline: var(--_card-focus-outline-thickness, 0px) solid var(--_card-focus-outline-color, transparent);
174
+ outline-offset: var(--_card-focus-outline-offset, 0px);
118
175
  }
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);
176
+ @include card-interactive('active') {
177
+ box-shadow: var(--_card-pressed-elevation);
178
+ border-color: var(--_card-pressed-border-color, transparent);
123
179
  }
124
180
  &[tabindex='0']:not([inert]).micl-card--dragging {
125
- box-shadow: var(--_dragged-elevation);
126
- border-color: var(--_dragged-border-color, transparent);
181
+ box-shadow: var(--_card-dragged-elevation);
182
+ border-color: var(--_card-dragged-border-color, transparent);
127
183
  }
128
184
 
129
185
  &::details-content {
130
186
  block-size: 0;
131
187
  overflow: hidden;
132
188
  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;
189
+ block-size var(--md-comp-card-motion-duration) var(--md-comp-card-motion-spatial),
190
+ content-visibility var(--md-comp-card-motion-duration) linear allow-discrete;
135
191
  }
136
192
  &[open]::details-content {
137
193
  block-size: auto;
@@ -157,7 +213,7 @@
157
213
 
158
214
  .micl-card__image {
159
215
  grid-column: 1;
160
- grid-row: 1 / 5;
216
+ grid-row: 1 / -1;
161
217
  block-size: 100%;
162
218
  background-size: cover;
163
219
  }
@@ -183,103 +239,62 @@
183
239
  }
184
240
 
185
241
  .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
- }
242
+ @include card-variant(
243
+ $name : 'elevated',
244
+ $bg-default : var(--md-sys-color-surface-container-low),
245
+ $elev-default : var(--md-sys-elevation-level1),
246
+ $hover-elev-default : var(--md-sys-elevation-level2),
247
+ $focus-elev-default : var(--md-sys-elevation-level1),
248
+ $pressed-elev-default: var(--md-sys-elevation-level1),
249
+ $dragged-elev-default: var(--md-sys-elevation-level4),
250
+ $inert-bg-default : var(--md-sys-color-surface),
251
+ $inert-elev-default : var(--md-sys-elevation-level1)
252
+ );
253
+ @include card-focus-outline('elevated');
215
254
  }
216
255
 
217
256
  .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));
257
+ @include card-variant(
258
+ $name : 'filled',
259
+ $bg-default : var(--md-sys-color-surface-container-highest),
260
+ $elev-default : var(--md-sys-elevation-level0),
261
+ $hover-elev-default : var(--md-sys-elevation-level1),
262
+ $focus-elev-default : var(--md-sys-elevation-level0),
263
+ $pressed-elev-default: var(--md-sys-elevation-level0),
264
+ $dragged-elev-default: var(--md-sys-elevation-level3),
265
+ $inert-bg-default : var(--md-sys-color-surface-variant),
266
+ $inert-elev-default : var(--md-sys-elevation-level0)
267
+ );
268
+ @include card-focus-outline('filled');
269
+ }
221
270
 
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));
271
+ .micl-card-outlined {
272
+ @include card-variant(
273
+ $name : 'outlined',
274
+ $bg-default : var(--md-sys-color-surface),
275
+ $elev-default : var(--md-sys-elevation-level0),
276
+ $hover-elev-default : var(--md-sys-elevation-level1),
277
+ $focus-elev-default : var(--md-sys-elevation-level0),
278
+ $pressed-elev-default: var(--md-sys-elevation-level0),
279
+ $dragged-elev-default: var(--md-sys-elevation-level3),
280
+ $inert-bg-default : var(--md-sys-color-surface),
281
+ $inert-elev-default : var(--md-sys-elevation-level0)
282
+ );
225
283
 
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));
284
+ --_card-border-width: var(--md-comp-outlined-card-outline-width, 1px);
285
+ --_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
286
 
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));
287
+ --_card-hover-border-color: var(--md-comp-outlined-card-hover-outline-color, var(--md-sys-color-outline-variant));
236
288
 
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));
289
+ --_card-focus-border-color: var(--md-comp-outlined-card-focus-indicator-color, var(--md-sys-color-secondary));
290
+ --_card-focus-border-width: var(--md-comp-outlined-card-focus-indicator-thickness, var(--md-sys-state-focus-indicator-thickness));
240
291
 
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
- }
292
+ --_card-pressed-border-color: var(--md-comp-outlined-card-pressed-outline-color, var(--md-sys-color-outline-variant));
248
293
 
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));
294
+ --_card-dragged-border-color: var(--md-comp-outlined-card-dragged-outline-color, var(--md-sys-color-outline-variant));
276
295
 
277
296
  &[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;
297
+ --_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
298
  }
284
299
  }
285
300
 
@@ -289,7 +304,7 @@
289
304
  background-position: center;
290
305
  background-repeat: no-repeat;
291
306
  background-size: contain;
292
- border-radius: var(--_shape);
307
+ border-radius: var(--_card-shape);
293
308
  }
294
309
 
295
310
  .micl-card-elevated,
@@ -311,7 +326,7 @@
311
326
  display: flex;
312
327
  align-items: center;
313
328
  column-gap: var(--md-comp-card-gap, 8px);
314
- color: var(--_text-color);
329
+ color: var(--_card-color);
315
330
 
316
331
  h1, h2, h3, h4, h5, h6, .micl-heading {
317
332
  flex: 1 2 fit-content;
@@ -330,17 +345,11 @@
330
345
  }
331
346
  }
332
347
 
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; }
348
+ @each $abbrev, $size in ('s': 'small', 'm': 'medium', 'l': 'large') {
349
+ .micl-card__headline-#{$abbrev} :is(h1, h2, h3, h4, h5, h6, .micl-heading) {
350
+ @include meta.apply(meta.get-mixin('headline-' + $size, $module: 'typography'));
351
+ }
352
+ }
344
353
 
345
354
  .micl-card__subhead {
346
355
  @include typography.title-medium;
@@ -350,22 +359,21 @@
350
359
  overflow: hidden;
351
360
  text-overflow: ellipsis;
352
361
  white-space: nowrap;
353
- color: var(--_text-color);
362
+ color: var(--_card-color);
354
363
  }
355
364
 
356
365
  .micl-card__supporting-text {
357
- @include typography.body-small;
366
+ @include typography.body-smallmedium;
358
367
  display: block;
359
368
  margin: 0;
360
369
  padding: 0 var(--md-comp-card-padding-inline, 16px);
361
- color: var(--_text-color);
370
+ color: var(--_card-color);
362
371
  }
363
372
 
364
373
  .micl-card__content {
365
374
  box-sizing: border-box;
366
375
  padding-block: var(--md-comp-card-content-padding-block, 16px);
367
376
  padding-inline: var(--md-comp-card-padding-inline, 16px);
368
- background-color: inherit;
369
377
  overflow: clip visible;
370
378
  }
371
379
 
@@ -373,7 +381,8 @@
373
381
  box-sizing: border-box;
374
382
  display: flex;
375
383
  flex-shrink: 0;
376
- column-gap: 8px;
384
+ flex-wrap: wrap;
385
+ gap: 8px;
377
386
  padding-block: 0 var(--md-comp-card-content-padding-block, 16px);
378
387
  padding-inline: var(--md-comp-card-padding-inline, 16px);
379
388
  }
@@ -158,13 +158,18 @@ input[type=checkbox].micl-checkbox {
158
158
  --micl-ripple: 1;
159
159
 
160
160
  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%),
161
+ radial-gradient(
162
+ circle at var(--micl-x, center) var(--micl-y, center),
163
+ transparent 0%,
164
+ rgb(from var(--statelayer-color) r g b / calc(var(--statelayer-opacity) * var(--md-sys-state-ripple-opacity-factor))) 10%,
165
+ transparent 10%
166
+ ),
162
167
  linear-gradient(rgb(from var(--statelayer-color) r g b / var(--statelayer-opacity)));
163
168
  background-repeat: no-repeat;
164
- background-size: 10000%, 100%;
169
+ background-size: 0%, 100%;
165
170
  cursor: pointer;
166
171
  transition:
167
- background-size 3000ms,
172
+ background-size 0ms,
168
173
  --statelayer-opacity var(--md-sys-checkbox-motion-duration) linear;
169
174
 
170
175
  &:hover {
@@ -187,9 +192,6 @@ input[type=checkbox].micl-checkbox {
187
192
  --statelayer-color: var(--md-sys-color-on-surface);
188
193
  --statelayer-opacity: var(--md-sys-state-pressed-state-layer-opacity, 10%);
189
194
 
190
- background-size: 0%, 100%;
191
- transition: background-size 0ms;
192
-
193
195
  &:not(:checked):not(:indeterminate) {
194
196
  --statelayer-color: var(--md-sys-color-primary);
195
197
 
@@ -198,6 +200,9 @@ input[type=checkbox].micl-checkbox {
198
200
  }
199
201
  }
200
202
  }
203
+ &.micl-rippling {
204
+ animation: micl-ripple var(--md-sys-state-ripple-duration) motion.$md-sys-motion-easing-standard;
205
+ }
201
206
  }
202
207
  &:disabled {
203
208
  opacity: var(--md-sys-state-disabled-state-layer-opacity, 38%);