material-inspired-component-library 7.0.2 → 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.
- package/CLAUDE.md +42 -0
- package/README.md +6 -0
- package/components/accordion/README.md +6 -3
- package/components/button/index.scss +10 -6
- package/components/card/README.md +4 -0
- package/components/card/index.scss +159 -150
- package/components/checkbox/index.scss +11 -6
- package/components/datepicker/index.ts +9 -9
- package/components/dialog/index.scss +5 -6
- package/components/iconbutton/index.scss +10 -6
- package/components/list/README.md +191 -32
- package/components/list/index.scss +256 -190
- package/components/list/index.ts +100 -100
- package/components/menu/README.md +199 -10
- package/components/menu/index.scss +224 -47
- package/components/menu/index.ts +74 -37
- package/components/navigationrail/index.scss +75 -69
- package/components/radio/index.scss +11 -6
- package/components/select/README.md +42 -5
- package/components/select/index.scss +39 -79
- package/components/stepper/index.scss +1 -5
- package/components/textfield/index.scss +1 -1
- package/components/textfield/index.ts +2 -2
- package/dist/alert.css +1 -1
- package/dist/appbar.css +1 -1
- package/dist/badge.css +1 -1
- package/dist/bottomsheet.css +1 -1
- package/dist/button.css +1 -1
- package/dist/card.css +1 -1
- package/dist/checkbox.css +1 -1
- package/dist/components/list/index.d.ts +2 -2
- package/dist/datepicker.css +1 -1
- package/dist/dialog.css +1 -1
- package/dist/divider.css +1 -1
- package/dist/foundations.css +1 -1
- package/dist/iconbutton.css +1 -1
- package/dist/list.css +1 -1
- package/dist/menu.css +1 -1
- package/dist/micl.css +1 -1
- package/dist/micl.js +1 -1
- package/dist/navigationrail.css +1 -1
- package/dist/radio.css +1 -1
- package/dist/select.css +1 -1
- package/dist/sidesheet.css +1 -1
- package/dist/slider.css +1 -1
- package/dist/snackbar.css +1 -1
- package/dist/stepper.css +1 -1
- package/dist/switch.css +1 -1
- package/dist/textfield.css +1 -1
- package/dist/timepicker.css +1 -1
- package/docs/accordion.html +24 -24
- package/docs/bottomsheet.html +1 -4
- package/docs/dialog.html +1 -1
- package/docs/index.html +4 -4
- package/docs/list.html +38 -22
- package/docs/menu.html +246 -41
- package/docs/micl.css +1 -1
- package/docs/micl.js +1 -1
- package/docs/select.html +68 -19
- package/docs/shapes.html +85 -0
- package/foundations/index.scss +0 -1
- package/micl.ts +6 -1
- package/package.json +3 -3
- package/styles/README.md +4 -4
- package/styles/shapes.scss +81 -0
- package/styles/statelayer.scss +10 -0
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"
|
|
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
|
|
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.
|
|
@@ -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(
|
|
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:
|
|
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
|
|
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
|
-
|
|
95
|
-
|
|
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-
|
|
40
|
-
--md-
|
|
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
|
-
--
|
|
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(--
|
|
53
|
-
background-color: var(--
|
|
54
|
-
box-shadow: var(--
|
|
55
|
-
border: var(--
|
|
56
|
-
opacity: var(--
|
|
57
|
-
pointer-events: var(--
|
|
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(
|
|
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:
|
|
129
|
+
background-size: 0%, 100%;
|
|
72
130
|
transition:
|
|
73
|
-
background-size
|
|
74
|
-
--statelayer-opacity var(--md-
|
|
131
|
+
background-size 0ms,
|
|
132
|
+
--statelayer-opacity var(--md-comp-card-motion-duration) linear;
|
|
75
133
|
|
|
76
134
|
&:hover {
|
|
77
|
-
--statelayer-color: var(--
|
|
78
|
-
--statelayer-opacity: var(--
|
|
79
|
-
--
|
|
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(--
|
|
84
|
-
--statelayer-opacity: var(--
|
|
85
|
-
--
|
|
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(--
|
|
89
|
-
--statelayer-opacity: var(--
|
|
90
|
-
--
|
|
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(--
|
|
96
|
-
--statelayer-opacity: var(--
|
|
97
|
-
--
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
border-
|
|
115
|
-
|
|
116
|
-
outline: var(--
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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(--
|
|
126
|
-
border-color: var(--
|
|
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-
|
|
134
|
-
content-visibility var(--md-
|
|
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 /
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
--
|
|
227
|
-
--
|
|
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
|
-
--
|
|
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
|
-
--
|
|
238
|
-
--
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
--
|
|
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(--
|
|
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(--
|
|
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
|
-
|
|
334
|
-
.micl-card__headline
|
|
335
|
-
.
|
|
336
|
-
|
|
337
|
-
|
|
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,7 +359,7 @@
|
|
|
350
359
|
overflow: hidden;
|
|
351
360
|
text-overflow: ellipsis;
|
|
352
361
|
white-space: nowrap;
|
|
353
|
-
color: var(--
|
|
362
|
+
color: var(--_card-color);
|
|
354
363
|
}
|
|
355
364
|
|
|
356
365
|
.micl-card__supporting-text {
|
|
@@ -358,14 +367,13 @@
|
|
|
358
367
|
display: block;
|
|
359
368
|
margin: 0;
|
|
360
369
|
padding: 0 var(--md-comp-card-padding-inline, 16px);
|
|
361
|
-
color: var(--
|
|
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
|
-
|
|
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(
|
|
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:
|
|
169
|
+
background-size: 0%, 100%;
|
|
165
170
|
cursor: pointer;
|
|
166
171
|
transition:
|
|
167
|
-
background-size
|
|
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%);
|