material 3.0.2 → 3.0.4
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 -2
- package/dist/components/badge/config.d.ts +2 -2
- package/dist/components/button/features/toggle.d.ts +1 -1
- package/dist/components/button/types.d.ts +5 -5
- package/dist/components/button-group/button-group.d.ts +1 -1
- package/dist/components/button-group/constants.d.ts +1 -1
- package/dist/components/button-group/index.d.ts +1 -1
- package/dist/components/button-group/types.d.ts +2 -2
- package/dist/components/card/types.d.ts +5 -5
- package/dist/components/carousel/features/scroll.js +33 -33
- package/dist/components/carousel/keylines.d.ts +8 -5
- package/dist/components/carousel/keylines.js +23 -21
- package/dist/components/carousel/types.d.ts +1 -1
- package/dist/components/checkbox/types.d.ts +4 -4
- package/dist/components/chips/types.d.ts +12 -12
- package/dist/components/datepicker/datepicker.d.ts +1 -1
- package/dist/components/datepicker/types.d.ts +11 -11
- package/dist/components/datepicker/utils.d.ts +1 -1
- package/dist/components/dialog/types.d.ts +1 -1
- package/dist/components/drawer/types.d.ts +1 -1
- package/dist/components/extended-fab/types.d.ts +3 -3
- package/dist/components/fab/types.d.ts +2 -3
- package/dist/components/fab-menu/types.d.ts +1 -1
- package/dist/components/icon-button/types.d.ts +4 -5
- package/dist/components/list/types.d.ts +1 -1
- package/dist/components/menu/features/loader.d.ts +1 -1
- package/dist/components/menu/types.d.ts +3 -3
- package/dist/components/navigation-bar/types.d.ts +1 -1
- package/dist/components/navigation-rail/types.d.ts +2 -2
- package/dist/components/progress/types.d.ts +1 -1
- package/dist/components/radios/types.d.ts +1 -1
- package/dist/components/search/types.d.ts +5 -5
- package/dist/components/select/constants.d.ts +1 -1
- package/dist/components/select/types.d.ts +1 -1
- package/dist/components/slider/config.d.ts +1 -1
- package/dist/components/slider/features/axis.d.ts +1 -1
- package/dist/components/slider/features/controller.d.ts +14 -14
- package/dist/components/slider/types.d.ts +1 -1
- package/dist/components/snackbar/types.d.ts +1 -1
- package/dist/components/switch/features.d.ts +1 -1
- package/dist/components/switch/types.d.ts +5 -5
- package/dist/components/tabs/features.d.ts +1 -1
- package/dist/components/tabs/responsive.d.ts +1 -1
- package/dist/components/tabs/types.d.ts +7 -8
- package/dist/components/tabs/utils.d.ts +5 -5
- package/dist/components/text-field/constants.d.ts +1 -1
- package/dist/components/text-field/features/counter.d.ts +1 -1
- package/dist/components/text-field/features/field.d.ts +1 -1
- package/dist/components/text-field/features/required.d.ts +1 -1
- package/dist/components/text-field/features/trailing-icon.d.ts +2 -2
- package/dist/components/text-field/types.d.ts +8 -8
- package/dist/components/timepicker/dial.d.ts +2 -2
- package/dist/components/timepicker/types.d.ts +9 -9
- package/dist/components/timepicker/utils.d.ts +2 -2
- package/dist/core/compose/features/constants.d.ts +1 -1
- package/dist/core/compose/features/events.d.ts +1 -1
- package/dist/core/config/component.d.ts +1 -1
- package/dist/core/dom/create.d.ts +2 -2
- package/dist/core/dom/layer.d.ts +1 -1
- package/dist/core/state/emitter.d.ts +1 -1
- package/dist/core/theme/shape.d.ts +1 -1
- package/dist/core/theme/tokens.d.ts +1 -1
- package/dist/core/utils/attributes.d.ts +2 -2
- package/dist/core/utils/theme.d.ts +1 -1
- package/dist/elements/adapter.d.ts +12 -1
- package/dist/elements/button.d.ts +1 -1
- package/dist/elements/css/icon-button.css +1 -1
- package/dist/elements/css/icon-button.js +1 -1
- package/dist/elements/css/toolbar.css +1 -1
- package/dist/elements/css/toolbar.js +1 -1
- package/dist/elements/css/tooltip.css +1 -1
- package/dist/elements/css/tooltip.js +1 -1
- package/dist/elements/define.d.ts +20 -4
- package/dist/elements/define.js +2 -0
- package/dist/elements/icon-button.d.ts +6 -1
- package/dist/elements/icon-button.js +1 -0
- package/dist/elements/navigation-bar.d.ts +1 -1
- package/dist/elements/navigation-rail.d.ts +1 -1
- package/dist/elements/preupgrade/badge.css +1 -1
- package/dist/elements/preupgrade/bottom-app-bar.css +1 -1
- package/dist/elements/preupgrade/bottom-sheet.css +1 -1
- package/dist/elements/preupgrade/button-group.css +1 -1
- package/dist/elements/preupgrade/button.css +1 -1
- package/dist/elements/preupgrade/card.css +1 -1
- package/dist/elements/preupgrade/carousel.css +1 -1
- package/dist/elements/preupgrade/checkbox.css +1 -1
- package/dist/elements/preupgrade/chips.css +1 -1
- package/dist/elements/preupgrade/datepicker.css +1 -1
- package/dist/elements/preupgrade/dialog.css +1 -1
- package/dist/elements/preupgrade/divider.css +1 -1
- package/dist/elements/preupgrade/drawer.css +1 -1
- package/dist/elements/preupgrade/extended-fab.css +1 -1
- package/dist/elements/preupgrade/fab-menu.css +1 -1
- package/dist/elements/preupgrade/fab.css +1 -1
- package/dist/elements/preupgrade/icon-button.css +1 -1
- package/dist/elements/preupgrade/list.css +1 -1
- package/dist/elements/preupgrade/loading-indicator.css +1 -1
- package/dist/elements/preupgrade/menu.css +1 -1
- package/dist/elements/preupgrade/navigation-bar.css +1 -1
- package/dist/elements/preupgrade/navigation-rail.css +1 -1
- package/dist/elements/preupgrade/progress.css +1 -1
- package/dist/elements/preupgrade/radios.css +1 -1
- package/dist/elements/preupgrade/search.css +1 -1
- package/dist/elements/preupgrade/select.css +1 -1
- package/dist/elements/preupgrade/side-sheet.css +1 -1
- package/dist/elements/preupgrade/slider.css +1 -1
- package/dist/elements/preupgrade/snackbar.css +1 -1
- package/dist/elements/preupgrade/split-button.css +1 -1
- package/dist/elements/preupgrade/switch.css +1 -1
- package/dist/elements/preupgrade/tabs.css +1 -1
- package/dist/elements/preupgrade/text-field.css +1 -1
- package/dist/elements/preupgrade/timepicker.css +1 -1
- package/dist/elements/preupgrade/toolbar.css +1 -1
- package/dist/elements/preupgrade/tooltip.css +1 -1
- package/dist/elements/preupgrade/top-app-bar.css +1 -1
- package/dist/elements/preupgrade.css +1 -1
- package/dist/elements/styles.d.ts +5 -4
- package/dist/elements/timepicker.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/package.json +1 -1
- package/dist/react/create.d.ts +1 -1
- package/dist/react/create.js +4 -1
- package/dist/solid/create.d.ts +2 -2
- package/dist/solid/create.js +6 -4
- package/dist/ssr/index.js +13 -13
- package/dist/ssr/react.js +1 -1
- package/dist/styles/badge.css +1 -1
- package/dist/styles/base.css +1 -1
- package/dist/styles/bottom-app-bar.css +1 -1
- package/dist/styles/bottom-sheet.css +1 -1
- package/dist/styles/button-group.css +1 -1
- package/dist/styles/button.css +1 -1
- package/dist/styles/card.css +1 -1
- package/dist/styles/carousel.css +1 -1
- package/dist/styles/checkbox.css +1 -1
- package/dist/styles/chips.css +1 -1
- package/dist/styles/contrast.css +1 -1
- package/dist/styles/datepicker.css +1 -1
- package/dist/styles/dialog.css +1 -1
- package/dist/styles/divider.css +1 -1
- package/dist/styles/drawer.css +1 -1
- package/dist/styles/extended-fab.css +1 -1
- package/dist/styles/fab-menu.css +1 -1
- package/dist/styles/fab.css +1 -1
- package/dist/styles/icon-button.css +2 -2
- package/dist/styles/list.css +1 -1
- package/dist/styles/loading-indicator.css +1 -1
- package/dist/styles/menu.css +1 -1
- package/dist/styles/navigation-bar.css +1 -1
- package/dist/styles/navigation-rail.css +1 -1
- package/dist/styles/progress.css +1 -1
- package/dist/styles/radios.css +1 -1
- package/dist/styles/search.css +1 -1
- package/dist/styles/select.css +1 -1
- package/dist/styles/side-sheet.css +1 -1
- package/dist/styles/slider.css +1 -1
- package/dist/styles/snackbar.css +1 -1
- package/dist/styles/split-button.css +1 -1
- package/dist/styles/switch.css +1 -1
- package/dist/styles/tabs.css +1 -1
- package/dist/styles/text-field.css +1 -1
- package/dist/styles/timepicker.css +1 -1
- package/dist/styles/toolbar.css +2 -2
- package/dist/styles/tooltip.css +2 -2
- package/dist/styles/top-app-bar.css +1 -1
- package/dist/styles/typography.css +1 -1
- package/dist/styles/utilities.css +1 -1
- package/dist/styles.css +2 -2
- package/dist/svelte/Badge.svelte +1 -1
- package/dist/svelte/BottomAppBar.svelte +1 -1
- package/dist/svelte/BottomSheet.svelte +1 -1
- package/dist/svelte/Button.svelte +1 -1
- package/dist/svelte/ButtonGroup.svelte +1 -1
- package/dist/svelte/Card.svelte +1 -1
- package/dist/svelte/Carousel.svelte +1 -1
- package/dist/svelte/Checkbox.svelte +1 -1
- package/dist/svelte/Chips.svelte +1 -1
- package/dist/svelte/Datepicker.svelte +1 -1
- package/dist/svelte/Dialog.svelte +1 -1
- package/dist/svelte/Divider.svelte +1 -1
- package/dist/svelte/Drawer.svelte +1 -1
- package/dist/svelte/ExtendedFab.svelte +1 -1
- package/dist/svelte/Fab.svelte +1 -1
- package/dist/svelte/FabMenu.svelte +1 -1
- package/dist/svelte/IconButton.svelte +1 -1
- package/dist/svelte/List.svelte +1 -1
- package/dist/svelte/LoadingIndicator.svelte +1 -1
- package/dist/svelte/Menu.svelte +1 -1
- package/dist/svelte/NavigationBar.svelte +1 -1
- package/dist/svelte/NavigationRail.svelte +1 -1
- package/dist/svelte/Progress.svelte +1 -1
- package/dist/svelte/Radios.svelte +1 -1
- package/dist/svelte/Search.svelte +1 -1
- package/dist/svelte/Select.svelte +1 -1
- package/dist/svelte/SideSheet.svelte +1 -1
- package/dist/svelte/Slider.svelte +1 -1
- package/dist/svelte/Snackbar.svelte +1 -1
- package/dist/svelte/SplitButton.svelte +1 -1
- package/dist/svelte/Switch.svelte +1 -1
- package/dist/svelte/Tabs.svelte +1 -1
- package/dist/svelte/TextField.svelte +1 -1
- package/dist/svelte/Timepicker.svelte +1 -1
- package/dist/svelte/Toolbar.svelte +1 -1
- package/dist/svelte/Tooltip.svelte +1 -1
- package/dist/svelte/TopAppBar.svelte +1 -1
- package/dist/svelte/runtime.d.ts +2 -2
- package/dist/svelte/runtime.js +4 -1
- package/dist/themes/autumn-contrast.css +1 -1
- package/dist/themes/autumn.css +1 -1
- package/dist/themes/baseline-contrast.css +1 -1
- package/dist/themes/baseline.css +1 -1
- package/dist/themes/brownbeige-contrast.css +1 -1
- package/dist/themes/brownbeige.css +1 -1
- package/dist/themes/content-contrast.css +1 -1
- package/dist/themes/content.css +1 -1
- package/dist/themes/desert-contrast.css +1 -1
- package/dist/themes/desert.css +1 -1
- package/dist/themes/expressive-contrast.css +1 -1
- package/dist/themes/expressive.css +1 -1
- package/dist/themes/fidelity-contrast.css +1 -1
- package/dist/themes/fidelity.css +1 -1
- package/dist/themes/forest-contrast.css +1 -1
- package/dist/themes/forest.css +1 -1
- package/dist/themes/fruit-salad-contrast.css +1 -1
- package/dist/themes/fruit-salad.css +1 -1
- package/dist/themes/highcontrast-contrast.css +1 -1
- package/dist/themes/highcontrast.css +1 -1
- package/dist/themes/monochrome-contrast.css +1 -1
- package/dist/themes/monochrome.css +1 -1
- package/dist/themes/neutral-contrast.css +1 -1
- package/dist/themes/neutral.css +1 -1
- package/dist/themes/ocean-contrast.css +1 -1
- package/dist/themes/ocean.css +1 -1
- package/dist/themes/rainbow-contrast.css +1 -1
- package/dist/themes/rainbow.css +1 -1
- package/dist/themes/sageivory-contrast.css +1 -1
- package/dist/themes/sageivory.css +1 -1
- package/dist/themes/spring-contrast.css +1 -1
- package/dist/themes/spring.css +1 -1
- package/dist/themes/summer-contrast.css +1 -1
- package/dist/themes/summer.css +1 -1
- package/dist/themes/sunset-contrast.css +1 -1
- package/dist/themes/sunset.css +1 -1
- package/dist/themes/tealcaramel-contrast.css +1 -1
- package/dist/themes/tealcaramel.css +1 -1
- package/dist/themes/vibrant-contrast.css +1 -1
- package/dist/themes/vibrant.css +1 -1
- package/dist/vue/create.d.ts +2 -2
- package/dist/vue/create.js +4 -1
- package/package.json +1 -1
- package/src/styles/abstract/_mixins.scss +4 -4
- package/src/styles/abstract/_theme.scss +1 -1
- package/src/styles/abstract/_variables.scss +7 -7
- package/src/styles/base/_foundation.scss +1 -1
- package/src/styles/base/_typescale-tokens.scss +1 -1
- package/src/styles/base/_typography.scss +1 -1
- package/src/styles/components/_bottom-sheet.scss +1 -1
- package/src/styles/components/_button.scss +1 -1
- package/src/styles/components/_checkbox.scss +5 -5
- package/src/styles/components/_chips.scss +9 -9
- package/src/styles/components/_datepicker.scss +8 -9
- package/src/styles/components/_dialog.scss +1 -1
- package/src/styles/components/_drawer.scss +1 -1
- package/src/styles/components/_fab-menu.scss +1 -1
- package/src/styles/components/_icon-button.scss +50 -13
- package/src/styles/components/_menu.scss +0 -1
- package/src/styles/components/_navigation-bar.scss +1 -1
- package/src/styles/components/_radios.scss +3 -3
- package/src/styles/components/_search.scss +7 -7
- package/src/styles/components/_select.scss +2 -2
- package/src/styles/components/_side-sheet.scss +2 -2
- package/src/styles/components/_slider.scss +6 -6
- package/src/styles/components/_switch.scss +5 -5
- package/src/styles/components/_tabs.scss +15 -15
- package/src/styles/components/_text-field.scss +20 -21
- package/src/styles/components/_timepicker.scss +6 -6
- package/src/styles/components/_toolbar.scss +48 -0
- package/src/styles/components/_tooltip.scss +35 -74
- package/src/styles/elements/_field.scss +2 -2
- package/src/styles/themes/_autumn.scss +3 -3
- package/src/styles/themes/_base-theme.scss +2 -2
- package/src/styles/themes/_baseline.scss +5 -5
- package/src/styles/themes/_forest.scss +3 -3
- package/src/styles/themes/_ocean.scss +3 -3
- package/src/styles/themes/_spring.scss +3 -3
- package/src/styles/themes/_sunset.scss +3 -3
- package/src/styles/utilities/_ripple.scss +1 -1
|
@@ -139,7 +139,7 @@ $component: '#{base.$prefix}-radios';
|
|
|
139
139
|
|
|
140
140
|
// The 20dp icon: a 2dp ring (RadioStrokeWidth; it was 1.5px, which Chromium
|
|
141
141
|
// paints as 1px) in on-surface-variant, and a 10dp dot (Compose and material-web;
|
|
142
|
-
// it was 12px) that springs in on the fast spatial spring.
|
|
142
|
+
// it was 12px) that springs in on the fast spatial spring.
|
|
143
143
|
&__circle {
|
|
144
144
|
position: relative;
|
|
145
145
|
width: 20px;
|
|
@@ -167,7 +167,7 @@ $component: '#{base.$prefix}-radios';
|
|
|
167
167
|
// The state layer (md-comp-radio-button): unselected on-surface on hover and
|
|
168
168
|
// focus, selected primary; a press takes the colour of the state it leads to. The
|
|
169
169
|
// unselected ring turns on-surface. Hover was primary even when unselected, a
|
|
170
|
-
// plain :focus showed on mouse clicks, and there was no press.
|
|
170
|
+
// plain :focus showed on mouse clicks, and there was no press.
|
|
171
171
|
&__ripple {
|
|
172
172
|
position: absolute;
|
|
173
173
|
inset: 0;
|
|
@@ -201,7 +201,7 @@ $component: '#{base.$prefix}-radios';
|
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
// Radio text: the gap follows the reading direction (it was a physical
|
|
204
|
-
// margin-left, 0px in right-to-left layouts).
|
|
204
|
+
// margin-left, 0px in right-to-left layouts).
|
|
205
205
|
&__text {
|
|
206
206
|
margin-inline-start: 8px;
|
|
207
207
|
|
|
@@ -16,7 +16,7 @@ $component: "#{base.$prefix}-search";
|
|
|
16
16
|
$bar-height: 56px;
|
|
17
17
|
// SearchBarTokens.ContainerShape is CornerFull. Half the height, so the
|
|
18
18
|
// radius animates to the view's corners; min() keeps a theme's full corner
|
|
19
|
-
// in charge when it is smaller
|
|
19
|
+
// in charge when it is smaller.
|
|
20
20
|
$bar-shape: min(var(--#{base.$prefix}-sys-shape-corner-full, 9999px), calc(#{$bar-height} / 2));
|
|
21
21
|
$bar-min-width: 360px;
|
|
22
22
|
$bar-max-width: 720px;
|
|
@@ -59,7 +59,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
59
59
|
|
|
60
60
|
// The root keeps the bar's place in the page. While the view is open, the bar
|
|
61
61
|
// and its results show in the top layer as one surface, placed over it
|
|
62
|
-
//
|
|
62
|
+
// A docked view no longer pushes the page down, and a full-screen
|
|
63
63
|
// search no longer covers the page while it is a bar.
|
|
64
64
|
.#{$component} {
|
|
65
65
|
position: relative;
|
|
@@ -187,7 +187,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
187
187
|
|
|
188
188
|
|
|
189
189
|
// ============================================================================
|
|
190
|
-
// Styles
|
|
190
|
+
// Styles
|
|
191
191
|
// ============================================================================
|
|
192
192
|
|
|
193
193
|
// The rules above draw the divided style, the baseline: the bar squares off
|
|
@@ -237,7 +237,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
237
237
|
@include contained-fullscreen;
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
-
// The results reveal on the emphasized decelerate curve (
|
|
240
|
+
// The results reveal on the emphasized decelerate curve (the
|
|
241
241
|
// --expanding and --collapsing classes were never driven, and are gone).
|
|
242
242
|
.#{$component}--view .#{$component}__content {
|
|
243
243
|
animation: #{$component}-reveal v.motion("duration-medium2") v.motion("easing-emphasized-decelerate");
|
|
@@ -284,7 +284,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
284
284
|
// Icon buttons: leading, clear, trailing
|
|
285
285
|
// ============================================================================
|
|
286
286
|
|
|
287
|
-
// 48dp tap targets around 24dp icons (
|
|
287
|
+
// 48dp tap targets around 24dp icons (they were 24dp buttons), with
|
|
288
288
|
// state layers in their icon colour and md.comp.focus-ring.
|
|
289
289
|
.#{$component}__leading-icon,
|
|
290
290
|
.#{$component}__clear-button,
|
|
@@ -300,7 +300,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
300
300
|
padding: 0;
|
|
301
301
|
border: none;
|
|
302
302
|
border-radius: 50%;
|
|
303
|
-
// A shadow root does not get the page's font reset
|
|
303
|
+
// A shadow root does not get the page's font reset.
|
|
304
304
|
font: inherit;
|
|
305
305
|
background-color: color-mix(in srgb, currentColor var(--#{$component}-layer), transparent);
|
|
306
306
|
cursor: pointer;
|
|
@@ -442,7 +442,7 @@ $transition-easing: cubic-bezier(0.2, 0, 0, 1);
|
|
|
442
442
|
flex: 1;
|
|
443
443
|
overflow-y: auto;
|
|
444
444
|
overflow-x: hidden;
|
|
445
|
-
// The arrows name no behaviour, so that reduced motion can stop it
|
|
445
|
+
// The arrows name no behaviour, so that reduced motion can stop it
|
|
446
446
|
scroll-behavior: smooth;
|
|
447
447
|
}
|
|
448
448
|
|
|
@@ -63,7 +63,7 @@ $component: "#{base.$prefix}-select";
|
|
|
63
63
|
// No viewport scrim: the old `::before` one shared the root's
|
|
64
64
|
// pseudo-element with the filled indicator (height 2px), so it was a
|
|
65
65
|
// 2px strip and never blocked anything; a click outside closes the
|
|
66
|
-
// menu (
|
|
66
|
+
// menu (the indicator moved to the field, which revived it).
|
|
67
67
|
|
|
68
68
|
// These styles handle the focused state when the menu is open
|
|
69
69
|
.#{base.$prefix}-text-field--filled {
|
|
@@ -188,7 +188,7 @@ $component: "#{base.$prefix}-select";
|
|
|
188
188
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
// `.mtrl-select__menu` marks the select's menu (
|
|
191
|
+
// `.mtrl-select__menu` marks the select's menu (the class was unprefixed,
|
|
192
192
|
// so nothing here ever applied). Its never-applied rules are gone: a 460px max
|
|
193
193
|
// width fought the menu's field width, a 4px margin its top-layer placement, and
|
|
194
194
|
// the fade classes were never set; the menu's own motion and size apply.
|
|
@@ -115,7 +115,7 @@ $component: "#{base.$prefix}-side-sheet";
|
|
|
115
115
|
outline-offset: 2px;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
//
|
|
118
|
+
// The 40px button carries a 48px target, the icon button's own
|
|
119
119
|
// mechanism (its --xs/--s ::after): the box reaches 4px past each edge.
|
|
120
120
|
// The `position: relative` above is the button's own, so the box anchors
|
|
121
121
|
// to the button whatever the page does to buttons.
|
|
@@ -170,7 +170,7 @@ $component: "#{base.$prefix}-side-sheet";
|
|
|
170
170
|
|
|
171
171
|
// Only the modal sheet rounds, on its inner edge: CornerLarge where it
|
|
172
172
|
// faces the page. The standard one is square (MDC
|
|
173
|
-
// Sheet.Side.Docked.Container.Shape = Corner.None),
|
|
173
|
+
// Sheet.Side.Docked.Container.Shape = Corner.None),
|
|
174
174
|
&.#{$component}--end .#{$component}__container {
|
|
175
175
|
box-shadow: f.get-elevation(1), m.$sheet-overshoot-guard 0 0 0 t.color("surface-container-low");
|
|
176
176
|
border-start-start-radius: v.shape("large");
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
@use '../../styles/abstract/mixins' as m;
|
|
6
6
|
@use '../../styles/abstract/theme' as t;
|
|
7
7
|
|
|
8
|
-
// Motion
|
|
8
|
+
// Motion. A value change that does not follow a pointer -- a tap on the
|
|
9
9
|
// track, a key, setValue() -- carries the handle, the value indicator and the track
|
|
10
10
|
// to the new value on the default spatial spring, as the m3.material.io sliders
|
|
11
11
|
// video shows: a tap slides the handle over, peaking about 300ms in with a 3-5%
|
|
12
12
|
// overshoot and settled by 450ms. The default spatial spring peaks at about 270ms
|
|
13
13
|
// with 1.5% and settles in 450ms; the fast one (140ms, 9%) was visibly too strong. The controller sets
|
|
14
14
|
// `--settling` for those changes alone, so a drag follows the pointer and a layout
|
|
15
|
-
// render (the first one, a resize) never moves anything
|
|
15
|
+
// render (the first one, a resize) never moves anything.
|
|
16
16
|
//
|
|
17
17
|
// The value indicator grows out of the handle and shrinks back into it: in on
|
|
18
18
|
// motionDurationMedium4 emphasized decelerate, out on motionDurationShort3
|
|
@@ -39,7 +39,7 @@ $component: '#{base.$prefix}-slider';
|
|
|
39
39
|
// inactive track and the ticks on the active track take its container colour
|
|
40
40
|
// (secondaryContainer). A stylesheet overrides them per slider with
|
|
41
41
|
// --<prefix>-slider-color, --<prefix>-slider-container-color and, for the ticks on
|
|
42
|
-
// the active track alone, --<prefix>-slider-on-color.
|
|
42
|
+
// the active track alone, --<prefix>-slider-on-color.
|
|
43
43
|
--#{base.$prefix}-slider-track-color: var(--#{base.$prefix}-slider-color, #{t.color('primary')});
|
|
44
44
|
--#{base.$prefix}-slider-inactive-track-color: var(--#{base.$prefix}-slider-container-color, #{t.color('secondary-container')});
|
|
45
45
|
--#{base.$prefix}-slider-tick-color: var(--#{base.$prefix}-slider-on-color, var(--#{base.$prefix}-slider-inactive-track-color));
|
|
@@ -55,7 +55,7 @@ $component: '#{base.$prefix}-slider';
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Label
|
|
58
|
-
// Body Large, as the checkbox, radio and switch labels
|
|
58
|
+
// Body Large, as the checkbox, radio and switch labels.
|
|
59
59
|
&__label {
|
|
60
60
|
display: block;
|
|
61
61
|
@include m.typography('body-large');
|
|
@@ -84,7 +84,7 @@ $component: '#{base.$prefix}-slider';
|
|
|
84
84
|
// An icon outside the track sits level with it, before or after it (the M3
|
|
85
85
|
// guidelines' icons at either end); the label spans the track's column, above or
|
|
86
86
|
// below. It used to be absolutely placed at a fixed top on the start side, so
|
|
87
|
-
// iconPosition and labelPosition changed nothing on screen.
|
|
87
|
+
// iconPosition and labelPosition changed nothing on screen.
|
|
88
88
|
&--icon {
|
|
89
89
|
display: grid;
|
|
90
90
|
grid-template-columns: 40px minmax(0, 1fr);
|
|
@@ -327,7 +327,7 @@ $component: '#{base.$prefix}-slider';
|
|
|
327
327
|
.#{$component}__value--visible { transition: $settle-position, $bubble-transition-visible; }
|
|
328
328
|
}
|
|
329
329
|
|
|
330
|
-
// Vertical
|
|
330
|
+
// Vertical: the same parts turned a quarter. withTracks and the
|
|
331
331
|
// controller write positions along the axis -- to bottom, or to top with
|
|
332
332
|
// topToBottom -- and thicknesses across it; the length is the slider's height.
|
|
333
333
|
&--vertical {
|
|
@@ -56,7 +56,7 @@ $component: '#{base.$prefix}-switch';
|
|
|
56
56
|
flex-grow: 1;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
// labelPosition 'end' only added this class, and the label stayed first.
|
|
59
|
+
// labelPosition 'end' only added this class, and the label stayed first.
|
|
60
60
|
&--label-end &__container {
|
|
61
61
|
flex-direction: row-reverse;
|
|
62
62
|
}
|
|
@@ -83,7 +83,7 @@ $component: '#{base.$prefix}-switch';
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
// md.comp.focus-ring around the track (material-web's switch ring), 3dp
|
|
86
|
-
// secondary at a 2dp offset.
|
|
86
|
+
// secondary at a 2dp offset.
|
|
87
87
|
&:focus-visible ~ .#{$component}__track {
|
|
88
88
|
outline: 3px solid t.color('secondary');
|
|
89
89
|
outline-offset: 2px;
|
|
@@ -92,7 +92,7 @@ $component: '#{base.$prefix}-switch';
|
|
|
92
92
|
|
|
93
93
|
// The track (52 x 32dp, a 2dp outline). The handle and its state layer are
|
|
94
94
|
// placed with inset-inline-start, so both mirror in right-to-left layouts: a
|
|
95
|
-
// physical left plus translateX put the selected handle off the track.
|
|
95
|
+
// physical left plus translateX put the selected handle off the track.
|
|
96
96
|
&__track {
|
|
97
97
|
position: relative;
|
|
98
98
|
flex-shrink: 0;
|
|
@@ -140,7 +140,7 @@ $component: '#{base.$prefix}-switch';
|
|
|
140
140
|
pointer-events: none;
|
|
141
141
|
|
|
142
142
|
// Icons: 16dp. The selected one is on-primary-container, the unselected one
|
|
143
|
-
// surface-container-highest (SwitchTokens).
|
|
143
|
+
// surface-container-highest (SwitchTokens).
|
|
144
144
|
&-icon {
|
|
145
145
|
position: absolute;
|
|
146
146
|
display: flex;
|
|
@@ -270,7 +270,7 @@ $component: '#{base.$prefix}-switch';
|
|
|
270
270
|
|
|
271
271
|
// Interaction states. The handle takes on-surface-variant (unselected) or
|
|
272
272
|
// primary-container (selected) on hover, focus and press, over an on-surface or
|
|
273
|
-
// primary layer at the hover, focus and pressed opacities.
|
|
273
|
+
// primary layer at the hover, focus and pressed opacities.
|
|
274
274
|
&:not(.#{$component}--disabled) {
|
|
275
275
|
.#{$component}__input:is(:hover, :focus-visible, :active) ~ .#{$component}__track .#{$component}__thumb {
|
|
276
276
|
background-color: t.color('on-surface-variant');
|
|
@@ -28,7 +28,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
// Primary indicator: m3.material.io tabs specs, shape "3, 3, 0, 0" (the top
|
|
31
|
-
// corners only; Compose rounds all four) at 3dp, set by indicator.ts.
|
|
31
|
+
// corners only; Compose rounds all four) at 3dp, set by indicator.ts.
|
|
32
32
|
.#{$container}__indicator {
|
|
33
33
|
border-radius: 3px 3px 0 0;
|
|
34
34
|
background-color: t.color("primary");
|
|
@@ -40,7 +40,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
40
40
|
// Tab indicator styling for secondary variant
|
|
41
41
|
.#{$container}__indicator {
|
|
42
42
|
// 2dp, set by indicator.ts: the site's secondary indicator height (Compose's
|
|
43
|
-
// SecondaryIndicator takes the primary 3dp; the site wins).
|
|
43
|
+
// SecondaryIndicator takes the primary 3dp; the site wins).
|
|
44
44
|
border-radius: 0;
|
|
45
45
|
background-color: t.color("primary");
|
|
46
46
|
}
|
|
@@ -62,7 +62,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
62
62
|
// container the tabs inherited that and stacked vertically -- `flex: 1`
|
|
63
63
|
// below was dividing the height rather than the row the comment above
|
|
64
64
|
// describes. The divider and the indicator are both absolutely
|
|
65
|
-
// positioned, so neither depends on the container's direction.
|
|
65
|
+
// positioned, so neither depends on the container's direction.
|
|
66
66
|
&:not(&--scrollable) {
|
|
67
67
|
flex-direction: row;
|
|
68
68
|
}
|
|
@@ -82,7 +82,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
82
82
|
// tabs inside the row.
|
|
83
83
|
padding-inline: 52px;
|
|
84
84
|
overflow-x: auto;
|
|
85
|
-
// The scroll buttons name no behaviour, so that reduced motion can stop it
|
|
85
|
+
// The scroll buttons name no behaviour, so that reduced motion can stop it
|
|
86
86
|
scroll-behavior: smooth;
|
|
87
87
|
scrollbar-width: none; // Firefox
|
|
88
88
|
-ms-overflow-style: none; // IE and Edge
|
|
@@ -108,7 +108,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
108
108
|
// Tab indicator styling - base styles
|
|
109
109
|
&__indicator {
|
|
110
110
|
position: absolute;
|
|
111
|
-
// On the row's bottom edge, over the divider, as the site draws it.
|
|
111
|
+
// On the row's bottom edge, over the divider, as the site draws it.
|
|
112
112
|
bottom: 0;
|
|
113
113
|
// indicator.ts measures from the scroll container's left edge and moves the
|
|
114
114
|
// indicator with translateX, so it has to start there. Without `left` an
|
|
@@ -117,7 +117,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
117
117
|
left: 0;
|
|
118
118
|
// Compose springs the indicator's offset and width (damping 0.9, stiffness
|
|
119
119
|
// 700): the default spatial spring. indicator.ts moves it without motion on
|
|
120
|
-
// the first render and on resize.
|
|
120
|
+
// the first render and on resize.
|
|
121
121
|
transition: m.spring(transform, default-spatial), m.spring(width, default-spatial);
|
|
122
122
|
z-index: 1; // Ensure indicator appears above divider
|
|
123
123
|
}
|
|
@@ -125,7 +125,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
125
125
|
// Resting position where anchor positioning exists (Baseline 2026). `left: 0`
|
|
126
126
|
// above stays the fallback, and older browsers keep the transform spring.
|
|
127
127
|
// The name is scoped to this component. The active tab carries it; a primary
|
|
128
|
-
// label replaces it so the indicator insets that text.
|
|
128
|
+
// label replaces it so the indicator insets that text.
|
|
129
129
|
@supports (#{string.unquote("anchor-name: --a")}) {
|
|
130
130
|
anchor-scope: string.unquote("--#{base.$prefix}-tabs-indicator");
|
|
131
131
|
$anchor: string.unquote("--#{base.$prefix}-tabs-indicator");
|
|
@@ -228,7 +228,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
// A tab with an icon is a button with an icon, whose text-button padding is
|
|
231
|
-
// 12dp on the icon side: the stacked icon sat 2px off-centre.
|
|
231
|
+
// 12dp on the icon side: the stacked icon sat 2px off-centre.
|
|
232
232
|
&.#{base.$prefix}-button--icon {
|
|
233
233
|
padding: 0 16px;
|
|
234
234
|
}
|
|
@@ -239,7 +239,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
239
239
|
}
|
|
240
240
|
|
|
241
241
|
// md.comp.focus-ring: 3dp in secondary, drawn inward because a tab sits at the
|
|
242
|
-
// row's edge and inside a scroll container that would clip it.
|
|
242
|
+
// row's edge and inside a scroll container that would clip it.
|
|
243
243
|
&:focus-visible {
|
|
244
244
|
outline: 3px solid t.color("secondary");
|
|
245
245
|
outline-offset: -3px;
|
|
@@ -331,7 +331,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
// Pressed state for active tabs
|
|
334
|
-
// A rippled tab leaves the press to its ripple
|
|
334
|
+
// A rippled tab leaves the press to its ripple.
|
|
335
335
|
&:active:not(:has(> .#{base.$prefix}-ripple)),
|
|
336
336
|
&.#{$component}--pressed {
|
|
337
337
|
background-color: t.alpha("primary", v.state("pressed-state-layer-opacity"));
|
|
@@ -346,7 +346,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
346
346
|
|
|
347
347
|
// An inactive tab's label and icon turn on-surface in every interaction
|
|
348
348
|
// state (InactiveHover/Focus/PressedLabelTextColor = OnSurface), over an
|
|
349
|
-
// on-surface layer;
|
|
349
|
+
// on-surface layer;
|
|
350
350
|
&:hover,
|
|
351
351
|
&.#{$component}--hover {
|
|
352
352
|
color: t.color("on-surface");
|
|
@@ -360,7 +360,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
360
360
|
}
|
|
361
361
|
|
|
362
362
|
// The press is primary: "tapping a non-selected tab will select it"
|
|
363
|
-
// (MDC inactive_pressed_state_layer_color). The ripple draws it
|
|
363
|
+
// (MDC inactive_pressed_state_layer_color). The ripple draws it.
|
|
364
364
|
&:active,
|
|
365
365
|
&.#{$component}--pressed {
|
|
366
366
|
color: t.color("on-surface");
|
|
@@ -400,7 +400,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
400
400
|
}
|
|
401
401
|
|
|
402
402
|
// Pressed state for active tabs - secondary
|
|
403
|
-
// A rippled tab leaves the press to its ripple
|
|
403
|
+
// A rippled tab leaves the press to its ripple.
|
|
404
404
|
&:active:not(:has(> .#{base.$prefix}-ripple)),
|
|
405
405
|
&.#{$component}--pressed {
|
|
406
406
|
background-color: t.alpha("on-surface", v.state("pressed-state-layer-opacity"));
|
|
@@ -414,7 +414,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
414
414
|
color: t.color("on-surface-variant");
|
|
415
415
|
|
|
416
416
|
// Secondary tabs: label, icon and layer on-surface in every interaction
|
|
417
|
-
// state, active or not (SecondaryNavigationTabTokens).
|
|
417
|
+
// state, active or not (SecondaryNavigationTabTokens).
|
|
418
418
|
&:hover,
|
|
419
419
|
&.#{$component}--hover {
|
|
420
420
|
color: t.color("on-surface");
|
|
@@ -432,7 +432,7 @@ $container: "#{base.$prefix}-tabs";
|
|
|
432
432
|
color: t.color("on-surface");
|
|
433
433
|
}
|
|
434
434
|
|
|
435
|
-
// A rippled tab leaves the press to its ripple
|
|
435
|
+
// A rippled tab leaves the press to its ripple.
|
|
436
436
|
&:active:not(:has(> .#{base.$prefix}-ripple)),
|
|
437
437
|
&.#{$component}--pressed {
|
|
438
438
|
background-color: t.alpha("on-surface", v.state("pressed-state-layer-opacity"));
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Define the component once
|
|
9
9
|
$component: "#{base.$prefix}-text-field";
|
|
10
10
|
|
|
11
|
-
// Right to left
|
|
11
|
+
// Right to left. Every horizontal inset is a custom property, set
|
|
12
12
|
// once whatever the direction, and the rules in this mixin, at the end of the
|
|
13
13
|
// component's block, are the whole mirror. Two selectors: an ancestor's `dir`,
|
|
14
14
|
// which needs no script, and --rtl, which placement.ts sets from the computed
|
|
@@ -49,13 +49,13 @@ $component: "#{base.$prefix}-text-field";
|
|
|
49
49
|
// Unsized, the field is 280px wide (TextFieldDefaults.MinWidth), not as
|
|
50
50
|
// wide as its input's 20 average characters, which Chrome measures
|
|
51
51
|
// differently per platform for the same font: 167px on macOS, 220px on
|
|
52
|
-
// Linux
|
|
52
|
+
// Linux. A width from the page still applies.
|
|
53
53
|
contain: inline-size;
|
|
54
54
|
contain-intrinsic-inline-size: v.text-field('width');
|
|
55
55
|
// align-self: flex-start; // Prevents growing to fill the container's height
|
|
56
56
|
flex: 0 0 auto; // Don't grow or shrink; keep natural size
|
|
57
57
|
// The container: the label, input, outline, icons and affixes are placed
|
|
58
|
-
// against it, so the supporting text row under it never moves them
|
|
58
|
+
// against it, so the supporting text row under it never moves them
|
|
59
59
|
&__field {
|
|
60
60
|
position: relative;
|
|
61
61
|
display: flex;
|
|
@@ -100,7 +100,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
100
100
|
transition: background-color 0s ease-out 50000000s;
|
|
101
101
|
|
|
102
102
|
// InputPlaceholderColor, shown while the field is focused or has no
|
|
103
|
-
// label: under a resting label it would collide with it
|
|
103
|
+
// label: under a resting label it would collide with it
|
|
104
104
|
&::placeholder {
|
|
105
105
|
color: t.color("on-surface-variant");
|
|
106
106
|
opacity: 1;
|
|
@@ -114,7 +114,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
114
114
|
transition: background-color 5000s ease-in-out 0s; // Long transition to keep the background
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
// Firefox autofill; the animation reports it as on WebKit
|
|
117
|
+
// Firefox autofill; the animation reports it as on WebKit
|
|
118
118
|
&:autofill {
|
|
119
119
|
animation-name: onAutoFillStart;
|
|
120
120
|
animation-duration: 10ms;
|
|
@@ -123,14 +123,14 @@ $component: "#{base.$prefix}-text-field";
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
// The disabled input's -webkit-text-fill-color is inherited by its
|
|
126
|
-
// placeholder and paints over color, so both are cleared
|
|
126
|
+
// placeholder and paints over color, so both are cleared
|
|
127
127
|
&:has(> .#{$component}__field > .#{$component}__label):not(.#{$component}--focused) .#{$component}__input::placeholder {
|
|
128
128
|
color: transparent;
|
|
129
129
|
-webkit-text-fill-color: transparent;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
// While the label rests in the input area it is all that area shows: the
|
|
133
|
-
// prefix and suffix appear as it floats, like the placeholder
|
|
133
|
+
// prefix and suffix appear as it floats, like the placeholder.
|
|
134
134
|
// Resting is the float rules' complement: empty to the script and to the
|
|
135
135
|
// input itself, and not focused.
|
|
136
136
|
&--empty:has(> .#{$component}__field > .#{$component}__label):not(.#{$component}--focused):not(:has(.#{$component}__input:is(:not(:placeholder-shown), :autofill, :-webkit-autofill))) {
|
|
@@ -153,7 +153,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
153
153
|
max-width: 40%; // Prevent extreme overflow
|
|
154
154
|
overflow: hidden;
|
|
155
155
|
text-overflow: ellipsis;
|
|
156
|
-
// opacity as the label floats
|
|
156
|
+
// opacity as the label floats; top where a label is added
|
|
157
157
|
// or removed
|
|
158
158
|
transition:
|
|
159
159
|
top v.motion("duration-short4") v.motion("easing-emphasized"),
|
|
@@ -196,7 +196,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
196
196
|
transition: top v.motion("duration-short4")
|
|
197
197
|
v.motion("easing-emphasized"); // Add transition for top position
|
|
198
198
|
|
|
199
|
-
// LeadingIconSize / TrailingIconSize: 24dp, the whole box
|
|
199
|
+
// LeadingIconSize / TrailingIconSize: 24dp, the whole box
|
|
200
200
|
svg {
|
|
201
201
|
width: 24px;
|
|
202
202
|
height: 24px;
|
|
@@ -219,7 +219,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
219
219
|
transition: top v.motion("duration-short4")
|
|
220
220
|
v.motion("easing-emphasized"); // Add transition for top position
|
|
221
221
|
|
|
222
|
-
// LeadingIconSize / TrailingIconSize: 24dp, the whole box
|
|
222
|
+
// LeadingIconSize / TrailingIconSize: 24dp, the whole box
|
|
223
223
|
svg {
|
|
224
224
|
width: 24px;
|
|
225
225
|
height: 24px;
|
|
@@ -266,7 +266,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
266
266
|
|
|
267
267
|
// What a prefix or a suffix adds before the text: its width, which
|
|
268
268
|
// placement.ts measures into a custom property (32px until it has), and
|
|
269
|
-
// the 2dp to the text (PrefixSuffixTextPadding)
|
|
269
|
+
// the 2dp to the text (PrefixSuffixTextPadding)
|
|
270
270
|
&--with-prefix {
|
|
271
271
|
--#{$component}-prefix-space: calc(var(--#{$component}-prefix-width, 32px) + 2px);
|
|
272
272
|
}
|
|
@@ -291,7 +291,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
291
291
|
|
|
292
292
|
// Disabled state
|
|
293
293
|
// Disabled: the roles at 38%, not the element faded, which also faded
|
|
294
|
-
// the filled container's 4
|
|
294
|
+
// the filled container's 4%. The fill is the filled variant's.
|
|
295
295
|
&--disabled {
|
|
296
296
|
.#{$component}__input {
|
|
297
297
|
color: t.alpha("on-surface", 0.38);
|
|
@@ -319,7 +319,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
// The label comes before the input, so no sibling selector reaches it:
|
|
322
|
-
// the root reads the input's state instead
|
|
322
|
+
// the root reads the input's state instead.
|
|
323
323
|
&:has(.#{$component}__input:disabled) {
|
|
324
324
|
.#{$component}__label,
|
|
325
325
|
.#{$component}__supporting {
|
|
@@ -347,7 +347,6 @@ $component: "#{base.$prefix}-text-field";
|
|
|
347
347
|
// the start, the counter at the end, 4dp below the field and 16dp in from
|
|
348
348
|
// each side (TextFieldDefaults.supportingTextPadding). It was absolute,
|
|
349
349
|
// 18px under the field, so it overlapped what followed and never wrapped
|
|
350
|
-
// (FLO-300).
|
|
351
350
|
&__supporting {
|
|
352
351
|
@include m.typography("body-small");
|
|
353
352
|
display: flex;
|
|
@@ -376,7 +375,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
376
375
|
color: t.color("error");
|
|
377
376
|
}
|
|
378
377
|
|
|
379
|
-
// The required asterisk
|
|
378
|
+
// The required asterisk: part of the label, in its colour and
|
|
380
379
|
// straight after its text, as Material Web appends it. It was the error
|
|
381
380
|
// colour with a 4px gap, a style no element carried until now.
|
|
382
381
|
&__required {
|
|
@@ -439,7 +438,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
439
438
|
transition: opacity v.motion("duration-short4") v.motion("easing-standard");
|
|
440
439
|
|
|
441
440
|
// Here, not in the block above with the label and the outline:
|
|
442
|
-
// this rule comes later and would win over it
|
|
441
|
+
// this rule comes later and would win over it
|
|
443
442
|
@include m.reduced-motion {
|
|
444
443
|
transition: none;
|
|
445
444
|
}
|
|
@@ -455,7 +454,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
455
454
|
|
|
456
455
|
// Floated from the input's own state too: a value, or autofill before
|
|
457
456
|
// the script has seen it. The label precedes the input, so the root
|
|
458
|
-
// reads it
|
|
457
|
+
// reads it.
|
|
459
458
|
&:has(.#{$component}__input:is(:not(:placeholder-shown), :autofill, :-webkit-autofill)) .#{$component}__label {
|
|
460
459
|
transform: translateY(calc(-12px - 37.5%)) scale(0.75);
|
|
461
460
|
}
|
|
@@ -650,7 +649,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
650
649
|
}
|
|
651
650
|
}
|
|
652
651
|
|
|
653
|
-
// LabelColor at full strength: faded to 0.5 it failed 4.5:1
|
|
652
|
+
// LabelColor at full strength: faded to 0.5 it failed 4.5:1
|
|
654
653
|
.#{$component}__label {
|
|
655
654
|
top: 50%;
|
|
656
655
|
}
|
|
@@ -723,7 +722,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
723
722
|
|
|
724
723
|
// Multiline styles
|
|
725
724
|
// The first line and the label are where a single-line field has them
|
|
726
|
-
//
|
|
725
|
+
// Compose places the text with no singleLine branch,
|
|
727
726
|
// `textPosition = topPaddingValue + labelPlaceable.height`. The textarea's
|
|
728
727
|
// own 12px put the first line under the filled field's floated label.
|
|
729
728
|
&--multiline {
|
|
@@ -939,7 +938,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
939
938
|
}
|
|
940
939
|
|
|
941
940
|
// ============================================================================
|
|
942
|
-
// An interactive trailing icon
|
|
941
|
+
// An interactive trailing icon
|
|
943
942
|
// ============================================================================
|
|
944
943
|
// With `trailingIconLabel` the trailing icon is a button: M3 draws an
|
|
945
944
|
// interactive trailing icon as an icon button, as Compose's trailing slot holds
|
|
@@ -990,7 +989,7 @@ $component: "#{base.$prefix}-text-field";
|
|
|
990
989
|
}
|
|
991
990
|
|
|
992
991
|
// The field's mirror, for the button: an ancestor's `dir`, or the
|
|
993
|
-
// field's --rtl inside a shadow root
|
|
992
|
+
// field's --rtl inside a shadow root
|
|
994
993
|
[dir='rtl'] &,
|
|
995
994
|
.#{$component}--rtl & {
|
|
996
995
|
right: auto;
|
|
@@ -13,7 +13,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
13
13
|
position: relative;
|
|
14
14
|
display: inline-block;
|
|
15
15
|
|
|
16
|
-
// A native modal <dialog
|
|
16
|
+
// A native modal <dialog>: the browser centres it in the top layer and
|
|
17
17
|
// draws ::backdrop; the scrim is scrim at 0.32, as for every M3 dialog.
|
|
18
18
|
&__dialog {
|
|
19
19
|
box-sizing: border-box;
|
|
@@ -160,7 +160,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
// Dial mode: the boxes are radios
|
|
163
|
+
// Dial mode: the boxes are radios. TimeSelector tokens: an 8dp
|
|
164
164
|
// surface-container-highest container with an on-surface label, filled
|
|
165
165
|
// primary-container when selected; state layers in the label colour.
|
|
166
166
|
&:not([type="number"]) {
|
|
@@ -242,7 +242,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
242
242
|
background-color: t.alpha('on-surface-variant', v.state('pressed-state-layer-opacity'));
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
-
// No time in this half of the day is inside minTime/maxTime
|
|
245
|
+
// No time in this half of the day is inside minTime/maxTime.
|
|
246
246
|
&[aria-disabled="true"] {
|
|
247
247
|
opacity: 0.38;
|
|
248
248
|
cursor: default;
|
|
@@ -279,7 +279,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
279
279
|
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
-
// The DOM dial
|
|
282
|
+
// The DOM dial, m3.material.io's clock dial: a 256dp surface-container-
|
|
283
283
|
// highest face with Body Large numbers, a 2dp primary track, an 8dp centre dot and
|
|
284
284
|
// a 48dp primary handle; under the handle the numbers read on-primary. One
|
|
285
285
|
// animated angle and radius place the track, the handle and that clipped copy, so
|
|
@@ -334,7 +334,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
334
334
|
// md.comp.focus-ring on the focused number.
|
|
335
335
|
&:focus-visible { outline: 3px solid t.color('secondary'); outline-offset: 2px; }
|
|
336
336
|
|
|
337
|
-
// Outside minTime/maxTime or off the step
|
|
337
|
+
// Outside minTime/maxTime or off the step: M3's disabled content,
|
|
338
338
|
// at 38%.
|
|
339
339
|
&[aria-disabled="true"] { opacity: 0.38; cursor: default; }
|
|
340
340
|
}
|
|
@@ -518,7 +518,7 @@ $component: '#{base.$prefix}-time-picker';
|
|
|
518
518
|
|
|
519
519
|
|
|
520
520
|
// The dial's angle and radius animate as values, so the hand, the handle and the
|
|
521
|
-
// clipped labels move together on one spring
|
|
521
|
+
// clipped labels move together on one spring.
|
|
522
522
|
@property --#{$component}-angle { syntax: '<angle>'; inherits: true; initial-value: 0deg; }
|
|
523
523
|
@property --#{$component}-radius { syntax: '<length>'; inherits: true; initial-value: 101px; }
|
|
524
524
|
|
|
@@ -201,3 +201,51 @@ $component: '#{base.$prefix}-toolbar';
|
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
|
+
|
|
205
|
+
// A toolbar shows a selected item through its colour alone: the m3 toolbars
|
|
206
|
+
// specs give a selected toggle item colour roles and the toolbar token set
|
|
207
|
+
// has no item shape tokens, while a standalone toggle icon button morphs
|
|
208
|
+
// round to square when selected (icon buttons specs) and "their square
|
|
209
|
+
// shape conflicts with the fully-rounded shape of the floating toolbar
|
|
210
|
+
// container". So the morph targets of a round item are pinned to its round
|
|
211
|
+
// radius, selected and pressed. (Pressed is this library's reading of the
|
|
212
|
+
// report — round stays round — not something the toolbars spec asks for.)
|
|
213
|
+
// The pins are each item's own resting round radius, half the container
|
|
214
|
+
// height per size (styles/components/_icon-button.scss, which owns them),
|
|
215
|
+
// and they reach only the bar's direct items:
|
|
216
|
+
// - a round icon button that is a child of the bar in the same tree (a
|
|
217
|
+
// factory toolbar's items and overflow button, and the <m-toolbar>
|
|
218
|
+
// element's own overflow button): a size changed later swaps the size
|
|
219
|
+
// class, and the selector follows;
|
|
220
|
+
// - an icon-button host assigned to the bar's default slot (an
|
|
221
|
+
// <m-icon-button> slotted into an <m-toolbar>), behind its own shadow
|
|
222
|
+
// root where no descendant selector reaches: ::slotted() matches it where
|
|
223
|
+
// it is assigned, by the marker attribute every icon-button host of this
|
|
224
|
+
// library carries whatever its tag prefix (src/elements/icon-button.ts,
|
|
225
|
+
// src/elements/define.ts — the sheet cannot spell a tag the page chose),
|
|
226
|
+
// and [size=…] follows a size changed after insertion, the size attribute
|
|
227
|
+
// being the host's public size (the element exposes no size property to
|
|
228
|
+
// drift from it). The default tag is matched as well, so markup that
|
|
229
|
+
// reaches the browser without the marker by any path — an adapter not
|
|
230
|
+
// writing it, hand-written HTML, a cached page from an older server
|
|
231
|
+
// render — still pins under the default prefix, as before the marker; a
|
|
232
|
+
// custom prefix cannot be spelled and needs the marker. :is() weighs its
|
|
233
|
+
// most specific argument, so the compound keeps the bare attribute's
|
|
234
|
+
// (0,1,0). Another library's icon button keeps the standalone
|
|
235
|
+
// morphs.
|
|
236
|
+
// Anything deeper — an icon button in the overflow menu's content, a dialog
|
|
237
|
+
// or menu opened from the bar, a composite child — matches neither selector
|
|
238
|
+
// and keeps the standalone morphs.
|
|
239
|
+
.#{base.$prefix}-toolbar .#{base.$prefix}-toolbar__bar > .#{base.$prefix}-icon-button--round,
|
|
240
|
+
slot:not([name])::slotted(:is([data-mtrl-icon-button], m-icon-button)) {
|
|
241
|
+
--#{base.$prefix}-icon-button-shape-selected: 20px;
|
|
242
|
+
--#{base.$prefix}-icon-button-shape-pressed: 20px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
@each $size, $radius in ("xs": 16px, "m": 28px, "l": 48px, "xl": 68px) {
|
|
246
|
+
.#{base.$prefix}-toolbar .#{base.$prefix}-toolbar__bar > .#{base.$prefix}-icon-button--round.#{base.$prefix}-icon-button--#{$size},
|
|
247
|
+
slot:not([name])::slotted(:is([data-mtrl-icon-button], m-icon-button)[size=#{$size}]) {
|
|
248
|
+
--#{base.$prefix}-icon-button-shape-selected: #{$radius};
|
|
249
|
+
--#{base.$prefix}-icon-button-shape-pressed: #{$radius};
|
|
250
|
+
}
|
|
251
|
+
}
|