material-inspired-component-library 9.1.0 → 9.1.2
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/README.md +2 -1
- package/components/appbar/index.scss +1 -1
- package/components/badge/README.md +43 -12
- package/components/badge/index.scss +15 -21
- package/components/bottomsheet/README.md +53 -22
- package/components/bottomsheet/index.scss +62 -45
- package/components/button/_shared.scss +9 -9
- package/components/card/README.md +55 -25
- package/components/card/index.scss +57 -38
- package/components/checkbox/README.md +97 -28
- package/components/checkbox/index.scss +39 -29
- package/components/chip/index.scss +6 -6
- package/components/datepicker/README.md +184 -59
- package/components/datepicker/index.scss +85 -21
- package/components/dialog/README.md +151 -56
- package/components/dialog/index.scss +50 -62
- package/components/iconbutton/index.scss +8 -8
- package/components/list/index.scss +15 -11
- package/components/menu/index.scss +13 -13
- package/components/navigationbar/index.scss +7 -1
- package/components/navigationrail/index.scss +27 -22
- package/components/radio/README.md +52 -12
- package/components/radio/index.scss +59 -41
- package/components/select/index.scss +3 -3
- package/components/sidesheet/README.md +90 -37
- package/components/sidesheet/index.scss +51 -41
- package/components/slider/README.md +35 -9
- package/components/slider/index.scss +182 -153
- package/components/snackbar/README.md +43 -25
- package/components/snackbar/index.scss +22 -27
- package/components/stepper/index.scss +5 -5
- package/components/switch/README.md +32 -4
- package/components/switch/index.scss +57 -52
- package/components/timepicker/README.md +131 -55
- package/components/timepicker/index.scss +47 -26
- package/dist/appbar.css +1 -1
- package/dist/badge.css +1 -1
- package/dist/bottomsheet.css +1 -1
- package/dist/bottomsheet.js +1 -1
- package/dist/button.css +1 -1
- package/dist/card.css +1 -1
- package/dist/checkbox.css +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/chip.css +1 -1
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/datepicker.css +1 -1
- package/dist/datepicker.js +1 -1
- package/dist/dialog.css +1 -1
- package/dist/foundations/form/index.js +1 -1
- package/dist/iconbutton.css +1 -1
- package/dist/layout.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/navigationbar.css +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/slider.js +1 -1
- package/dist/snackbar.css +1 -1
- package/dist/snackbar.js +1 -1
- package/dist/stepper.css +1 -1
- package/dist/stepper.js +1 -1
- package/dist/switch.css +1 -1
- package/dist/timepicker.css +1 -1
- package/dist/timepicker.js +1 -1
- package/foundations/layout/_tokens.scss +55 -0
- package/foundations/layout/index.scss +5 -35
- package/package.json +2 -2
- package/{components/checkbox/_label.scss → styles/togglelabel.scss} +11 -3
|
@@ -1,22 +1,31 @@
|
|
|
1
1
|
# Time picker
|
|
2
|
+
|
|
2
3
|
This component implements the [Material Design 3 Expressive Time picker](https://m3.material.io/components/time-pickers/overview) design. It allows users to select a specific time of day using either a text input or an analog dial interface.
|
|
3
4
|
|
|
4
5
|
## Basic Usage
|
|
5
6
|
|
|
6
7
|
### HTML
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
The Time picker component is an extension of the [**Dialog** component](../dialog/README.md). To create a basic time picker, use a `<dialog>` element with both the `micl-dialog` and `micl-timepicker` classes.
|
|
8
10
|
|
|
9
11
|
```HTML
|
|
10
|
-
<dialog
|
|
12
|
+
<dialog
|
|
13
|
+
id="mytimepicker"
|
|
14
|
+
class="micl-dialog micl-timepicker"
|
|
15
|
+
closedby="closerequest"
|
|
16
|
+
aria-labelledby="mytitle"
|
|
17
|
+
data-micldialheadline="Select time"
|
|
18
|
+
data-miclinputheadline="Enter time"
|
|
19
|
+
>
|
|
11
20
|
<form method="dialog">
|
|
12
21
|
<div class="micl-dialog__headline">
|
|
13
|
-
<h2 id="mytitle">
|
|
22
|
+
<h2 id="mytitle">Select time</h2>
|
|
14
23
|
</div>
|
|
15
24
|
|
|
16
25
|
<div class="micl-dialog__content">
|
|
17
|
-
<input type="
|
|
26
|
+
<input type="text" name="hour" value="00" aria-labelledby="myhour">
|
|
18
27
|
<span class="micl-timepicker__separator">:</span>
|
|
19
|
-
<input type="
|
|
28
|
+
<input type="text" name="minute" value="00" aria-labelledby="myminute">
|
|
20
29
|
<div class="micl-timepicker__period"></div>
|
|
21
30
|
<span id="myhour" class="micl-timepicker__supporting-text-hour">Hour</span>
|
|
22
31
|
<span id="myminute" class="micl-timepicker__supporting-text-minute">Minute</span>
|
|
@@ -42,124 +51,191 @@ The Time picker component is an extension of the [**Dialog** component](../dialo
|
|
|
42
51
|
</div>
|
|
43
52
|
</form>
|
|
44
53
|
</dialog>
|
|
54
|
+
|
|
45
55
|
```
|
|
46
56
|
|
|
47
57
|
### CSS
|
|
48
|
-
|
|
58
|
+
|
|
59
|
+
Import the time picker, dialog, and button styles into your project:
|
|
49
60
|
|
|
50
61
|
```CSS
|
|
51
62
|
@use "material-inspired-component-library/dist/dialog";
|
|
52
63
|
@use "material-inspired-component-library/dist/button";
|
|
53
64
|
@use "material-inspired-component-library/dist/iconbutton";
|
|
54
65
|
@use "material-inspired-component-library/dist/timepicker";
|
|
66
|
+
|
|
55
67
|
```
|
|
56
68
|
|
|
57
69
|
Or import all MICL styles:
|
|
70
|
+
|
|
58
71
|
```CSS
|
|
59
72
|
@use "material-inspired-component-library/styles";
|
|
73
|
+
|
|
60
74
|
```
|
|
61
75
|
|
|
62
76
|
### JavaScript
|
|
77
|
+
|
|
63
78
|
This component requires JavaScript to function:
|
|
64
79
|
|
|
65
80
|
```JavaScript
|
|
66
81
|
import micl from "material-inspired-component-library/dist/micl";
|
|
82
|
+
|
|
67
83
|
```
|
|
68
|
-
When loading individual JavaScript files, also load `dist/textfield` — it wires the input field that opens the picker.
|
|
69
84
|
|
|
70
85
|
This will initialize any Time picker component, including those that will be added to the DOM later on.
|
|
71
86
|
|
|
87
|
+
If you are loading individual JavaScript modules, ensure you include `dist/textfield` (to wire the triggering input field) and `dist/button` (to manage the `aria-pressed` state and icon of the mode toggle).
|
|
88
|
+
|
|
72
89
|
### Live Demo
|
|
73
|
-
A live example of the [Time picker component](https://henkpb.github.io/micl/timepicker.html) is available to interact with.
|
|
74
90
|
|
|
75
|
-
|
|
76
|
-
|
|
91
|
+
A live example of the [Time picker component](https://henkpb.github.io/micl/timepicker.html) is available for interaction.
|
|
92
|
+
|
|
93
|
+
## Anatomy
|
|
94
|
+
|
|
95
|
+
As an extension of the Dialog component, the Time picker utilizes the same utility classes for its content structure. Refer to the [Dialog component documentation](../dialog/README.md) for base layout details.
|
|
77
96
|
|
|
78
|
-
### Time Picker Structure
|
|
79
97
|
For the picker to function correctly, the `micl-dialog__content` area must contain:
|
|
80
98
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
99
|
+
* **Hour input:** `<input type="text" name="hour">`
|
|
100
|
+
* **Minute input:** `<input type="text" name="minute">`
|
|
101
|
+
* **Separator:** A text element with the class `micl-timepicker__separator` (e.g., a colon).
|
|
102
|
+
* **AM/PM Container:** An empty `<div>` with the class `micl-timepicker__period`. The component logic populates this container automatically when using a 12-hour clock.
|
|
103
|
+
* **Dial Container:** An optional empty `<div>` with the class `micl-timepicker__dial` for the analog clock interface.
|
|
104
|
+
* **Supporting Text:** Optional elements mapping to "Hour" and "Minute" labels.
|
|
87
105
|
|
|
88
|
-
By default, the layout is **vertical**. To switch to a **horizontal** layout (side-by-side inputs and dial), add the
|
|
106
|
+
By default, the layout is **vertical**. To switch to a **horizontal** layout (side-by-side inputs and dial), add the `micl-timepicker--horizontal` modifier class to the `<dialog>`. The two layouts only differ visually while the dial is displayed.
|
|
89
107
|
|
|
90
|
-
|
|
91
|
-
|
|
108
|
+
## Variants
|
|
109
|
+
|
|
110
|
+
#### 12-Hour and 24-Hour Clocks
|
|
111
|
+
|
|
112
|
+
By default, the picker adopts the hour cycle of the user's locale: a 12-hour clock displays an AM/PM selector and hours 1–12 on the dial, while a 24-hour clock displays hours 0–11 on the outer ring and 12–23 on the inner ring. The AM/PM labels reflect the locale's day period names (e.g., a Spanish locale will display *a.m.* / *p.m.*).
|
|
113
|
+
|
|
114
|
+
To explicitly set the clock format regardless of the user's locale (useful for applications with custom locale switchers), add `data-miclhourcycle` to the `<dialog>`:
|
|
115
|
+
|
|
116
|
+
```HTML
|
|
117
|
+
<dialog class="micl-dialog micl-timepicker" data-miclhourcycle="h12" closedby="closerequest">
|
|
118
|
+
...
|
|
119
|
+
</dialog>
|
|
92
120
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
- Data Attribute: `data-micliconselected="schedule"` (the icon shown in input mode, when `aria-pressed="true"`).
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Accepted values are `h11` and `h12` (for 12-hour formatting) and `h23` and `h24` (for 24-hour formatting). These map directly to the [`hourCycle`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions) values reported by `Intl`.
|
|
97
124
|
|
|
98
125
|
#### Starting in Input Mode
|
|
99
|
-
|
|
126
|
+
|
|
127
|
+
By default, the picker opens in dial mode. To default to input mode, add the `micl-timepicker__dial--hidden` class to the `micl-timepicker__dial` element, and set `aria-pressed="true"` on the `micl-timepicker__inputmode` button so it displays the matching `schedule` icon. These two attributes operate independently and must be synced in your initial markup.
|
|
128
|
+
|
|
129
|
+
#### Input Mode Switching
|
|
130
|
+
|
|
131
|
+
To allow users to toggle between text inputs and the analog dial, add an icon [toggle button](../iconbutton/README.md) to the `micl-dialog__actions` container, as shown in the basic example:
|
|
132
|
+
|
|
133
|
+
* **Class:** `micl-timepicker__inputmode` alongside the standard icon button and `micl-button--toggle` classes.
|
|
134
|
+
* **Behavior:** A self-targeting `commandfor` / `command="--micl-toggle"` pair flips the button's `aria-pressed` state upon activation.
|
|
135
|
+
* **Dial Icon:** `data-miclicon="keyboard"` (displayed in dial mode when `aria-pressed="false"`).
|
|
136
|
+
* **Input Icon:** `data-micliconselected="schedule"` (displayed in input mode when `aria-pressed="true"`).
|
|
137
|
+
|
|
138
|
+
Material Design specifies different headlines for the two modes. By adding `data-micldialheadline` and `data-miclinputheadline` to the `<dialog>`, the component will dynamically update the headline text to match the current mode. If omitted, the default heading remains static.
|
|
100
139
|
|
|
101
140
|
### Integration
|
|
141
|
+
|
|
102
142
|
You can trigger the Time picker component from standard input fields or buttons.
|
|
103
143
|
|
|
104
144
|
#### Connecting to an Input Field
|
|
105
|
-
|
|
145
|
+
|
|
146
|
+
To replace the browser's native time picker, assign the `data-timepicker` attribute to an `<input>` element. The value of this attribute must match the `id` of your Time picker dialog.
|
|
106
147
|
|
|
107
148
|
```HTML
|
|
108
149
|
<input type="time" data-timepicker="mytimepicker" value="09:41">
|
|
150
|
+
|
|
109
151
|
```
|
|
110
152
|
|
|
111
|
-
|
|
112
|
-
|
|
153
|
+
* **Behavior**: Clicking the input opens the picker, initialized to the input's current value.
|
|
154
|
+
* **Reusability**: Multiple input fields can target the same Time picker ID. The component will automatically read from and write to the specific input field the user interacted with.
|
|
113
155
|
|
|
114
156
|
#### Connecting to a Button
|
|
115
|
-
|
|
157
|
+
|
|
158
|
+
You can trigger the picker from a button using standard `command` / `commandfor` attributes.
|
|
116
159
|
|
|
117
160
|
```HTML
|
|
118
|
-
<button
|
|
161
|
+
<button
|
|
162
|
+
type="button"
|
|
163
|
+
class="micl-button-text-m"
|
|
164
|
+
command="show-modal"
|
|
165
|
+
commandfor="mytimepicker"
|
|
166
|
+
value="09:41"
|
|
167
|
+
>09:41</button>
|
|
168
|
+
|
|
119
169
|
```
|
|
120
170
|
|
|
121
|
-
|
|
122
|
-
|
|
171
|
+
* **Behavior**: The Time picker reads from and writes to the button's `value` attribute, which must hold the time in 24-hour `HH:MM` format.
|
|
172
|
+
* **Formatting**: The component updates the button's visible text content with the selected time, formatted according to the user's locale.
|
|
173
|
+
|
|
174
|
+
> [!NOTE]
|
|
175
|
+
> Because a time picker requires explicit user confirmation, it must function as a modal dialog. Opening it as a popover (`popovertarget`) is **not supported**. A `<dialog popover>` does not fire the standard `close` event required by the component to write the selected time back to the invoker.
|
|
176
|
+
|
|
177
|
+
## Accessibility
|
|
178
|
+
|
|
179
|
+
* **Always label the dialog.** Point `aria-labelledby` to the headline element. Additionally, ensure both input fields use `aria-labelledby` to point to their respective supporting text elements (as demonstrated in the HTML snippet).
|
|
180
|
+
* **Ensure full keyboard navigation.** The two input fields serve as the primary keyboard path. Exposed as spin buttons, they respond to <kbd>↑</kbd> and <kbd>↓</kbd> keys in *both* modes, wrapping at the limits of their ranges. On a 12-hour clock, wrapping past 12 or below 1 automatically toggles the AM/PM selector.
|
|
181
|
+
* **Hide the dial from assistive technologies.** The dial is purely a pointer affordance. It uses `aria-hidden="true"` to prevent screen readers from announcing an inoperable list of numbers. Everything configurable via the dial is fully accessible via the input fields.
|
|
182
|
+
* **Manage field states dynamically.** The input fields are marked `read-only` while in dial mode to prevent mobile on-screen keyboards from appearing unnecessarily. Switching to input mode restores editability, moves focus to the hour field, and selects its contents.
|
|
183
|
+
* **Provide context for the toggle button.** The mode toggle is an icon-only button; it requires an `aria-label`. Its `aria-pressed` state programmatically communicates the active mode to screen readers.
|
|
184
|
+
* **Respect motion preferences.** The selector visually sweeps between values only if the user has not enabled OS-level reduced motion.
|
|
123
185
|
|
|
124
186
|
## Theming
|
|
125
|
-
|
|
187
|
+
|
|
188
|
+
Time pickers can be themed using CSS custom properties adhering to the Material Design 3 component-token naming convention. Container color, shape, and elevation are inherited directly from the [Dialog component](../dialog/README.md).
|
|
126
189
|
|
|
127
190
|
| Custom property | Meaning | Default |
|
|
128
|
-
|
|
191
|
+
| --- | --- | --- |
|
|
192
|
+
| `--md-comp-time-picker-motion-duration` | Duration of the selector sweep and state layer fades | `--md-sys-motion-expressive-fast-spatial-duration` |
|
|
129
193
|
| `--md-comp-time-picker-time-selector-container-height` | Height of the hour and minute input boxes | `72px` (`80px` in dial mode) |
|
|
130
194
|
| `--md-comp-time-picker-time-selector-container-width` | Width of the input boxes in 12-hour mode | `96px` |
|
|
131
195
|
| `--md-comp-time-picker-time-selector-24h-container-width` | Width of the input boxes in 24-hour mode | `114px` |
|
|
132
|
-
| `--md-comp-time-picker-time-selector-unselected-container-color` |
|
|
133
|
-
| `--md-comp-time-picker-time-selector-unselected-label-text-color` |
|
|
134
|
-
| `--md-comp-time-picker-time-selector-selected-container-color` |
|
|
135
|
-
| `--md-comp-time-picker-time-selector-selected-label-text-color` |
|
|
136
|
-
| `--md-comp-time-input-focus-outline-color` |
|
|
137
|
-
| `--md-comp-time-picker-separator-width` | Width of the
|
|
138
|
-
| `--md-comp-time-picker-separator-color` |
|
|
139
|
-
| `--md-comp-time-picker-headline-color` |
|
|
140
|
-
| `--md-comp-time-picker-supporting-text-color` |
|
|
196
|
+
| `--md-comp-time-picker-time-selector-unselected-container-color` | Background color of inactive input boxes | `--md-sys-color-surface-container-highest` |
|
|
197
|
+
| `--md-comp-time-picker-time-selector-unselected-label-text-color` | Text color of inactive input boxes | `--md-sys-color-on-surface` |
|
|
198
|
+
| `--md-comp-time-picker-time-selector-selected-container-color` | Background color of the active input box | `--md-sys-color-primary-container` |
|
|
199
|
+
| `--md-comp-time-picker-time-selector-selected-label-text-color` | Text color of the active input box | `--md-sys-color-on-primary-container` |
|
|
200
|
+
| `--md-comp-time-input-focus-outline-color` | Border color of the active input box in keyboard input mode | `--md-sys-color-primary` |
|
|
201
|
+
| `--md-comp-time-picker-separator-width` | Width of the container holding the colon separator | `24px` |
|
|
202
|
+
| `--md-comp-time-picker-separator-color` | Color of the colon separator | `--md-sys-color-on-surface` |
|
|
203
|
+
| `--md-comp-time-picker-headline-color` | Text color of the dialog headline | `--md-sys-color-on-surface-variant` |
|
|
204
|
+
| `--md-comp-time-picker-supporting-text-color` | Text color of the labels beneath the input boxes | `--md-sys-color-on-surface-variant` |
|
|
141
205
|
| `--md-comp-time-picker-period-selector-container-height` | Total height of the AM/PM selector toggle | `72px` (`80px` or `38px` in dial modes) |
|
|
142
206
|
| `--md-comp-time-picker-period-selector-container-width` | Width of the AM/PM selector toggle | `52px` |
|
|
143
|
-
| `--md-comp-time-picker-period-selector-outline-color` |
|
|
144
|
-
| `--md-comp-time-picker-period-selector-unselected-label-text-color` |
|
|
145
|
-
| `--md-comp-time-picker-period-selector-selected-container-color` |
|
|
146
|
-
| `--md-comp-time-picker-period-selector-selected-label-text-color` |
|
|
207
|
+
| `--md-comp-time-picker-period-selector-outline-color` | Border color of the AM/PM selector toggle | `--md-sys-color-outline` |
|
|
208
|
+
| `--md-comp-time-picker-period-selector-unselected-label-text-color` | Text color of the unselected period | `--md-sys-color-on-surface-variant` |
|
|
209
|
+
| `--md-comp-time-picker-period-selector-selected-container-color` | Background color of the selected period | `--md-sys-color-tertiary-container` |
|
|
210
|
+
| `--md-comp-time-picker-period-selector-selected-label-text-color` | Text color of the selected period | `--md-sys-color-on-tertiary-container` |
|
|
147
211
|
| `--md-comp-time-picker-clock-dial-container-size` | Diameter of the analog clock face | `256px` |
|
|
148
|
-
| `--md-comp-time-picker-clock-dial-color` |
|
|
149
|
-
| `--md-comp-time-picker-clock-dial-unselected-label-text-color` |
|
|
150
|
-
| `--md-comp-time-picker-clock-dial-selected-label-text-color` |
|
|
151
|
-
| `--md-comp-time-picker-clock-dial-selector-handle-container-color` |
|
|
152
|
-
| `--md-comp-time-picker-clock-dial-selector-track-container-color` |
|
|
212
|
+
| `--md-comp-time-picker-clock-dial-color` | Background color of the analog clock face | `--md-sys-color-surface-container-highest` |
|
|
213
|
+
| `--md-comp-time-picker-clock-dial-unselected-label-text-color` | Text color of the unselected dial marks | `--md-sys-color-on-surface` |
|
|
214
|
+
| `--md-comp-time-picker-clock-dial-selected-label-text-color` | Text color of the selected dial mark | `--md-sys-color-on-primary` |
|
|
215
|
+
| `--md-comp-time-picker-clock-dial-selector-handle-container-color` | Background color of the selected dial mark | `--md-sys-color-primary` |
|
|
216
|
+
| `--md-comp-time-picker-clock-dial-selector-track-container-color` | Color of the selector track line on the dial | `--md-sys-color-primary` |
|
|
153
217
|
| `--md-comp-time-picker-clock-dial-selector-track-container-width` | Thickness of the selector track line on the dial | `2px` |
|
|
154
|
-
| `--md-comp-time-picker-clock-dial-selector-center-container-color` |
|
|
155
|
-
| `--md-comp-time-picker-clock-dial-selector-center-container-size` | Diameter of the center dot
|
|
218
|
+
| `--md-comp-time-picker-clock-dial-selector-center-container-color` | Color of the center dot on the dial | `--md-sys-color-primary` |
|
|
219
|
+
| `--md-comp-time-picker-clock-dial-selector-center-container-size` | Diameter of the center dot on the dial | `8px` |
|
|
156
220
|
|
|
157
221
|
**Example: Changing the width of the dial track**
|
|
158
222
|
|
|
159
223
|
```HTML
|
|
160
|
-
<div style="--md-comp-time-picker-clock-dial-selector-track-container-width:3px">
|
|
224
|
+
<div style="--md-comp-time-picker-clock-dial-selector-track-container-width: 3px;">
|
|
161
225
|
<dialog class="micl-dialog micl-timepicker" closedby="closerequest">
|
|
162
226
|
...
|
|
163
227
|
</dialog>
|
|
164
228
|
</div>
|
|
229
|
+
|
|
165
230
|
```
|
|
231
|
+
|
|
232
|
+
## Compatibility
|
|
233
|
+
|
|
234
|
+
This component relies on modern web platform features. Review *Browser compatibility* before deploying it in production environments.
|
|
235
|
+
|
|
236
|
+
* **Open/Close Mechanisms:** Relies on the `<dialog>` element's [`beforetoggle`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/beforetoggle_event) event to load the invoker's time, and on the `close` event to write it back. Buttons open the picker using the [Invoker Commands API](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) (`command` / `commandfor`). In browsers where this is unsupported, you must trigger `showModal()` manually.
|
|
237
|
+
* **Input Mode Toggle:** The icon and `aria-pressed` state of the toggle button are driven by a custom invoker command. Without Invoker Commands support, the dial will still toggle, but the button will not visually reflect the active mode.
|
|
238
|
+
* **Selector Sweep:** The animated dial selector utilizes a registered [`@property`](https://developer.mozilla.org/en-US/docs/Web/CSS/@property) custom property of type `<angle>`. In browsers without `@property` support, the selector will snap to the new value instantly rather than sweeping smoothly.
|
|
239
|
+
* **Dial Geometry:** The clock face calculates mark positions using the [`cos()` and `sin()](https://developer.mozilla.org/en-US/docs/Web/CSS/sin)` trigonometric CSS functions.
|
|
240
|
+
* **Advanced Styling:** Utilizes [`:has()`](https://developer.mozilla.org/en-US/docs/Web/CSS/:has), [`:dir()`](https://developer.mozilla.org/en-US/docs/Web/CSS/:dir), and [relative color syntax](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_colors/Relative_colors) to handle layout switching, right-to-left rendering, and state layer opacities.
|
|
241
|
+
* **Locale Data:** Locale-specific details (hour cycle, AM/PM labels, button text formatting) are sourced from [`Intl.DateTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat). If the lookup fails, the component safely falls back to a 24-hour clock using English day periods.
|
|
@@ -40,6 +40,12 @@
|
|
|
40
40
|
@include typography.scale('body-small');
|
|
41
41
|
@include typography.scale('label-medium');
|
|
42
42
|
|
|
43
|
+
@property --micl-angle {
|
|
44
|
+
syntax: '<angle>';
|
|
45
|
+
inherits: true;
|
|
46
|
+
initial-value: 0deg;
|
|
47
|
+
}
|
|
48
|
+
|
|
43
49
|
// State layer background shared by the time fields and the AM/PM toggles.
|
|
44
50
|
// The state layer color follows the label color of the current state.
|
|
45
51
|
%statelayer-background {
|
|
@@ -49,7 +55,7 @@
|
|
|
49
55
|
background-repeat: no-repeat;
|
|
50
56
|
background-size: 100%;
|
|
51
57
|
-webkit-tap-highlight-color: transparent;
|
|
52
|
-
transition: --statelayer-opacity var(--
|
|
58
|
+
transition: --statelayer-opacity var(--_timepicker-motion-duration) linear;
|
|
53
59
|
|
|
54
60
|
&:hover {
|
|
55
61
|
--statelayer-opacity: var(--md-sys-state-hover-state-layer-opacity);
|
|
@@ -63,7 +69,7 @@
|
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
dialog.micl-dialog.micl-timepicker {
|
|
66
|
-
--md-comp-time-picker-motion-duration
|
|
72
|
+
--_timepicker-motion-duration: var(--md-comp-time-picker-motion-duration, #{motion.$md-sys-motion-expressive-fast-spatial-duration});
|
|
67
73
|
|
|
68
74
|
// Internal aliases: each public token is referenced from many descendants.
|
|
69
75
|
// The keyboard-input mode uses the (smaller) time-input defaults; the
|
|
@@ -76,7 +82,7 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
76
82
|
--_dial-size: var(--md-comp-time-picker-clock-dial-container-size, 256px);
|
|
77
83
|
--_center-size: var(--md-comp-time-picker-clock-dial-selector-center-container-size, 8px);
|
|
78
84
|
--_track-width: var(--md-comp-time-picker-clock-dial-selector-track-container-width, 2px);
|
|
79
|
-
--_target: var(--md-sys-target-size, 48px);
|
|
85
|
+
--_target: var(--md-sys-state-target-size, 48px);
|
|
80
86
|
|
|
81
87
|
.micl-dialog__headline {
|
|
82
88
|
padding-block-end: 20px;
|
|
@@ -118,7 +124,7 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
118
124
|
}
|
|
119
125
|
.micl-dialog__content {
|
|
120
126
|
grid-template-areas:
|
|
121
|
-
"
|
|
127
|
+
". . . dial"
|
|
122
128
|
"hr sep min dial"
|
|
123
129
|
"per per per dial";
|
|
124
130
|
grid-template-rows: 72px var(--_input-height) auto;
|
|
@@ -154,6 +160,21 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
154
160
|
display: none;
|
|
155
161
|
}
|
|
156
162
|
}
|
|
163
|
+
|
|
164
|
+
// A clock face must never mirror, and a time is written hour-first in every
|
|
165
|
+
// locale, so the whole selector runs ltr and only the labels follow the page.
|
|
166
|
+
&:dir(rtl) .micl-dialog__content {
|
|
167
|
+
direction: ltr;
|
|
168
|
+
|
|
169
|
+
.micl-timepicker__supporting-text-hour,
|
|
170
|
+
.micl-timepicker__supporting-text-minute {
|
|
171
|
+
direction: rtl;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@media (prefers-reduced-motion: reduce) {
|
|
176
|
+
--_timepicker-motion-duration: 0ms;
|
|
177
|
+
}
|
|
157
178
|
}
|
|
158
179
|
|
|
159
180
|
.micl-timepicker {
|
|
@@ -173,16 +194,7 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
173
194
|
background-color: var(--md-comp-time-picker-time-selector-unselected-container-color, var(--md-sys-color-surface-container-highest));
|
|
174
195
|
color: var(--md-comp-time-picker-time-selector-unselected-label-text-color, var(--md-sys-color-on-surface));
|
|
175
196
|
text-align: center;
|
|
176
|
-
user-select: none;
|
|
177
|
-
-moz-appearance: textfield;
|
|
178
197
|
|
|
179
|
-
&::-webkit-inner-spin-button,
|
|
180
|
-
&::-webkit-outer-spin-button {
|
|
181
|
-
-webkit-appearance: none;
|
|
182
|
-
}
|
|
183
|
-
&::selection {
|
|
184
|
-
background-color: transparent;
|
|
185
|
-
}
|
|
186
198
|
&.micl-timepicker--selected {
|
|
187
199
|
background-color: var(--md-comp-time-picker-time-selector-selected-container-color, var(--md-sys-color-primary-container));
|
|
188
200
|
color: var(--md-comp-time-picker-time-selector-selected-label-text-color, var(--md-sys-color-on-primary-container));
|
|
@@ -191,11 +203,13 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
191
203
|
}
|
|
192
204
|
input[name=hour] {
|
|
193
205
|
grid-area: hr;
|
|
194
|
-
justify-self:
|
|
206
|
+
justify-self: end;
|
|
195
207
|
}
|
|
196
208
|
input[name=minute] {
|
|
197
209
|
grid-area: min;
|
|
198
210
|
}
|
|
211
|
+
// In dial mode the fields are read-only read-outs: no caret, no selection.
|
|
212
|
+
// The keyboard mode needs both, so that the select-on-focus is visible.
|
|
199
213
|
&:has(.micl-timepicker__dial:not(.micl-timepicker__dial--hidden)) {
|
|
200
214
|
input[name=hour],
|
|
201
215
|
input[name=minute] {
|
|
@@ -203,6 +217,11 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
203
217
|
|
|
204
218
|
border: none;
|
|
205
219
|
cursor: pointer;
|
|
220
|
+
user-select: none;
|
|
221
|
+
|
|
222
|
+
&::selection {
|
|
223
|
+
background-color: transparent;
|
|
224
|
+
}
|
|
206
225
|
}
|
|
207
226
|
}
|
|
208
227
|
&:not(:has(.micl-timepicker__am)):not(:has(.micl-timepicker__dial:not(.micl-timepicker__dial--hidden))) {
|
|
@@ -250,8 +269,10 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
250
269
|
background-color: transparent;
|
|
251
270
|
cursor: pointer;
|
|
252
271
|
|
|
272
|
+
// The runtime names the radios with the day periods of the user's locale,
|
|
273
|
+
// so the accessible name is also the visible label.
|
|
253
274
|
&::before {
|
|
254
|
-
content:
|
|
275
|
+
content: attr(aria-label);
|
|
255
276
|
position: absolute;
|
|
256
277
|
inline-size: 100%;
|
|
257
278
|
text-align: center;
|
|
@@ -273,10 +294,6 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
273
294
|
border-block-start-width: 0px;
|
|
274
295
|
border-end-start-radius: var(--md-sys-shape-corner-small);
|
|
275
296
|
border-end-end-radius: var(--md-sys-shape-corner-small);
|
|
276
|
-
|
|
277
|
-
&::before {
|
|
278
|
-
content: "PM";
|
|
279
|
-
}
|
|
280
297
|
}
|
|
281
298
|
}
|
|
282
299
|
|
|
@@ -295,7 +312,7 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
295
312
|
.micl-timepicker .micl-timepicker__dial {
|
|
296
313
|
--micl-dial-radius: calc((var(--_dial-size) - var(--_target)) / 2);
|
|
297
314
|
--micl-hour-radius: var(--micl-dial-radius);
|
|
298
|
-
--micl-
|
|
315
|
+
--micl-track-radius: var(--micl-dial-radius);
|
|
299
316
|
|
|
300
317
|
position: relative;
|
|
301
318
|
grid-area: dial;
|
|
@@ -304,10 +321,8 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
304
321
|
inline-size: var(--_dial-size);
|
|
305
322
|
margin-block: 36px 0;
|
|
306
323
|
margin-inline: 0;
|
|
307
|
-
outline: none;
|
|
308
324
|
border-radius: var(--md-sys-shape-corner-full);
|
|
309
325
|
background-color: var(--md-comp-time-picker-clock-dial-color, var(--md-sys-color-surface-container-highest));
|
|
310
|
-
list-style-type: none;
|
|
311
326
|
touch-action: none;
|
|
312
327
|
|
|
313
328
|
data.micl-timepicker__dial-inner {
|
|
@@ -331,7 +346,6 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
331
346
|
inline-size: var(--_target);
|
|
332
347
|
inset-inline-start: var(--micl-a);
|
|
333
348
|
inset-block-start: var(--micl-b);
|
|
334
|
-
outline: none;
|
|
335
349
|
border-radius: var(--md-sys-shape-corner-full);
|
|
336
350
|
color: var(--md-comp-time-picker-clock-dial-unselected-label-text-color, var(--md-sys-color-on-surface));
|
|
337
351
|
cursor: pointer;
|
|
@@ -357,7 +371,8 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
357
371
|
}
|
|
358
372
|
|
|
359
373
|
.micl-timepicker__track {
|
|
360
|
-
|
|
374
|
+
// Stops just inside the selected handle, on either ring.
|
|
375
|
+
--micl-track-length: calc(var(--micl-track-radius) - 12px);
|
|
361
376
|
|
|
362
377
|
position: relative;
|
|
363
378
|
display: block;
|
|
@@ -376,14 +391,20 @@ dialog.micl-dialog.micl-timepicker {
|
|
|
376
391
|
display: block;
|
|
377
392
|
block-size: var(--_center-size);
|
|
378
393
|
inline-size: var(--_center-size);
|
|
379
|
-
inset-block-end: -
|
|
380
|
-
inset-inline-start: -
|
|
394
|
+
inset-block-end: calc((var(--_center-size) - var(--_track-width)) / -2);
|
|
395
|
+
inset-inline-start: calc((var(--_center-size) - var(--_track-width)) / -2);
|
|
381
396
|
border-radius: var(--md-sys-shape-corner-full);
|
|
382
397
|
background-color: var(--md-comp-time-picker-clock-dial-selector-center-container-color, var(--md-sys-color-primary));
|
|
383
398
|
}
|
|
384
399
|
}
|
|
385
400
|
}
|
|
386
401
|
|
|
402
|
+
// Only an open picker sweeps: the value the invoker seeds on beforetoggle lands
|
|
403
|
+
// before the dialog opens, so it snaps into place instead of spinning from noon.
|
|
404
|
+
.micl-timepicker[open] .micl-timepicker__dial {
|
|
405
|
+
transition: --micl-angle var(--_timepicker-motion-duration) motion.$md-sys-motion-easing-standard;
|
|
406
|
+
}
|
|
407
|
+
|
|
387
408
|
.micl-timepicker__dial--hidden {
|
|
388
409
|
display: none !important;
|
|
389
410
|
}
|
package/dist/appbar.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--md-sys-shape-corner-medium: 12px}:root{--md-sys-layout-pane-spacer: 24px;--md-sys-layout-window-margin: 24px}@media(max-width: 599px){:root{--md-sys-layout-window-margin: 16px}}@media(min-width: 840px)and (max-width: 1199px){:root{--md-sys-layout-pane-fixed-width: 360px}}@media(min-width: 1200px){:root{--md-sys-layout-pane-fixed-width: 412px}}.micl-window{padding:env(safe-area-inset-top, 0px) calc(var(--md-sys-layout-window-margin) + env(safe-area-inset-right, 0px)) calc(var(--md-sys-layout-window-margin) + env(safe-area-inset-bottom, 0px)) calc(var(--md-sys-layout-window-margin) + env(safe-area-inset-left, 0px));margin:0;background-color:var(--md-sys-color-surface)}.micl-window .micl-panes .micl-appbar{margin-inline:calc(-1*var(--md-sys-layout-window-margin))}.micl-window:not(.micl-window--spatial):has(nav.micl-navigationrail) .micl-panes .micl-appbar{margin-inline-start:0}.micl-window.micl-window--spatial{--md-sys-layout-spatial-radius: calc(var(--md-sys-shape-corner-medium) + var(--md-sys-layout-window-margin));display:flex;padding-block:calc(2*var(--md-sys-layout-window-margin) + env(safe-area-inset-top, 0px)) calc(2*var(--md-sys-layout-window-margin) + env(safe-area-inset-bottom, 0px));gap:var(--md-sys-layout-window-margin)}.micl-window.micl-window--spatial .micl-navigationrail{display:flex;align-self:flex-start;block-size:inherit;min-block-size:inherit;margin:0;padding-block-end:var(--md-sys-navigationrail-top-space, 0px);border-radius:var(--md-sys-layout-spatial-radius)}.micl-window.micl-window--spatial .micl-panes{background:rgba(0,0,0,0)}.micl-window.micl-window--spatial .micl-pane{padding:0 var(--md-sys-layout-window-margin) var(--md-sys-layout-window-margin);border-radius:var(--md-sys-layout-spatial-radius);background-color:var(--md-sys-color-surface)}.micl-panes{box-sizing:border-box;display:flex;flex-direction:row;gap:var(--md-sys-comp-margin, 8px) var(--md-sys-layout-pane-spacer);background-color:inherit}.micl-panes.micl-panes--split>.micl-pane+.micl-pane{--_layout-safe-inline-end: env(safe-area-inset-right, 0px);box-sizing:border-box;flex:0 1 var(--_layout-stacked-pane-size, calc(50vw - var(--md-sys-layout-window-margin, 0px) - var(--_layout-safe-inline-end) - var(--md-sys-layout-pane-spacer) / 2))}.micl-panes.micl-panes--split>.micl-pane+.micl-pane:dir(rtl){--_layout-safe-inline-end: env(safe-area-inset-left, 0px)}.micl-panes.micl-panes--evenly .micl-pane{flex:1 1 0}.micl-pane{display:flex;flex-direction:column;flex:1 1 auto;min-inline-size:0;background-color:inherit}.micl-pane.micl-pane--fixed{flex:0 0 auto;box-sizing:border-box;inline-size:var(--_layout-stacked-pane-size, var(--md-sys-layout-pane-fixed-width, auto))}.micl-pane:has(>.micl-card-elevated,>.micl-card-filled,>.micl-card-outlined),.micl-pane>*:has(>.micl-card-elevated,>.micl-card-filled,>.micl-card-outlined){gap:var(--md-comp-card-margin, 8px)}.micl-pane>.micl-pane__columns{display:flex}.micl-pane>.micl-pane__columns:has(>.micl-pane__column>.micl-card-elevated,>.micl-pane__column>.micl-card-filled,>.micl-pane__column>.micl-card-outlined){gap:var(--md-comp-card-margin, 8px)}.micl-pane>.micl-pane__columns>.micl-pane__column{display:flex;flex-direction:column;flex:1 1 auto;min-inline-size:0;background-color:inherit}.micl-pane>.micl-pane__columns>.micl-pane__column:has(>.micl-card-elevated,>.micl-card-filled,>.micl-card-outlined){row-gap:var(--md-comp-card-margin, 8px)}.micl-pane>.micl-pane__columns>.micl-pane__column.micl-pane__column--fixed{flex:0 0 auto}.micl-pane>.micl-pane__columns.micl-pane__columns--evenly>.micl-pane__column{flex:1 1 0}@media(max-width: 599px){.micl-panes.micl-panes--stacked-to-medium{--_layout-stacked-pane-size: auto;flex-direction:column}.micl-pane.micl-pane--hidden-to-medium{display:none}.micl-pane__columns.micl-pane__columns--stacked-to-medium{flex-direction:column}}@media(max-width: 839px){.micl-panes.micl-panes--stacked-to-expanded{--_layout-stacked-pane-size: auto;flex-direction:column}.micl-pane.micl-pane--hidden-to-expanded{display:none}.micl-pane__columns.micl-pane__columns--stacked-to-expanded{flex-direction:column}}@media(max-width: 1199px){.micl-panes.micl-panes--stacked-to-large{--_layout-stacked-pane-size: auto;flex-direction:column}.micl-pane.micl-pane--hidden-to-large{display:none}.micl-pane__columns.micl-pane__columns--stacked-to-large{flex-direction:column}}@media(max-width: 1599px){.micl-panes.micl-panes--stacked-to-extralarge{--_layout-stacked-pane-size: auto;flex-direction:column}.micl-pane.micl-pane--hidden-to-extralarge{display:none}.micl-pane__columns.micl-pane__columns--stacked-to-extralarge{flex-direction:column}}:root{--md-ref-typeface-plain: Google Sans, system-ui, sans-serif;--md-ref-typeface-plain-narrow: 0;--md-ref-typeface-brand: Google Sans, system-ui, sans-serif;--md-ref-typeface-weight-regular: 400;--md-ref-typeface-weight-medium: 500;--md-ref-typeface-weight-bold: 700}body{--md-sys-elevation-level0: none}body{--md-sys-elevation-level2: rgb(from var(--md-sys-color-shadow) r g b/0.3) 0 1px 2px 0, rgb(from var(--md-sys-color-shadow) r g b/0.15) 0 2px 6px 2px}:root{--md-sys-shape-corner-none: 0px}:root{--md-sys-typescale-display-small-font: var(--md-ref-typeface-brand);--md-sys-typescale-display-small-size: 2.25rem;--md-sys-typescale-display-small-line-height: 2.75rem;--md-sys-typescale-display-small-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-display-small-tracking: 0}:root{--md-sys-typescale-headline-medium-font: var(--md-ref-typeface-brand);--md-sys-typescale-headline-medium-size: 1.75rem;--md-sys-typescale-headline-medium-line-height: 2.25rem;--md-sys-typescale-headline-medium-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-headline-medium-tracking: 0}:root{--md-sys-typescale-title-large-font: var(--md-ref-typeface-brand);--md-sys-typescale-title-large-size: 1.375rem;--md-sys-typescale-title-large-line-height: 1.75rem;--md-sys-typescale-title-large-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-title-large-tracking: 0}:root{--md-sys-typescale-title-medium-font: var(--md-ref-typeface-plain);--md-sys-typescale-title-medium-size: 1rem;--md-sys-typescale-title-medium-line-height: 1.5rem;--md-sys-typescale-title-medium-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-title-medium-tracking: 0.0125rem}:root{--md-sys-typescale-label-large-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-large-size: 0.875rem;--md-sys-typescale-label-large-line-height: 1.25rem;--md-sys-typescale-label-large-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-large-tracking: 0.00625rem}:root{--md-sys-typescale-label-medium-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-medium-size: 0.75rem;--md-sys-typescale-label-medium-line-height: 1rem;--md-sys-typescale-label-medium-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-medium-tracking: 0.03125rem}.micl-appbar{--_height: 64px;--_padding-block-start: 0px;--_padding-block-end: 0px;--_padding-inline: 0px;box-sizing:border-box;display:grid;grid-template-areas:"appbar-leading appbar-middle appbar-trailing" "appbar-bottom appbar-bottom appbar-bottom";grid-template-columns:0fr 1fr max-content;grid-template-rows:64px max-content;column-gap:4px;align-items:center;min-block-size:var(--_height);padding-block:var(--_padding-block-start) var(--_padding-block-end);padding-inline:var(--_padding-inline);border-start-start-radius:inherit;border-start-end-radius:inherit;background-color:var(--md-comp-app-bar-container-color, inherit);box-shadow:var(--md-sys-elevation-level0);z-index:8}.micl-appbar.micl-appbar--sticky{position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}.micl-appbar .micl-appbar__leading{grid-area:appbar-leading;margin-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar .micl-appbar__leading-icon{grid-area:appbar-leading;margin-inline-start:var(--md-sys-layout-window-margin);color:var(--md-comp-app-bar-leading-icon-color, var(--md-sys-color-on-surface))}.micl-appbar .micl-appbar__headline{display:flex;grid-area:appbar-middle;flex-direction:column;align-items:flex-start;margin:8px 0;border-radius:var(--md-sys-shape-corner-none);color:var(--md-comp-app-bar-title-color, var(--md-sys-color-on-surface))}.micl-appbar .micl-appbar__headline.micl-appbar__headline--center{align-items:center;text-align:center}.micl-appbar .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-title-large-weight) var(--md-sys-typescale-title-large-size)/var(--md-sys-typescale-title-large-line-height) var(--md-sys-typescale-title-large-font);letter-spacing:var(--md-sys-typescale-title-large-tracking);margin:0}.micl-appbar .micl-appbar__headline .micl-appbar__subtitle{font:var(--md-sys-typescale-label-medium-weight) var(--md-sys-typescale-label-medium-size)/var(--md-sys-typescale-label-medium-line-height) var(--md-sys-typescale-label-medium-font);letter-spacing:var(--md-sys-typescale-label-medium-tracking);margin:0;color:var(--md-comp-app-bar-subtitle-color, var(--md-sys-color-on-surface-variant))}.micl-appbar .micl-appbar__trailing{grid-area:appbar-trailing;margin-inline-end:var(--md-sys-layout-window-margin)}.micl-appbar .micl-appbar__trailing-icon{grid-area:appbar-trailing;margin-inline-end:var(--md-sys-layout-window-margin);color:var(--md-comp-app-bar-trailing-icon-color, var(--md-sys-color-on-surface-variant))}.micl-appbar.micl-appbar--medium{--_height: 112px;--_padding-block-end: 12px;padding-inline-start:0}.micl-appbar.micl-appbar--medium .micl-appbar__headline{grid-area:appbar-bottom;margin:0;padding-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar.micl-appbar--medium .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-headline-medium-weight) var(--md-sys-typescale-headline-medium-size)/var(--md-sys-typescale-headline-medium-line-height) var(--md-sys-typescale-headline-medium-font);letter-spacing:var(--md-sys-typescale-headline-medium-tracking)}.micl-appbar.micl-appbar--medium:has(.micl-appbar__subtitle){--_height: 136px}.micl-appbar.micl-appbar--medium:has(.micl-appbar__subtitle) .micl-appbar__subtitle{font:var(--md-sys-typescale-label-large-weight) var(--md-sys-typescale-label-large-size)/var(--md-sys-typescale-label-large-line-height) var(--md-sys-typescale-label-large-font);letter-spacing:var(--md-sys-typescale-label-large-tracking)}.micl-appbar.micl-appbar--large{--_height: 120px;--_padding-block-end: 12px;padding-inline-start:0}.micl-appbar.micl-appbar--large .micl-appbar__headline{grid-area:appbar-bottom;margin:0;padding-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar.micl-appbar--large .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-display-small-weight) var(--md-sys-typescale-display-small-size)/var(--md-sys-typescale-display-small-line-height) var(--md-sys-typescale-display-small-font);letter-spacing:var(--md-sys-typescale-display-small-tracking)}.micl-appbar.micl-appbar--large:has(.micl-appbar__subtitle){--_height: 152px}.micl-appbar.micl-appbar--large:has(.micl-appbar__subtitle) .micl-appbar__subtitle{font:var(--md-sys-typescale-title-medium-weight) var(--md-sys-typescale-title-medium-size)/var(--md-sys-typescale-title-medium-line-height) var(--md-sys-typescale-title-medium-font);letter-spacing:var(--md-sys-typescale-title-medium-tracking)}.micl-panes:not(:has(>.micl-pane:nth-child(2))) .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}@media(max-width: 600px){.micl-panes:has(>.micl-pane:nth-child(2)) .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 600px)and (max-width: 839px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-expanded .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-large .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 840px)and (max-width: 1199px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-large .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 1200px)and (max-width: 1599px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@keyframes appbar-background{0%{background-color:inherit;border-start-start-radius:inherit;border-start-end-radius:inherit}10%{background-color:var(--md-comp-app-bar-on-scroll-container-color, var(--md-sys-color-surface-container));box-shadow:var(--md-sys-elevation-level2)}50%{border-start-start-radius:0;border-start-end-radius:0}100%{background-color:var(--md-comp-app-bar-on-scroll-container-color, var(--md-sys-color-surface-container));box-shadow:var(--md-sys-elevation-level2);border-start-start-radius:0;border-start-end-radius:0}}
|
|
1
|
+
:root{--md-sys-layout-pane-spacer: 24px;--md-sys-layout-window-margin: 24px;--md-sys-card-margin: 8px}@media(max-width: 599px){:root{--md-sys-layout-window-margin: 16px}}@media(min-width: 840px)and (max-width: 1199px){:root{--md-sys-layout-pane-fixed-width: 360px}}@media(min-width: 1200px){:root{--md-sys-layout-pane-fixed-width: 412px}}:root{--md-ref-typeface-plain: Google Sans, system-ui, sans-serif;--md-ref-typeface-plain-narrow: 0;--md-ref-typeface-brand: Google Sans, system-ui, sans-serif;--md-ref-typeface-weight-regular: 400;--md-ref-typeface-weight-medium: 500;--md-ref-typeface-weight-bold: 700}body{--md-sys-elevation-level0: none}body{--md-sys-elevation-level2: rgb(from var(--md-sys-color-shadow) r g b/0.3) 0 1px 2px 0, rgb(from var(--md-sys-color-shadow) r g b/0.15) 0 2px 6px 2px}:root{--md-sys-shape-corner-none: 0px}:root{--md-sys-typescale-display-small-font: var(--md-ref-typeface-brand);--md-sys-typescale-display-small-size: 2.25rem;--md-sys-typescale-display-small-line-height: 2.75rem;--md-sys-typescale-display-small-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-display-small-tracking: 0}:root{--md-sys-typescale-headline-medium-font: var(--md-ref-typeface-brand);--md-sys-typescale-headline-medium-size: 1.75rem;--md-sys-typescale-headline-medium-line-height: 2.25rem;--md-sys-typescale-headline-medium-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-headline-medium-tracking: 0}:root{--md-sys-typescale-title-large-font: var(--md-ref-typeface-brand);--md-sys-typescale-title-large-size: 1.375rem;--md-sys-typescale-title-large-line-height: 1.75rem;--md-sys-typescale-title-large-weight: var(--md-ref-typeface-weight-regular);--md-sys-typescale-title-large-tracking: 0}:root{--md-sys-typescale-title-medium-font: var(--md-ref-typeface-plain);--md-sys-typescale-title-medium-size: 1rem;--md-sys-typescale-title-medium-line-height: 1.5rem;--md-sys-typescale-title-medium-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-title-medium-tracking: 0.0125rem}:root{--md-sys-typescale-label-large-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-large-size: 0.875rem;--md-sys-typescale-label-large-line-height: 1.25rem;--md-sys-typescale-label-large-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-large-tracking: 0.00625rem}:root{--md-sys-typescale-label-medium-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-medium-size: 0.75rem;--md-sys-typescale-label-medium-line-height: 1rem;--md-sys-typescale-label-medium-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-medium-tracking: 0.03125rem}.micl-appbar{--_height: 64px;--_padding-block-start: 0px;--_padding-block-end: 0px;--_padding-inline: 0px;box-sizing:border-box;display:grid;grid-template-areas:"appbar-leading appbar-middle appbar-trailing" "appbar-bottom appbar-bottom appbar-bottom";grid-template-columns:0fr 1fr max-content;grid-template-rows:64px max-content;column-gap:4px;align-items:center;min-block-size:var(--_height);padding-block:var(--_padding-block-start) var(--_padding-block-end);padding-inline:var(--_padding-inline);border-start-start-radius:inherit;border-start-end-radius:inherit;background-color:var(--md-comp-app-bar-container-color, inherit);box-shadow:var(--md-sys-elevation-level0);z-index:8}.micl-appbar.micl-appbar--sticky{position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}.micl-appbar .micl-appbar__leading{grid-area:appbar-leading;margin-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar .micl-appbar__leading-icon{grid-area:appbar-leading;margin-inline-start:var(--md-sys-layout-window-margin);color:var(--md-comp-app-bar-leading-icon-color, var(--md-sys-color-on-surface))}.micl-appbar .micl-appbar__headline{display:flex;grid-area:appbar-middle;flex-direction:column;align-items:flex-start;margin:8px 0;border-radius:var(--md-sys-shape-corner-none);color:var(--md-comp-app-bar-title-color, var(--md-sys-color-on-surface))}.micl-appbar .micl-appbar__headline.micl-appbar__headline--center{align-items:center;text-align:center}.micl-appbar .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-title-large-weight) var(--md-sys-typescale-title-large-size)/var(--md-sys-typescale-title-large-line-height) var(--md-sys-typescale-title-large-font);letter-spacing:var(--md-sys-typescale-title-large-tracking);margin:0}.micl-appbar .micl-appbar__headline .micl-appbar__subtitle{font:var(--md-sys-typescale-label-medium-weight) var(--md-sys-typescale-label-medium-size)/var(--md-sys-typescale-label-medium-line-height) var(--md-sys-typescale-label-medium-font);letter-spacing:var(--md-sys-typescale-label-medium-tracking);margin:0;color:var(--md-comp-app-bar-subtitle-color, var(--md-sys-color-on-surface-variant))}.micl-appbar .micl-appbar__trailing{grid-area:appbar-trailing;margin-inline-end:var(--md-sys-layout-window-margin)}.micl-appbar .micl-appbar__trailing-icon{grid-area:appbar-trailing;margin-inline-end:var(--md-sys-layout-window-margin);color:var(--md-comp-app-bar-trailing-icon-color, var(--md-sys-color-on-surface-variant))}.micl-appbar.micl-appbar--medium{--_height: 112px;--_padding-block-end: 12px;padding-inline-start:0}.micl-appbar.micl-appbar--medium .micl-appbar__headline{grid-area:appbar-bottom;margin:0;padding-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar.micl-appbar--medium .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-headline-medium-weight) var(--md-sys-typescale-headline-medium-size)/var(--md-sys-typescale-headline-medium-line-height) var(--md-sys-typescale-headline-medium-font);letter-spacing:var(--md-sys-typescale-headline-medium-tracking)}.micl-appbar.micl-appbar--medium:has(.micl-appbar__subtitle){--_height: 136px}.micl-appbar.micl-appbar--medium:has(.micl-appbar__subtitle) .micl-appbar__subtitle{font:var(--md-sys-typescale-label-large-weight) var(--md-sys-typescale-label-large-size)/var(--md-sys-typescale-label-large-line-height) var(--md-sys-typescale-label-large-font);letter-spacing:var(--md-sys-typescale-label-large-tracking)}.micl-appbar.micl-appbar--large{--_height: 120px;--_padding-block-end: 12px;padding-inline-start:0}.micl-appbar.micl-appbar--large .micl-appbar__headline{grid-area:appbar-bottom;margin:0;padding-inline-start:var(--md-sys-layout-window-margin)}.micl-appbar.micl-appbar--large .micl-appbar__headline :is(h1,h2,h3,h4,h5,h6,.micl-heading){font:var(--md-sys-typescale-display-small-weight) var(--md-sys-typescale-display-small-size)/var(--md-sys-typescale-display-small-line-height) var(--md-sys-typescale-display-small-font);letter-spacing:var(--md-sys-typescale-display-small-tracking)}.micl-appbar.micl-appbar--large:has(.micl-appbar__subtitle){--_height: 152px}.micl-appbar.micl-appbar--large:has(.micl-appbar__subtitle) .micl-appbar__subtitle{font:var(--md-sys-typescale-title-medium-weight) var(--md-sys-typescale-title-medium-size)/var(--md-sys-typescale-title-medium-line-height) var(--md-sys-typescale-title-medium-font);letter-spacing:var(--md-sys-typescale-title-medium-tracking)}.micl-panes:not(:has(>.micl-pane:nth-child(2))) .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}@media(max-width: 600px){.micl-panes:has(>.micl-pane:nth-child(2)) .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 600px)and (max-width: 839px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-expanded .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-large .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 840px)and (max-width: 1199px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-large .micl-appbar:not(.micl-appbar--not-sticky),.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@media(min-width: 1200px)and (max-width: 1599px){.micl-panes:has(>.micl-pane:nth-child(2)).micl-panes--stacked-to-extralarge .micl-appbar:not(.micl-appbar--not-sticky){position:sticky;inset:unset;inset-block-start:env(safe-area-inset-top, 0px);inset-inline-start:0;animation:1ms linear alternate appbar-background;animation-timeline:scroll(root)}}@keyframes appbar-background{0%{background-color:inherit;border-start-start-radius:inherit;border-start-end-radius:inherit}10%{background-color:var(--md-comp-app-bar-on-scroll-container-color, var(--md-sys-color-surface-container));box-shadow:var(--md-sys-elevation-level2)}50%{border-start-start-radius:0;border-start-end-radius:0}100%{background-color:var(--md-comp-app-bar-on-scroll-container-color, var(--md-sys-color-surface-container));box-shadow:var(--md-sys-elevation-level2);border-start-start-radius:0;border-start-end-radius:0}}
|
package/dist/badge.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--md-ref-typeface-plain: Google Sans, system-ui, sans-serif;--md-ref-typeface-plain-narrow: 0;--md-ref-typeface-brand: Google Sans, system-ui, sans-serif;--md-ref-typeface-weight-regular: 400;--md-ref-typeface-weight-medium: 500;--md-ref-typeface-weight-bold: 700}:root{--md-sys-typescale-label-small-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-small-size: 0.6875rem;--md-sys-typescale-label-small-line-height: 1rem;--md-sys-typescale-label-small-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-small-tracking: 0.03125rem}.micl-badge{--_size: var(--md-comp-badge-size, 6px);--_large-size: var(--md-comp-badge-large-size, 16px);--_dx: var(--md-comp-badge-inline-offset, 0px);--_dy: var(--md-comp-badge-block-offset, 0px);box-sizing:border-box;position:
|
|
1
|
+
:root{--md-ref-typeface-plain: Google Sans, system-ui, sans-serif;--md-ref-typeface-plain-narrow: 0;--md-ref-typeface-brand: Google Sans, system-ui, sans-serif;--md-ref-typeface-weight-regular: 400;--md-ref-typeface-weight-medium: 500;--md-ref-typeface-weight-bold: 700}:root{--md-sys-typescale-label-small-font: var(--md-ref-typeface-plain);--md-sys-typescale-label-small-size: 0.6875rem;--md-sys-typescale-label-small-line-height: 1rem;--md-sys-typescale-label-small-weight: var(--md-ref-typeface-weight-medium);--md-sys-typescale-label-small-tracking: 0.03125rem}.micl-badge{--_size: var(--md-comp-badge-size, 6px);--_large-size: var(--md-comp-badge-large-size, 16px);--_icon: var(--md-sys-icon-size, 24px);--_dx: var(--md-comp-badge-inline-offset, 0px);--_dy: var(--md-comp-badge-block-offset, 0px);box-sizing:border-box;position:absolute;inset:auto;margin:0;overflow:clip;background-color:var(--md-comp-badge-color, var(--md-sys-color-error));color:var(--md-comp-badge-large-label-text-color, var(--md-sys-color-on-error))}.micl-badge.micl-badge--small{inline-size:var(--_size);block-size:var(--_size);inset-block-start:calc(anchor(center) - var(--_icon)/2 + var(--_dy));inset-inline-start:calc(anchor(center) + var(--_icon)/2 - var(--_size) + var(--_dx));padding:0;border-radius:calc(var(--_size)/2)}.micl-badge:not(.micl-badge--small){font:var(--md-sys-typescale-label-small-weight) var(--md-sys-typescale-label-small-size)/var(--md-sys-typescale-label-small-line-height) var(--md-sys-typescale-label-small-font);letter-spacing:var(--md-sys-typescale-label-small-tracking);inline-size:fit-content;max-inline-size:34px;min-inline-size:var(--_large-size);block-size:var(--_large-size);inset-block-start:calc(anchor(center) - var(--_icon)/2 - (var(--_large-size) - 14px) + var(--_dy));inset-inline-start:calc(anchor(center) + var(--_icon)/2 - 12px + var(--_dx));padding-inline:var(--md-comp-badge-large-padding, 4px);border-radius:calc(var(--_large-size)/2)}.micl-badge.micl-badge--trailing{position:static;display:inline-flex;align-items:center;justify-content:center;align-self:center;margin-inline-start:var(--md-comp-badge-trailing-space, 4px)}
|
package/dist/bottomsheet.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
body{--md-sys-elevation-level1: rgb(from var(--md-sys-color-shadow) r g b/0.3) 0 1px 2px 0, rgb(from var(--md-sys-color-shadow) r g b/0.15) 0 1px 3px 1px}:root{--md-sys-shape-corner-extra-large-top: 28px 28px 0 0}:root{--md-sys-shape-corner-extra-large: 28px}:root{--md-sys-state-focus-indicator-thickness: 3px}:root{--md-sys-state-focus-indicator-outer-offset: 2px}:root{--md-sys-state-backdrop-opacity: 32%}dialog.micl-bottomsheet{--md-comp-bottomsheet-height
|
|
1
|
+
:root{--md-sys-layout-pane-spacer: 24px;--md-sys-layout-window-margin: 24px;--md-sys-card-margin: 8px}@media(max-width: 599px){:root{--md-sys-layout-window-margin: 16px}}@media(min-width: 840px)and (max-width: 1199px){:root{--md-sys-layout-pane-fixed-width: 360px}}@media(min-width: 1200px){:root{--md-sys-layout-pane-fixed-width: 412px}}body{--md-sys-elevation-level1: rgb(from var(--md-sys-color-shadow) r g b/0.3) 0 1px 2px 0, rgb(from var(--md-sys-color-shadow) r g b/0.15) 0 1px 3px 1px}:root{--md-sys-shape-corner-extra-large-top: 28px 28px 0 0}:root{--md-sys-shape-corner-extra-large: 28px}:root{--md-sys-state-focus-indicator-thickness: 3px}:root{--md-sys-state-focus-indicator-outer-offset: 2px}:root{--md-sys-state-backdrop-opacity: 32%}@property --micl-bottomsheet-scroll{syntax:"<custom-ident>";inherits:true;initial-value:hidden}dialog.micl-bottomsheet{--_height: var(--md-comp-bottomsheet-height, max-content);--_margin: var(--md-comp-bottomsheet-margin, 56px);--_margin-top: var(--md-comp-bottomsheet-margin-top, 72px);--_padding: var(--md-comp-bottomsheet-padding, 24px);--_drag-handle-width: var(--md-comp-bottomsheet-drag-handle-width, 32px);--_drag-handle-height: var(--md-comp-bottomsheet-drag-handle-height, 4px);--_motion-spatial: var(--md-comp-bottomsheet-motion-spatial, cubic-bezier(0.39, 1.29, 0.35, 0.98));--_motion-duration: var(--md-comp-bottomsheet-motion-duration, 650ms);--_motion-duration-reverse: var(--md-comp-bottomsheet-motion-duration-reverse, 500ms);--micl-duration: var(--_motion-duration-reverse);--micl-easing: cubic-bezier(0.3, 0, 0.8, 0.15);--micl-bottomsheet-scroll: hidden;--_settle-delay: 0s;box-sizing:border-box;position:fixed;inset-block:auto 0;inset-inline:0;block-size:0;max-block-size:50dvb;inline-size:100%;margin:0;padding:0;border:none;border-radius:var(--md-comp-bottomsheet-container-shape, var(--md-sys-shape-corner-extra-large-top));background-color:var(--md-comp-bottomsheet-container-color, var(--md-sys-color-surface-container-low));box-shadow:var(--md-comp-bottomsheet-container-elevation, var(--md-sys-elevation-level1));opacity:0;overflow:hidden;interpolate-size:allow-keywords}dialog.micl-bottomsheet[data-miclfitheight]{max-block-size:calc(100dvb - var(--_margin-top))}dialog.micl-bottomsheet:not(.micl-bottomsheet--resizing){transition:opacity var(--micl-duration) var(--micl-easing),block-size var(--micl-duration) var(--_motion-spatial),overlay var(--micl-duration) linear allow-discrete,display var(--micl-duration) linear allow-discrete,--micl-bottomsheet-scroll 0s var(--_settle-delay) allow-discrete}dialog.micl-bottomsheet .micl-bottomsheet__headline{box-sizing:border-box;display:flex;flex-shrink:0;align-items:center;inline-size:100%;block-size:var(--md-sys-state-target-size, 48px);justify-content:center;cursor:grab;touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}dialog.micl-bottomsheet .micl-bottomsheet__headline .micl-bottomsheet__draghandle{box-sizing:content-box;inline-size:var(--_drag-handle-width);block-size:var(--_drag-handle-height);padding:16px calc((var(--md-sys-state-target-size, 48px) - var(--_drag-handle-width))/2);border:none;border-radius:var(--md-sys-shape-corner-extra-large);background:none;cursor:pointer}dialog.micl-bottomsheet .micl-bottomsheet__headline .micl-bottomsheet__draghandle::before{content:"";display:block;block-size:100%;border-radius:calc(var(--_drag-handle-height)/2);background-color:var(--md-comp-bottomsheet-drag-handle-color, var(--md-sys-color-on-surface-variant))}dialog.micl-bottomsheet .micl-bottomsheet__headline .micl-bottomsheet__draghandle:focus-visible{outline:var(--md-sys-state-focus-indicator-thickness, 3px) solid var(--md-comp-bottomsheet-focus-indicator-color, var(--md-sys-color-secondary));outline-offset:var(--md-sys-state-focus-indicator-outer-offset, 2px)}dialog.micl-bottomsheet .micl-bottomsheet__content{flex:1 1 auto;padding:0 var(--_padding) var(--_padding) var(--_padding);overflow:hidden var(--micl-bottomsheet-scroll)}dialog.micl-bottomsheet .micl-bottomsheet__content:first-child{padding-block-start:var(--_padding)}dialog.micl-bottomsheet::backdrop{background-color:rgba(0,0,0,0);transition:overlay var(--micl-duration) linear allow-discrete,display var(--micl-duration) linear allow-discrete,background-color var(--micl-duration) linear}dialog.micl-bottomsheet:popover-open,dialog.micl-bottomsheet[open]{--micl-duration: var(--_motion-duration);--micl-easing: cubic-bezier(0.05, 0.7, 0.1, 1);--micl-bottomsheet-scroll: auto;--_settle-delay: var(--_motion-duration);display:flex;flex-direction:column;block-size:var(--_height);opacity:1}@starting-style{dialog.micl-bottomsheet:popover-open,dialog.micl-bottomsheet[open]{block-size:0;opacity:0;--micl-bottomsheet-scroll: hidden}}dialog.micl-bottomsheet[open]::backdrop{background-color:rgba(0, 0, 0, var(--md-sys-state-backdrop-opacity, 32%))}@starting-style{dialog.micl-bottomsheet[open]::backdrop{background-color:rgba(0,0,0,0)}}dialog.micl-bottomsheet.micl-bottomsheet--resizing{--micl-bottomsheet-scroll: hidden}dialog.micl-bottomsheet.micl-bottomsheet--resizing .micl-bottomsheet__headline{cursor:grabbing}@media(prefers-reduced-motion: reduce){dialog.micl-bottomsheet{--_motion-duration: 0ms;--_motion-duration-reverse: 0ms}}@media(min-width: 600px){dialog.micl-bottomsheet{inline-size:min(100% - 2*var(--_margin),640px);margin-inline:auto}}
|
package/dist/bottomsheet.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.micl=t():e.micl=t()}(self,()=>(()=>{"use strict";var e={56(e,t,
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.micl=t():e.micl=t()}(self,()=>(()=>{"use strict";var e={56(e,t,o){const n=globalThis.__miclRegistry??={map:{},rippled:new WeakSet,activated:!1},i=()=>Object.keys(n.map).join(","),r=e=>Object.entries(n.map).find(([t,{type:o}])=>e.matches(t)&&e instanceof o)?.[1],c=e=>{const t=r(e);t&&"function"==typeof t.component.initialize&&t.component.initialize(e)},a=e=>{const t=r(e);t&&"function"==typeof t.component.cleanup&&t.component.cleanup(e)},s=e=>{const t=i();if(!t)return;const o=e.target.closest(t);if(!(o instanceof HTMLElement))return;const n=r(o),c=e.type;n&&"function"==typeof n.component[c]&&n.component[c]?.(e)},l=()=>{n.activated||(n.activated=!0,new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&(e.addedNodes.forEach(e=>{if(e instanceof HTMLElement){const t=i();t&&e.matches(t)&&c(e),t&&e.querySelectorAll(t).forEach(c)}}),e.removedNodes.forEach(e=>{if(e instanceof HTMLElement){const t=i();t&&e.matches(t)&&a(e),(e=>{const t=i();t&&e.querySelectorAll(t).forEach(a)})(e)}}))})}).observe(document.body,{childList:!0,subtree:!0}),(e=>{const t=i();t&&e.querySelectorAll(t).forEach(c),e.querySelectorAll('[class*="micl-"], [class*="micl-"] > summary').forEach(e=>{n.rippled.has(e)||"1"===window.getComputedStyle(e).getPropertyValue("--micl-ripple")&&(e.addEventListener("pointerdown",t=>{if(t.currentTarget.classList.contains("micl-card--nonactionable"))return;t.stopPropagation();const o=e.getBoundingClientRect();e.style.setProperty("--micl-x",(t.clientX-o.left)/o.width*100+"%"),e.style.setProperty("--micl-y",(t.clientY-o.top)/o.height*100+"%"),e.classList.remove("micl-rippling"),e.offsetWidth,e.classList.add("micl-rippling");const n=t=>{"micl-ripple"===t.animationName&&(e.classList.remove("micl-rippling"),e.style.removeProperty("--micl-x"),e.style.removeProperty("--micl-y"),e.removeEventListener("animationend",n))};e.addEventListener("animationend",n)}),n.rippled.add(e))}),document.documentElement.style.setProperty("--md-sys-scrollbar-thumb-color",window.getComputedStyle(document.body).getPropertyValue("--md-sys-color-outline").trim())})(document),document.addEventListener("change",s),document.addEventListener("input",s),document.addEventListener("keydown",s))},d=()=>{document.removeEventListener("DOMContentLoaded",d),l()};"loading"!==document.readyState?l():document.addEventListener("DOMContentLoaded",d),o.d(t,["register",0,(e,t,o)=>(n.map[e]={component:t,type:o},n.activated&&document.querySelectorAll(e).forEach(c),t)])}};const t={};function o(n){const i=t[n];if(void 0!==i)return i.exports;const r=t[n]={exports:{}};return e[n](r,r.exports,o),r.exports}o.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],r=t[n++];o.o(e,i)?0===r&&n++:0===r?Object.defineProperty(e,i,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:r})}else for(var i in t)o.o(t,i)&&!o.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let n={};o.r(n);var i=o(56);const r="dialog.micl-bottomsheet",c=new WeakMap,a=e=>{delete e.dataset.miclfitheight,e.style.removeProperty("--md-comp-bottomsheet-height")},s=e=>(e.getAnimations().forEach(e=>e.finish()),e.getBoundingClientRect().height),l=e=>{let t=parseInt(e.dataset.miclfitheight||"0",10);t<1&&(t=s(e),e.dataset.miclfitheight=`${t}`);let o=parseInt(window.getComputedStyle(e).getPropertyValue("max-block-size"),10)||1/0,n=(e.dataset.miclsnapheights||"").split(",").map(Number).filter(e=>!isNaN(e)&&e>=0&&e<=o);return[...new Set(n.concat([Math.min(t,o)]).sort((e,t)=>e-t))]},d=(e,t)=>{t<1?(a(e),e[e.popover?"hidePopover":"close"]()):e.style.setProperty("--md-comp-bottomsheet-height",`${t}px`)},m=(0,i.register)(r,{initialize:e=>{if(!e.matches(r)||e.dataset.miclinitialized)return;const t=e.querySelector(".micl-bottomsheet__headline");if(!t)return;e.dataset.miclinitialized="1";const o=t.querySelector(".micl-bottomsheet__draghandle"),n=new AbortController,i={signal:n.signal};c.set(e,n);let m,p,u=!1,f=!1,y=!1;function h(t){const o=t.clientY;if(u&&Math.abs(m-o)>4&&(u=!1,f=!0,e.classList.add("micl-bottomsheet--resizing")),f){const t=Math.max(1,p+m-o),n=l(e).find(e=>e>0&&Math.abs(e-t)<=12);d(e,n||t)}}function g(t){const o=f;if(u=!1,f=!1,e.classList.remove("micl-bottomsheet--resizing"),document.removeEventListener("pointermove",h),document.removeEventListener("pointerup",g),document.removeEventListener("pointercancel",g),o){y=!0;const o=e.getBoundingClientRect().height,n=o<48&&"pointerup"===t.type;d(e,n?0:((e,t)=>{const o=l(e).filter(e=>e>0);return o.reduce((e,o)=>Math.abs(o-t)<Math.abs(e-t)?o:e,o[0]??t)})(e,o))}}e.addEventListener("beforetoggle",t=>{"open"===t.newState&&a(e)},i),o?.addEventListener("click",t=>{y&&t.detail||d(e,(e=>{let t=s(e),o=l(e);return o.filter(e=>e>t+4)[0]||o[0]})(e))},i),t.addEventListener("pointerdown",n=>{n.target!==t&&n.target!==o||(u=!0,y=!1,n.preventDefault(),m=n.clientY,p=s(e),document.addEventListener("pointermove",h,i),document.addEventListener("pointerup",g,i),document.addEventListener("pointercancel",g,i))},i)},cleanup:e=>{const t=c.get(e);t&&(t.abort(),c.delete(e)),e.classList.remove("micl-bottomsheet--resizing"),a(e),delete e.dataset.miclinitialized}},HTMLDialogElement);return o.d(n,["bottomsheetSelector",0,r,"default",0,m]),n})());
|