@rcarls/rc-theme-material 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,83 @@
1
+ # @rcarls/rc-theme-material
2
+
3
+ ## 0.4.1
4
+
5
+ ## 0.4.0
6
+
7
+ ### Minor Changes
8
+
9
+ - e57277f: Add Material 3 search-view, fixed-pane splitter, dialog scrim, and resize enhancements.
10
+
11
+ `rc-search-bar` now supports `variant="view"`, controlled/default open state, search-view methods, a rich `suggestions` slot, and datalist-derived text suggestions. `rc-splitter` adds `mode="fixed"` for clampable pixel primary panes. `rc-common` now honors CSS max-size constraints during resize gestures, and `rc-dialog` exposes a scrim token plus resize handle/origin hooks used by themed surfaces.
12
+
13
+ - c40a1be: Add theme-neutral fast, default, and slow effects and spatial motion token
14
+ pairs. Expose bottom-sheet settle easing through
15
+ `--rc-bottom-sheet-snap-easing` and map sheet settling to the Material spatial
16
+ motion scheme.
17
+
18
+ Give direct-child bottom-sheet handles a full-width 48px interaction target
19
+ while preserving the 32 by 4 pixel visual indicator. Replace rectangular
20
+ mobile browser tap highlights on chips with themeable, shape-clipped state
21
+ layers. Keep bottom-sheet snap targets docked to the block-end edge when CSS
22
+ minimum or maximum sizing constrains their requested heights.
23
+
24
+ Mount declaratively assigned textarea plugins at connection time and remount
25
+ them after reconnection, preserving plugin effects and adopted styles in
26
+ framework render lifecycles.
27
+
28
+ ### Patch Changes
29
+
30
+ - 9c7476d: Add theme-specific rc-button progress treatments, including compact Material spinners and
31
+ Substrate percentage indicators.
32
+ - 3efe74a: Center navigation rail header content on the inline axis and remove Material
33
+ elevation from FABs placed in the header slot.
34
+ - ebec800: Dock bottom sheets without a theme to the viewport block-end by default and
35
+ support absolute positioning for non-modal sheets contained by a positioned ancestor.
36
+ Center authored drag handles with a splitter-aligned pill treatment. Align the
37
+ Material theme with its surface, elevation, scrim, drag-handle, and contextual
38
+ button treatment.
39
+ - e88eff8: Refine semantic card-title typography and icon-button alignment across both
40
+ themes. Simplify Substrate navigation selection, match its bottom-sheet handle
41
+ to the splitter grip, improve inverse notification action contrast, and theme the
42
+ Markdown editor's composed controls.
43
+ - 6f91e7a: Fix collapsed `rc-navigation-rail` items so the whole item's box wraps icon and
44
+ label, not just the icon. The shared component pulled the label out of flow
45
+ (`position: absolute`), so a theme's whole-item background or focus ring only
46
+ covered the icon; Material's detached-pill layout now lives in its own theme
47
+ stylesheet instead of the shared base. Substrate's collapsed rail also grows
48
+ from `5rem` to `6rem` so single-word labels like "Settings" stop wrapping.
49
+ - dce5749: Replace the navigation rail's shadow-DOM fallback toggle with a consumer-authored light-DOM
50
+ button, and align collapsed and expanded item layouts across the default and reference themes.
51
+ - 55e8ab5: Preserve UA-like control and surface styling until an optional theme supplies decorative tokens.
52
+ Restore themed button hover and pressed state layers, including a pointer-origin Material ripple.
53
+ - 4d118ff: Share icon-font size and line-height tokens across themed component icon markers.
54
+ - 3e89095: Replace rc-menu's generated submenu glyph with an author-supplied `indicator`
55
+ slot on rc-menu-button. Keep the decorative indicator inside the trigger bounds,
56
+ reserve label space for it, and expose theme-neutral size, color, and inset
57
+ tokens for Material, Substrate, and application themes.
58
+ - 0dd9ff5: Prevent Material switches from collapsing below their 52 by 32 pixel track geometry in constrained flex and grid layouts.
59
+ - 979b989: Use a zero default gap for tighter chip content layout and a smaller default
60
+ font size for slotted remove icons. Derive removable content padding from the
61
+ remove target width and chip gap so the label and trailing icon stay aligned.
62
+
63
+ ## 0.3.2
64
+
65
+ ## 0.3.1
66
+
67
+ ## 0.3.0
68
+
69
+ ### Added
70
+
71
+ - Add full Material 3 token support.
72
+ - Add Material styling for the FAB back-to-top pattern.
73
+ - Add Material styling for the splitter collapse handle.
74
+
75
+ ### Changed
76
+
77
+ - Normalize listbox, menu, menu-button, and menubar styling through inherited component tokens.
78
+ - Update search-bar elevation, hover, and keyboard-focus styling.
79
+ - Update rc-select selectors for the default native select slot.
80
+ - Update transfer-list listbox backgrounds and action button corner radius.
81
+ - Update package metadata, README intro, and docs links.
82
+
83
+ ## 0.2.0
package/README.md CHANGED
@@ -34,6 +34,16 @@ Selective component styles are also exported:
34
34
  @import '@rcarls/rc-theme-material/components/menu.css';
35
35
  ```
36
36
 
37
+ The state-layer utility is included by `components.css` and `theme.css`, and is
38
+ also exported separately for selective imports:
39
+
40
+ ```css
41
+ @import '@rcarls/rc-theme-material/state-layer.css';
42
+ ```
43
+
44
+ Apply `.rc-state-layer` to interactive elements that already define their own
45
+ border radius when you want a CSS-only Material state layer.
46
+
37
47
  Theme styles are scoped under a `.rc-theme-material` class.
38
48
 
39
49
  ```html
@@ -53,13 +63,18 @@ bridge and component style layers:
53
63
 
54
64
  ## Theming scope
55
65
 
56
- The full style layer will style native controls when their intent is established
57
- by composition (e.g., menu items, button triggers, etc.). Otherwise, It never styles
58
- unrelated application controls and tries to follow design token conventions.
66
+ The full style layer styles native controls when their intent is established by
67
+ composition, for example menu items and button triggers. Otherwise, it does not style
68
+ unrelated application controls and follows design-token conventions.
59
69
 
60
70
  Fonts and icons are not bundled; websites and applications may provide
61
71
  [Roboto](https://fonts.google.com/specimen/Roboto) and
62
72
  [Material Symbols](https://fonts.google.com/icons) through other means.
73
+ Tag general icon-font markup with `data-rc-icon`; component-specific markers
74
+ such as `data-rc-button-icon` and `data-rc-navigation-icon` opt in
75
+ automatically. The shared `--rc-icon-font-size` and
76
+ `--rc-icon-font-line-height` tokens keep glyph geometry consistent and can be
77
+ overridden at the theme boundary or on one component.
63
78
 
64
79
  [Material Web](material-web.dev) token names are used where a corresponding component
65
80
  exists. Search bar and top app bar mappings follow Material 3 token terminology and
package/bridge.css CHANGED
@@ -37,11 +37,80 @@
37
37
  --rc-font-family: var(--md-sys-typescale-body-medium-font, inherit);
38
38
  --rc-font-size: var(--md-sys-typescale-body-medium-size, 0.875rem);
39
39
  --rc-line-height: var(--md-sys-typescale-body-medium-line-height, 1.25rem);
40
+ --rc-icon-font-size: 1.5rem;
41
+ --rc-icon-font-line-height: var(--rc-icon-font-size);
40
42
  --rc-control-block-size: 2.5rem;
41
43
  --rc-control-padding-block: 0.5rem;
42
44
  --rc-control-padding-inline: 1rem;
43
45
  --rc-control-gap: 0.5rem;
44
46
  --rc-control-radius: var(--md-sys-shape-corner-full, 1.25rem);
47
+ --rc-list-item-gap: 1rem;
48
+ --rc-list-item-min-block-size: 3rem;
49
+ --rc-list-item-padding-block: 0;
50
+ --rc-list-item-padding-inline: 1rem;
51
+ --rc-list-item-selected-bg: var(--md-sys-color-secondary-container, Highlight);
52
+ --rc-list-item-selected-color: var(--md-sys-color-on-secondary-container, HighlightText);
53
+ --rc-button-bg: var(--md-sys-color-primary, ButtonFace);
54
+ --rc-button-color: var(--md-sys-color-on-primary, ButtonText);
55
+ --rc-button-block-size: var(--rc-control-block-size);
56
+ --rc-button-radius: var(--rc-control-radius);
57
+ --rc-button-border: 0;
58
+ --rc-button-padding-block: 0;
59
+ --rc-button-padding-inline: 1.5rem;
60
+ --rc-button-gap: var(--rc-control-gap);
61
+ --rc-button-font: 500 var(--md-sys-typescale-label-large-size, 0.875rem) /
62
+ var(--md-sys-typescale-label-large-line-height, 1.25rem) var(--rc-font-family);
63
+ --rc-button-hover-state-layer-opacity: 0.08;
64
+ --rc-button-focus-state-layer-opacity: 0.12;
65
+ --rc-button-pressed-state-layer-opacity: 0.12;
66
+ --rc-card-bg: var(--md-sys-color-surface-container-low, Canvas);
67
+ --rc-card-color: var(--md-sys-color-on-surface, CanvasText);
68
+ --rc-card-radius: var(--md-sys-shape-corner-medium, 0.75rem);
69
+ --rc-card-padding-block: 1rem;
70
+ --rc-card-padding-inline: 1rem;
71
+ --rc-card-actions-gap: 0.5rem;
72
+ --rc-card-hover-state-layer-opacity: 0.08;
73
+ --rc-card-pressed-state-layer-opacity: 0.12;
74
+ --rc-chip-block-size: 2rem;
75
+ --rc-chip-gap: 0px;
76
+ --rc-chip-padding-inline: 1rem;
77
+ --rc-chip-border: 1px solid var(--md-sys-color-outline, ButtonBorder);
78
+ --rc-chip-radius: var(--md-sys-shape-corner-small, 0.5rem);
79
+ --rc-chip-bg: var(--md-sys-color-surface-container-low, ButtonFace);
80
+ --rc-chip-color: var(--md-sys-color-on-surface-variant, ButtonText);
81
+ --rc-chip-font: inherit;
82
+ --rc-chip-text-decoration: none;
83
+ --rc-chip-selected-bg: var(--md-sys-color-secondary-container, Highlight);
84
+ --rc-chip-state-layer-color: var(--md-sys-color-on-surface-variant, CanvasText);
85
+ --rc-chip-selected-state-layer-color: var(--md-sys-color-on-secondary-container, CanvasText);
86
+ --rc-chip-hover-state-layer-opacity: var(--md-sys-state-hover-state-layer-opacity, 0.08);
87
+ --rc-chip-focus-state-layer-opacity: var(--md-sys-state-focus-state-layer-opacity, 0.12);
88
+ --rc-chip-pressed-state-layer-opacity: var(--md-sys-state-pressed-state-layer-opacity, 0.12);
89
+ --rc-chip-state-layer-transition-duration: var(--rc-motion-effects-duration-fast, 150ms);
90
+ --rc-chip-state-layer-transition-easing: var(--rc-motion-effects-easing-fast, ease-out);
91
+ --rc-switch-native-appearance: none;
92
+ --rc-switch-native-inline-size: 100%;
93
+ --rc-switch-native-block-size: 100%;
94
+ --rc-switch-native-margin: 0;
95
+ --rc-switch-native-opacity: 0;
96
+ --rc-switch-decoration-display: block;
97
+ --rc-switch-icon-display: grid;
98
+ --rc-switch-track-inline-size: 3.25rem;
99
+ --rc-switch-track-block-size: 2rem;
100
+ --rc-switch-selected-track-bg: var(--md-sys-color-primary, Highlight);
101
+ --rc-switch-thumb-translate: 1.125rem;
102
+ --rc-segmented-button-segment-min-block-size: 2.5rem;
103
+ --rc-segmented-button-selected-bg: var(--md-sys-color-secondary-container, Highlight);
104
+ --rc-snackbar-bg: var(--md-sys-color-inverse-surface, CanvasText);
105
+ --rc-snackbar-color: var(--md-sys-color-inverse-on-surface, Canvas);
106
+ --rc-snackbar-border: 0;
107
+ --rc-snackbar-action-color: var(--md-sys-color-inverse-primary, LinkText);
108
+ --rc-snackbar-action-border: 0;
109
+ --rc-snackbar-action-radius: 9999px;
110
+ --rc-snackbar-action-padding-block: 0.5rem;
111
+ --rc-snackbar-action-padding-inline: 0.75rem;
112
+ --rc-snackbar-action-bg: transparent;
113
+ --rc-snackbar-action-font: inherit;
45
114
  --rc-toolbar-radius: var(--md-sys-shape-corner-large, 1rem);
46
115
  --rc-toolbar-vertical-radius: 0;
47
116
  --rc-item-padding-block: 0.75rem;
@@ -52,7 +121,30 @@
52
121
  --rc-focus-ring: 2px solid var(--md-sys-color-primary, Highlight);
53
122
  --rc-focus-ring-offset: 2px;
54
123
  --rc-disabled-opacity: var(--md-sys-state-disabled-state-layer-opacity, 0.38);
55
- --rc-motion-duration: 200ms;
124
+ --rc-motion-effects-duration-fast: var(--md-sys-motion-duration-150, 150ms);
125
+ --rc-motion-effects-easing-fast: cubic-bezier(
126
+ var(--md-sys-motion-easing-standard-x0, 0.2),
127
+ var(--md-sys-motion-easing-standard-y0, 0),
128
+ var(--md-sys-motion-easing-standard-x1, 0),
129
+ var(--md-sys-motion-easing-standard-y1, 1)
130
+ );
131
+ --rc-motion-effects-duration-default: var(--md-sys-motion-duration-200, 200ms);
132
+ --rc-motion-effects-easing-default: var(--rc-motion-effects-easing-fast);
133
+ --rc-motion-effects-duration-slow: var(--md-sys-motion-duration-300, 300ms);
134
+ --rc-motion-effects-easing-slow: var(--rc-motion-effects-easing-fast);
135
+ --rc-motion-spatial-duration-fast: var(--md-sys-motion-duration-350, 350ms);
136
+ --rc-motion-spatial-easing-fast: cubic-bezier(
137
+ var(--md-sys-motion-easing-emphasized-x0, 0.2),
138
+ var(--md-sys-motion-easing-emphasized-y0, 0),
139
+ var(--md-sys-motion-easing-emphasized-x1, 0),
140
+ var(--md-sys-motion-easing-emphasized-y1, 1)
141
+ );
142
+ --rc-motion-spatial-duration-default: var(--md-sys-motion-duration-500, 500ms);
143
+ --rc-motion-spatial-easing-default: var(--rc-motion-spatial-easing-fast);
144
+ --rc-motion-spatial-duration-slow: var(--md-sys-motion-duration-700, 700ms);
145
+ --rc-motion-spatial-easing-slow: var(--rc-motion-spatial-easing-fast);
146
+ --rc-motion-duration: var(--rc-motion-effects-duration-default);
147
+ --rc-dialog-scrim: color-mix(in srgb, var(--md-sys-color-scrim, #000) 32%, transparent);
56
148
  }
57
149
 
58
150
  .rc-theme-material rc-select,
@@ -91,10 +183,10 @@
91
183
 
92
184
  .rc-theme-material rc-listbox,
93
185
  :host(.rc-theme-material) rc-listbox {
94
- --rc-listbox-option-gap: 0.75rem;
95
- --rc-listbox-option-min-block-size: 3rem;
96
- --rc-listbox-option-padding-block: 0;
97
- --rc-listbox-option-padding-inline: 0.75rem;
186
+ --rc-listbox-option-gap: var(--rc-list-item-gap, 0.75rem);
187
+ --rc-listbox-option-min-block-size: var(--rc-list-item-min-block-size, 3rem);
188
+ --rc-listbox-option-padding-block: var(--rc-list-item-padding-block, 0);
189
+ --rc-listbox-option-padding-inline: var(--rc-list-item-padding-inline, 0.75rem);
98
190
  --rc-listbox-option-transition: background-color 150ms ease, color 150ms ease;
99
191
  --rc-listbox-hover-bg: color-mix(
100
192
  in srgb,
@@ -108,8 +200,8 @@
108
200
  transparent
109
201
  );
110
202
  --rc-listbox-active-color: var(--md-sys-color-on-surface, CanvasText);
111
- --rc-listbox-selected-bg: var(--md-sys-color-secondary-container, Highlight);
112
- --rc-listbox-selected-color: var(--md-sys-color-on-secondary-container, HighlightText);
203
+ --rc-listbox-selected-bg: var(--rc-list-item-selected-bg, Highlight);
204
+ --rc-listbox-selected-color: var(--rc-list-item-selected-color, HighlightText);
113
205
  --rc-listbox-disabled-opacity: var(--md-sys-state-disabled-state-layer-opacity, 0.38);
114
206
  }
115
207
 
@@ -252,6 +344,27 @@
252
344
  --md-search-bar-input-text-size,
253
345
  var(--md-sys-typescale-body-large-size, 1rem)
254
346
  );
347
+ --rc-search-bar-view-bg: var(
348
+ --md-search-view-container-color,
349
+ var(--md-sys-color-surface-container-high, Field)
350
+ );
351
+ --rc-search-bar-view-color: var(
352
+ --md-search-view-input-text-color,
353
+ var(--md-sys-color-on-surface, FieldText)
354
+ );
355
+ --rc-search-bar-view-radius: var(
356
+ --md-search-view-container-shape,
357
+ var(--md-sys-shape-corner-extra-large, 1.75rem)
358
+ );
359
+ --rc-search-bar-view-shadow: var(--rc-shadow-level3);
360
+ --rc-search-bar-view-padding-block: 0.5rem;
361
+ --rc-search-bar-suggestion-min-block-size: 3rem;
362
+ --rc-search-bar-suggestion-padding-inline: 1rem;
363
+ --rc-search-bar-suggestion-hover-bg: color-mix(
364
+ in srgb,
365
+ var(--md-sys-color-on-surface, CanvasText) 8%,
366
+ transparent
367
+ );
255
368
  }
256
369
 
257
370
  .rc-theme-material rc-app-bar,
@@ -315,8 +428,6 @@
315
428
  --rc-menu-check-color: var(--md-sys-color-primary, Highlight);
316
429
  --rc-menu-shortcut-size: var(--md-sys-typescale-label-large-size, 0.875rem);
317
430
  --rc-menu-shortcut-color: var(--md-sys-color-on-surface-variant, GrayText);
318
- --rc-menu-submenu-indicator-size: 1.25rem;
319
- --rc-menu-submenu-indicator-color: var(--md-sys-color-on-surface-variant, CanvasText);
320
431
  --rc-menu-disabled-color: var(--md-sys-color-on-surface, GrayText);
321
432
  --rc-menu-disabled-opacity: var(--md-sys-state-disabled-state-layer-opacity, 0.38);
322
433
  --rc-menu-separator-border: 1px solid var(--md-sys-color-outline-variant, ButtonBorder);
@@ -345,6 +456,8 @@
345
456
  --rc-menu-button-trigger-hover-color: var(--md-sys-color-primary, ButtonText);
346
457
  --rc-menu-button-trigger-open-background: var(--md-sys-color-secondary-container, ButtonFace);
347
458
  --rc-menu-button-trigger-open-color: var(--md-sys-color-on-secondary-container, ButtonText);
459
+ --rc-menu-button-indicator-size: 1.5rem;
460
+ --rc-menu-button-indicator-color: var(--md-sys-color-on-surface-variant, CanvasText);
348
461
  }
349
462
 
350
463
  .rc-theme-material rc-menubar,
@@ -411,18 +524,59 @@
411
524
  --rc-transfer-list-listbox-border: 1px solid var(--md-sys-color-outline-variant, ButtonBorder);
412
525
  }
413
526
 
527
+ .rc-theme-material rc-navigation-bar,
528
+ :host(.rc-theme-material) rc-navigation-bar {
529
+ --rc-navigation-bar-bg: var(--md-sys-color-surface-container, Canvas);
530
+ --rc-navigation-bar-color: var(--md-sys-color-on-surface-variant, CanvasText);
531
+ --rc-navigation-bar-item-text-decoration: none;
532
+ --rc-navigation-bar-indicator-bg: var(--md-sys-color-secondary-container, Highlight);
533
+ --rc-navigation-bar-indicator-border: 0;
534
+ }
535
+
536
+ .rc-theme-material rc-navigation-rail,
537
+ :host(.rc-theme-material) rc-navigation-rail {
538
+ --rc-navigation-rail-bg: var(--md-sys-color-surface, Canvas);
539
+ --rc-navigation-rail-color: var(--md-sys-color-on-surface-variant, CanvasText);
540
+ --rc-navigation-rail-item-text-decoration: none;
541
+ --rc-navigation-rail-indicator-bg: var(--md-sys-color-secondary-container, Highlight);
542
+ --rc-navigation-rail-indicator-border: 0;
543
+ --rc-navigation-rail-toggle-padding: 0;
544
+ --rc-navigation-rail-toggle-border: 0;
545
+ --rc-navigation-rail-toggle-font: inherit;
546
+ }
547
+ .rc-theme-material rc-navigation-rail > rc-fab[slot='header'],
548
+ :host(.rc-theme-material) rc-navigation-rail > rc-fab[slot='header'] {
549
+ --rc-fab-shadow: none;
550
+ --rc-fab-shadow-hover: none;
551
+ --rc-fab-shadow-active: none;
552
+ }
553
+
414
554
  .rc-theme-material rc-fab,
415
- :host(.rc-theme-material) rc-fab {
555
+ .rc-theme-material rc-fab-menu,
556
+ :host(.rc-theme-material) rc-fab,
557
+ :host(.rc-theme-material) rc-fab-menu {
416
558
  --rc-fab-bg: var(--md-fab-container-color, var(--md-sys-color-primary-container, ButtonFace));
417
559
  --rc-fab-color: var(--md-fab-icon-color, var(--md-sys-color-on-primary-container, ButtonText));
418
560
  --rc-fab-shadow: var(--rc-shadow-level3);
419
561
  --rc-fab-shadow-hover: var(--rc-shadow-level4);
420
562
  --rc-fab-shadow-active: var(--rc-shadow-level3);
421
563
  --rc-fab-radius: var(--md-fab-container-shape, var(--md-sys-shape-corner-large, 1rem));
422
- --rc-fab-font-family: var(--md-fab-label-text-font, var(--md-sys-typescale-label-large-font, inherit));
423
- --rc-fab-font-size: var(--md-fab-label-text-size, var(--md-sys-typescale-label-large-size, 0.875rem));
424
- --rc-fab-font-weight: var(--md-fab-label-text-weight, var(--md-sys-typescale-label-large-weight, 500));
425
- --rc-fab-letter-spacing: var(--md-fab-label-text-tracking, var(--md-sys-typescale-label-large-tracking, 0.00625em));
564
+ --rc-fab-font-family: var(
565
+ --md-fab-label-text-font,
566
+ var(--md-sys-typescale-label-large-font, inherit)
567
+ );
568
+ --rc-fab-font-size: var(
569
+ --md-fab-label-text-size,
570
+ var(--md-sys-typescale-label-large-size, 0.875rem)
571
+ );
572
+ --rc-fab-font-weight: var(
573
+ --md-fab-label-text-weight,
574
+ var(--md-sys-typescale-label-large-weight, 500)
575
+ );
576
+ --rc-fab-letter-spacing: var(
577
+ --md-fab-label-text-tracking,
578
+ var(--md-sys-typescale-label-large-tracking, 0.00625em)
579
+ );
426
580
  --rc-fab-focus-ring: var(--rc-focus-ring);
427
581
  --rc-fab-focus-ring-offset: var(--rc-focus-ring-offset);
428
582
  }
@@ -434,6 +588,23 @@
434
588
  --rc-splitter-handle-color: var(--md-sys-color-on-surface-variant, ButtonBorder);
435
589
  }
436
590
 
591
+ .rc-theme-material rc-bottom-sheet,
592
+ :host(.rc-theme-material) rc-bottom-sheet {
593
+ --rc-bottom-sheet-bg: var(--md-sys-color-surface, Canvas);
594
+ --rc-bottom-sheet-color: var(--md-sys-color-on-surface, CanvasText);
595
+ --rc-bottom-sheet-radius: var(--md-sys-shape-corner-extra-large, 1.75rem)
596
+ var(--md-sys-shape-corner-extra-large, 1.75rem) 0 0;
597
+ --rc-bottom-sheet-shadow: var(--rc-shadow-level1);
598
+ --rc-bottom-sheet-max-inline-size: 40rem;
599
+ --rc-bottom-sheet-max-block-size: 70dvh;
600
+ --rc-bottom-sheet-scrim: color-mix(in srgb, var(--md-sys-color-scrim, #000) 32%, transparent);
601
+ --rc-bottom-sheet-handle-color: color-mix(
602
+ in srgb,
603
+ var(--md-sys-color-on-surface-variant, GrayText) 40%,
604
+ transparent
605
+ );
606
+ --rc-bottom-sheet-handle-radius: var(--md-sys-shape-corner-full, 999px);
607
+ }
437
608
  .rc-theme-material rc-virtual-canvas,
438
609
  :host(.rc-theme-material) rc-virtual-canvas {
439
610
  --rc-virtual-canvas-scrollbar-thumb-background: var(--md-sys-color-outline, ButtonFace);
@@ -27,4 +27,32 @@
27
27
  :is(button, [role='button']):hover {
28
28
  background: color-mix(in srgb, var(--md-sys-color-on-surface, CanvasText) 8%, transparent);
29
29
  }
30
+
31
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-app-bar.rc-app-bar--center-aligned {
32
+ --rc-app-bar-title-font-size: var(
33
+ --md-top-app-bar-headline-size,
34
+ var(--md-sys-typescale-title-large-size, inherit)
35
+ );
36
+ }
37
+
38
+ :where(.rc-theme-material, :host(.rc-theme-material))
39
+ rc-app-bar.rc-app-bar--center-aligned::part(title) {
40
+ text-align: center;
41
+ }
42
+
43
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-app-bar.rc-app-bar--medium {
44
+ --rc-app-bar-expanded-title-font-size: var(
45
+ --md-medium-top-app-bar-headline-size,
46
+ var(--md-sys-typescale-headline-small-size, inherit)
47
+ );
48
+ --rc-app-bar-expanded-padding-block: 1rem;
49
+ }
50
+
51
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-app-bar.rc-app-bar--large {
52
+ --rc-app-bar-expanded-title-font-size: var(
53
+ --md-large-top-app-bar-headline-size,
54
+ var(--md-sys-typescale-headline-medium-size, inherit)
55
+ );
56
+ --rc-app-bar-expanded-padding-block: 1.25rem;
57
+ }
30
58
  }
@@ -0,0 +1,132 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-bottom-sheet {
3
+ --rc-bottom-sheet-bg: var(--md-sys-color-surface, Canvas);
4
+ --rc-bottom-sheet-handle-color: color-mix(
5
+ in srgb,
6
+ var(--md-sys-color-on-surface-variant, GrayText) 40%,
7
+ transparent
8
+ );
9
+ --rc-bottom-sheet-handle-radius: var(--md-sys-shape-corner-full, 999px);
10
+ --rc-bottom-sheet-handle-target-block-size: 3rem;
11
+ --rc-bottom-sheet-snap-duration: var(--rc-motion-spatial-duration-default, 500ms);
12
+ --rc-bottom-sheet-snap-easing: var(
13
+ --rc-motion-spatial-easing-default,
14
+ cubic-bezier(0.2, 0, 0, 1)
15
+ );
16
+ }
17
+
18
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-bottom-sheet > dialog {
19
+ position: fixed;
20
+ inset: auto 0 0;
21
+ box-sizing: border-box;
22
+ inline-size: 100%;
23
+ max-inline-size: var(--rc-bottom-sheet-max-inline-size, 40rem);
24
+ max-block-size: var(--rc-bottom-sheet-max-block-size, 70dvh);
25
+ margin-block: 0;
26
+ margin-inline: auto;
27
+ padding: var(--rc-bottom-sheet-padding, 0 1rem calc(1rem + env(safe-area-inset-bottom, 0px)));
28
+ overflow: auto;
29
+ border: 0;
30
+ border-radius: var(--rc-bottom-sheet-radius, 1.75rem 1.75rem 0 0);
31
+ background: var(--rc-bottom-sheet-bg, var(--md-sys-color-surface, Canvas));
32
+ color: var(--rc-bottom-sheet-color, var(--md-sys-color-on-surface, CanvasText));
33
+ box-shadow: var(--rc-bottom-sheet-shadow, var(--rc-shadow-level1, none));
34
+ font-family: var(--md-sys-typescale-body-medium-font, inherit);
35
+ }
36
+
37
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-bottom-sheet > dialog::backdrop {
38
+ background: var(
39
+ --rc-bottom-sheet-scrim,
40
+ var(--rc-dialog-scrim, color-mix(in srgb, var(--md-sys-color-scrim, #000) 32%, transparent))
41
+ );
42
+ }
43
+
44
+ :where(.rc-theme-material, :host(.rc-theme-material))
45
+ rc-bottom-sheet
46
+ > dialog
47
+ > [data-rc-bottom-sheet-handle] {
48
+ position: relative;
49
+ display: block;
50
+ inline-size: var(--rc-bottom-sheet-handle-target-inline-size, 100%);
51
+ min-block-size: var(--rc-bottom-sheet-handle-target-block-size, 3rem);
52
+ margin: var(--rc-bottom-sheet-handle-target-margin, 0);
53
+ padding: 0;
54
+ border: 0;
55
+ border-radius: inherit;
56
+ background: transparent;
57
+ appearance: none;
58
+ cursor: ns-resize;
59
+ touch-action: none;
60
+ -webkit-tap-highlight-color: transparent;
61
+ }
62
+
63
+ :where(.rc-theme-material, :host(.rc-theme-material))
64
+ rc-bottom-sheet
65
+ > dialog
66
+ > [data-rc-bottom-sheet-handle]::before {
67
+ content: '';
68
+ position: absolute;
69
+ inset-block-start: 50%;
70
+ inset-inline-start: 50%;
71
+ inline-size: var(--rc-bottom-sheet-handle-inline-size, 2rem);
72
+ block-size: var(--rc-bottom-sheet-handle-block-size, 0.25rem);
73
+ border-radius: var(--rc-bottom-sheet-handle-radius, 999px);
74
+ background: var(--rc-bottom-sheet-handle-color, GrayText);
75
+ translate: -50% -50%;
76
+ }
77
+
78
+ :where(.rc-theme-material, :host(.rc-theme-material))
79
+ rc-bottom-sheet
80
+ > dialog
81
+ > [data-rc-bottom-sheet-handle]:focus-visible {
82
+ outline: 0.125rem solid var(--md-sys-color-primary, Highlight);
83
+ outline-offset: -0.25rem;
84
+ }
85
+
86
+ :where(.rc-theme-material, :host(.rc-theme-material))
87
+ rc-bottom-sheet
88
+ > dialog
89
+ > :is(button, [role='button']):not([data-rc-bottom-sheet-handle]) {
90
+ min-block-size: 2.5rem;
91
+ padding-block: 0;
92
+ padding-inline: 1.5rem;
93
+ border: 0;
94
+ border-radius: var(--md-sys-shape-corner-full, 999px);
95
+ background: transparent;
96
+ color: var(--md-sys-color-primary, ButtonText);
97
+ font: var(--md-sys-typescale-label-large-weight, 500)
98
+ var(--md-sys-typescale-label-large-size, 0.875rem) /
99
+ var(--md-sys-typescale-label-large-line-height, 1.25rem)
100
+ var(--md-sys-typescale-label-large-font, inherit);
101
+ letter-spacing: var(--md-sys-typescale-label-large-tracking, 0.00625em);
102
+ }
103
+
104
+ :where(.rc-theme-material, :host(.rc-theme-material))
105
+ rc-bottom-sheet
106
+ > dialog
107
+ > :is(button, [role='button']):not([data-rc-bottom-sheet-handle], :disabled):hover {
108
+ background: color-mix(in srgb, var(--md-sys-color-primary, ButtonText) 8%, transparent);
109
+ }
110
+
111
+ :where(.rc-theme-material, :host(.rc-theme-material))
112
+ rc-bottom-sheet
113
+ > dialog
114
+ > :is(button, [role='button']):not([data-rc-bottom-sheet-handle]):focus-visible {
115
+ outline: var(--rc-focus-ring, 2px solid Highlight);
116
+ outline-offset: var(--rc-focus-ring-offset, 2px);
117
+ }
118
+
119
+ :where(.rc-theme-material, :host(.rc-theme-material))
120
+ rc-bottom-sheet
121
+ > dialog
122
+ > :is(button, [role='button']):not([data-rc-bottom-sheet-handle], :disabled):active {
123
+ background: color-mix(in srgb, var(--md-sys-color-primary, ButtonText) 12%, transparent);
124
+ }
125
+
126
+ :where(.rc-theme-material, :host(.rc-theme-material))
127
+ rc-bottom-sheet
128
+ > dialog
129
+ > :is(button, [role='button']):not([data-rc-bottom-sheet-handle]):disabled {
130
+ opacity: var(--rc-disabled-opacity, 0.38);
131
+ }
132
+ }
@@ -0,0 +1,57 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-button {
3
+ --rc-button-bg: var(--md-sys-color-primary, ButtonFace);
4
+ --rc-button-color: var(--md-sys-color-on-primary, ButtonText);
5
+ --rc-button-border: 0;
6
+ --rc-button-radius: var(--md-sys-shape-corner-full, 9999px);
7
+ --rc-button-block-size: 2.5rem;
8
+ --rc-button-padding-block: 0;
9
+ --rc-button-padding-inline: 1.5rem;
10
+ --rc-button-gap: 0.5rem;
11
+ --rc-button-font: var(--md-sys-typescale-label-large-weight, 500)
12
+ var(--md-sys-typescale-label-large-size, 0.875rem) /
13
+ var(--md-sys-typescale-label-large-line-height, 1.25rem)
14
+ var(--md-sys-typescale-label-large-font, inherit);
15
+ --rc-button-state-layer-bg: var(--md-sys-color-on-primary, currentColor);
16
+ --rc-button-hover-state-layer-opacity: var(--md-sys-state-hover-state-layer-opacity, 0.08);
17
+ --rc-button-focus-state-layer-opacity: var(--md-sys-state-focus-state-layer-opacity, 0.12);
18
+ --rc-button-pressed-state-layer-opacity: var(--md-sys-state-pressed-state-layer-opacity, 0.12);
19
+ --rc-button-state-layer-easing: var(
20
+ --md-sys-motion-easing-standard,
21
+ cubic-bezier(0.2, 0, 0, 1)
22
+ );
23
+ --_rc-button-ripple-enabled: 1;
24
+ --_rc-button-ripple-color: var(--md-sys-color-on-primary, currentColor);
25
+ --_rc-button-ripple-opacity: var(--md-sys-state-pressed-state-layer-opacity, 0.12);
26
+ --_rc-button-ripple-duration: var(--md-sys-motion-duration-long1, 450ms);
27
+ --_rc-button-ripple-easing: var(
28
+ --md-sys-motion-easing-emphasized-decelerate,
29
+ cubic-bezier(0.05, 0.7, 0.1, 1)
30
+ );
31
+ --rc-button-progress-color: var(--md-sys-color-on-primary, ButtonText);
32
+ }
33
+
34
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-button > button:focus-visible {
35
+ outline: var(--rc-focus-ring, 2px solid Highlight);
36
+ outline-offset: var(--rc-focus-ring-offset, 2px);
37
+ }
38
+
39
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-button[disabled] > button:disabled {
40
+ opacity: var(--rc-disabled-opacity, 0.38);
41
+ }
42
+
43
+ :where(.rc-theme-material, :host(.rc-theme-material))
44
+ rc-button[progress][progress-value]::part(progress) {
45
+ font-size: 0;
46
+ }
47
+
48
+ :where(.rc-theme-material, :host(.rc-theme-material))
49
+ rc-button[progress][progress-value]::part(progress)::before {
50
+ display: block;
51
+ }
52
+
53
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-button[icon-only] {
54
+ --rc-button-icon-size: 2.5rem;
55
+ --rc-icon-font-line-height: var(--rc-button-icon-size, 2.5rem);
56
+ }
57
+ }
@@ -0,0 +1,59 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card {
3
+ --rc-card-bg: var(--md-sys-color-surface-container-low, Canvas);
4
+ --rc-card-color: var(--md-sys-color-on-surface, CanvasText);
5
+ --rc-card-radius: var(--md-sys-shape-corner-medium, 0.75rem);
6
+ --rc-card-shadow:
7
+ 0 1px 2px color-mix(in srgb, var(--md-sys-color-shadow, #000) 30%, transparent),
8
+ 0 1px 3px 1px color-mix(in srgb, var(--md-sys-color-shadow, #000) 15%, transparent);
9
+ --rc-card-padding-block: 1rem;
10
+ --rc-card-padding-inline: 1rem;
11
+ --rc-card-actions-gap: 0.5rem;
12
+ --rc-card-title-font: var(--md-sys-typescale-title-medium-weight, 500)
13
+ var(--md-sys-typescale-title-medium-size, 1rem) /
14
+ var(--md-sys-typescale-title-medium-line-height, 1.5rem)
15
+ var(--md-sys-typescale-title-medium-font, inherit);
16
+ --rc-card-subtitle-font: var(--md-sys-typescale-body-medium-weight, 400)
17
+ var(--md-sys-typescale-body-medium-size, 0.875rem) /
18
+ var(--md-sys-typescale-body-medium-line-height, 1.25rem)
19
+ var(--md-sys-typescale-body-medium-font, inherit);
20
+ --rc-card-subtitle-color: var(--md-sys-color-on-surface-variant, CanvasText);
21
+ --rc-card-state-layer-bg: var(--md-sys-color-on-surface, currentColor);
22
+ --rc-card-hover-state-layer-opacity: var(--md-sys-state-hover-state-layer-opacity, 0.08);
23
+ --rc-card-pressed-state-layer-opacity: var(--md-sys-state-pressed-state-layer-opacity, 0.12);
24
+ }
25
+
26
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card[selected] {
27
+ box-shadow:
28
+ 0 0 0 2px var(--md-sys-color-primary, Highlight),
29
+ var(--rc-card-shadow);
30
+ }
31
+
32
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card[disabled] {
33
+ opacity: var(--rc-disabled-opacity, 0.38);
34
+ }
35
+
36
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card > :is(h2, h3)[slot='title'] {
37
+ margin: 0;
38
+ color: var(--rc-card-title-color, inherit);
39
+ }
40
+
41
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card > h2[slot='title'] {
42
+ font-family: var(--md-sys-typescale-title-large-font, inherit);
43
+ font-size: var(--md-sys-typescale-title-large-size, 1.375rem);
44
+ font-weight: var(--md-sys-typescale-title-large-weight, 500);
45
+ line-height: var(--md-sys-typescale-title-large-line-height, 1.75rem);
46
+ }
47
+
48
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card > h3[slot='title'] {
49
+ font-family: var(--md-sys-typescale-title-medium-font, inherit);
50
+ font-size: var(--md-sys-typescale-title-medium-size, 1rem);
51
+ font-weight: var(--md-sys-typescale-title-medium-weight, 500);
52
+ line-height: var(--md-sys-typescale-title-medium-line-height, 1.5rem);
53
+ }
54
+
55
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-card > :is(h2, h3)[slot='title'] > a {
56
+ color: inherit;
57
+ text-decoration: none;
58
+ }
59
+ }