@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
@@ -25,6 +25,18 @@ export const css = `/**
25
25
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
26
26
  }
27
27
 
28
+ /* Hide native date picker controls when using custom trigger */
29
+ .datepicker-input-container .datepicker-input[type="date"]::-webkit-calendar-picker-indicator {
30
+ display: none;
31
+ -webkit-appearance: none;
32
+ }
33
+
34
+ .datepicker-input-container .datepicker-input[type="date"]::-webkit-inner-spin-button,
35
+ .datepicker-input-container .datepicker-input[type="date"]::-webkit-clear-button {
36
+ display: none;
37
+ -webkit-appearance: none;
38
+ }
39
+
28
40
  .datepicker-input:focus {
29
41
  outline: none;
30
42
  border-color: var(--color-primary);
@@ -53,8 +65,50 @@ export const css = `/**
53
65
  pointer-events: none;
54
66
  }
55
67
 
56
- /* Datepicker Dropdown */
57
- .datepicker-dropdown {
68
+ /* Datepicker Input Container */
69
+ .datepicker-input-container {
70
+ position: relative;
71
+ display: flex;
72
+ align-items: center;
73
+ width: 100%;
74
+ }
75
+
76
+ .datepicker-input-container .datepicker-input {
77
+ padding-right: 2.5rem;
78
+ }
79
+
80
+ /* Datepicker Trigger (icon button for Popover API) */
81
+ .datepicker-trigger {
82
+ position: absolute;
83
+ right: 0.5rem;
84
+ top: 50%;
85
+ transform: translateY(-50%);
86
+ z-index: 1;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ width: 2rem;
91
+ height: 2rem;
92
+ padding: 0;
93
+ background: transparent;
94
+ border: none;
95
+ border-radius: 50%;
96
+ cursor: pointer;
97
+ color: var(--color-on-surface-variant);
98
+ transition: background-color 150ms ease-in-out;
99
+ }
100
+
101
+ .datepicker-trigger:hover {
102
+ background-color: var(--color-surface-container);
103
+ }
104
+
105
+ .datepicker-trigger .datepicker-icon {
106
+ position: static;
107
+ transform: none;
108
+ }
109
+
110
+ /* Datepicker Dropdown - Non-popover (JS-controlled) */
111
+ .datepicker-dropdown:not([popover]) {
58
112
  position: absolute;
59
113
  top: 100%;
60
114
  left: 0;
@@ -70,13 +124,28 @@ export const css = `/**
70
124
  transition: opacity 150ms ease-out, visibility 150ms ease-out, transform 150ms ease-out;
71
125
  }
72
126
 
73
- .datepicker.datepicker-open .datepicker-dropdown,
74
- .datepicker-dropdown.show {
127
+ .datepicker.datepicker-open .datepicker-dropdown:not([popover]),
128
+ .datepicker-dropdown:not([popover]).show,
129
+ .datepicker-dropdown-open:not([popover]) {
75
130
  opacity: 1;
76
131
  visibility: visible;
77
132
  transform: translateY(0);
78
133
  }
79
134
 
135
+ /* Popover API Support - Browser handles visibility, JS handles positioning */
136
+ .datepicker-dropdown[popover] {
137
+ /* Reset browser defaults - positioning handled by JavaScript */
138
+ inset: unset;
139
+ margin: 0;
140
+ padding: 0;
141
+ /* Styling */
142
+ min-width: 18rem;
143
+ background-color: var(--color-surface);
144
+ border: 1px solid var(--color-outline);
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);
147
+ }
148
+
80
149
  /* Calendar Header */
81
150
  .datepicker-header {
82
151
  display: flex;
@@ -123,6 +192,9 @@ export const css = `/**
123
192
 
124
193
  /* Calendar Body */
125
194
  .datepicker-calendar {
195
+ display: grid;
196
+ grid-template-columns: repeat(7, 1fr);
197
+ gap: 0.125rem;
126
198
  padding: 0.5rem;
127
199
  }
128
200
 
@@ -138,7 +210,7 @@ export const css = `/**
138
210
  display: flex;
139
211
  align-items: center;
140
212
  justify-content: center;
141
- height: 2rem;
213
+ aspect-ratio: 1;
142
214
  font-size: 0.75rem;
143
215
  font-weight: 500;
144
216
  color: var(--color-on-surface-variant);
@@ -155,8 +227,7 @@ export const css = `/**
155
227
  display: flex;
156
228
  align-items: center;
157
229
  justify-content: center;
158
- width: 2.5rem;
159
- height: 2.5rem;
230
+ aspect-ratio: 1;
160
231
  font-size: 0.875rem;
161
232
  color: var(--color-on-surface);
162
233
  background-color: transparent;
@@ -226,6 +297,7 @@ export const css = `/**
226
297
  grid-template-columns: repeat(3, 1fr);
227
298
  gap: 0.5rem;
228
299
  padding: 0.5rem;
300
+ min-width: 16rem;
229
301
  }
230
302
 
231
303
  .datepicker-month,
@@ -233,7 +305,7 @@ export const css = `/**
233
305
  display: flex;
234
306
  align-items: center;
235
307
  justify-content: center;
236
- height: 3rem;
308
+ padding: 0.75rem 1rem;
237
309
  font-size: 0.875rem;
238
310
  color: var(--color-on-surface);
239
311
  background-color: transparent;
@@ -249,11 +321,20 @@ export const css = `/**
249
321
  }
250
322
 
251
323
  .datepicker-month.selected,
252
- .datepicker-year.selected {
324
+ .datepicker-month-selected,
325
+ .datepicker-year.selected,
326
+ .datepicker-year-selected {
253
327
  background-color: var(--color-primary);
254
328
  color: var(--color-on-primary);
255
329
  }
256
330
 
331
+ .datepicker-day-disabled {
332
+ color: var(--color-on-surface-variant);
333
+ opacity: 0.4;
334
+ cursor: not-allowed;
335
+ pointer-events: none;
336
+ }
337
+
257
338
  /* Footer Actions */
258
339
  .datepicker-footer {
259
340
  display: flex;
@@ -339,9 +420,322 @@ export const css = `/**
339
420
  font-size: 1rem;
340
421
  }
341
422
 
423
+ /* ========================================
424
+ * Date Range Picker Variants
425
+ * ======================================== */
426
+
427
+ /* Range Input Container */
428
+ .datepicker-range {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 0.5rem;
432
+ }
433
+
434
+ .datepicker-range-separator {
435
+ color: var(--color-on-surface-variant);
436
+ font-size: 0.875rem;
437
+ }
438
+
439
+ .datepicker-range-input {
440
+ flex: 1;
441
+ }
442
+
443
+ /* Dual Calendar View */
444
+ .datepicker-dual-calendar {
445
+ display: flex;
446
+ gap: 1rem;
447
+ padding: 0.5rem;
448
+ }
449
+
450
+ .datepicker-dual-calendar .datepicker-calendar {
451
+ flex: 1;
452
+ }
453
+
454
+ /* Range Presets */
455
+ .datepicker-presets {
456
+ display: flex;
457
+ flex-direction: column;
458
+ gap: 0.25rem;
459
+ padding: 0.5rem;
460
+ border-right: 1px solid var(--color-outline-variant);
461
+ min-width: 8rem;
462
+ }
463
+
464
+ .datepicker-preset {
465
+ padding: 0.5rem 0.75rem;
466
+ font-size: 0.75rem;
467
+ color: var(--color-on-surface);
468
+ background-color: transparent;
469
+ border: none;
470
+ border-radius: 0.375rem;
471
+ cursor: pointer;
472
+ text-align: left;
473
+ transition: background-color 150ms ease-in-out;
474
+ }
475
+
476
+ .datepicker-preset:hover {
477
+ background-color: var(--color-surface-container);
478
+ }
479
+
480
+ .datepicker-preset-active {
481
+ background-color: var(--color-primary-container);
482
+ color: var(--color-on-primary-container);
483
+ }
484
+
485
+ /* Range Display */
486
+ .datepicker-range-display {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 0.75rem;
490
+ padding: 0.75rem;
491
+ background-color: var(--color-surface-container-lowest);
492
+ border-bottom: 1px solid var(--color-outline-variant);
493
+ }
494
+
495
+ .datepicker-range-date {
496
+ flex: 1;
497
+ text-align: center;
498
+ }
499
+
500
+ .datepicker-range-date-label {
501
+ font-size: 0.625rem;
502
+ font-weight: 500;
503
+ color: var(--color-on-surface-variant);
504
+ text-transform: uppercase;
505
+ margin-bottom: 0.25rem;
506
+ }
507
+
508
+ .datepicker-range-date-value {
509
+ font-size: 0.875rem;
510
+ font-weight: 500;
511
+ color: var(--color-on-surface);
512
+ }
513
+
514
+ .datepicker-range-arrow {
515
+ color: var(--color-on-surface-variant);
516
+ }
517
+
518
+ /* ========================================
519
+ * DateTime Picker Variants
520
+ * ======================================== */
521
+
522
+ /* DateTime Container */
523
+ .datetime-picker {
524
+ position: relative;
525
+ display: inline-block;
526
+ width: 100%;
527
+ }
528
+
529
+ .datetime-picker-input {
530
+ width: 100%;
531
+ padding: 0.75rem 2.5rem 0.75rem 1rem;
532
+ font-size: 0.875rem;
533
+ line-height: 1.5;
534
+ color: var(--color-on-surface);
535
+ background-color: var(--color-surface);
536
+ border: 1px solid var(--color-outline);
537
+ border-radius: 0.5rem;
538
+ transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
539
+ }
540
+
541
+ .datetime-picker-input:focus {
542
+ outline: none;
543
+ border-color: var(--color-primary);
544
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
545
+ }
546
+
547
+ /* DateTime Dropdown Layout */
548
+ .datetime-picker-dropdown {
549
+ display: flex;
550
+ flex-direction: column;
551
+ }
552
+
553
+ .datetime-picker-body {
554
+ display: flex;
555
+ }
556
+
557
+ .datetime-picker-calendar {
558
+ flex: 1;
559
+ }
560
+
561
+ .datetime-picker-time-panel {
562
+ display: flex;
563
+ flex-direction: column;
564
+ min-width: 5rem;
565
+ border-left: 1px solid var(--color-outline-variant);
566
+ }
567
+
568
+ .datetime-picker-time-header {
569
+ padding: 0.5rem;
570
+ font-size: 0.75rem;
571
+ font-weight: 500;
572
+ color: var(--color-on-surface-variant);
573
+ text-align: center;
574
+ border-bottom: 1px solid var(--color-outline-variant);
575
+ }
576
+
577
+ .datetime-picker-time-columns {
578
+ display: flex;
579
+ flex: 1;
580
+ max-height: 16rem;
581
+ }
582
+
583
+ .datetime-picker-time-column {
584
+ flex: 1;
585
+ display: flex;
586
+ flex-direction: column;
587
+ overflow-y: auto;
588
+ border-right: 1px solid var(--color-outline-variant);
589
+ }
590
+
591
+ .datetime-picker-time-column:last-child {
592
+ border-right: none;
593
+ }
594
+
595
+ .datetime-picker-time-option {
596
+ padding: 0.375rem 0.5rem;
597
+ font-size: 0.75rem;
598
+ text-align: center;
599
+ color: var(--color-on-surface);
600
+ background-color: transparent;
601
+ border: none;
602
+ cursor: pointer;
603
+ transition: background-color 150ms ease-in-out;
604
+ }
605
+
606
+ .datetime-picker-time-option:hover {
607
+ background-color: var(--color-surface-container);
608
+ }
609
+
610
+ .datetime-picker-time-option-selected {
611
+ background-color: var(--color-primary);
612
+ color: var(--color-primary-content);
613
+ }
614
+
615
+ .datetime-picker-time-option:disabled {
616
+ opacity: 0.4;
617
+ cursor: not-allowed;
618
+ }
619
+
620
+ /* ========================================
621
+ * DateTime Range Picker
622
+ * ======================================== */
623
+
624
+ .datetime-range-picker {
625
+ position: relative;
626
+ display: inline-block;
627
+ width: 100%;
628
+ }
629
+
630
+ .datetime-range-picker-inputs {
631
+ display: flex;
632
+ align-items: center;
633
+ gap: 0.5rem;
634
+ }
635
+
636
+ .datetime-range-picker-input {
637
+ flex: 1;
638
+ padding: 0.75rem 1rem;
639
+ font-size: 0.875rem;
640
+ color: var(--color-on-surface);
641
+ background-color: var(--color-surface);
642
+ border: 1px solid var(--color-outline);
643
+ border-radius: 0.5rem;
644
+ transition: border-color 150ms ease-in-out;
645
+ }
646
+
647
+ .datetime-range-picker-input:focus {
648
+ outline: none;
649
+ border-color: var(--color-primary);
650
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
651
+ }
652
+
653
+ .datetime-range-picker-dropdown {
654
+ min-width: 40rem;
655
+ }
656
+
657
+ .datetime-range-picker-body {
658
+ display: flex;
659
+ }
660
+
661
+ .datetime-range-picker-panel {
662
+ flex: 1;
663
+ border-right: 1px solid var(--color-outline-variant);
664
+ }
665
+
666
+ .datetime-range-picker-panel:last-child {
667
+ border-right: none;
668
+ }
669
+
670
+ .datetime-range-picker-panel-header {
671
+ padding: 0.5rem 0.75rem;
672
+ font-size: 0.75rem;
673
+ font-weight: 500;
674
+ color: var(--color-on-surface-variant);
675
+ text-align: center;
676
+ background-color: var(--color-surface-container-lowest);
677
+ border-bottom: 1px solid var(--color-outline-variant);
678
+ }
679
+
680
+ /* Inline Datepicker (always visible) */
681
+ .datepicker-inline {
682
+ position: static;
683
+ }
684
+
685
+ .datepicker-inline .datepicker-dropdown,
686
+ .datepicker-dropdown.datepicker-inline {
687
+ position: static;
688
+ display: block;
689
+ opacity: 1;
690
+ visibility: visible;
691
+ transform: none;
692
+ margin-top: 0;
693
+ box-shadow: none;
694
+ }
695
+
696
+ /* Color Variants */
697
+ .datepicker-primary .datepicker-day-selected,
698
+ .datepicker-primary .datepicker-day-range-start,
699
+ .datepicker-primary .datepicker-day-range-end {
700
+ background-color: var(--color-primary);
701
+ color: var(--color-primary-content);
702
+ }
703
+
704
+ .datepicker-secondary .datepicker-day-selected,
705
+ .datepicker-secondary .datepicker-day-range-start,
706
+ .datepicker-secondary .datepicker-day-range-end {
707
+ background-color: var(--color-secondary);
708
+ color: var(--color-secondary-content);
709
+ }
710
+
711
+ .datepicker-tertiary .datepicker-day-selected,
712
+ .datepicker-tertiary .datepicker-day-range-start,
713
+ .datepicker-tertiary .datepicker-day-range-end {
714
+ background-color: var(--color-tertiary);
715
+ color: var(--color-tertiary-content);
716
+ }
717
+
718
+ /* Error State */
719
+ .datepicker-error .datepicker-input,
720
+ .datetime-picker-error .datetime-picker-input {
721
+ border-color: var(--color-error);
722
+ }
723
+
724
+ .datepicker-error .datepicker-input:focus,
725
+ .datetime-picker-error .datetime-picker-input:focus {
726
+ border-color: var(--color-error);
727
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
728
+ }
729
+
342
730
  /* Reduce Motion */
343
731
  @media (prefers-reduced-motion: reduce) {
344
- .datepicker-dropdown {
732
+ .datepicker-dropdown,
733
+ .datepicker-nav-btn,
734
+ .datepicker-day,
735
+ .datepicker-month,
736
+ .datepicker-year,
737
+ .datepicker-preset,
738
+ .datetime-picker-time-option {
345
739
  transition: none;
346
740
  }
347
741
  }