@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.
Files changed (54) hide show
  1. package/README.md +3 -3
  2. package/dist/components/appbar.css +2 -2
  3. package/dist/components/autocomplete.css +1 -1
  4. package/dist/components/card.css +4 -4
  5. package/dist/components/cascader.css +1 -1
  6. package/dist/components/collapse.css +1 -1
  7. package/dist/components/datepicker.css +2 -2
  8. package/dist/components/dialog.css +1 -1
  9. package/dist/components/drawer.css +1 -1
  10. package/dist/components/file-upload.css +1 -1
  11. package/dist/components/form-group.css +33 -1
  12. package/dist/components/index.css +630 -42
  13. package/dist/components/modal.css +1 -1
  14. package/dist/components/multi-select.css +1 -1
  15. package/dist/components/navigation.css +2 -2
  16. package/dist/components/nested-menu.css +261 -0
  17. package/dist/components/popover.css +28 -16
  18. package/dist/components/snackbar.css +1 -1
  19. package/dist/components/theme-controller.css +281 -0
  20. package/dist/components/time-input.css +1 -1
  21. package/dist/components/toast.css +1 -1
  22. package/dist/components/toggle.css +274 -0
  23. package/dist/components/tooltip.css +2 -2
  24. package/dist/components/tree-select.css +1 -1
  25. package/dist/esm/components/appbar.js +2 -2
  26. package/dist/esm/components/autocomplete.js +1 -1
  27. package/dist/esm/components/card.js +4 -4
  28. package/dist/esm/components/cascader.js +1 -1
  29. package/dist/esm/components/collapse.js +1 -1
  30. package/dist/esm/components/datepicker.js +2 -2
  31. package/dist/esm/components/dialog.js +1 -1
  32. package/dist/esm/components/drawer.js +1 -1
  33. package/dist/esm/components/file-upload.js +1 -1
  34. package/dist/esm/components/form-group.js +33 -1
  35. package/dist/esm/components/modal.js +1 -1
  36. package/dist/esm/components/multi-select.js +1 -1
  37. package/dist/esm/components/navigation.js +2 -2
  38. package/dist/esm/components/nested-menu.js +268 -0
  39. package/dist/esm/components/popover.js +28 -16
  40. package/dist/esm/components/snackbar.js +1 -1
  41. package/dist/esm/components/theme-controller.js +288 -0
  42. package/dist/esm/components/time-input.js +1 -1
  43. package/dist/esm/components/toast.js +1 -1
  44. package/dist/esm/components/toggle.js +281 -0
  45. package/dist/esm/components/tooltip.js +2 -2
  46. package/dist/esm/components/tree-select.js +1 -1
  47. package/dist/index.css +702 -73
  48. package/dist/index.min.css +1 -0
  49. package/dist/themes/moonlight.css +34 -16
  50. package/dist/themes/ocean.css +16 -7
  51. package/dist/themes/sunset.css +5 -4
  52. package/dist/themes/sunshine.css +6 -4
  53. package/dist/types/types/plugin.d.ts +1 -1
  54. package/package.json +21 -1
@@ -66,7 +66,7 @@
66
66
  color: var(--color-on-surface);
67
67
  border: 1px solid var(--color-outline);
68
68
  border-radius: 0.75rem;
69
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
69
+ box-shadow: var(--shadow-lg);
70
70
  pointer-events: auto;
71
71
  opacity: 0;
72
72
  transform: translateX(100%);
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Toggle Button Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired toggle button
4
+ * Used for selecting between multiple options or toggling states
5
+ */
6
+
7
+ @layer components {
8
+ /* Base toggle button */
9
+ .toggle-btn {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ gap: 0.5rem;
14
+ padding: 0.625rem 1rem;
15
+ font-size: 0.875rem;
16
+ font-weight: 500;
17
+ line-height: 1.25rem;
18
+ color: var(--color-on-surface-variant);
19
+ background-color: transparent;
20
+ border: 1px solid var(--color-outline);
21
+ border-radius: 0.5rem;
22
+ cursor: pointer;
23
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
24
+ user-select: none;
25
+ }
26
+
27
+ /* Hover state */
28
+ .toggle-btn:hover:not(:disabled) {
29
+ background-color: color-mix(in oklch, var(--color-surface-variant) 50%, transparent);
30
+ border-color: var(--color-outline-variant);
31
+ }
32
+
33
+ /* Active/Selected state */
34
+ .toggle-btn-active,
35
+ .toggle-btn.active {
36
+ color: var(--color-on-primary-container);
37
+ background-color: var(--color-primary-container);
38
+ border-color: var(--color-primary);
39
+ }
40
+
41
+ .toggle-btn-active:hover:not(:disabled),
42
+ .toggle-btn.active:hover:not(:disabled) {
43
+ background-color: color-mix(in oklch, var(--color-primary-container) 90%, transparent);
44
+ }
45
+
46
+ /* Secondary variant */
47
+ .toggle-btn-secondary.toggle-btn-active,
48
+ .toggle-btn-secondary.active {
49
+ color: var(--color-on-secondary-container);
50
+ background-color: var(--color-secondary-container);
51
+ border-color: var(--color-secondary);
52
+ }
53
+
54
+ /* Tertiary variant */
55
+ .toggle-btn-tertiary.toggle-btn-active,
56
+ .toggle-btn-tertiary.active {
57
+ color: var(--color-on-tertiary-container);
58
+ background-color: var(--color-tertiary-container);
59
+ border-color: var(--color-tertiary);
60
+ }
61
+
62
+ /* Focus state */
63
+ .toggle-btn:focus-visible {
64
+ outline: 2px solid var(--color-primary);
65
+ outline-offset: 2px;
66
+ }
67
+
68
+ /* Disabled state */
69
+ .toggle-btn:disabled,
70
+ .toggle-btn-disabled {
71
+ opacity: 0.38;
72
+ cursor: not-allowed;
73
+ pointer-events: none;
74
+ }
75
+
76
+ /* Size variants */
77
+ .toggle-btn-sm {
78
+ padding: 0.375rem 0.75rem;
79
+ font-size: 0.8125rem;
80
+ gap: 0.375rem;
81
+ }
82
+
83
+ .toggle-btn-lg {
84
+ padding: 0.75rem 1.25rem;
85
+ font-size: 1rem;
86
+ gap: 0.625rem;
87
+ }
88
+
89
+ /* Toggle button group */
90
+ .toggle-group {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 0;
94
+ border: 1px solid var(--color-outline);
95
+ border-radius: 0.5rem;
96
+ padding: 0.25rem;
97
+ background-color: color-mix(in oklch, var(--color-surface-variant) 30%, transparent);
98
+ }
99
+
100
+ /* Toggle buttons in group */
101
+ .toggle-group .toggle-btn {
102
+ border: none;
103
+ border-radius: 0.375rem;
104
+ margin: 0;
105
+ }
106
+
107
+ .toggle-group .toggle-btn:not(:last-child) {
108
+ margin-right: 0.125rem;
109
+ }
110
+
111
+ /* Vertical group */
112
+ .toggle-group-vertical {
113
+ flex-direction: column;
114
+ }
115
+
116
+ .toggle-group-vertical .toggle-btn:not(:last-child) {
117
+ margin-right: 0;
118
+ margin-bottom: 0.125rem;
119
+ }
120
+
121
+ /* Exclusive selection (radio-like behavior) */
122
+ .toggle-group-exclusive .toggle-btn {
123
+ flex: 1;
124
+ }
125
+
126
+ /* Icon-only toggle */
127
+ .toggle-btn-icon-only {
128
+ padding: 0.625rem;
129
+ aspect-ratio: 1;
130
+ }
131
+
132
+ .toggle-btn-icon-only.toggle-btn-sm {
133
+ padding: 0.5rem;
134
+ }
135
+
136
+ .toggle-btn-icon-only.toggle-btn-lg {
137
+ padding: 0.875rem;
138
+ }
139
+
140
+ /* With icon */
141
+ .toggle-icon {
142
+ width: 1.125rem;
143
+ height: 1.125rem;
144
+ flex-shrink: 0;
145
+ }
146
+
147
+ /* Segmented control style */
148
+ .toggle-segmented {
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 0;
152
+ background-color: var(--color-surface);
153
+ border: 1px solid var(--color-outline-variant);
154
+ border-radius: 0.5rem;
155
+ padding: 0.25rem;
156
+ }
157
+
158
+ .toggle-segmented .toggle-btn {
159
+ border: none;
160
+ background-color: transparent;
161
+ border-radius: 0.375rem;
162
+ }
163
+
164
+ .toggle-segmented .toggle-btn.toggle-btn-active,
165
+ .toggle-segmented .toggle-btn.active {
166
+ background-color: var(--color-surface-variant);
167
+ border-color: transparent;
168
+ box-shadow: var(--shadow-sm);
169
+ }
170
+
171
+ /* Chip-like toggle */
172
+ .toggle-chip {
173
+ border-radius: 1rem;
174
+ padding: 0.5rem 1rem;
175
+ }
176
+
177
+ .toggle-chip.toggle-btn-active,
178
+ .toggle-chip.active {
179
+ background-color: var(--color-primary-container);
180
+ border-color: var(--color-primary-container);
181
+ }
182
+
183
+ /* Outlined variant */
184
+ .toggle-outlined {
185
+ background-color: transparent;
186
+ }
187
+
188
+ .toggle-outlined.toggle-btn-active,
189
+ .toggle-outlined.active {
190
+ background-color: color-mix(in oklch, var(--color-primary) 10%, transparent);
191
+ }
192
+
193
+ /* Filled variant */
194
+ .toggle-filled {
195
+ background-color: var(--color-surface-variant);
196
+ border: none;
197
+ }
198
+
199
+ .toggle-filled.toggle-btn-active,
200
+ .toggle-filled.active {
201
+ background-color: var(--color-primary);
202
+ color: var(--color-on-primary);
203
+ }
204
+
205
+ /* With badge/indicator */
206
+ .toggle-badge {
207
+ position: relative;
208
+ }
209
+
210
+ .toggle-badge::after {
211
+ content: "";
212
+ position: absolute;
213
+ top: 0.25rem;
214
+ right: 0.25rem;
215
+ width: 0.5rem;
216
+ height: 0.5rem;
217
+ background-color: var(--color-error);
218
+ border-radius: 50%;
219
+ border: 2px solid var(--color-surface);
220
+ }
221
+
222
+ /* Full width */
223
+ .toggle-full {
224
+ width: 100%;
225
+ }
226
+
227
+ .toggle-group-full {
228
+ width: 100%;
229
+ }
230
+
231
+ .toggle-group-full .toggle-btn {
232
+ flex: 1;
233
+ }
234
+
235
+ /* Loading state */
236
+ .toggle-loading {
237
+ position: relative;
238
+ pointer-events: none;
239
+ }
240
+
241
+ .toggle-loading::after {
242
+ content: "";
243
+ position: absolute;
244
+ top: 50%;
245
+ left: 50%;
246
+ width: 1rem;
247
+ height: 1rem;
248
+ margin-top: -0.5rem;
249
+ margin-left: -0.5rem;
250
+ border: 2px solid currentColor;
251
+ border-top-color: transparent;
252
+ border-radius: 50%;
253
+ animation: toggle-spin 0.6s linear infinite;
254
+ }
255
+
256
+ @keyframes toggle-spin {
257
+ 0% {
258
+ transform: rotate(0deg);
259
+ }
260
+ 100% {
261
+ transform: rotate(360deg);
262
+ }
263
+ }
264
+
265
+ /* Reduce Motion */
266
+ @media (prefers-reduced-motion: reduce) {
267
+ .toggle-btn {
268
+ transition: none;
269
+ }
270
+ .toggle-loading::after {
271
+ animation: none;
272
+ }
273
+ }
274
+ }
@@ -22,7 +22,7 @@
22
22
  background-color: var(--color-on-surface);
23
23
  color: var(--color-surface);
24
24
  border-radius: 0.25rem;
25
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
25
+ box-shadow: var(--shadow-md);
26
26
  opacity: 0;
27
27
  visibility: hidden;
28
28
  transition: opacity 150ms ease-out, visibility 150ms ease-out;
@@ -151,7 +151,7 @@
151
151
  background-color: var(--color-surface);
152
152
  color: var(--color-on-surface);
153
153
  border: 1px solid var(--color-outline);
154
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
154
+ box-shadow: var(--shadow-md);
155
155
  }
156
156
 
157
157
  .tooltip.tooltip-light .tooltip-content::before {
@@ -136,7 +136,7 @@
136
136
  background-color: var(--color-surface);
137
137
  border: 1px solid var(--color-outline-variant);
138
138
  border-radius: 0.5rem;
139
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
139
+ box-shadow: var(--shadow-md);
140
140
  overflow-y: auto;
141
141
  }
142
142
 
@@ -15,7 +15,7 @@ export const css = `/**
15
15
  padding: 0 1rem;
16
16
  background-color: var(--color-surface);
17
17
  color: var(--color-on-surface);
18
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
18
+ box-shadow: var(--shadow-sm);
19
19
  }
20
20
 
21
21
  /* Static App Bar (default) */
@@ -56,7 +56,7 @@ export const css = `/**
56
56
 
57
57
  /* App Bar with Shadow (elevated) */
58
58
  .appbar-elevated {
59
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
59
+ box-shadow: var(--shadow-sm);
60
60
  }
61
61
 
62
62
  /* Flat App Bar (no shadow) */
@@ -50,7 +50,7 @@ export const css = `/**
50
50
  background-color: var(--color-surface);
51
51
  border: 1px solid var(--color-outline);
52
52
  border-radius: 0.5rem;
53
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
53
+ box-shadow: var(--shadow-lg);
54
54
  overflow-y: auto;
55
55
  opacity: 0;
56
56
  visibility: hidden;
@@ -14,12 +14,12 @@ export const css = `/**
14
14
  border-radius: 1rem;
15
15
  background-color: var(--color-surface);
16
16
  color: var(--color-on-surface);
17
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
17
+ box-shadow: var(--shadow-sm);
18
18
  transition: box-shadow 150ms ease-in-out, transform 150ms ease-in-out;
19
19
  }
20
20
 
21
21
  .card:hover {
22
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
22
+ box-shadow: var(--shadow-md);
23
23
  }
24
24
 
25
25
  /* Card Image */
@@ -172,11 +172,11 @@ export const css = `/**
172
172
 
173
173
  /* Elevated Variants */
174
174
  .card-elevated {
175
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
175
+ box-shadow: var(--shadow-lg);
176
176
  }
177
177
 
178
178
  .card-elevated:hover {
179
- box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
179
+ box-shadow: var(--shadow-xl);
180
180
  transform: translateY(-2px);
181
181
  }
182
182
 
@@ -126,7 +126,7 @@ export const css = `/**
126
126
  background-color: var(--color-surface);
127
127
  border: 1px solid var(--color-outline-variant);
128
128
  border-radius: 0.5rem;
129
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
129
+ box-shadow: var(--shadow-md);
130
130
  overflow: hidden;
131
131
  }
132
132
 
@@ -157,7 +157,7 @@ export const css = `/**
157
157
  border: 1px solid var(--color-outline-variant);
158
158
  border-radius: 0.75rem;
159
159
  overflow: hidden;
160
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
160
+ box-shadow: var(--shadow-sm);
161
161
  }
162
162
 
163
163
  .collapse-card .collapse-toggle,
@@ -117,7 +117,7 @@ export const css = `/**
117
117
  background-color: var(--color-surface);
118
118
  border: 1px solid var(--color-outline);
119
119
  border-radius: 0.75rem;
120
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
120
+ box-shadow: var(--shadow-lg);
121
121
  opacity: 0;
122
122
  visibility: hidden;
123
123
  transform: translateY(-0.5rem);
@@ -143,7 +143,7 @@ export const css = `/**
143
143
  background-color: var(--color-surface);
144
144
  border: 1px solid var(--color-outline);
145
145
  border-radius: 0.75rem;
146
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
146
+ box-shadow: var(--shadow-lg);
147
147
  }
148
148
 
149
149
  /* Calendar Header */
@@ -18,7 +18,7 @@ export const css = `/**
18
18
  background-color: var(--color-surface);
19
19
  color: var(--color-on-surface);
20
20
  border-radius: 1.5rem;
21
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
21
+ box-shadow: var(--shadow-2xl);
22
22
  overflow: hidden;
23
23
  }
24
24
 
@@ -28,7 +28,7 @@ export const css = `/**
28
28
  display: flex;
29
29
  flex-direction: column;
30
30
  background-color: var(--color-surface-container-low);
31
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
31
+ box-shadow: var(--shadow-2xl);
32
32
  transition: transform 300ms ease-out;
33
33
  }
34
34
 
@@ -287,7 +287,7 @@ export const css = `/**
287
287
  }
288
288
 
289
289
  .file-upload-button:hover {
290
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
290
+ box-shadow: var(--shadow-md);
291
291
  }
292
292
 
293
293
  .file-upload-button:focus-visible {
@@ -148,7 +148,7 @@ export const css = `/**
148
148
  .fieldset-card {
149
149
  background-color: var(--color-surface);
150
150
  border-color: transparent;
151
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
151
+ box-shadow: var(--shadow-xs);
152
152
  padding: 1.5rem;
153
153
  }
154
154
 
@@ -290,6 +290,13 @@ export const css = `/**
290
290
  border-color: var(--color-error);
291
291
  }
292
292
 
293
+ .form-group-error .input:focus-visible,
294
+ .form-group-error .select:focus-visible,
295
+ .form-group-error .textarea:focus-visible {
296
+ border-color: var(--color-error);
297
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
298
+ }
299
+
293
300
  /* Success State on Form Group */
294
301
  .form-group-success .form-label {
295
302
  color: var(--color-success);
@@ -301,6 +308,31 @@ export const css = `/**
301
308
  border-color: var(--color-success);
302
309
  }
303
310
 
311
+ .form-group-success .input:focus-visible,
312
+ .form-group-success .select:focus-visible,
313
+ .form-group-success .textarea:focus-visible {
314
+ border-color: var(--color-success);
315
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
316
+ }
317
+
318
+ /* Warning State on Form Group */
319
+ .form-group-warning .form-label {
320
+ color: var(--color-warning);
321
+ }
322
+
323
+ .form-group-warning .input,
324
+ .form-group-warning .select,
325
+ .form-group-warning .textarea {
326
+ border-color: var(--color-warning);
327
+ }
328
+
329
+ .form-group-warning .input:focus-visible,
330
+ .form-group-warning .select:focus-visible,
331
+ .form-group-warning .textarea:focus-visible {
332
+ border-color: var(--color-warning);
333
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
334
+ }
335
+
304
336
  /* Disabled Form Group */
305
337
  .form-group-disabled {
306
338
  opacity: 0.5;
@@ -36,7 +36,7 @@ export const css = `/**
36
36
  background-color: var(--color-surface);
37
37
  color: var(--color-on-surface);
38
38
  border-radius: 1rem;
39
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
39
+ box-shadow: var(--shadow-2xl);
40
40
  overflow-y: auto;
41
41
  transform: scale(0.95);
42
42
  transition: transform 200ms ease-out;
@@ -192,7 +192,7 @@ export const css = `/**
192
192
  background-color: var(--color-surface);
193
193
  border: 1px solid var(--color-outline-variant);
194
194
  border-radius: 0.5rem;
195
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
195
+ box-shadow: var(--shadow-md);
196
196
  overflow: hidden;
197
197
  }
198
198
 
@@ -439,7 +439,7 @@ export const css = `/**
439
439
  .tabs-boxed .tab[aria-selected="true"] {
440
440
  background-color: var(--color-surface);
441
441
  color: var(--color-on-surface);
442
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
442
+ box-shadow: var(--shadow-xs);
443
443
  }
444
444
 
445
445
  /* Tabs Lifted */
@@ -491,7 +491,7 @@ export const css = `/**
491
491
  background-color: var(--color-surface);
492
492
  border: 1px solid var(--color-outline);
493
493
  border-radius: 0.5rem;
494
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
494
+ box-shadow: var(--shadow-lg);
495
495
  opacity: 0;
496
496
  visibility: hidden;
497
497
  transform: translateY(-0.5rem);