@duskmoon-dev/core 1.1.1 → 1.3.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/checkbox.css +231 -0
  2. package/dist/components/collapse.css +208 -8
  3. package/dist/components/datepicker.css +404 -10
  4. package/dist/components/form-group.css +308 -0
  5. package/dist/components/index.css +4598 -816
  6. package/dist/components/multi-select.css +491 -0
  7. package/dist/components/navigation.css +346 -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/checkbox.js +238 -0
  18. package/dist/esm/components/collapse.js +208 -8
  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 +346 -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 +4402 -620
  33. package/package.json +56 -1
@@ -149,6 +149,7 @@
149
149
  font-size: 0.875rem;
150
150
  }
151
151
 
152
+ /* List-based breadcrumbs (legacy) */
152
153
  .breadcrumbs li {
153
154
  display: flex;
154
155
  align-items: center;
@@ -179,6 +180,198 @@
179
180
  color: var(--color-on-surface-variant);
180
181
  }
181
182
 
183
+ /* Span-based breadcrumbs */
184
+ .breadcrumb-item {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ gap: 0.375rem;
188
+ color: var(--color-on-surface-variant);
189
+ text-decoration: none;
190
+ transition: color 150ms ease-in-out;
191
+ }
192
+
193
+ .breadcrumb-item:hover {
194
+ color: var(--color-on-surface);
195
+ }
196
+
197
+ .breadcrumb-item-active {
198
+ color: var(--color-on-surface);
199
+ font-weight: 500;
200
+ pointer-events: none;
201
+ }
202
+
203
+ .breadcrumb-link {
204
+ display: inline-flex;
205
+ align-items: center;
206
+ gap: 0.375rem;
207
+ color: var(--color-on-surface-variant);
208
+ text-decoration: none;
209
+ transition: color 150ms ease-in-out;
210
+ cursor: pointer;
211
+ }
212
+
213
+ .breadcrumb-link:hover {
214
+ color: var(--color-primary);
215
+ text-decoration: underline;
216
+ }
217
+
218
+ .breadcrumb-link:focus-visible {
219
+ outline: 2px solid var(--color-primary);
220
+ outline-offset: 2px;
221
+ border-radius: 0.25rem;
222
+ }
223
+
224
+ /* Separator - Default shows "/" */
225
+ .breadcrumb-separator {
226
+ display: inline-flex;
227
+ align-items: center;
228
+ color: var(--color-on-surface-variant);
229
+ font-size: 0.875rem;
230
+ user-select: none;
231
+ opacity: 0.6;
232
+ }
233
+
234
+ .breadcrumb-separator::before {
235
+ content: "/";
236
+ }
237
+
238
+ /* Separator Variants */
239
+ .breadcrumbs-slash .breadcrumb-separator::before {
240
+ content: "/";
241
+ }
242
+
243
+ .breadcrumbs-chevron .breadcrumb-separator::before {
244
+ content: "›";
245
+ font-size: 1.125rem;
246
+ }
247
+
248
+ .breadcrumbs-dot .breadcrumb-separator::before {
249
+ content: "•";
250
+ }
251
+
252
+ .breadcrumbs-arrow .breadcrumb-separator::before {
253
+ content: "→";
254
+ }
255
+
256
+ .breadcrumbs-pipe .breadcrumb-separator::before {
257
+ content: "|";
258
+ }
259
+
260
+ /* Breadcrumb Icon */
261
+ .breadcrumb-icon {
262
+ display: inline-flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ width: 1rem;
266
+ height: 1rem;
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ .breadcrumb-icon svg {
271
+ width: 100%;
272
+ height: 100%;
273
+ }
274
+
275
+ /* Home Icon Link */
276
+ .breadcrumb-home {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ color: var(--color-on-surface-variant);
281
+ text-decoration: none;
282
+ transition: color 150ms ease-in-out;
283
+ }
284
+
285
+ .breadcrumb-home:hover {
286
+ color: var(--color-primary);
287
+ }
288
+
289
+ .breadcrumb-home-icon {
290
+ width: 1.125rem;
291
+ height: 1.125rem;
292
+ }
293
+
294
+ /* Collapsed Breadcrumbs (with ellipsis) */
295
+ .breadcrumb-ellipsis {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ padding: 0.25rem 0.5rem;
300
+ color: var(--color-on-surface-variant);
301
+ background-color: transparent;
302
+ border: none;
303
+ border-radius: 0.25rem;
304
+ cursor: pointer;
305
+ transition: background-color 150ms ease-in-out;
306
+ }
307
+
308
+ .breadcrumb-ellipsis::before {
309
+ content: "...";
310
+ }
311
+
312
+ .breadcrumb-ellipsis:hover {
313
+ background-color: color-mix(in oklch, var(--color-on-surface) 8%, transparent);
314
+ }
315
+
316
+ /* Color Variants */
317
+ .breadcrumbs-primary .breadcrumb-link:hover,
318
+ .breadcrumbs-primary .breadcrumb-item-active {
319
+ color: var(--color-primary);
320
+ }
321
+
322
+ .breadcrumbs-secondary .breadcrumb-link:hover,
323
+ .breadcrumbs-secondary .breadcrumb-item-active {
324
+ color: var(--color-secondary);
325
+ }
326
+
327
+ .breadcrumbs-tertiary .breadcrumb-link:hover,
328
+ .breadcrumbs-tertiary .breadcrumb-item-active {
329
+ color: var(--color-tertiary);
330
+ }
331
+
332
+ /* Size Variants */
333
+ .breadcrumbs-sm {
334
+ font-size: 0.75rem;
335
+ gap: 0.375rem;
336
+ }
337
+
338
+ .breadcrumbs-sm .breadcrumb-icon,
339
+ .breadcrumbs-sm .breadcrumb-home-icon {
340
+ width: 0.875rem;
341
+ height: 0.875rem;
342
+ }
343
+
344
+ .breadcrumbs-lg {
345
+ font-size: 1rem;
346
+ gap: 0.625rem;
347
+ }
348
+
349
+ .breadcrumbs-lg .breadcrumb-icon,
350
+ .breadcrumbs-lg .breadcrumb-home-icon {
351
+ width: 1.25rem;
352
+ height: 1.25rem;
353
+ }
354
+
355
+ /* Contained Variant (with background) */
356
+ .breadcrumbs-contained {
357
+ padding: 0.75rem 1rem;
358
+ background-color: var(--color-surface-container);
359
+ border-radius: 0.5rem;
360
+ }
361
+
362
+ /* No Wrap Variant */
363
+ .breadcrumbs-nowrap {
364
+ flex-wrap: nowrap;
365
+ overflow-x: auto;
366
+ }
367
+
368
+ /* Disabled Breadcrumb Item */
369
+ .breadcrumb-item-disabled {
370
+ opacity: 0.38;
371
+ pointer-events: none;
372
+ cursor: not-allowed;
373
+ }
374
+
182
375
  /* Tabs */
183
376
  .tabs {
184
377
  display: flex;
@@ -347,14 +540,18 @@
347
540
  padding: 0;
348
541
  }
349
542
 
543
+ .pagination-item,
544
+ .pagination-prev,
545
+ .pagination-next,
350
546
  .pagination li > a,
351
547
  .pagination li > button {
352
- display: flex;
548
+ display: inline-flex;
353
549
  align-items: center;
354
550
  justify-content: center;
551
+ gap: 0.25rem;
355
552
  min-width: 2.5rem;
356
553
  height: 2.5rem;
357
- padding: 0 0.5rem;
554
+ padding: 0 0.75rem;
358
555
  font-size: 0.875rem;
359
556
  color: var(--color-on-surface);
360
557
  background-color: transparent;
@@ -362,13 +559,19 @@
362
559
  border-radius: 0.5rem;
363
560
  cursor: pointer;
364
561
  transition: all 150ms ease-in-out;
562
+ white-space: nowrap;
365
563
  }
366
564
 
565
+ .pagination-item:hover,
566
+ .pagination-prev:hover,
567
+ .pagination-next:hover,
367
568
  .pagination li > a:hover,
368
569
  .pagination li > button:hover {
369
570
  background-color: var(--color-surface-container);
370
571
  }
371
572
 
573
+ .pagination-item-active,
574
+ .pagination-item-active-primary,
372
575
  .pagination li > a.active,
373
576
  .pagination li > button.active,
374
577
  .pagination li > a[aria-current="page"],
@@ -378,15 +581,156 @@
378
581
  border-color: var(--color-primary);
379
582
  }
380
583
 
584
+ .pagination-item-active-secondary {
585
+ background-color: var(--color-secondary);
586
+ color: var(--color-secondary-content);
587
+ border-color: var(--color-secondary);
588
+ }
589
+
590
+ .pagination-item-active-tertiary {
591
+ background-color: var(--color-tertiary);
592
+ color: var(--color-tertiary-content);
593
+ border-color: var(--color-tertiary);
594
+ }
595
+
596
+ .pagination-item:focus-visible,
597
+ .pagination-prev:focus-visible,
598
+ .pagination-next:focus-visible,
381
599
  .pagination li > a:focus-visible,
382
600
  .pagination li > button:focus-visible {
383
601
  outline: 2px solid var(--color-primary);
384
602
  outline-offset: 2px;
385
603
  }
386
604
 
605
+ .pagination-item:disabled,
606
+ .pagination-item-disabled,
607
+ .pagination-prev:disabled,
608
+ .pagination-next:disabled,
387
609
  .pagination li > a:disabled,
388
610
  .pagination li > button:disabled {
389
611
  opacity: 0.5;
390
612
  cursor: not-allowed;
613
+ pointer-events: none;
614
+ }
615
+
616
+ /* Pagination Ellipsis */
617
+ .pagination-ellipsis {
618
+ display: inline-flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ min-width: 2.5rem;
622
+ height: 2.5rem;
623
+ color: var(--color-on-surface-variant);
624
+ }
625
+
626
+ .pagination-ellipsis::before {
627
+ content: '…';
628
+ }
629
+
630
+ /* Pagination Info */
631
+ .pagination-info {
632
+ display: flex;
633
+ flex-direction: column;
634
+ align-items: center;
635
+ gap: 0.5rem;
636
+ }
637
+
638
+ .pagination-info-text {
639
+ font-size: 0.875rem;
640
+ color: var(--color-on-surface-variant);
641
+ }
642
+
643
+ /* Pagination Input */
644
+ .pagination-input {
645
+ display: inline-flex;
646
+ align-items: center;
647
+ gap: 0.5rem;
648
+ font-size: 0.875rem;
649
+ color: var(--color-on-surface-variant);
650
+ }
651
+
652
+ .pagination-input input {
653
+ width: 3.5rem;
654
+ padding: 0.375rem 0.5rem;
655
+ font-size: 0.875rem;
656
+ text-align: center;
657
+ color: var(--color-on-surface);
658
+ background-color: var(--color-surface);
659
+ border: 1px solid var(--color-outline);
660
+ border-radius: 0.375rem;
661
+ }
662
+
663
+ .pagination-input input:focus {
664
+ outline: none;
665
+ border-color: var(--color-primary);
666
+ }
667
+
668
+ /* Pagination Variants */
669
+ .pagination-outlined .pagination-item,
670
+ .pagination-outlined .pagination-prev,
671
+ .pagination-outlined .pagination-next {
672
+ border: 1px solid var(--color-outline);
673
+ }
674
+
675
+ .pagination-tonal .pagination-item-active,
676
+ .pagination-tonal .pagination-item-active-primary {
677
+ background-color: var(--color-primary-container);
678
+ color: var(--color-on-primary-container);
679
+ border-color: var(--color-primary-container);
680
+ }
681
+
682
+ /* Pagination Sizes */
683
+ .pagination-sm .pagination-item,
684
+ .pagination-sm .pagination-prev,
685
+ .pagination-sm .pagination-next {
686
+ min-width: 2rem;
687
+ height: 2rem;
688
+ padding: 0 0.5rem;
689
+ font-size: 0.75rem;
690
+ }
691
+
692
+ .pagination-lg .pagination-item,
693
+ .pagination-lg .pagination-prev,
694
+ .pagination-lg .pagination-next {
695
+ min-width: 3rem;
696
+ height: 3rem;
697
+ padding: 0 1rem;
698
+ font-size: 1rem;
699
+ }
700
+
701
+ /* Pagination Compact */
702
+ .pagination-compact {
703
+ gap: 0;
704
+ }
705
+
706
+ .pagination-compact .pagination-item,
707
+ .pagination-compact .pagination-prev,
708
+ .pagination-compact .pagination-next {
709
+ border-radius: 0;
710
+ }
711
+
712
+ .pagination-compact .pagination-item:first-child,
713
+ .pagination-compact .pagination-prev {
714
+ border-radius: 0.5rem 0 0 0.5rem;
715
+ }
716
+
717
+ .pagination-compact .pagination-item:last-child,
718
+ .pagination-compact .pagination-next {
719
+ border-radius: 0 0.5rem 0.5rem 0;
720
+ }
721
+
722
+ /* Pagination Responsive */
723
+ .pagination-responsive {
724
+ flex-wrap: wrap;
725
+ justify-content: center;
726
+ }
727
+
728
+ /* Reduce Motion */
729
+ @media (prefers-reduced-motion: reduce) {
730
+ .pagination-item,
731
+ .pagination-prev,
732
+ .pagination-next {
733
+ transition: none;
734
+ }
391
735
  }
392
736
  }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * OTP Input Component Styles
3
+ * DuskMoonUI - One-Time Password input for verification codes
4
+ */
5
+
6
+ @layer components {
7
+ /* Base OTP Container */
8
+ .otp-input {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ gap: 0.5rem;
12
+ }
13
+
14
+ /* OTP Input Field */
15
+ .otp-input-field {
16
+ width: 3rem;
17
+ height: 3.5rem;
18
+ padding: 0;
19
+ font-size: 1.5rem;
20
+ font-weight: 600;
21
+ text-align: center;
22
+ color: var(--color-on-surface);
23
+ background-color: var(--color-surface);
24
+ border: 2px solid var(--color-outline);
25
+ border-radius: 0.5rem;
26
+ outline: none;
27
+ transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
28
+ caret-color: var(--color-primary);
29
+ }
30
+
31
+ .otp-input-field::placeholder {
32
+ color: var(--color-on-surface-variant);
33
+ opacity: 0.5;
34
+ }
35
+
36
+ .otp-input-field:hover:not(:disabled):not(:focus) {
37
+ border-color: var(--color-on-surface-variant);
38
+ }
39
+
40
+ .otp-input-field:focus {
41
+ border-color: var(--color-primary);
42
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
43
+ }
44
+
45
+ .otp-input-field:disabled {
46
+ opacity: 0.38;
47
+ cursor: not-allowed;
48
+ background-color: var(--color-surface-container);
49
+ }
50
+
51
+ /* Filled State */
52
+ .otp-input-field-filled {
53
+ background-color: var(--color-surface-container);
54
+ border-color: var(--color-primary);
55
+ }
56
+
57
+ /* Separator */
58
+ .otp-separator {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ width: 1rem;
63
+ height: 0.25rem;
64
+ background-color: var(--color-outline);
65
+ border-radius: 0.125rem;
66
+ }
67
+
68
+ /* Size Variants */
69
+ .otp-input-sm .otp-input-field {
70
+ width: 2.5rem;
71
+ height: 3rem;
72
+ font-size: 1.25rem;
73
+ border-radius: 0.375rem;
74
+ }
75
+
76
+ .otp-input-lg .otp-input-field {
77
+ width: 3.5rem;
78
+ height: 4rem;
79
+ font-size: 1.75rem;
80
+ border-radius: 0.625rem;
81
+ }
82
+
83
+ /* Compact Gap */
84
+ .otp-input-compact {
85
+ gap: 0.25rem;
86
+ }
87
+
88
+ /* Wide Gap */
89
+ .otp-input-wide {
90
+ gap: 1rem;
91
+ }
92
+
93
+ /* Filled Variant */
94
+ .otp-input-filled .otp-input-field {
95
+ background-color: var(--color-surface-container);
96
+ border: none;
97
+ border-bottom: 2px solid var(--color-outline);
98
+ border-radius: 0.5rem 0.5rem 0 0;
99
+ }
100
+
101
+ .otp-input-filled .otp-input-field:focus {
102
+ border-bottom-color: var(--color-primary);
103
+ box-shadow: none;
104
+ }
105
+
106
+ /* Outlined Variant (default) */
107
+ .otp-input-outlined .otp-input-field {
108
+ background-color: transparent;
109
+ }
110
+
111
+ /* Underline Variant */
112
+ .otp-input-underline .otp-input-field {
113
+ background-color: transparent;
114
+ border: none;
115
+ border-bottom: 2px solid var(--color-outline);
116
+ border-radius: 0;
117
+ }
118
+
119
+ .otp-input-underline .otp-input-field:focus {
120
+ border-bottom-color: var(--color-primary);
121
+ box-shadow: none;
122
+ }
123
+
124
+ /* Color Variants */
125
+ .otp-input-primary .otp-input-field:focus {
126
+ border-color: var(--color-primary);
127
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
128
+ }
129
+
130
+ .otp-input-secondary .otp-input-field:focus {
131
+ border-color: var(--color-secondary);
132
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
133
+ }
134
+
135
+ .otp-input-tertiary .otp-input-field:focus {
136
+ border-color: var(--color-tertiary);
137
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
138
+ }
139
+
140
+ /* Error State */
141
+ .otp-input-error .otp-input-field {
142
+ border-color: var(--color-error);
143
+ }
144
+
145
+ .otp-input-error .otp-input-field:focus {
146
+ border-color: var(--color-error);
147
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
148
+ }
149
+
150
+ /* Success State */
151
+ .otp-input-success .otp-input-field {
152
+ border-color: var(--color-success);
153
+ }
154
+
155
+ .otp-input-success .otp-input-field:focus {
156
+ border-color: var(--color-success);
157
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
158
+ }
159
+
160
+ /* Masked Input (dots) */
161
+ .otp-input-masked .otp-input-field {
162
+ -webkit-text-security: disc;
163
+ font-family: text-security-disc;
164
+ }
165
+
166
+ /* OTP Group with Label */
167
+ .otp-group {
168
+ display: flex;
169
+ flex-direction: column;
170
+ gap: 0.5rem;
171
+ }
172
+
173
+ .otp-label {
174
+ font-size: 0.875rem;
175
+ font-weight: 500;
176
+ color: var(--color-on-surface);
177
+ }
178
+
179
+ .otp-helper {
180
+ font-size: 0.75rem;
181
+ color: var(--color-on-surface-variant);
182
+ }
183
+
184
+ .otp-error-message {
185
+ font-size: 0.75rem;
186
+ color: var(--color-error);
187
+ }
188
+
189
+ /* Reduce Motion */
190
+ @media (prefers-reduced-motion: reduce) {
191
+ .otp-input-field {
192
+ transition: none;
193
+ }
194
+ }
195
+ }