@duskmoon-dev/core 1.8.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.
Files changed (48) hide show
  1. package/dist/components/appbar.css +2 -2
  2. package/dist/components/autocomplete.css +1 -1
  3. package/dist/components/card.css +4 -4
  4. package/dist/components/cascader.css +1 -1
  5. package/dist/components/collapse.css +1 -1
  6. package/dist/components/datepicker.css +2 -2
  7. package/dist/components/dialog.css +1 -1
  8. package/dist/components/drawer.css +1 -1
  9. package/dist/components/file-upload.css +1 -1
  10. package/dist/components/form-group.css +33 -1
  11. package/dist/components/index.css +349 -42
  12. package/dist/components/modal.css +1 -1
  13. package/dist/components/multi-select.css +1 -1
  14. package/dist/components/navigation.css +2 -2
  15. package/dist/components/nested-menu.css +261 -0
  16. package/dist/components/popover.css +28 -16
  17. package/dist/components/snackbar.css +1 -1
  18. package/dist/components/time-input.css +1 -1
  19. package/dist/components/toast.css +1 -1
  20. package/dist/components/tooltip.css +2 -2
  21. package/dist/components/tree-select.css +1 -1
  22. package/dist/esm/components/appbar.js +2 -2
  23. package/dist/esm/components/autocomplete.js +1 -1
  24. package/dist/esm/components/card.js +4 -4
  25. package/dist/esm/components/cascader.js +1 -1
  26. package/dist/esm/components/collapse.js +1 -1
  27. package/dist/esm/components/datepicker.js +2 -2
  28. package/dist/esm/components/dialog.js +1 -1
  29. package/dist/esm/components/drawer.js +1 -1
  30. package/dist/esm/components/file-upload.js +1 -1
  31. package/dist/esm/components/form-group.js +33 -1
  32. package/dist/esm/components/modal.js +1 -1
  33. package/dist/esm/components/multi-select.js +1 -1
  34. package/dist/esm/components/navigation.js +2 -2
  35. package/dist/esm/components/nested-menu.js +268 -0
  36. package/dist/esm/components/popover.js +28 -16
  37. package/dist/esm/components/snackbar.js +1 -1
  38. package/dist/esm/components/time-input.js +1 -1
  39. package/dist/esm/components/toast.js +1 -1
  40. package/dist/esm/components/tooltip.js +2 -2
  41. package/dist/esm/components/tree-select.js +1 -1
  42. package/dist/index.css +439 -91
  43. package/dist/index.min.css +1 -0
  44. package/dist/themes/moonlight.css +34 -16
  45. package/dist/themes/ocean.css +16 -7
  46. package/dist/themes/sunset.css +5 -4
  47. package/dist/themes/sunshine.css +24 -22
  48. 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: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
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: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
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: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
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
- position: absolute;
658
- position-area: bottom;
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
- position-area: top;
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
- position-area: bottom;
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
- position-area: left;
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
- position-area: right;
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
- position-area: bottom start;
701
+ justify-self: start;
690
702
  }
691
703
 
692
704
  .popover-end[popover][style*="position-anchor"] {
693
- position-area: bottom end;
705
+ justify-self: end;
694
706
  }
695
707
 
696
708
  .popover-top.popover-start[popover][style*="position-anchor"] {
697
- position-area: top start;
709
+ justify-self: start;
698
710
  }
699
711
 
700
712
  .popover-top.popover-end[popover][style*="position-anchor"] {
701
- position-area: top end;
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: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
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: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
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: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
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: 0 4px 6px -1px rgb(0 0 0 / 0.1);
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: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
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: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
140
+ box-shadow: var(--shadow-md);
141
141
  overflow-y: auto;
142
142
  }
143
143