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