@rcarls/rc-theme-material 0.0.0-next-20260921045401

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +423 -0
  2. package/README.md +164 -0
  3. package/bridge.css +678 -0
  4. package/components/accordion.css +20 -0
  5. package/components/adaptive-menu.css +162 -0
  6. package/components/app-bar.css +100 -0
  7. package/components/bottom-sheet.css +135 -0
  8. package/components/button.css +270 -0
  9. package/components/card.css +61 -0
  10. package/components/carousel.css +23 -0
  11. package/components/chip-group.css +15 -0
  12. package/components/chip.css +39 -0
  13. package/components/combobox.css +155 -0
  14. package/components/dialog.css +86 -0
  15. package/components/disclosure.css +104 -0
  16. package/components/fab-menu.css +85 -0
  17. package/components/fab.css +51 -0
  18. package/components/field.css +378 -0
  19. package/components/icons.css +52 -0
  20. package/components/list-item.css +146 -0
  21. package/components/listbox.css +47 -0
  22. package/components/markdown-editor.css +72 -0
  23. package/components/menu-button.css +126 -0
  24. package/components/menu.css +147 -0
  25. package/components/menubar.css +27 -0
  26. package/components/modes.css +50 -0
  27. package/components/navigation-bar.css +76 -0
  28. package/components/navigation-rail.css +132 -0
  29. package/components/progress.css +15 -0
  30. package/components/range-slider.css +29 -0
  31. package/components/scroller.css +7 -0
  32. package/components/search-bar.css +58 -0
  33. package/components/segmented-button.css +19 -0
  34. package/components/select.css +197 -0
  35. package/components/slider.css +19 -0
  36. package/components/snackbar.css +23 -0
  37. package/components/splitter.css +35 -0
  38. package/components/switch.css +41 -0
  39. package/components/textarea.css +31 -0
  40. package/components/toolbar.css +32 -0
  41. package/components/transfer-list.css +70 -0
  42. package/components/virtual-canvas.css +16 -0
  43. package/components.css +42 -0
  44. package/constraints/material.json +99 -0
  45. package/defaults.css +1081 -0
  46. package/package.json +53 -0
  47. package/state-layer.css +35 -0
  48. package/theme.css +3 -0
@@ -0,0 +1,72 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-markdown-editor {
3
+ --rc-markdown-editor-background: var(--md-sys-color-surface, Canvas);
4
+ --rc-markdown-editor-color: var(--md-sys-color-on-surface, CanvasText);
5
+ --rc-markdown-editor-border: 1px solid var(--md-sys-color-outline, ButtonBorder);
6
+ --rc-markdown-editor-border-radius: 0 0 var(--md-sys-shape-corner-small, 0.5rem)
7
+ var(--md-sys-shape-corner-small, 0.5rem);
8
+ --rc-markdown-editor-focus-outline: 2px solid var(--md-sys-color-primary, Highlight);
9
+ --rc-markdown-editor-padding: 1rem;
10
+ --rc-markdown-editor-toolbar-gap: 0.25rem;
11
+ --rc-markdown-editor-toolbar-button-size: 2.5rem;
12
+ --rc-markdown-editor-toolbar-padding: 0.25rem;
13
+ --rc-markdown-editor-toolbar-radius: var(--md-sys-shape-corner-small, 0.5rem)
14
+ var(--md-sys-shape-corner-small, 0.5rem) 0 0;
15
+ --rc-markdown-editor-toolbar-background: var(--md-sys-color-surface-container, Canvas);
16
+ --rc-markdown-editor-toolbar-color: var(--md-sys-color-on-surface, CanvasText);
17
+ --rc-markdown-editor-toolbar-border: 1px solid var(--md-sys-color-outline, ButtonBorder);
18
+ --rc-markdown-editor-toolbar-button-color: var(--md-sys-color-on-surface-variant, ButtonText);
19
+ --rc-markdown-editor-toolbar-button-border: 0;
20
+ --rc-markdown-editor-toolbar-button-radius: var(--md-sys-shape-corner-full, 999px);
21
+ --rc-markdown-editor-toolbar-button-active-background: var(
22
+ --md-sys-color-secondary-container,
23
+ Highlight
24
+ );
25
+ --rc-markdown-editor-toolbar-button-active-color: var(
26
+ --md-sys-color-on-secondary-container,
27
+ HighlightText
28
+ );
29
+ --rc-markdown-editor-toolbar-button-active-border: 0;
30
+ --rc-markdown-editor-toolbar-button-hover-opacity: var(
31
+ --md-sys-state-hover-state-layer-opacity,
32
+ 0.08
33
+ );
34
+ --rc-markdown-editor-toolbar-button-focus-opacity: var(
35
+ --md-sys-state-focus-state-layer-opacity,
36
+ 0.12
37
+ );
38
+ --rc-markdown-editor-toolbar-button-pressed-opacity: var(
39
+ --md-sys-state-pressed-state-layer-opacity,
40
+ 0.12
41
+ );
42
+ --rc-markdown-editor-toolbar-focus-outline: 2px solid var(--md-sys-color-primary, Highlight);
43
+ --rc-markdown-editor-toolbar-focus-outline-offset: 1px;
44
+ --rc-markdown-editor-toolbar-select-background: var(
45
+ --md-sys-color-surface-container-highest,
46
+ Field
47
+ );
48
+ --rc-markdown-editor-toolbar-select-color: var(--md-sys-color-on-surface, FieldText);
49
+ --rc-markdown-editor-toolbar-select-border: 1px solid var(--md-sys-color-outline, ButtonBorder);
50
+ --rc-markdown-editor-toolbar-select-radius: var(--md-sys-shape-corner-extra-small, 0.25rem);
51
+ --rc-markdown-editor-toolbar-select-active-background: var(
52
+ --md-sys-color-secondary-container,
53
+ Highlight
54
+ );
55
+ --rc-markdown-editor-toolbar-select-active-color: var(
56
+ --md-sys-color-on-secondary-container,
57
+ HighlightText
58
+ );
59
+ --rc-markdown-editor-toolbar-select-active-border-color: var(--md-sys-color-primary, Highlight);
60
+ --rc-markdown-editor-toolbar-input-background: var(
61
+ --md-sys-color-surface-container-highest,
62
+ Field
63
+ );
64
+ --rc-markdown-editor-toolbar-input-color: var(--md-sys-color-on-surface, FieldText);
65
+ --rc-markdown-editor-toolbar-input-border: 1px solid var(--md-sys-color-outline, ButtonBorder);
66
+ --rc-markdown-editor-toolbar-input-radius: var(--md-sys-shape-corner-extra-small, 0.25rem);
67
+ }
68
+
69
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-markdown-editor::part(rich-view) {
70
+ font-family: var(--md-sys-typescale-body-large-font, inherit);
71
+ }
72
+ }
@@ -0,0 +1,126 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu-button {
3
+ font-family: var(--md-sys-typescale-label-large-font, inherit);
4
+ font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
5
+ font-weight: 500;
6
+
7
+ --rc-menu-button-trigger-border: 0;
8
+ --rc-menu-button-trigger-background: transparent;
9
+ --rc-menu-button-trigger-color: var(--md-sys-color-primary, ButtonText);
10
+ --rc-menu-button-trigger-transition:
11
+ background-color var(--rc-motion-effects-duration-fast, 150ms)
12
+ var(--rc-motion-effects-easing-fast, ease),
13
+ color var(--rc-motion-effects-duration-fast, 150ms) var(--rc-motion-effects-easing-fast, ease);
14
+ --rc-menu-button-trigger-hover-background: color-mix(
15
+ in srgb,
16
+ var(--md-sys-color-primary, Highlight) 8%,
17
+ transparent
18
+ );
19
+ --rc-menu-button-trigger-hover-color: var(--md-sys-color-primary, ButtonText);
20
+ --rc-menu-button-trigger-open-background: var(--md-sys-color-secondary-container, ButtonFace);
21
+ --rc-menu-button-trigger-open-color: var(--md-sys-color-on-secondary-container, ButtonText);
22
+ --rc-menu-button-indicator-size: 1.5rem;
23
+ --rc-menu-button-indicator-color: var(--md-sys-color-on-surface-variant, CanvasText);
24
+ }
25
+
26
+ /*
27
+ * MD3 "Small" icon button sizing (40dp square trigger / 24dp icon) for an
28
+ * icon-only rc-menu-button trigger — e.g. an app bar's overflow button.
29
+ * rc-menu-button's own touch-target affordance (min-inline/block-size
30
+ * 3rem on the trigger wrapper, plus the light-DOM hit-slop) makes up the
31
+ * difference to the 48dp minimum tap target on its own.
32
+ * https://m3.material.io/components/icon-buttons/specs
33
+ */
34
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu-button[icon-only] {
35
+ --rc-menu-button-trigger-block-size: 2.5rem;
36
+ --rc-menu-button-trigger-padding-block: 0;
37
+ --rc-menu-button-trigger-padding-inline: 0;
38
+ --rc-menu-button-trigger-gap: 0;
39
+ --rc-menu-button-icon-size: 2.5rem;
40
+ }
41
+
42
+ /* Adaptive overflow keeps the authored menu label in the trigger, so the
43
+ shared label marker is the one direct child that is not icon content. */
44
+ :where(.rc-theme-material, :host(.rc-theme-material))
45
+ rc-menu-button[icon-only]
46
+ > [slot='trigger']
47
+ > :not([data-rc-menu-label]) {
48
+ font-size: var(--rc-icon-button-icon-font-size, 1.5rem);
49
+ line-height: var(--rc-icon-button-icon-font-size, 1.5rem) !important;
50
+ }
51
+
52
+ /*
53
+ * Narrow width: trims the trigger's inline size (32dp, the MD3 "Small"
54
+ * narrow-width spec value) without changing its height. Suits a dense
55
+ * context that already has an unambiguous, self-labeling icon and no
56
+ * neighbors it needs to align widths with — an app bar's trailing
57
+ * overflow trigger is the canonical case, so this also defaults the
58
+ * trailing-edge overlap token: (3rem default touch target - 2rem icon
59
+ * size) / 2, giving back exactly what the touch target would otherwise
60
+ * reserve past the visible trigger. Trailing-edge only, matching the
61
+ * "trailing overflow trigger" framing above -- see rc-button's own
62
+ * narrow-variant comment for why only one side defaults.
63
+ */
64
+ :where(.rc-theme-material, :host(.rc-theme-material))
65
+ rc-menu-button.rc-menu-button--narrow[icon-only] {
66
+ --rc-menu-button-icon-size: 2rem;
67
+ --rc-menu-button-touch-target-overlap-inline-end: 0.5rem;
68
+ }
69
+
70
+ /*
71
+ * A submenu trigger (a cascading menu item that opens a nested rc-menu)
72
+ * is still an rc-menu-button underneath, but MD3 treats it as a menu row
73
+ * with a trailing disclosure chevron — not as its own standalone pill
74
+ * control. The base rule above (and rc-menu-button's own defaults) style
75
+ * it as the latter: a primary-colored, pill-shaped, independently-padded
76
+ * trigger, layered on top of whatever geometry rc-menu's own item CSS
77
+ * (menu.css / rc-base) tries to apply to the same element by virtue of
78
+ * its role="menuitem" — hence the mismatched shape and the icon sitting
79
+ * at a different inset than its sibling rows.
80
+ *
81
+ * The consumer marks this case the same way rc-menu itself expects a
82
+ * cascading item to be marked (role="menuitem" — see menu.css and
83
+ * rc-menu's own light-DOM CSS), so key every geometry/color token here
84
+ * off rc-menu's own item, hover, and active tokens (--rc-menu-item-...,
85
+ * --rc-menu-hover-..., --rc-menu-active-...) instead of hand-matching
86
+ * values that could drift out of sync with a sibling plain-button item
87
+ * later.
88
+ * https://m3.material.io/components/menus/specs
89
+ */
90
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu-button[role='menuitem'] {
91
+ font-family: var(--md-sys-typescale-body-large-font, inherit);
92
+ font-size: var(--md-sys-typescale-body-large-size, 1rem);
93
+ font-weight: 400;
94
+
95
+ --rc-menu-button-trigger-block-size: var(--rc-menu-item-min-block-size, 3rem);
96
+ --rc-menu-button-trigger-padding-block: var(--rc-menu-item-padding-block, 0);
97
+ --rc-menu-button-trigger-padding-inline: var(--rc-menu-item-padding-inline, 0.75rem);
98
+ --rc-menu-button-trigger-gap: var(--rc-menu-item-gap, 0.75rem);
99
+ --rc-menu-button-trigger-radius: 0;
100
+ --rc-menu-button-trigger-border: 0;
101
+ --rc-menu-button-trigger-background: transparent;
102
+ --rc-menu-button-trigger-color: inherit;
103
+ --rc-menu-button-trigger-hover-background: var(--rc-menu-hover-bg);
104
+ --rc-menu-button-trigger-hover-color: var(--rc-menu-hover-color, inherit);
105
+ --rc-menu-button-trigger-open-background: var(--rc-menu-active-bg);
106
+ --rc-menu-button-trigger-open-color: var(--rc-menu-active-color, inherit);
107
+ }
108
+
109
+ /*
110
+ * rc-menu's own light-DOM CSS (rc-base, an even-higher-priority layer
111
+ * than this one — it's registered at custom-element-connect time,
112
+ * after every static stylesheet) matches *any* role="menuitem" element
113
+ * for its generic item padding, which includes this host itself, not
114
+ * just plain-button items. Left alone, that stacks on top of the
115
+ * trigger-inline padding bridged above: the host absorbs one
116
+ * --rc-menu-item-padding-inline, then the trigger button absorbs
117
+ * another, doubling the icon's inset versus a sibling row. The host
118
+ * itself isn't a visible surface — all padding belongs on the one
119
+ * real, visible trigger button — so it needs to contribute zero here,
120
+ * which (since rc-base doesn't mark its own padding !important) is
121
+ * only reachable with !important of our own.
122
+ */
123
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu-button[role='menuitem'] {
124
+ padding-inline: 0 !important;
125
+ }
126
+ }
@@ -0,0 +1,147 @@
1
+ @layer rc-theme-material.components {
2
+ /* Container + token overrides ------------------------------------------- */
3
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu {
4
+ background: var(--md-menu-container-color, var(--md-sys-color-surface-container, Canvas));
5
+ border: none;
6
+ border-radius: var(--md-menu-container-shape, 4px);
7
+ box-shadow:
8
+ 0 1px 2px rgba(0, 0, 0, 0.3),
9
+ 0 2px 6px 2px rgba(0, 0, 0, 0.15);
10
+ padding-block: 0.5rem;
11
+ color: var(--md-sys-color-on-surface, CanvasText);
12
+ font-family: var(--md-sys-typescale-body-large-font, inherit);
13
+ font-size: var(--md-sys-typescale-body-large-size, 1rem);
14
+ line-height: var(--md-sys-typescale-body-large-line-height, 1.5rem);
15
+
16
+ /* Item geometry — M3 menu item: 48dp height, 12dp h-padding, 12dp gap */
17
+ --rc-menu-item-min-block-size: 3rem;
18
+ --rc-menu-item-padding-block: 0;
19
+ --rc-menu-item-padding-inline: 0.75rem;
20
+ --rc-menu-item-gap: 0.75rem;
21
+ --rc-menu-item-transition:
22
+ background-color var(--rc-motion-effects-duration-fast, 150ms)
23
+ var(--rc-motion-effects-easing-fast, ease),
24
+ color var(--rc-motion-effects-duration-fast, 150ms) var(--rc-motion-effects-easing-fast, ease);
25
+
26
+ /* State layers derived from on-surface (M3: 8% hover, 12% keyboard cursor) */
27
+ --rc-menu-hover-bg: color-mix(
28
+ in srgb,
29
+ var(--md-sys-color-on-surface, CanvasText) 8%,
30
+ transparent
31
+ );
32
+ --rc-menu-hover-color: var(--md-sys-color-on-surface, CanvasText);
33
+ --rc-menu-active-bg: color-mix(
34
+ in srgb,
35
+ var(--md-sys-color-on-surface, CanvasText) 12%,
36
+ transparent
37
+ );
38
+ --rc-menu-active-color: var(--md-sys-color-on-surface, CanvasText);
39
+
40
+ /* Check/radio indicator — M3 trailing indicator column is 24dp wide */
41
+ --rc-menu-check-size: 1.5rem;
42
+ --rc-menu-check-color: var(--md-sys-color-primary, Highlight);
43
+
44
+ /* Trailing shortcut labels (label-large) */
45
+ --rc-menu-shortcut-size: var(--md-sys-typescale-label-large-size, 0.875rem);
46
+ --rc-menu-shortcut-color: var(--md-sys-color-on-surface-variant, GrayText);
47
+ /* Dividers: outline-variant, full-width by default */
48
+ --rc-menu-separator-border: 1px solid var(--md-sys-color-outline-variant, ButtonBorder);
49
+ --rc-menu-separator-margin-block: 0.5rem;
50
+
51
+ /* Disabled: M3 uses 38% opacity on on-surface */
52
+ --rc-menu-disabled-color: var(--md-sys-color-on-surface, CanvasText);
53
+ --rc-menu-disabled-opacity: 0.38;
54
+
55
+ /* Section label color */
56
+ --rc-menu-group-label-color: var(--md-sys-color-on-surface-variant, GrayText);
57
+ }
58
+
59
+ /* M3 uses the state-layer cursor, not a container focus ring ------------- */
60
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu:focus-visible {
61
+ outline: none;
62
+ }
63
+
64
+ /*
65
+ * M3 baseline menu items are rectangular full-width rows (unlike a
66
+ * standalone rc-button, which is a pill) — rc-menu's own structural CSS
67
+ * intentionally leaves shape undecided (it's a themed concern), so claim
68
+ * it explicitly here rather than leaving items to whatever shape a
69
+ * consumer's own incidental button styling might otherwise supply.
70
+ */
71
+ :where(.rc-theme-material, :host(.rc-theme-material))
72
+ rc-menu
73
+ :is([role='menuitem'], [role='menuitemcheckbox'], [role='menuitemradio']) {
74
+ border-radius: 0;
75
+ }
76
+
77
+ /*
78
+ * Sizes an item's own leading icon to the M3 menu leading-icon size.
79
+ * Unlike an icon-only rc-button, a menu item routinely combines an icon
80
+ * *and* a label (they aren't mutually exclusive), so "first child" isn't
81
+ * a safe stand-in for "the icon" here the way it is there — this only
82
+ * sizes content the consumer has actually marked as an icon.
83
+ */
84
+ :where(.rc-theme-material, :host(.rc-theme-material))
85
+ rc-menu
86
+ :is([role='menuitem'], [role='menuitemcheckbox'], [role='menuitemradio'])
87
+ :is([data-rc-icon], [data-rc-menu-leading], [data-rc-menu-icon]) {
88
+ flex: none;
89
+ font-size: 1.5rem;
90
+ line-height: 1.5rem;
91
+ }
92
+
93
+ /* Current item (navigation active / selected radio row) gets secondary-container */
94
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu [aria-current='true'] {
95
+ background: var(--md-sys-color-secondary-container, Highlight);
96
+ color: var(--md-sys-color-on-secondary-container, HighlightText);
97
+ }
98
+
99
+ /* M3 single-choice menus use the same trailing check affordance as other
100
+ * selected menu rows; role=menuitemradio continues to carry semantics. */
101
+ :where(.rc-theme-material, :host(.rc-theme-material))
102
+ rc-menu
103
+ [role='menuitemradio'][aria-checked='true']::after {
104
+ content: '✓';
105
+ }
106
+
107
+ /* Section / group labels (optional, for menu segmentation) -------------- */
108
+ /* Add [data-group-label] as first child of role="group" for a visible heading. */
109
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu [data-group-label] {
110
+ padding-block-start: 0.75rem;
111
+ padding-block-end: 0.25rem;
112
+ font-family: var(--md-sys-typescale-label-small-font, inherit);
113
+ font-size: var(--md-sys-typescale-label-small-size, 0.6875rem);
114
+ font-weight: var(--md-sys-typescale-label-small-weight, 500);
115
+ letter-spacing: 0.05em;
116
+ text-transform: uppercase;
117
+ }
118
+
119
+ /* Inset dividers within groups ------------------------------------------ */
120
+ /* Separators inside role="group" are inset by the item padding on both sides.
121
+ This matches the M3 spec for grouped menus (e.g. radio group segments). */
122
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menu [role='group'] > hr,
123
+ :where(.rc-theme-material, :host(.rc-theme-material))
124
+ rc-menu
125
+ [role='group']
126
+ > [role='separator'] {
127
+ --rc-menu-separator-margin-inline: var(--rc-menu-item-padding-inline, 0.75rem);
128
+ }
129
+ }
130
+
131
+ /*
132
+ * Theming notes for rc-menu-button variants:
133
+ *
134
+ * The trigger button in rc-menu-button is already styled via
135
+ * rc-theme-material/components/menu-button.css. If you need a different
136
+ * trigger surface (filled, tonal, outlined) wrap the trigger <button> in
137
+ * the appropriate M3 button variant class rather than overriding menu.css.
138
+ *
139
+ * For a plain/text trigger (the default), the existing menu-button.css
140
+ * sets primary-colored text with an 8% hover state layer.
141
+ *
142
+ * For an outlined variant:
143
+ * rc-menu-button > [slot='trigger'] { border: 1px solid var(--md-sys-color-outline); }
144
+ *
145
+ * For a filled variant:
146
+ * rc-menu-button > [slot='trigger'] { background: var(--md-sys-color-primary); color: var(--md-sys-color-on-primary); }
147
+ */
@@ -0,0 +1,27 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menubar::part(root) {
3
+ box-shadow: var(--rc-shadow-level0, none);
4
+ }
5
+
6
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-menubar {
7
+ --rc-menubar-item-block-size: 2.5rem;
8
+ --rc-menubar-item-padding-block: 0.5rem;
9
+ --rc-menubar-item-padding-inline: 1rem;
10
+ --rc-menubar-item-border: 0;
11
+ --rc-menubar-item-radius: var(--md-sys-shape-corner-full, 999px);
12
+ --rc-menubar-item-background: transparent;
13
+ --rc-menubar-item-color: var(--md-sys-color-primary, CanvasText);
14
+ --rc-menubar-item-transition:
15
+ background-color var(--rc-motion-effects-duration-fast, 150ms)
16
+ var(--rc-motion-effects-easing-fast, ease),
17
+ color var(--rc-motion-effects-duration-fast, 150ms) var(--rc-motion-effects-easing-fast, ease);
18
+ --rc-menubar-item-hover-background: color-mix(
19
+ in srgb,
20
+ var(--md-sys-color-primary, Highlight) 8%,
21
+ transparent
22
+ );
23
+ --rc-menubar-item-hover-color: var(--md-sys-color-primary, CanvasText);
24
+ --rc-menubar-item-open-background: var(--md-sys-color-secondary-container, ButtonFace);
25
+ --rc-menubar-item-open-color: var(--md-sys-color-on-secondary-container, ButtonText);
26
+ }
27
+ }
@@ -0,0 +1,50 @@
1
+ @layer rc-theme-material.components {
2
+ /*
3
+ * The vestibular harm reduced motion guards against is movement across the
4
+ * visual field: a cross-fade or a color change doesn't trigger it, so
5
+ * removing every transition (the previous *, !important sweep) over-
6
+ * corrected, and it also silently removed the ones that aid comprehension.
7
+ * Spatial motion still goes to zero; effects motion is kept but shortened,
8
+ * which the spatial/effects split makes expressible for the first time.
9
+ * Values are read as custom properties rather than reasserted with
10
+ * !important, so this only reaches whatever already consumes the shared
11
+ * motion tokens or the Material duration primitives. Components that
12
+ * still handle prefers-reduced-motion with their own blunt sweep are
13
+ * refined in their own component styles; this file no longer
14
+ * compensates for that with a second, theme-wide !important override.
15
+ */
16
+ @media (prefers-reduced-motion: reduce) {
17
+ :where(.rc-theme-material, :host(.rc-theme-material)) {
18
+ --rc-motion-spatial-duration-fast: 0ms;
19
+ --rc-motion-spatial-duration-default: 0ms;
20
+ --rc-motion-spatial-duration-slow: 0ms;
21
+ --rc-motion-effects-duration-fast: 50ms;
22
+ --rc-motion-effects-duration-default: 70ms;
23
+ --rc-motion-effects-duration-slow: 100ms;
24
+ --rc-motion-duration: var(--rc-motion-effects-duration-default);
25
+ }
26
+ }
27
+
28
+ @media (forced-colors: active) {
29
+ :where(.rc-theme-material, :host(.rc-theme-material))
30
+ :is(
31
+ rc-select,
32
+ rc-combobox,
33
+ rc-search-bar,
34
+ rc-textarea,
35
+ rc-markdown-editor,
36
+ rc-menu,
37
+ rc-menubar,
38
+ rc-toolbar,
39
+ rc-dialog > dialog
40
+ ) {
41
+ forced-color-adjust: auto;
42
+ box-shadow: none;
43
+ }
44
+
45
+ :where(.rc-theme-material, :host(.rc-theme-material))
46
+ :is(button, [role='button'], [role^='menuitem']):focus-visible {
47
+ outline: 2px solid Highlight;
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,76 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-bar {
3
+ --rc-navigation-bar-bg: var(--md-sys-color-surface-container, Canvas);
4
+ --rc-navigation-bar-color: var(--md-sys-color-on-surface-variant, CanvasText);
5
+ --rc-navigation-bar-block-size: calc(5rem + env(safe-area-inset-bottom, 0px));
6
+ --rc-navigation-bar-padding-block: 0 0;
7
+ --rc-navigation-bar-padding-inline: 0;
8
+ --rc-navigation-bar-item-min-block-size: 5rem;
9
+ --rc-navigation-bar-item-padding-block: 0.75rem 1rem;
10
+ --rc-navigation-bar-item-padding-inline: 0.75rem;
11
+ --rc-navigation-bar-item-gap: 0.25rem;
12
+ --rc-navigation-bar-item-color: var(--md-sys-color-on-surface-variant, CanvasText);
13
+ --rc-navigation-bar-item-text-decoration: none;
14
+ --rc-navigation-bar-active-color: var(--md-sys-color-on-surface, CanvasText);
15
+ --rc-navigation-bar-indicator-bg: var(--md-sys-color-secondary-container, Highlight);
16
+ --rc-navigation-bar-indicator-border: 0;
17
+ --rc-navigation-bar-indicator-radius: var(--md-sys-shape-corner-full, 9999px);
18
+ /* The indicator resizes to the selected item's box, which is spatial motion. */
19
+ --rc-navigation-bar-indicator-duration: var(--rc-motion-spatial-duration-fast, 300ms);
20
+ --rc-navigation-bar-indicator-easing: var(--rc-motion-spatial-easing-fast, ease);
21
+ --rc-icon-font-line-height: 2rem;
22
+ --rc-navigation-bar-focus-ring: 2px solid var(--md-sys-color-primary, Highlight);
23
+ --rc-navigation-bar-focus-ring-offset: 2px;
24
+ padding-block-end: env(safe-area-inset-bottom, 0px);
25
+ }
26
+
27
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-bar > a {
28
+ font-family: var(--md-sys-typescale-label-medium-font, inherit);
29
+ font-size: var(--md-sys-typescale-label-medium-size, 0.75rem);
30
+ font-weight: var(--md-sys-typescale-label-medium-weight, 500);
31
+ line-height: var(--md-sys-typescale-label-medium-line-height, 1rem);
32
+ letter-spacing: var(--md-sys-typescale-label-medium-tracking, 0.03125rem);
33
+ }
34
+
35
+ :where(.rc-theme-material, :host(.rc-theme-material))
36
+ rc-navigation-bar
37
+ > a
38
+ :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
39
+ display: inline-grid;
40
+ place-items: center;
41
+ inline-size: 4rem;
42
+ block-size: 2rem;
43
+ border-radius: var(--md-sys-shape-corner-full, 9999px);
44
+ }
45
+
46
+ :where(.rc-theme-material, :host(.rc-theme-material))
47
+ rc-navigation-bar
48
+ > a:hover
49
+ :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
50
+ background: color-mix(
51
+ in srgb,
52
+ var(--md-sys-color-on-surface, CanvasText)
53
+ calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 100%),
54
+ transparent
55
+ );
56
+ }
57
+
58
+ :where(.rc-theme-material, :host(.rc-theme-material))
59
+ rc-navigation-bar
60
+ > a:active
61
+ :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
62
+ background: color-mix(
63
+ in srgb,
64
+ var(--md-sys-color-on-surface, CanvasText)
65
+ calc(var(--md-sys-state-pressed-state-layer-opacity, 0.12) * 100%),
66
+ transparent
67
+ );
68
+ }
69
+
70
+ :where(.rc-theme-material, :host(.rc-theme-material))
71
+ rc-navigation-bar
72
+ > a[aria-current]:not([aria-current='false'])
73
+ :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
74
+ color: var(--md-sys-color-on-secondary-container, CanvasText);
75
+ }
76
+ }
@@ -0,0 +1,132 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-rail {
3
+ --rc-navigation-rail-bg: var(--md-sys-color-surface, Canvas);
4
+ --rc-navigation-rail-color: var(--md-sys-color-on-surface-variant, CanvasText);
5
+ --rc-navigation-rail-inline-size: 5rem;
6
+ --rc-navigation-rail-expanded-inline-size: 16rem;
7
+ --rc-navigation-rail-padding-block: 0.75rem;
8
+ --rc-navigation-rail-padding-inline: 0.5rem;
9
+ --rc-navigation-rail-gap: 1rem;
10
+ --rc-navigation-rail-item-gap: 0.75rem;
11
+ --rc-navigation-rail-item-min-block-size: 3.5rem;
12
+ --rc-navigation-rail-expanded-item-min-block-size: 3.5rem;
13
+ --rc-navigation-rail-item-padding-inline: 0.5rem;
14
+ --rc-navigation-rail-expanded-item-padding-inline: var(
15
+ --rc-navigation-rail-item-padding-inline
16
+ );
17
+ --rc-navigation-rail-item-color: var(--md-sys-color-on-surface-variant, CanvasText);
18
+ --rc-navigation-rail-item-text-decoration: none;
19
+ --rc-navigation-rail-active-color: var(--md-sys-color-on-surface, CanvasText);
20
+ --rc-navigation-rail-indicator-bg: var(--md-sys-color-secondary-container, Highlight);
21
+ --rc-navigation-rail-indicator-border: 0;
22
+ --rc-navigation-rail-indicator-radius: var(--md-sys-shape-corner-full, 9999px);
23
+ --rc-navigation-rail-toggle-size: 3rem;
24
+ --rc-navigation-rail-toggle-inline-offset: 1rem;
25
+ --rc-navigation-rail-duration: var(--rc-motion-spatial-duration-fast, 300ms);
26
+ --rc-navigation-rail-easing: var(--rc-motion-spatial-easing-fast, ease);
27
+ /* The indicator resizes to the selected item's box, which is spatial motion. */
28
+ --rc-navigation-rail-indicator-duration: var(--rc-motion-spatial-duration-fast, 300ms);
29
+ --rc-navigation-rail-indicator-easing: var(--rc-motion-spatial-easing-fast, ease);
30
+ --rc-icon-font-line-height: 2rem;
31
+ --rc-navigation-rail-focus-ring: 2px solid var(--md-sys-color-primary, Highlight);
32
+ --rc-navigation-rail-focus-ring-offset: 2px;
33
+ }
34
+
35
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-rail > rc-fab[slot='header'] {
36
+ --rc-fab-shadow: none;
37
+ --rc-fab-shadow-hover: none;
38
+ --rc-fab-shadow-active: none;
39
+ }
40
+
41
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-rail > a {
42
+ align-items: flex-start;
43
+ inline-size: 100%;
44
+ font-family: var(--md-sys-typescale-label-medium-font, inherit);
45
+ font-size: var(--md-sys-typescale-label-medium-size, 0.75rem);
46
+ font-weight: var(--md-sys-typescale-label-medium-weight, 500);
47
+ line-height: var(--md-sys-typescale-label-medium-line-height, 1rem);
48
+ letter-spacing: var(--md-sys-typescale-label-medium-tracking, 0.03125rem);
49
+ }
50
+
51
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-navigation-rail[expanded] > a {
52
+ font-family: var(--md-sys-typescale-label-large-font, inherit);
53
+ font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
54
+ font-weight: var(--md-sys-typescale-label-large-weight, 500);
55
+ line-height: var(--md-sys-typescale-label-large-line-height, 1.25rem);
56
+ letter-spacing: var(--md-sys-typescale-label-large-tracking, 0.00625rem);
57
+ }
58
+
59
+ :where(.rc-theme-material, :host(.rc-theme-material))
60
+ rc-navigation-rail
61
+ > a
62
+ > :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
63
+ display: inline-grid;
64
+ place-items: center;
65
+ inline-size: 3.5rem;
66
+ block-size: 2rem;
67
+ border-radius: var(--md-sys-shape-corner-full, 9999px);
68
+ }
69
+
70
+ :where(.rc-theme-material, :host(.rc-theme-material))
71
+ rc-navigation-rail[expanded]
72
+ > a
73
+ > :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
74
+ display: inline-flex;
75
+ justify-content: flex-start;
76
+ gap: 0.75rem;
77
+ inline-size: 100%;
78
+ block-size: 3.5rem;
79
+ padding-inline: 1rem;
80
+ box-sizing: border-box;
81
+ text-align: start;
82
+ }
83
+
84
+ /*
85
+ * MD3 collapsed items keep a fixed-size pill behind the icon only; the
86
+ * caption label renders below it, detached from the pill's own box.
87
+ */
88
+ :where(.rc-theme-material, :host(.rc-theme-material))
89
+ rc-navigation-rail:not([expanded])
90
+ > a
91
+ > [data-rc-navigation-indicator]
92
+ > :not([data-rc-navigation-icon]) {
93
+ position: absolute;
94
+ inset-block-start: calc(100% + var(--rc-navigation-rail-link-gap, 0.25rem));
95
+ inset-inline-start: 50%;
96
+ inline-size: max-content;
97
+ font-size: var(--md-sys-typescale-label-medium-size, 0.75rem);
98
+ line-height: var(--md-sys-typescale-label-medium-line-height, 1rem);
99
+ translate: -50% 0;
100
+ }
101
+
102
+ :where(.rc-theme-material, :host(.rc-theme-material))
103
+ rc-navigation-rail
104
+ > a:hover
105
+ > :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
106
+ background: color-mix(
107
+ in srgb,
108
+ var(--md-sys-color-on-surface, CanvasText)
109
+ calc(var(--md-sys-state-hover-state-layer-opacity, 0.08) * 100%),
110
+ transparent
111
+ );
112
+ }
113
+
114
+ :where(.rc-theme-material, :host(.rc-theme-material))
115
+ rc-navigation-rail
116
+ > a:active
117
+ > :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
118
+ background: color-mix(
119
+ in srgb,
120
+ var(--md-sys-color-on-surface, CanvasText)
121
+ calc(var(--md-sys-state-pressed-state-layer-opacity, 0.12) * 100%),
122
+ transparent
123
+ );
124
+ }
125
+
126
+ :where(.rc-theme-material, :host(.rc-theme-material))
127
+ rc-navigation-rail
128
+ > a[aria-current]:not([aria-current='false'])
129
+ > :where([data-rc-navigation-icon], [data-rc-navigation-indicator]) {
130
+ color: var(--md-sys-color-on-secondary-container, CanvasText);
131
+ }
132
+ }
@@ -0,0 +1,15 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-progress::part(value-display) {
3
+ color: var(--md-sys-color-on-surface-variant, GrayText);
4
+ font-size: var(--md-sys-typescale-label-small-size, 0.75rem);
5
+ }
6
+
7
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-progress[disabled] {
8
+ opacity: var(--md-sys-state-disabled-state-layer-opacity, 0.38);
9
+ }
10
+
11
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-progress {
12
+ --rc-progress-fill-transition-duration: var(--rc-motion-effects-duration-fast, 150ms);
13
+ --rc-progress-fill-transition-easing: var(--rc-motion-effects-easing-fast, ease-out);
14
+ }
15
+ }
@@ -0,0 +1,29 @@
1
+ @layer rc-theme-material.components {
2
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-range-slider::part(thumb) {
3
+ border-width: 0;
4
+ border-radius: var(--md-sys-shape-corner-full, 999px);
5
+ box-shadow: 0 0 0 0 transparent;
6
+ transition:
7
+ box-shadow var(--rc-motion-effects-duration-fast, 150ms)
8
+ var(--rc-motion-effects-easing-fast, ease),
9
+ scale var(--rc-motion-spatial-duration-fast, 300ms) var(--rc-motion-spatial-easing-fast, ease);
10
+ }
11
+
12
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-range-slider::part(thumb):hover {
13
+ box-shadow: 0 0 0 0.5rem
14
+ color-mix(in srgb, var(--md-sys-color-primary, Highlight) 8%, transparent);
15
+ }
16
+
17
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-range-slider::part(thumb):active {
18
+ box-shadow: 0 0 0 0.625rem
19
+ color-mix(in srgb, var(--md-sys-color-primary, Highlight) 12%, transparent);
20
+ scale: 0.9;
21
+ }
22
+
23
+ :where(.rc-theme-material, :host(.rc-theme-material)) rc-range-slider::part(value-display) {
24
+ padding: 0.25rem 0.5rem;
25
+ border-radius: var(--md-sys-shape-corner-extra-small, 0.25rem);
26
+ background: var(--md-sys-color-inverse-surface, var(--md-sys-color-on-surface, CanvasText));
27
+ color: var(--md-sys-color-inverse-on-surface, var(--md-sys-color-surface, Canvas));
28
+ }
29
+ }