@duskmoon-dev/core 1.9.0 → 1.10.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/README.md +3 -3
- package/dist/components/appbar.css +2 -2
- package/dist/components/autocomplete.css +1 -1
- package/dist/components/card.css +4 -4
- package/dist/components/cascader.css +1 -1
- package/dist/components/collapse.css +1 -1
- package/dist/components/datepicker.css +2 -2
- package/dist/components/dialog.css +1 -1
- package/dist/components/drawer.css +1 -1
- package/dist/components/file-upload.css +1 -1
- package/dist/components/form-group.css +33 -1
- package/dist/components/index.css +630 -42
- package/dist/components/modal.css +1 -1
- package/dist/components/multi-select.css +1 -1
- package/dist/components/navigation.css +2 -2
- package/dist/components/nested-menu.css +261 -0
- package/dist/components/popover.css +28 -16
- package/dist/components/snackbar.css +1 -1
- package/dist/components/theme-controller.css +281 -0
- package/dist/components/time-input.css +1 -1
- package/dist/components/toast.css +1 -1
- package/dist/components/toggle.css +274 -0
- package/dist/components/tooltip.css +2 -2
- package/dist/components/tree-select.css +1 -1
- package/dist/esm/components/appbar.js +2 -2
- package/dist/esm/components/autocomplete.js +1 -1
- package/dist/esm/components/card.js +4 -4
- package/dist/esm/components/cascader.js +1 -1
- package/dist/esm/components/collapse.js +1 -1
- package/dist/esm/components/datepicker.js +2 -2
- package/dist/esm/components/dialog.js +1 -1
- package/dist/esm/components/drawer.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/form-group.js +33 -1
- package/dist/esm/components/modal.js +1 -1
- package/dist/esm/components/multi-select.js +1 -1
- package/dist/esm/components/navigation.js +2 -2
- package/dist/esm/components/nested-menu.js +268 -0
- package/dist/esm/components/popover.js +28 -16
- package/dist/esm/components/snackbar.js +1 -1
- package/dist/esm/components/theme-controller.js +288 -0
- package/dist/esm/components/time-input.js +1 -1
- package/dist/esm/components/toast.js +1 -1
- package/dist/esm/components/toggle.js +281 -0
- package/dist/esm/components/tooltip.js +2 -2
- package/dist/esm/components/tree-select.js +1 -1
- package/dist/index.css +702 -73
- package/dist/index.min.css +1 -0
- package/dist/themes/moonlight.css +34 -16
- package/dist/themes/ocean.css +16 -7
- package/dist/themes/sunset.css +5 -4
- package/dist/themes/sunshine.css +6 -4
- package/dist/types/types/plugin.d.ts +1 -1
- package/package.json +21 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// Auto-generated from nested-menu.css
|
|
2
|
+
export const css = `/**
|
|
3
|
+
* Nested Menu Component Styles
|
|
4
|
+
* DuskMoonUI - Sidebar navigation with collapsible cascading levels via <details>/<summary>
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@layer components {
|
|
8
|
+
/* ============================================
|
|
9
|
+
* ROOT CONTAINER
|
|
10
|
+
* ============================================ */
|
|
11
|
+
|
|
12
|
+
.nested-menu {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
list-style: none;
|
|
16
|
+
margin: 0;
|
|
17
|
+
padding: 0.5rem;
|
|
18
|
+
gap: 0.125rem;
|
|
19
|
+
font-size: 0.875rem;
|
|
20
|
+
color: var(--color-on-surface);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* ============================================
|
|
24
|
+
* SECTION TITLES
|
|
25
|
+
* ============================================ */
|
|
26
|
+
|
|
27
|
+
.nested-menu-title {
|
|
28
|
+
padding: 0.75rem 0.75rem 0.25rem;
|
|
29
|
+
font-size: 0.6875rem;
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
text-transform: uppercase;
|
|
32
|
+
letter-spacing: 0.05em;
|
|
33
|
+
color: var(--color-on-surface-variant);
|
|
34
|
+
user-select: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* ============================================
|
|
38
|
+
* MENU ITEMS (links and buttons)
|
|
39
|
+
* ============================================ */
|
|
40
|
+
|
|
41
|
+
.nested-menu li > a,
|
|
42
|
+
.nested-menu li > button {
|
|
43
|
+
display: flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
gap: 0.5rem;
|
|
46
|
+
width: 100%;
|
|
47
|
+
padding: 0.5rem 0.75rem;
|
|
48
|
+
font-size: inherit;
|
|
49
|
+
color: var(--color-on-surface);
|
|
50
|
+
text-decoration: none;
|
|
51
|
+
background-color: transparent;
|
|
52
|
+
border: none;
|
|
53
|
+
border-radius: var(--radius-field, 0.375rem);
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.nested-menu li > a:hover,
|
|
59
|
+
.nested-menu li > button:hover {
|
|
60
|
+
background-color: var(--color-surface-container);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.nested-menu li > a:focus-visible,
|
|
64
|
+
.nested-menu li > button:focus-visible {
|
|
65
|
+
outline: 2px solid var(--color-primary);
|
|
66
|
+
outline-offset: -2px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Active state */
|
|
70
|
+
.nested-menu li > a.active,
|
|
71
|
+
.nested-menu li > button.active,
|
|
72
|
+
.nested-menu li > a[aria-current="page"],
|
|
73
|
+
.nested-menu li > button[aria-current="page"] {
|
|
74
|
+
background-color: var(--color-primary-container);
|
|
75
|
+
color: var(--color-on-primary-container);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.nested-menu li > a.active:hover,
|
|
79
|
+
.nested-menu li > button.active:hover,
|
|
80
|
+
.nested-menu li > a[aria-current="page"]:hover,
|
|
81
|
+
.nested-menu li > button[aria-current="page"]:hover {
|
|
82
|
+
background-color: color-mix(in oklch, var(--color-primary-container), var(--color-on-primary-container) 8%);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Disabled state */
|
|
86
|
+
.nested-menu li.disabled {
|
|
87
|
+
opacity: 0.5;
|
|
88
|
+
pointer-events: none;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* ============================================
|
|
92
|
+
* COLLAPSIBLE SUBMENUS (<details>/<summary>)
|
|
93
|
+
* ============================================ */
|
|
94
|
+
|
|
95
|
+
.nested-menu details {
|
|
96
|
+
width: 100%;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Remove native marker */
|
|
100
|
+
.nested-menu summary {
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
gap: 0.5rem;
|
|
104
|
+
width: 100%;
|
|
105
|
+
padding: 0.5rem 0.75rem;
|
|
106
|
+
font-size: inherit;
|
|
107
|
+
color: var(--color-on-surface);
|
|
108
|
+
background-color: transparent;
|
|
109
|
+
border: none;
|
|
110
|
+
border-radius: var(--radius-field, 0.375rem);
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
list-style: none;
|
|
113
|
+
transition: background-color 150ms ease-in-out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.nested-menu summary::-webkit-details-marker {
|
|
117
|
+
display: none;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.nested-menu summary::marker {
|
|
121
|
+
display: none;
|
|
122
|
+
content: "";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.nested-menu summary:hover {
|
|
126
|
+
background-color: var(--color-surface-container);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.nested-menu summary:focus-visible {
|
|
130
|
+
outline: 2px solid var(--color-primary);
|
|
131
|
+
outline-offset: -2px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Chevron indicator */
|
|
135
|
+
.nested-menu summary::after {
|
|
136
|
+
content: "";
|
|
137
|
+
display: inline-block;
|
|
138
|
+
margin-left: auto;
|
|
139
|
+
width: 0.375rem;
|
|
140
|
+
height: 0.375rem;
|
|
141
|
+
border-right: 1.5px solid currentColor;
|
|
142
|
+
border-bottom: 1.5px solid currentColor;
|
|
143
|
+
transform: rotate(-45deg);
|
|
144
|
+
transition: transform 200ms ease-in-out;
|
|
145
|
+
flex-shrink: 0;
|
|
146
|
+
opacity: 0.6;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.nested-menu details[open] > summary::after {
|
|
150
|
+
transform: rotate(45deg);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Nested <ul> inside details — auto-indentation */
|
|
154
|
+
.nested-menu details > ul {
|
|
155
|
+
list-style: none;
|
|
156
|
+
margin: 0;
|
|
157
|
+
padding: 0.125rem 0 0.125rem 1rem;
|
|
158
|
+
display: flex;
|
|
159
|
+
flex-direction: column;
|
|
160
|
+
gap: 0.125rem;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* ============================================
|
|
164
|
+
* SIZE VARIANTS
|
|
165
|
+
* ============================================ */
|
|
166
|
+
|
|
167
|
+
.nested-menu-xs {
|
|
168
|
+
font-size: 0.75rem;
|
|
169
|
+
padding: 0.25rem;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.nested-menu-xs li > a,
|
|
173
|
+
.nested-menu-xs li > button,
|
|
174
|
+
.nested-menu-xs summary {
|
|
175
|
+
padding: 0.25rem 0.5rem;
|
|
176
|
+
gap: 0.375rem;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.nested-menu-xs .nested-menu-title {
|
|
180
|
+
padding: 0.5rem 0.5rem 0.125rem;
|
|
181
|
+
font-size: 0.625rem;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.nested-menu-sm {
|
|
185
|
+
font-size: 0.8125rem;
|
|
186
|
+
padding: 0.375rem;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.nested-menu-sm li > a,
|
|
190
|
+
.nested-menu-sm li > button,
|
|
191
|
+
.nested-menu-sm summary {
|
|
192
|
+
padding: 0.375rem 0.625rem;
|
|
193
|
+
gap: 0.375rem;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.nested-menu-sm .nested-menu-title {
|
|
197
|
+
padding: 0.625rem 0.625rem 0.1875rem;
|
|
198
|
+
font-size: 0.625rem;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.nested-menu-lg {
|
|
202
|
+
font-size: 1rem;
|
|
203
|
+
padding: 0.625rem;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.nested-menu-lg li > a,
|
|
207
|
+
.nested-menu-lg li > button,
|
|
208
|
+
.nested-menu-lg summary {
|
|
209
|
+
padding: 0.625rem 1rem;
|
|
210
|
+
gap: 0.625rem;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.nested-menu-lg .nested-menu-title {
|
|
214
|
+
padding: 0.875rem 1rem 0.375rem;
|
|
215
|
+
font-size: 0.75rem;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* ============================================
|
|
219
|
+
* MODIFIER VARIANTS
|
|
220
|
+
* ============================================ */
|
|
221
|
+
|
|
222
|
+
/* Bordered — sidebar panel look */
|
|
223
|
+
.nested-menu-bordered {
|
|
224
|
+
background-color: var(--color-surface);
|
|
225
|
+
border: 1px solid var(--color-outline-variant);
|
|
226
|
+
border-radius: var(--radius-card, 0.75rem);
|
|
227
|
+
box-shadow: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Compact — tighter padding throughout */
|
|
231
|
+
.nested-menu-compact {
|
|
232
|
+
padding: 0.25rem;
|
|
233
|
+
gap: 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.nested-menu-compact li > a,
|
|
237
|
+
.nested-menu-compact li > button,
|
|
238
|
+
.nested-menu-compact summary {
|
|
239
|
+
padding: 0.3125rem 0.625rem;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.nested-menu-compact .nested-menu-title {
|
|
243
|
+
padding: 0.5rem 0.625rem 0.125rem;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.nested-menu-compact details > ul {
|
|
247
|
+
padding: 0 0 0 0.75rem;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* ============================================
|
|
251
|
+
* REDUCED MOTION
|
|
252
|
+
* ============================================ */
|
|
253
|
+
|
|
254
|
+
@media (prefers-reduced-motion: reduce) {
|
|
255
|
+
.nested-menu li > a,
|
|
256
|
+
.nested-menu li > button,
|
|
257
|
+
.nested-menu summary,
|
|
258
|
+
.nested-menu summary::after {
|
|
259
|
+
transition: none;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
`;
|
|
264
|
+
|
|
265
|
+
const sheet = new CSSStyleSheet();
|
|
266
|
+
sheet.replaceSync(css);
|
|
267
|
+
export const styles = sheet;
|
|
268
|
+
export default sheet;
|
|
@@ -5,8 +5,8 @@ export const css = `/**
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
@layer components {
|
|
8
|
-
/* Popover Container */
|
|
9
|
-
.popover {
|
|
8
|
+
/* Popover Container (class-based approach only, not native [popover]) */
|
|
9
|
+
.popover:not([popover]) {
|
|
10
10
|
position: relative;
|
|
11
11
|
display: inline-block;
|
|
12
12
|
}
|
|
@@ -21,7 +21,7 @@ export const css = `/**
|
|
|
21
21
|
background-color: var(--color-surface);
|
|
22
22
|
border: 1px solid var(--color-outline-variant);
|
|
23
23
|
border-radius: 0.75rem;
|
|
24
|
-
box-shadow:
|
|
24
|
+
box-shadow: var(--shadow-lg);
|
|
25
25
|
opacity: 0;
|
|
26
26
|
visibility: hidden;
|
|
27
27
|
transform: scale(0.95);
|
|
@@ -56,7 +56,7 @@ export const css = `/**
|
|
|
56
56
|
background-color: var(--color-surface);
|
|
57
57
|
border: 1px solid var(--color-outline-variant);
|
|
58
58
|
border-radius: 0.75rem;
|
|
59
|
-
box-shadow:
|
|
59
|
+
box-shadow: var(--shadow-lg);
|
|
60
60
|
opacity: 0;
|
|
61
61
|
visibility: hidden;
|
|
62
62
|
transition: opacity 150ms ease-out, visibility 150ms ease-out;
|
|
@@ -510,7 +510,7 @@ export const css = `/**
|
|
|
510
510
|
background-color: var(--color-surface);
|
|
511
511
|
border: 1px solid var(--color-outline-variant);
|
|
512
512
|
border-radius: 0.75rem;
|
|
513
|
-
box-shadow:
|
|
513
|
+
box-shadow: var(--shadow-lg);
|
|
514
514
|
opacity: 0;
|
|
515
515
|
transform: scale(0.95);
|
|
516
516
|
transition: opacity 150ms ease-out, transform 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
|
|
@@ -652,53 +652,65 @@ export const css = `/**
|
|
|
652
652
|
style="anchor-name: --my-popover" */
|
|
653
653
|
}
|
|
654
654
|
|
|
655
|
-
/* Anchored popover positioning
|
|
655
|
+
/* Anchored popover positioning
|
|
656
|
+
* Uses anchor() functions instead of position-area to avoid
|
|
657
|
+
* a Chrome rendering bug at HiDPI (DPR>=2) where position-area
|
|
658
|
+
* computes correct CSS-pixel offsets but renders at physical-pixel
|
|
659
|
+
* coordinates, doubling the distance from the anchor. */
|
|
656
660
|
.popover[popover][style*="position-anchor"] {
|
|
657
|
-
|
|
658
|
-
|
|
661
|
+
inset: unset;
|
|
662
|
+
top: anchor(bottom);
|
|
663
|
+
justify-self: anchor-center;
|
|
659
664
|
margin-top: 0.5rem;
|
|
660
665
|
}
|
|
661
666
|
|
|
662
667
|
/* Position variants for anchored popovers */
|
|
663
668
|
.popover-top[popover][style*="position-anchor"] {
|
|
664
|
-
|
|
669
|
+
top: unset;
|
|
670
|
+
bottom: anchor(top);
|
|
665
671
|
margin-top: 0;
|
|
666
672
|
margin-bottom: 0.5rem;
|
|
667
673
|
}
|
|
668
674
|
|
|
669
675
|
.popover-bottom[popover][style*="position-anchor"] {
|
|
670
|
-
|
|
676
|
+
top: anchor(bottom);
|
|
671
677
|
margin-top: 0.5rem;
|
|
672
678
|
margin-bottom: 0;
|
|
673
679
|
}
|
|
674
680
|
|
|
675
681
|
.popover-left[popover][style*="position-anchor"] {
|
|
676
|
-
|
|
682
|
+
top: anchor(center);
|
|
683
|
+
right: anchor(left);
|
|
684
|
+
justify-self: unset;
|
|
685
|
+
translate: 0 -50%;
|
|
677
686
|
margin-top: 0;
|
|
678
687
|
margin-right: 0.5rem;
|
|
679
688
|
}
|
|
680
689
|
|
|
681
690
|
.popover-right[popover][style*="position-anchor"] {
|
|
682
|
-
|
|
691
|
+
top: anchor(center);
|
|
692
|
+
left: anchor(right);
|
|
693
|
+
justify-self: unset;
|
|
694
|
+
translate: 0 -50%;
|
|
683
695
|
margin-top: 0;
|
|
684
696
|
margin-left: 0.5rem;
|
|
685
697
|
}
|
|
686
698
|
|
|
687
699
|
/* Anchored popover alignment variants */
|
|
688
700
|
.popover-start[popover][style*="position-anchor"] {
|
|
689
|
-
|
|
701
|
+
justify-self: start;
|
|
690
702
|
}
|
|
691
703
|
|
|
692
704
|
.popover-end[popover][style*="position-anchor"] {
|
|
693
|
-
|
|
705
|
+
justify-self: end;
|
|
694
706
|
}
|
|
695
707
|
|
|
696
708
|
.popover-top.popover-start[popover][style*="position-anchor"] {
|
|
697
|
-
|
|
709
|
+
justify-self: start;
|
|
698
710
|
}
|
|
699
711
|
|
|
700
712
|
.popover-top.popover-end[popover][style*="position-anchor"] {
|
|
701
|
-
|
|
713
|
+
justify-self: end;
|
|
702
714
|
}
|
|
703
715
|
|
|
704
716
|
/* Reduce Motion */
|
|
@@ -66,7 +66,7 @@ export const css = `/**
|
|
|
66
66
|
background-color: var(--color-surface-container-highest);
|
|
67
67
|
color: var(--color-on-surface);
|
|
68
68
|
border-radius: 0.5rem;
|
|
69
|
-
box-shadow:
|
|
69
|
+
box-shadow: var(--shadow-md);
|
|
70
70
|
pointer-events: auto;
|
|
71
71
|
opacity: 0;
|
|
72
72
|
transform: translateY(100%);
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// Auto-generated from theme-controller.css
|
|
2
|
+
export const css = `/**
|
|
3
|
+
* Theme Controller Component Styles
|
|
4
|
+
* DuskMoonUI - Two display modes for theme switching:
|
|
5
|
+
*
|
|
6
|
+
* 1. Switch (.theme-controller) — inline pill-shaped radio group, all options visible
|
|
7
|
+
* 2. Dropdown (.theme-controller-dropdown) — <details>/<summary> with floating menu
|
|
8
|
+
*
|
|
9
|
+
* Both modes reuse .theme-controller-item (hidden radio) and .theme-controller-label
|
|
10
|
+
* for CSS-only active state via :checked + label.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
@layer components {
|
|
14
|
+
/* ========================================
|
|
15
|
+
* SHARED — Radio input & label (used in both modes)
|
|
16
|
+
* ======================================== */
|
|
17
|
+
|
|
18
|
+
/* Hidden Radio Input — visually hidden but accessible */
|
|
19
|
+
.theme-controller-item {
|
|
20
|
+
position: absolute;
|
|
21
|
+
width: 1px;
|
|
22
|
+
height: 1px;
|
|
23
|
+
padding: 0;
|
|
24
|
+
margin: -1px;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
clip: rect(0, 0, 0, 0);
|
|
27
|
+
white-space: nowrap;
|
|
28
|
+
border: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Visible Label — the clickable option */
|
|
32
|
+
.theme-controller-label {
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
gap: 0.5rem;
|
|
37
|
+
padding: 0.5rem 1rem;
|
|
38
|
+
font-size: 0.875rem;
|
|
39
|
+
font-weight: 500;
|
|
40
|
+
line-height: 1.25rem;
|
|
41
|
+
color: var(--color-on-surface-variant);
|
|
42
|
+
background-color: transparent;
|
|
43
|
+
border-radius: calc(var(--radius-box, 1.5rem) - 0.25rem);
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
transition: background-color 150ms ease-in-out, color 150ms ease-in-out,
|
|
46
|
+
box-shadow 150ms ease-in-out;
|
|
47
|
+
user-select: none;
|
|
48
|
+
white-space: nowrap;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Hover state */
|
|
52
|
+
.theme-controller-label:hover {
|
|
53
|
+
background-color: var(--color-surface-container-high);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Focus-visible ring on the label when its radio is focused */
|
|
57
|
+
.theme-controller-item:focus-visible + .theme-controller-label {
|
|
58
|
+
outline: 2px solid var(--color-primary);
|
|
59
|
+
outline-offset: 2px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Active/checked state */
|
|
63
|
+
.theme-controller-item:checked + .theme-controller-label {
|
|
64
|
+
background-color: var(--color-primary-container);
|
|
65
|
+
color: var(--color-on-primary-container);
|
|
66
|
+
box-shadow: var(--shadow-xs);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.theme-controller-item:checked + .theme-controller-label:hover {
|
|
70
|
+
background-color: color-mix(in oklch, var(--color-primary-container), black 5%);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* ========================================
|
|
74
|
+
* SWITCH MODE — inline pill radio group
|
|
75
|
+
* ======================================== */
|
|
76
|
+
|
|
77
|
+
.theme-controller {
|
|
78
|
+
display: inline-flex;
|
|
79
|
+
align-items: stretch;
|
|
80
|
+
background-color: var(--color-surface-container);
|
|
81
|
+
border: 1px solid var(--color-outline-variant);
|
|
82
|
+
border-radius: var(--radius-box, 1.5rem);
|
|
83
|
+
padding: 0.25rem;
|
|
84
|
+
gap: 0.125rem;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* ── Switch Size Variants ── */
|
|
88
|
+
|
|
89
|
+
.theme-controller-sm {
|
|
90
|
+
padding: 0.125rem;
|
|
91
|
+
border-radius: calc(var(--radius-box, 1.5rem) * 0.75);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.theme-controller-sm .theme-controller-label {
|
|
95
|
+
padding: 0.375rem 0.75rem;
|
|
96
|
+
font-size: 0.75rem;
|
|
97
|
+
line-height: 1rem;
|
|
98
|
+
border-radius: calc(var(--radius-box, 1.5rem) * 0.75 - 0.125rem);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.theme-controller-lg {
|
|
102
|
+
padding: 0.375rem;
|
|
103
|
+
gap: 0.25rem;
|
|
104
|
+
border-radius: calc(var(--radius-box, 1.5rem) * 1.25);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.theme-controller-lg .theme-controller-label {
|
|
108
|
+
padding: 0.75rem 1.5rem;
|
|
109
|
+
font-size: 1rem;
|
|
110
|
+
line-height: 1.5rem;
|
|
111
|
+
border-radius: calc(var(--radius-box, 1.5rem) * 1.25 - 0.375rem);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* ── Switch Icon-only Variant ── */
|
|
115
|
+
|
|
116
|
+
.theme-controller-icon .theme-controller-label {
|
|
117
|
+
padding: 0.5rem;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.theme-controller-icon.theme-controller-sm .theme-controller-label {
|
|
121
|
+
padding: 0.375rem;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.theme-controller-icon.theme-controller-lg .theme-controller-label {
|
|
125
|
+
padding: 0.75rem;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ========================================
|
|
129
|
+
* DROPDOWN MODE — <details>/<summary> with floating menu
|
|
130
|
+
* ======================================== */
|
|
131
|
+
|
|
132
|
+
.theme-controller-dropdown {
|
|
133
|
+
position: relative;
|
|
134
|
+
display: inline-block;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Trigger button (<summary>) */
|
|
138
|
+
.theme-controller-trigger {
|
|
139
|
+
display: inline-flex;
|
|
140
|
+
align-items: center;
|
|
141
|
+
gap: 0.5rem;
|
|
142
|
+
padding: 0.5rem 0.75rem;
|
|
143
|
+
font-size: 0.875rem;
|
|
144
|
+
font-weight: 500;
|
|
145
|
+
line-height: 1.25rem;
|
|
146
|
+
color: var(--color-on-surface);
|
|
147
|
+
background-color: var(--color-surface-container);
|
|
148
|
+
border: 1px solid var(--color-outline-variant);
|
|
149
|
+
border-radius: var(--radius-field, 0.5rem);
|
|
150
|
+
cursor: pointer;
|
|
151
|
+
user-select: none;
|
|
152
|
+
transition: background-color 150ms ease-in-out;
|
|
153
|
+
list-style: none;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.theme-controller-trigger::-webkit-details-marker {
|
|
157
|
+
display: none;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.theme-controller-trigger:hover {
|
|
161
|
+
background-color: var(--color-surface-container-high);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.theme-controller-trigger:focus-visible {
|
|
165
|
+
outline: 2px solid var(--color-primary);
|
|
166
|
+
outline-offset: 2px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Chevron indicator */
|
|
170
|
+
.theme-controller-trigger::after {
|
|
171
|
+
content: '';
|
|
172
|
+
display: inline-block;
|
|
173
|
+
width: 0.5rem;
|
|
174
|
+
height: 0.5rem;
|
|
175
|
+
border-right: 2px solid currentColor;
|
|
176
|
+
border-bottom: 2px solid currentColor;
|
|
177
|
+
transform: rotate(45deg);
|
|
178
|
+
margin-top: -0.125rem;
|
|
179
|
+
transition: transform 150ms ease-in-out;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.theme-controller-dropdown[open] .theme-controller-trigger::after {
|
|
183
|
+
transform: rotate(-135deg);
|
|
184
|
+
margin-top: 0.125rem;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Floating menu */
|
|
188
|
+
.theme-controller-menu {
|
|
189
|
+
position: absolute;
|
|
190
|
+
top: calc(100% + 0.25rem);
|
|
191
|
+
left: 0;
|
|
192
|
+
z-index: 50;
|
|
193
|
+
min-width: 100%;
|
|
194
|
+
background-color: var(--color-surface-container);
|
|
195
|
+
border: 1px solid var(--color-outline-variant);
|
|
196
|
+
border-radius: var(--radius-field, 0.5rem);
|
|
197
|
+
padding: 0.25rem;
|
|
198
|
+
box-shadow: var(--shadow-md);
|
|
199
|
+
display: flex;
|
|
200
|
+
flex-direction: column;
|
|
201
|
+
gap: 0.125rem;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* Menu labels are full-width and left-aligned */
|
|
205
|
+
.theme-controller-menu .theme-controller-label {
|
|
206
|
+
width: 100%;
|
|
207
|
+
justify-content: flex-start;
|
|
208
|
+
border-radius: calc(var(--radius-field, 0.5rem) - 0.25rem);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* ── Dropdown Size Variants ── */
|
|
212
|
+
|
|
213
|
+
.theme-controller-dropdown-sm .theme-controller-trigger {
|
|
214
|
+
padding: 0.375rem 0.625rem;
|
|
215
|
+
font-size: 0.75rem;
|
|
216
|
+
line-height: 1rem;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.theme-controller-dropdown-sm .theme-controller-menu {
|
|
220
|
+
padding: 0.125rem;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.theme-controller-dropdown-sm .theme-controller-menu .theme-controller-label {
|
|
224
|
+
padding: 0.375rem 0.75rem;
|
|
225
|
+
font-size: 0.75rem;
|
|
226
|
+
line-height: 1rem;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.theme-controller-dropdown-lg .theme-controller-trigger {
|
|
230
|
+
padding: 0.75rem 1rem;
|
|
231
|
+
font-size: 1rem;
|
|
232
|
+
line-height: 1.5rem;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.theme-controller-dropdown-lg .theme-controller-menu {
|
|
236
|
+
padding: 0.375rem;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.theme-controller-dropdown-lg .theme-controller-menu .theme-controller-label {
|
|
240
|
+
padding: 0.75rem 1.5rem;
|
|
241
|
+
font-size: 1rem;
|
|
242
|
+
line-height: 1.5rem;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* ── Dropdown Icon-only Trigger ── */
|
|
246
|
+
|
|
247
|
+
.theme-controller-dropdown-icon .theme-controller-trigger {
|
|
248
|
+
padding: 0.5rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Hide chevron for icon-only trigger */
|
|
252
|
+
.theme-controller-dropdown-icon .theme-controller-trigger::after {
|
|
253
|
+
display: none;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.theme-controller-dropdown-icon.theme-controller-dropdown-sm .theme-controller-trigger {
|
|
257
|
+
padding: 0.375rem;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.theme-controller-dropdown-icon.theme-controller-dropdown-lg .theme-controller-trigger {
|
|
261
|
+
padding: 0.75rem;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* ── Dropdown Alignment ── */
|
|
265
|
+
|
|
266
|
+
.theme-controller-dropdown-end .theme-controller-menu {
|
|
267
|
+
left: auto;
|
|
268
|
+
right: 0;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* ========================================
|
|
272
|
+
* REDUCED MOTION
|
|
273
|
+
* ======================================== */
|
|
274
|
+
|
|
275
|
+
@media (prefers-reduced-motion: reduce) {
|
|
276
|
+
.theme-controller-label,
|
|
277
|
+
.theme-controller-trigger,
|
|
278
|
+
.theme-controller-trigger::after {
|
|
279
|
+
transition: none;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
`;
|
|
284
|
+
|
|
285
|
+
const sheet = new CSSStyleSheet();
|
|
286
|
+
sheet.replaceSync(css);
|
|
287
|
+
export const styles = sheet;
|
|
288
|
+
export default sheet;
|
|
@@ -199,7 +199,7 @@ export const css = `/**
|
|
|
199
199
|
background-color: var(--color-surface);
|
|
200
200
|
border: 1px solid var(--color-outline-variant);
|
|
201
201
|
border-radius: 0.5rem;
|
|
202
|
-
box-shadow:
|
|
202
|
+
box-shadow: var(--shadow-md);
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
.time-picker-dropdown-open {
|
|
@@ -67,7 +67,7 @@ export const css = `/**
|
|
|
67
67
|
color: var(--color-on-surface);
|
|
68
68
|
border: 1px solid var(--color-outline);
|
|
69
69
|
border-radius: 0.75rem;
|
|
70
|
-
box-shadow:
|
|
70
|
+
box-shadow: var(--shadow-lg);
|
|
71
71
|
pointer-events: auto;
|
|
72
72
|
opacity: 0;
|
|
73
73
|
transform: translateX(100%);
|