@duskmoon-dev/core 1.1.0 → 1.2.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 (33) hide show
  1. package/dist/components/button.css +47 -46
  2. package/dist/components/checkbox.css +231 -0
  3. package/dist/components/datepicker.css +404 -10
  4. package/dist/components/form-group.css +308 -0
  5. package/dist/components/index.css +4077 -687
  6. package/dist/components/multi-select.css +491 -0
  7. package/dist/components/navigation.css +153 -2
  8. package/dist/components/otp-input.css +195 -0
  9. package/dist/components/pin-input.css +184 -0
  10. package/dist/components/radio.css +183 -0
  11. package/dist/components/segment-control.css +186 -0
  12. package/dist/components/select.css +205 -0
  13. package/dist/components/switch.css +150 -193
  14. package/dist/components/textarea.css +202 -0
  15. package/dist/components/time-input.css +252 -0
  16. package/dist/components/tree-select.css +439 -0
  17. package/dist/esm/components/button.js +47 -46
  18. package/dist/esm/components/checkbox.js +238 -0
  19. package/dist/esm/components/datepicker.js +404 -10
  20. package/dist/esm/components/form-group.js +315 -0
  21. package/dist/esm/components/multi-select.js +498 -0
  22. package/dist/esm/components/navigation.js +153 -2
  23. package/dist/esm/components/otp-input.js +202 -0
  24. package/dist/esm/components/pin-input.js +191 -0
  25. package/dist/esm/components/radio.js +190 -0
  26. package/dist/esm/components/segment-control.js +193 -0
  27. package/dist/esm/components/select.js +212 -0
  28. package/dist/esm/components/switch.js +150 -193
  29. package/dist/esm/components/textarea.js +209 -0
  30. package/dist/esm/components/time-input.js +259 -0
  31. package/dist/esm/components/tree-select.js +446 -0
  32. package/dist/index.css +4073 -683
  33. package/package.json +56 -1
@@ -0,0 +1,498 @@
1
+ // Auto-generated from multi-select.css
2
+ export const css = `/**
3
+ * Multi Select Component Styles
4
+ * DuskMoonUI - Multiple selection dropdown component
5
+ */
6
+
7
+ @layer components {
8
+ /* Base Multi Select */
9
+ .multi-select {
10
+ position: relative;
11
+ display: inline-flex;
12
+ flex-direction: column;
13
+ width: 100%;
14
+ }
15
+
16
+ /* Multi Select Trigger */
17
+ .multi-select-trigger {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 0.5rem;
21
+ min-height: 2.75rem;
22
+ width: 100%;
23
+ padding: 0.5rem 0.75rem;
24
+ font-size: 1rem;
25
+ line-height: 1.5rem;
26
+ color: var(--color-on-surface);
27
+ background-color: var(--color-surface);
28
+ border: 1px solid var(--color-outline);
29
+ border-radius: 0.5rem;
30
+ cursor: pointer;
31
+ transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
32
+ }
33
+
34
+ .multi-select-trigger:hover:not(:disabled) {
35
+ border-color: var(--color-on-surface-variant);
36
+ }
37
+
38
+ .multi-select-trigger:focus-within {
39
+ outline: none;
40
+ border-color: var(--color-primary);
41
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
42
+ }
43
+
44
+ /* Placeholder */
45
+ .multi-select-placeholder {
46
+ flex: 1;
47
+ color: var(--color-on-surface-variant);
48
+ opacity: 0.7;
49
+ }
50
+
51
+ /* Selected Tags Container */
52
+ .multi-select-tags {
53
+ display: flex;
54
+ flex-wrap: wrap;
55
+ align-items: center;
56
+ gap: 0.25rem;
57
+ flex: 1;
58
+ min-width: 0;
59
+ }
60
+
61
+ /* Selected Tag */
62
+ .multi-select-tag {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ gap: 0.25rem;
66
+ max-width: 100%;
67
+ padding: 0.125rem 0.375rem 0.125rem 0.5rem;
68
+ font-size: 0.75rem;
69
+ line-height: 1.25rem;
70
+ background-color: var(--color-surface-container-high);
71
+ color: var(--color-on-surface);
72
+ border-radius: 1rem;
73
+ }
74
+
75
+ .multi-select-tag-text {
76
+ overflow: hidden;
77
+ text-overflow: ellipsis;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ .multi-select-tag-remove {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ width: 1rem;
86
+ height: 1rem;
87
+ padding: 0;
88
+ font-size: 0.875rem;
89
+ color: inherit;
90
+ background-color: transparent;
91
+ border: none;
92
+ border-radius: 50%;
93
+ cursor: pointer;
94
+ opacity: 0.7;
95
+ transition: opacity 150ms ease-in-out, background-color 150ms ease-in-out;
96
+ }
97
+
98
+ .multi-select-tag-remove:hover {
99
+ opacity: 1;
100
+ background-color: color-mix(in oklch, currentColor 15%, transparent);
101
+ }
102
+
103
+ /* Tag Variants */
104
+ .multi-select-tag-primary {
105
+ background-color: var(--color-primary-container);
106
+ color: var(--color-on-primary-container);
107
+ }
108
+
109
+ .multi-select-tag-outlined {
110
+ background-color: transparent;
111
+ border: 1px solid var(--color-outline);
112
+ color: var(--color-on-surface);
113
+ }
114
+
115
+ /* Overflow Tag */
116
+ .multi-select-tag-overflow {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ padding: 0.125rem 0.5rem;
120
+ font-size: 0.75rem;
121
+ line-height: 1.25rem;
122
+ background-color: var(--color-surface-container);
123
+ color: var(--color-on-surface-variant);
124
+ border-radius: 1rem;
125
+ }
126
+
127
+ /* Inline Search Input */
128
+ .multi-select-input {
129
+ flex: 1;
130
+ min-width: 4rem;
131
+ padding: 0.125rem 0;
132
+ font-size: 0.875rem;
133
+ color: var(--color-on-surface);
134
+ background-color: transparent;
135
+ border: none;
136
+ outline: none;
137
+ }
138
+
139
+ .multi-select-input::placeholder {
140
+ color: var(--color-on-surface-variant);
141
+ opacity: 0.7;
142
+ }
143
+
144
+ /* Dropdown Arrow */
145
+ .multi-select-arrow {
146
+ display: flex;
147
+ align-items: center;
148
+ justify-content: center;
149
+ width: 1.25rem;
150
+ height: 1.25rem;
151
+ margin-left: auto;
152
+ color: var(--color-on-surface-variant);
153
+ flex-shrink: 0;
154
+ transition: transform 150ms ease-in-out;
155
+ }
156
+
157
+ .multi-select-open .multi-select-arrow {
158
+ transform: rotate(180deg);
159
+ }
160
+
161
+ /* Clear All Button */
162
+ .multi-select-clear-all {
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ width: 1.25rem;
167
+ height: 1.25rem;
168
+ padding: 0;
169
+ color: var(--color-on-surface-variant);
170
+ background-color: transparent;
171
+ border: none;
172
+ border-radius: 50%;
173
+ cursor: pointer;
174
+ flex-shrink: 0;
175
+ transition: background-color 150ms ease-in-out;
176
+ }
177
+
178
+ .multi-select-clear-all:hover {
179
+ background-color: var(--color-surface-container-high);
180
+ }
181
+
182
+ /* Dropdown */
183
+ .multi-select-dropdown {
184
+ position: absolute;
185
+ top: 100%;
186
+ left: 0;
187
+ right: 0;
188
+ z-index: 50;
189
+ display: none;
190
+ max-height: 16rem;
191
+ margin-top: 0.25rem;
192
+ background-color: var(--color-surface);
193
+ border: 1px solid var(--color-outline-variant);
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);
196
+ overflow: hidden;
197
+ }
198
+
199
+ .multi-select-open .multi-select-dropdown {
200
+ display: flex;
201
+ flex-direction: column;
202
+ }
203
+
204
+ /* Popover API Support - Browser handles visibility, JS handles positioning */
205
+ .multi-select-dropdown[popover] {
206
+ /* Reset browser defaults - positioning handled by JavaScript */
207
+ inset: unset;
208
+ margin: 0;
209
+ padding: 0;
210
+ border: 1px solid var(--color-outline-variant);
211
+ }
212
+
213
+ .multi-select-dropdown[popover]:popover-open {
214
+ display: flex;
215
+ flex-direction: column;
216
+ }
217
+
218
+ /* Search Input */
219
+ .multi-select-search {
220
+ padding: 0.5rem;
221
+ border-bottom: 1px solid var(--color-outline-variant);
222
+ }
223
+
224
+ .multi-select-search-input {
225
+ width: 100%;
226
+ padding: 0.5rem 0.75rem;
227
+ font-size: 0.875rem;
228
+ color: var(--color-on-surface);
229
+ background-color: var(--color-surface-container);
230
+ border: none;
231
+ border-radius: 0.375rem;
232
+ outline: none;
233
+ }
234
+
235
+ .multi-select-search-input:focus {
236
+ background-color: var(--color-surface-container-high);
237
+ }
238
+
239
+ .multi-select-search-input::placeholder {
240
+ color: var(--color-on-surface-variant);
241
+ opacity: 0.7;
242
+ }
243
+
244
+ /* Options List */
245
+ .multi-select-options {
246
+ flex: 1;
247
+ overflow-y: auto;
248
+ padding: 0.25rem;
249
+ }
250
+
251
+ /* Option Item */
252
+ .multi-select-option {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: 0.75rem;
256
+ width: 100%;
257
+ padding: 0.625rem 0.75rem;
258
+ font-size: 0.875rem;
259
+ color: var(--color-on-surface);
260
+ background-color: transparent;
261
+ border: none;
262
+ border-radius: 0.375rem;
263
+ cursor: pointer;
264
+ text-align: left;
265
+ transition: background-color 150ms ease-in-out;
266
+ }
267
+
268
+ .multi-select-option:hover {
269
+ background-color: var(--color-surface-container);
270
+ }
271
+
272
+ .multi-select-option-selected {
273
+ background-color: var(--color-primary-container);
274
+ color: var(--color-on-primary-container);
275
+ }
276
+
277
+ .multi-select-option-selected:hover {
278
+ background-color: color-mix(in oklch, var(--color-primary-container), black 5%);
279
+ }
280
+
281
+ .multi-select-option-disabled {
282
+ opacity: 0.5;
283
+ cursor: not-allowed;
284
+ }
285
+
286
+ .multi-select-option-disabled:hover {
287
+ background-color: transparent;
288
+ }
289
+
290
+ .multi-select-option-focused {
291
+ background-color: var(--color-surface-container-high);
292
+ }
293
+
294
+ /* Option Checkbox */
295
+ .multi-select-option-checkbox {
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ width: 1rem;
300
+ height: 1rem;
301
+ background-color: transparent;
302
+ border: 2px solid var(--color-on-surface-variant);
303
+ border-radius: 0.125rem;
304
+ flex-shrink: 0;
305
+ }
306
+
307
+ .multi-select-option-selected .multi-select-option-checkbox {
308
+ background-color: var(--color-primary);
309
+ border-color: var(--color-primary);
310
+ }
311
+
312
+ .multi-select-option-selected .multi-select-option-checkbox svg {
313
+ color: var(--color-on-primary);
314
+ }
315
+
316
+ /* Option Icon */
317
+ .multi-select-option-icon {
318
+ display: flex;
319
+ align-items: center;
320
+ justify-content: center;
321
+ width: 1.25rem;
322
+ height: 1.25rem;
323
+ color: var(--color-on-surface-variant);
324
+ }
325
+
326
+ /* Option Text */
327
+ .multi-select-option-text {
328
+ flex: 1;
329
+ overflow: hidden;
330
+ text-overflow: ellipsis;
331
+ white-space: nowrap;
332
+ }
333
+
334
+ .multi-select-option-description {
335
+ font-size: 0.75rem;
336
+ color: var(--color-on-surface-variant);
337
+ }
338
+
339
+ /* Group */
340
+ .multi-select-group {
341
+ padding: 0.25rem 0;
342
+ }
343
+
344
+ .multi-select-group-header {
345
+ padding: 0.5rem 0.75rem;
346
+ font-size: 0.75rem;
347
+ font-weight: 600;
348
+ color: var(--color-on-surface-variant);
349
+ text-transform: uppercase;
350
+ letter-spacing: 0.05em;
351
+ }
352
+
353
+ /* Empty State */
354
+ .multi-select-empty {
355
+ padding: 1.5rem;
356
+ text-align: center;
357
+ color: var(--color-on-surface-variant);
358
+ font-size: 0.875rem;
359
+ }
360
+
361
+ /* Select All / Deselect All Actions */
362
+ .multi-select-actions {
363
+ display: flex;
364
+ gap: 0.5rem;
365
+ padding: 0.5rem;
366
+ border-bottom: 1px solid var(--color-outline-variant);
367
+ }
368
+
369
+ .multi-select-action {
370
+ padding: 0.375rem 0.75rem;
371
+ font-size: 0.75rem;
372
+ font-weight: 500;
373
+ color: var(--color-primary);
374
+ background-color: transparent;
375
+ border: none;
376
+ border-radius: 0.375rem;
377
+ cursor: pointer;
378
+ transition: background-color 150ms ease-in-out;
379
+ }
380
+
381
+ .multi-select-action:hover {
382
+ background-color: color-mix(in oklch, var(--color-primary) 10%, transparent);
383
+ }
384
+
385
+ /* Counter Badge */
386
+ .multi-select-counter {
387
+ display: inline-flex;
388
+ align-items: center;
389
+ justify-content: center;
390
+ min-width: 1.25rem;
391
+ height: 1.25rem;
392
+ padding: 0 0.375rem;
393
+ font-size: 0.625rem;
394
+ font-weight: 600;
395
+ color: var(--color-primary-content);
396
+ background-color: var(--color-primary);
397
+ border-radius: 0.625rem;
398
+ }
399
+
400
+ /* Size Variants */
401
+ .multi-select-sm .multi-select-trigger {
402
+ min-height: 2.25rem;
403
+ padding: 0.375rem 0.5rem;
404
+ font-size: 0.875rem;
405
+ border-radius: 0.375rem;
406
+ }
407
+
408
+ .multi-select-sm .multi-select-tag {
409
+ font-size: 0.625rem;
410
+ padding: 0 0.25rem 0 0.375rem;
411
+ }
412
+
413
+ .multi-select-lg .multi-select-trigger {
414
+ min-height: 3.25rem;
415
+ padding: 0.625rem 1rem;
416
+ font-size: 1.125rem;
417
+ border-radius: 0.625rem;
418
+ }
419
+
420
+ /* Outlined Variant (Default) */
421
+ .multi-select-outlined .multi-select-trigger {
422
+ background-color: var(--color-surface);
423
+ border: 1px solid var(--color-outline);
424
+ }
425
+
426
+ /* Filled Variant */
427
+ .multi-select-filled .multi-select-trigger {
428
+ background-color: var(--color-surface-container);
429
+ border: none;
430
+ border-bottom: 2px solid var(--color-outline);
431
+ border-radius: 0.5rem 0.5rem 0 0;
432
+ }
433
+
434
+ .multi-select-filled .multi-select-trigger:focus-within {
435
+ border-bottom-color: var(--color-primary);
436
+ box-shadow: none;
437
+ }
438
+
439
+ /* Error State */
440
+ .multi-select-error .multi-select-trigger {
441
+ border-color: var(--color-error);
442
+ }
443
+
444
+ .multi-select-error .multi-select-trigger:focus-within {
445
+ border-color: var(--color-error);
446
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
447
+ }
448
+
449
+ /* Disabled State */
450
+ .multi-select-disabled .multi-select-trigger {
451
+ cursor: not-allowed;
452
+ opacity: 0.5;
453
+ background-color: var(--color-surface-container);
454
+ }
455
+
456
+ .multi-select-disabled .multi-select-tag-remove {
457
+ pointer-events: none;
458
+ }
459
+
460
+ /* Loading State */
461
+ .multi-select-loading .multi-select-trigger {
462
+ cursor: wait;
463
+ }
464
+
465
+ .multi-select-spinner {
466
+ display: inline-block;
467
+ width: 1rem;
468
+ height: 1rem;
469
+ border: 2px solid var(--color-outline);
470
+ border-top-color: var(--color-primary);
471
+ border-radius: 50%;
472
+ animation: multi-select-spin 0.8s linear infinite;
473
+ }
474
+
475
+ @keyframes multi-select-spin {
476
+ to { transform: rotate(360deg); }
477
+ }
478
+
479
+ /* Reduce Motion */
480
+ @media (prefers-reduced-motion: reduce) {
481
+ .multi-select-trigger,
482
+ .multi-select-arrow,
483
+ .multi-select-tag-remove,
484
+ .multi-select-clear-all,
485
+ .multi-select-option {
486
+ transition: none;
487
+ }
488
+ .multi-select-spinner {
489
+ animation: none;
490
+ }
491
+ }
492
+ }
493
+ `;
494
+
495
+ const sheet = new CSSStyleSheet();
496
+ sheet.replaceSync(css);
497
+ export const styles = sheet;
498
+ export default sheet;
@@ -348,14 +348,18 @@ export const css = `/**
348
348
  padding: 0;
349
349
  }
350
350
 
351
+ .pagination-item,
352
+ .pagination-prev,
353
+ .pagination-next,
351
354
  .pagination li > a,
352
355
  .pagination li > button {
353
- display: flex;
356
+ display: inline-flex;
354
357
  align-items: center;
355
358
  justify-content: center;
359
+ gap: 0.25rem;
356
360
  min-width: 2.5rem;
357
361
  height: 2.5rem;
358
- padding: 0 0.5rem;
362
+ padding: 0 0.75rem;
359
363
  font-size: 0.875rem;
360
364
  color: var(--color-on-surface);
361
365
  background-color: transparent;
@@ -363,13 +367,19 @@ export const css = `/**
363
367
  border-radius: 0.5rem;
364
368
  cursor: pointer;
365
369
  transition: all 150ms ease-in-out;
370
+ white-space: nowrap;
366
371
  }
367
372
 
373
+ .pagination-item:hover,
374
+ .pagination-prev:hover,
375
+ .pagination-next:hover,
368
376
  .pagination li > a:hover,
369
377
  .pagination li > button:hover {
370
378
  background-color: var(--color-surface-container);
371
379
  }
372
380
 
381
+ .pagination-item-active,
382
+ .pagination-item-active-primary,
373
383
  .pagination li > a.active,
374
384
  .pagination li > button.active,
375
385
  .pagination li > a[aria-current="page"],
@@ -379,16 +389,157 @@ export const css = `/**
379
389
  border-color: var(--color-primary);
380
390
  }
381
391
 
392
+ .pagination-item-active-secondary {
393
+ background-color: var(--color-secondary);
394
+ color: var(--color-secondary-content);
395
+ border-color: var(--color-secondary);
396
+ }
397
+
398
+ .pagination-item-active-tertiary {
399
+ background-color: var(--color-tertiary);
400
+ color: var(--color-tertiary-content);
401
+ border-color: var(--color-tertiary);
402
+ }
403
+
404
+ .pagination-item:focus-visible,
405
+ .pagination-prev:focus-visible,
406
+ .pagination-next:focus-visible,
382
407
  .pagination li > a:focus-visible,
383
408
  .pagination li > button:focus-visible {
384
409
  outline: 2px solid var(--color-primary);
385
410
  outline-offset: 2px;
386
411
  }
387
412
 
413
+ .pagination-item:disabled,
414
+ .pagination-item-disabled,
415
+ .pagination-prev:disabled,
416
+ .pagination-next:disabled,
388
417
  .pagination li > a:disabled,
389
418
  .pagination li > button:disabled {
390
419
  opacity: 0.5;
391
420
  cursor: not-allowed;
421
+ pointer-events: none;
422
+ }
423
+
424
+ /* Pagination Ellipsis */
425
+ .pagination-ellipsis {
426
+ display: inline-flex;
427
+ align-items: center;
428
+ justify-content: center;
429
+ min-width: 2.5rem;
430
+ height: 2.5rem;
431
+ color: var(--color-on-surface-variant);
432
+ }
433
+
434
+ .pagination-ellipsis::before {
435
+ content: '…';
436
+ }
437
+
438
+ /* Pagination Info */
439
+ .pagination-info {
440
+ display: flex;
441
+ flex-direction: column;
442
+ align-items: center;
443
+ gap: 0.5rem;
444
+ }
445
+
446
+ .pagination-info-text {
447
+ font-size: 0.875rem;
448
+ color: var(--color-on-surface-variant);
449
+ }
450
+
451
+ /* Pagination Input */
452
+ .pagination-input {
453
+ display: inline-flex;
454
+ align-items: center;
455
+ gap: 0.5rem;
456
+ font-size: 0.875rem;
457
+ color: var(--color-on-surface-variant);
458
+ }
459
+
460
+ .pagination-input input {
461
+ width: 3.5rem;
462
+ padding: 0.375rem 0.5rem;
463
+ font-size: 0.875rem;
464
+ text-align: center;
465
+ color: var(--color-on-surface);
466
+ background-color: var(--color-surface);
467
+ border: 1px solid var(--color-outline);
468
+ border-radius: 0.375rem;
469
+ }
470
+
471
+ .pagination-input input:focus {
472
+ outline: none;
473
+ border-color: var(--color-primary);
474
+ }
475
+
476
+ /* Pagination Variants */
477
+ .pagination-outlined .pagination-item,
478
+ .pagination-outlined .pagination-prev,
479
+ .pagination-outlined .pagination-next {
480
+ border: 1px solid var(--color-outline);
481
+ }
482
+
483
+ .pagination-tonal .pagination-item-active,
484
+ .pagination-tonal .pagination-item-active-primary {
485
+ background-color: var(--color-primary-container);
486
+ color: var(--color-on-primary-container);
487
+ border-color: var(--color-primary-container);
488
+ }
489
+
490
+ /* Pagination Sizes */
491
+ .pagination-sm .pagination-item,
492
+ .pagination-sm .pagination-prev,
493
+ .pagination-sm .pagination-next {
494
+ min-width: 2rem;
495
+ height: 2rem;
496
+ padding: 0 0.5rem;
497
+ font-size: 0.75rem;
498
+ }
499
+
500
+ .pagination-lg .pagination-item,
501
+ .pagination-lg .pagination-prev,
502
+ .pagination-lg .pagination-next {
503
+ min-width: 3rem;
504
+ height: 3rem;
505
+ padding: 0 1rem;
506
+ font-size: 1rem;
507
+ }
508
+
509
+ /* Pagination Compact */
510
+ .pagination-compact {
511
+ gap: 0;
512
+ }
513
+
514
+ .pagination-compact .pagination-item,
515
+ .pagination-compact .pagination-prev,
516
+ .pagination-compact .pagination-next {
517
+ border-radius: 0;
518
+ }
519
+
520
+ .pagination-compact .pagination-item:first-child,
521
+ .pagination-compact .pagination-prev {
522
+ border-radius: 0.5rem 0 0 0.5rem;
523
+ }
524
+
525
+ .pagination-compact .pagination-item:last-child,
526
+ .pagination-compact .pagination-next {
527
+ border-radius: 0 0.5rem 0.5rem 0;
528
+ }
529
+
530
+ /* Pagination Responsive */
531
+ .pagination-responsive {
532
+ flex-wrap: wrap;
533
+ justify-content: center;
534
+ }
535
+
536
+ /* Reduce Motion */
537
+ @media (prefers-reduced-motion: reduce) {
538
+ .pagination-item,
539
+ .pagination-prev,
540
+ .pagination-next {
541
+ transition: none;
542
+ }
392
543
  }
393
544
  }
394
545
  `;