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