@duskmoon-dev/core 1.9.0 → 1.10.0
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/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 +349 -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/time-input.css +1 -1
- package/dist/components/toast.css +1 -1
- 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/time-input.js +1 -1
- package/dist/esm/components/toast.js +1 -1
- package/dist/esm/components/tooltip.js +2 -2
- package/dist/esm/components/tree-select.js +1 -1
- package/dist/index.css +421 -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/package.json +1 -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%);
|
|
@@ -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%);
|
|
@@ -23,7 +23,7 @@ export const css = `/**
|
|
|
23
23
|
background-color: var(--color-on-surface);
|
|
24
24
|
color: var(--color-surface);
|
|
25
25
|
border-radius: 0.25rem;
|
|
26
|
-
box-shadow:
|
|
26
|
+
box-shadow: var(--shadow-md);
|
|
27
27
|
opacity: 0;
|
|
28
28
|
visibility: hidden;
|
|
29
29
|
transition: opacity 150ms ease-out, visibility 150ms ease-out;
|
|
@@ -152,7 +152,7 @@ export const css = `/**
|
|
|
152
152
|
background-color: var(--color-surface);
|
|
153
153
|
color: var(--color-on-surface);
|
|
154
154
|
border: 1px solid var(--color-outline);
|
|
155
|
-
box-shadow:
|
|
155
|
+
box-shadow: var(--shadow-md);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
.tooltip.tooltip-light .tooltip-content::before {
|
|
@@ -137,7 +137,7 @@ export const css = `/**
|
|
|
137
137
|
background-color: var(--color-surface);
|
|
138
138
|
border: 1px solid var(--color-outline-variant);
|
|
139
139
|
border-radius: 0.5rem;
|
|
140
|
-
box-shadow:
|
|
140
|
+
box-shadow: var(--shadow-md);
|
|
141
141
|
overflow-y: auto;
|
|
142
142
|
}
|
|
143
143
|
|