@duskmoon-dev/core 1.14.2 → 1.16.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 (126) hide show
  1. package/dist/cjs/tailwind-plugin.cjs +38 -79
  2. package/dist/components/accordion.css +7 -7
  3. package/dist/components/alert.css +2 -2
  4. package/dist/components/appbar.css +5 -5
  5. package/dist/components/autocomplete.css +7 -7
  6. package/dist/components/avatar.css +5 -5
  7. package/dist/components/badge.css +3 -3
  8. package/dist/components/bottom-navigation.css +7 -7
  9. package/dist/components/bottomsheet.css +12 -12
  10. package/dist/components/button.css +19 -19
  11. package/dist/components/card.css +9 -2
  12. package/dist/components/cascader.css +9 -9
  13. package/dist/components/checkbox.css +1 -1
  14. package/dist/components/chip.css +12 -10
  15. package/dist/components/circle-menu.css +324 -0
  16. package/dist/components/code-block.css +133 -0
  17. package/dist/components/collapse.css +9 -9
  18. package/dist/components/datepicker.css +22 -22
  19. package/dist/components/dialog.css +5 -5
  20. package/dist/components/drawer.css +13 -13
  21. package/dist/components/file-upload.css +12 -12
  22. package/dist/components/form-group.css +162 -1
  23. package/dist/components/form.css +159 -22
  24. package/dist/components/index.css +1026 -385
  25. package/dist/components/input.css +23 -14
  26. package/dist/components/list.css +3 -3
  27. package/dist/components/markdown-body.css +6 -6
  28. package/dist/components/modal.css +7 -7
  29. package/dist/components/multi-select.css +16 -16
  30. package/dist/components/navigation.css +20 -20
  31. package/dist/components/nested-menu.css +5 -5
  32. package/dist/components/otp-input.css +5 -5
  33. package/dist/components/pin-input.css +5 -5
  34. package/dist/components/popover.css +15 -15
  35. package/dist/components/progress.css +2 -2
  36. package/dist/components/radio.css +2 -2
  37. package/dist/components/rating.css +1 -1
  38. package/dist/components/segment-control.css +6 -6
  39. package/dist/components/select.css +7 -7
  40. package/dist/components/skeleton.css +11 -11
  41. package/dist/components/slider.css +16 -16
  42. package/dist/components/snackbar.css +5 -5
  43. package/dist/components/stepper.css +9 -9
  44. package/dist/components/switch.css +1 -1
  45. package/dist/components/table.css +3 -3
  46. package/dist/components/textarea.css +5 -5
  47. package/dist/components/theme-controller.css +4 -4
  48. package/dist/components/time-input.css +10 -10
  49. package/dist/components/timeline.css +6 -6
  50. package/dist/components/toast.css +3 -3
  51. package/dist/components/toggle.css +8 -8
  52. package/dist/components/tooltip.css +1 -1
  53. package/dist/components/tree-select.css +14 -14
  54. package/dist/esm/components/accordion.js +7 -7
  55. package/dist/esm/components/alert.js +2 -2
  56. package/dist/esm/components/appbar.js +5 -5
  57. package/dist/esm/components/autocomplete.js +7 -7
  58. package/dist/esm/components/avatar.js +5 -5
  59. package/dist/esm/components/badge.js +3 -3
  60. package/dist/esm/components/bottom-navigation.js +7 -7
  61. package/dist/esm/components/bottomsheet.js +12 -12
  62. package/dist/esm/components/button.js +19 -19
  63. package/dist/esm/components/card.js +9 -2
  64. package/dist/esm/components/cascader.js +9 -9
  65. package/dist/esm/components/checkbox.js +1 -1
  66. package/dist/esm/components/chip.js +12 -10
  67. package/dist/esm/components/circle-menu.js +331 -0
  68. package/dist/esm/components/code-block.js +140 -0
  69. package/dist/esm/components/collapse.js +9 -9
  70. package/dist/esm/components/datepicker.js +22 -22
  71. package/dist/esm/components/dialog.js +5 -5
  72. package/dist/esm/components/drawer.js +13 -13
  73. package/dist/esm/components/file-upload.js +12 -12
  74. package/dist/esm/components/form-group.js +162 -1
  75. package/dist/esm/components/form.js +159 -22
  76. package/dist/esm/components/input.js +23 -14
  77. package/dist/esm/components/list.js +3 -3
  78. package/dist/esm/components/markdown-body.js +6 -6
  79. package/dist/esm/components/modal.js +7 -7
  80. package/dist/esm/components/multi-select.js +16 -16
  81. package/dist/esm/components/navigation.js +20 -20
  82. package/dist/esm/components/nested-menu.js +5 -5
  83. package/dist/esm/components/otp-input.js +5 -5
  84. package/dist/esm/components/pin-input.js +5 -5
  85. package/dist/esm/components/popover.js +15 -15
  86. package/dist/esm/components/progress.js +2 -2
  87. package/dist/esm/components/radio.js +2 -2
  88. package/dist/esm/components/rating.js +1 -1
  89. package/dist/esm/components/segment-control.js +6 -6
  90. package/dist/esm/components/select.js +7 -7
  91. package/dist/esm/components/skeleton.js +11 -11
  92. package/dist/esm/components/slider.js +16 -16
  93. package/dist/esm/components/snackbar.js +5 -5
  94. package/dist/esm/components/stepper.js +9 -9
  95. package/dist/esm/components/switch.js +1 -1
  96. package/dist/esm/components/table.js +3 -3
  97. package/dist/esm/components/textarea.js +5 -5
  98. package/dist/esm/components/theme-controller.js +4 -4
  99. package/dist/esm/components/time-input.js +10 -10
  100. package/dist/esm/components/timeline.js +6 -6
  101. package/dist/esm/components/toast.js +3 -3
  102. package/dist/esm/components/toggle.js +8 -8
  103. package/dist/esm/components/tooltip.js +1 -1
  104. package/dist/esm/components/tree-select.js +14 -14
  105. package/dist/esm/tailwind-plugin.js +38 -79
  106. package/dist/index.css +1435 -1137
  107. package/dist/index.min.css +1 -1
  108. package/dist/themes/{forest.css → generated/forest.css} +26 -94
  109. package/dist/themes/generated/moonlight.css +77 -0
  110. package/dist/themes/{ocean.css → generated/ocean.css} +26 -103
  111. package/dist/themes/generated/spacing.css +36 -0
  112. package/dist/themes/{sunset.css → generated/sunset.css} +26 -95
  113. package/dist/themes/generated/sunshine.css +77 -0
  114. package/dist/types/tailwind-plugin.d.ts +1 -0
  115. package/dist/types/tailwind-plugin.d.ts.map +1 -1
  116. package/dist/types/themes/generated/ts/types.d.ts +76 -0
  117. package/dist/types/themes/generated/ts/types.d.ts.map +1 -0
  118. package/dist/types/types/index.d.ts +1 -1
  119. package/dist/types/types/index.d.ts.map +1 -1
  120. package/dist/types/types/plugin.d.ts +1 -1
  121. package/dist/types/types/plugin.d.ts.map +1 -1
  122. package/dist/types/types/theme.d.ts +5 -152
  123. package/dist/types/types/theme.d.ts.map +1 -1
  124. package/package.json +11 -6
  125. package/dist/themes/moonlight.css +0 -271
  126. package/dist/themes/sunshine.css +0 -252
@@ -17,14 +17,14 @@ export const css = `/**
17
17
  max-height: calc(100vh - 4rem);
18
18
  background-color: var(--color-surface);
19
19
  color: var(--color-on-surface);
20
- border-radius: 1.5rem;
20
+ border-radius: var(--radius-2xl);
21
21
  box-shadow: var(--shadow-2xl);
22
22
  overflow: hidden;
23
23
  }
24
24
 
25
25
  /* Dialog Backdrop (native ::backdrop) */
26
26
  dialog.dialog::backdrop {
27
- background-color: rgb(0 0 0 / 0.5);
27
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
28
28
  }
29
29
 
30
30
  /* Dialog Box - inner container for flex layout */
@@ -63,7 +63,7 @@ export const css = `/**
63
63
  color: var(--color-on-surface-variant);
64
64
  background-color: transparent;
65
65
  border: none;
66
- border-radius: 50%;
66
+ border-radius: var(--radius-full);
67
67
  cursor: pointer;
68
68
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
69
69
  flex-shrink: 0;
@@ -75,8 +75,8 @@ export const css = `/**
75
75
  }
76
76
 
77
77
  .dialog-close:focus-visible {
78
- outline: 2px solid var(--color-primary);
79
- outline-offset: 2px;
78
+ outline: none;
79
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
80
80
  }
81
81
 
82
82
  /* Dialog Body */
@@ -10,7 +10,7 @@ export const css = `/**
10
10
  position: fixed;
11
11
  inset: 0;
12
12
  z-index: 1100;
13
- background-color: rgb(0 0 0 / 0.5);
13
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
14
14
  opacity: 0;
15
15
  visibility: hidden;
16
16
  transition: opacity 300ms ease-out, visibility 300ms ease-out;
@@ -57,7 +57,7 @@ export const css = `/**
57
57
  width: 20rem;
58
58
  max-width: calc(100vw - 3.5rem);
59
59
  transform: translateX(-100%);
60
- border-radius: 0 1rem 1rem 0;
60
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
61
61
  }
62
62
 
63
63
  .drawer-left.drawer-open {
@@ -71,7 +71,7 @@ export const css = `/**
71
71
  width: 20rem;
72
72
  max-width: calc(100vw - 3.5rem);
73
73
  transform: translateX(100%);
74
- border-radius: 1rem 0 0 1rem;
74
+ border-radius: var(--radius-lg) 0 0 var(--radius-lg);
75
75
  }
76
76
 
77
77
  .drawer-right.drawer-open {
@@ -85,7 +85,7 @@ export const css = `/**
85
85
  height: auto;
86
86
  max-height: 80vh;
87
87
  transform: translateY(-100%);
88
- border-radius: 0 0 1rem 1rem;
88
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
89
89
  }
90
90
 
91
91
  .drawer-top.drawer-open {
@@ -99,7 +99,7 @@ export const css = `/**
99
99
  height: auto;
100
100
  max-height: 80vh;
101
101
  transform: translateY(100%);
102
- border-radius: 1rem 1rem 0 0;
102
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
103
103
  }
104
104
 
105
105
  .drawer-bottom.drawer-open {
@@ -132,7 +132,7 @@ export const css = `/**
132
132
  color: var(--color-on-surface-variant);
133
133
  background-color: transparent;
134
134
  border: none;
135
- border-radius: 50%;
135
+ border-radius: var(--radius-full);
136
136
  cursor: pointer;
137
137
  transition: background-color 150ms ease-in-out;
138
138
  }
@@ -142,8 +142,8 @@ export const css = `/**
142
142
  }
143
143
 
144
144
  .drawer-close:focus-visible {
145
- outline: 2px solid var(--color-primary);
146
- outline-offset: 2px;
145
+ outline: none;
146
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
147
147
  }
148
148
 
149
149
  /* Drawer Body (main content area) */
@@ -174,7 +174,7 @@ export const css = `/**
174
174
  color: var(--color-on-surface-variant);
175
175
  background-color: transparent;
176
176
  border: none;
177
- border-radius: 1.75rem;
177
+ border-radius: var(--radius-2xl);
178
178
  cursor: pointer;
179
179
  text-decoration: none;
180
180
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
@@ -187,8 +187,8 @@ export const css = `/**
187
187
  }
188
188
 
189
189
  .drawer-item:focus-visible {
190
- outline: 2px solid var(--color-primary);
191
- outline-offset: 2px;
190
+ outline: none;
191
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
192
192
  }
193
193
 
194
194
  /* Active Item States */
@@ -226,7 +226,7 @@ export const css = `/**
226
226
  font-weight: 500;
227
227
  background-color: var(--color-error-container);
228
228
  color: var(--color-on-error-container);
229
- border-radius: 9999px;
229
+ border-radius: var(--radius-full);
230
230
  margin-left: auto;
231
231
  }
232
232
 
@@ -268,7 +268,7 @@ export const css = `/**
268
268
  .drawer-profile-avatar {
269
269
  width: 2.5rem;
270
270
  height: 2.5rem;
271
- border-radius: 50%;
271
+ border-radius: var(--radius-full);
272
272
  background-color: var(--color-primary-container);
273
273
  display: flex;
274
274
  align-items: center;
@@ -24,7 +24,7 @@ export const css = `/**
24
24
  padding: 2rem;
25
25
  background-color: var(--color-surface);
26
26
  border: 2px dashed currentColor;
27
- border-radius: 0.75rem;
27
+ border-radius: var(--radius-md);
28
28
  cursor: pointer;
29
29
  transition: border-color 150ms ease-in-out, background-color 150ms ease-in-out;
30
30
  }
@@ -107,7 +107,7 @@ export const css = `/**
107
107
  gap: 0.75rem;
108
108
  padding: 0.75rem;
109
109
  background-color: var(--color-surface-container);
110
- border-radius: 0.5rem;
110
+ border-radius: var(--radius-sm);
111
111
  }
112
112
 
113
113
  .file-upload-item-icon {
@@ -118,7 +118,7 @@ export const css = `/**
118
118
  height: 2.5rem;
119
119
  background-color: var(--color-primary-container);
120
120
  color: var(--color-on-primary-container);
121
- border-radius: 0.5rem;
121
+ border-radius: var(--radius-sm);
122
122
  font-size: 1.25rem;
123
123
  flex-shrink: 0;
124
124
  }
@@ -151,7 +151,7 @@ export const css = `/**
151
151
  color: var(--color-on-surface-variant);
152
152
  background-color: transparent;
153
153
  border: none;
154
- border-radius: 50%;
154
+ border-radius: var(--radius-full);
155
155
  cursor: pointer;
156
156
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
157
157
  flex-shrink: 0;
@@ -168,7 +168,7 @@ export const css = `/**
168
168
  height: 0.25rem;
169
169
  margin-top: 0.5rem;
170
170
  background-color: var(--color-surface-container-highest);
171
- border-radius: 9999px;
171
+ border-radius: var(--radius-full);
172
172
  overflow: hidden;
173
173
  }
174
174
 
@@ -178,7 +178,7 @@ export const css = `/**
178
178
  left: 0;
179
179
  height: 100%;
180
180
  background-color: var(--color-primary);
181
- border-radius: 9999px;
181
+ border-radius: var(--radius-full);
182
182
  transition: width 150ms ease-in-out;
183
183
  }
184
184
 
@@ -218,7 +218,7 @@ export const css = `/**
218
218
  .file-upload-preview-item {
219
219
  position: relative;
220
220
  aspect-ratio: 1;
221
- border-radius: 0.5rem;
221
+ border-radius: var(--radius-sm);
222
222
  overflow: hidden;
223
223
  background-color: var(--color-surface-container);
224
224
  }
@@ -241,7 +241,7 @@ export const css = `/**
241
241
  background-color: var(--color-on-surface);
242
242
  color: var(--color-surface);
243
243
  border: none;
244
- border-radius: 50%;
244
+ border-radius: var(--radius-full);
245
245
  cursor: pointer;
246
246
  opacity: 0;
247
247
  transition: opacity 150ms ease-in-out;
@@ -277,10 +277,10 @@ export const css = `/**
277
277
  padding: 0.75rem 1.5rem;
278
278
  font-size: 0.875rem;
279
279
  font-weight: 500;
280
- color: var(--color-on-primary);
280
+ color: var(--color-primary-content);
281
281
  background-color: var(--color-primary);
282
282
  border: none;
283
- border-radius: 0.5rem;
283
+ border-radius: var(--radius-sm);
284
284
  cursor: pointer;
285
285
  transition: background-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
286
286
  }
@@ -290,8 +290,8 @@ export const css = `/**
290
290
  }
291
291
 
292
292
  .file-upload-button:focus-visible {
293
- outline: 2px solid var(--color-primary);
294
- outline-offset: 2px;
293
+ outline: none;
294
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
295
295
  }
296
296
 
297
297
  .file-upload-button:disabled {
@@ -121,7 +121,7 @@ export const css = `/**
121
121
  padding: 1rem;
122
122
  margin: 0;
123
123
  border: 1px solid var(--color-outline-variant);
124
- border-radius: 0.5rem;
124
+ border-radius: var(--radius-sm);
125
125
  background-color: transparent;
126
126
  }
127
127
 
@@ -333,11 +333,172 @@ export const css = `/**
333
333
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
334
334
  }
335
335
 
336
+ /* Info State on Form Group */
337
+ .form-group-info .form-label {
338
+ color: var(--color-info);
339
+ }
340
+
341
+ .form-group-info .input,
342
+ .form-group-info .select,
343
+ .form-group-info .textarea {
344
+ border-color: var(--color-info);
345
+ }
346
+
347
+ .form-group-info .input:focus-visible,
348
+ .form-group-info .select:focus-visible,
349
+ .form-group-info .textarea:focus-visible {
350
+ border-color: var(--color-info);
351
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
352
+ }
353
+
336
354
  /* Disabled Form Group */
337
355
  .form-group-disabled {
338
356
  opacity: 0.5;
339
357
  pointer-events: none;
340
358
  }
359
+
360
+ /* ARIA-based validation states — mirrors class-based states for native form validation */
361
+ .input[aria-invalid="true"],
362
+ .select[aria-invalid="true"],
363
+ .textarea[aria-invalid="true"] {
364
+ border-color: var(--color-error);
365
+ color: var(--color-error);
366
+ }
367
+
368
+ .input[aria-invalid="true"]:focus-visible,
369
+ .select[aria-invalid="true"]:focus-visible,
370
+ .textarea[aria-invalid="true"]:focus-visible {
371
+ border-color: var(--color-error);
372
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
373
+ }
374
+
375
+ /* ARIA-based validation for checkbox, radio, switch, file-input
376
+ (frameworks like React Hook Form / Angular set aria-invalid programmatically) */
377
+ .checkbox[aria-invalid="true"],
378
+ .radio[aria-invalid="true"],
379
+ .file-input[aria-invalid="true"] {
380
+ border-color: var(--color-error);
381
+ }
382
+
383
+ .checkbox[aria-invalid="true"]:focus-visible,
384
+ .radio[aria-invalid="true"]:focus-visible,
385
+ .file-input[aria-invalid="true"]:focus-visible {
386
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
387
+ }
388
+
389
+ .switch[aria-invalid="true"] {
390
+ border-color: var(--color-error);
391
+ }
392
+
393
+ .switch[aria-invalid="true"]:focus-visible {
394
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
395
+ }
396
+
397
+ /* ARIA required indicator for labels */
398
+ .form-label[aria-required="true"]::after,
399
+ label[aria-required="true"]::after {
400
+ content: ' *';
401
+ color: var(--color-error);
402
+ }
403
+
404
+ /* Native :invalid pseudo-class (opt-in with .validate class to avoid red on page load) */
405
+ .validate .input:invalid,
406
+ .validate .select:invalid,
407
+ .validate .textarea:invalid {
408
+ border-color: var(--color-error);
409
+ }
410
+
411
+ .validate .input:valid,
412
+ .validate .select:valid,
413
+ .validate .textarea:valid {
414
+ border-color: var(--color-success);
415
+ }
416
+
417
+ /* :user-invalid — fires only after user interaction (no .validate wrapper needed) */
418
+ .input:user-invalid,
419
+ .select:user-invalid,
420
+ .textarea:user-invalid {
421
+ border-color: var(--color-error);
422
+ }
423
+
424
+ .input:user-invalid:focus-visible,
425
+ .select:user-invalid:focus-visible,
426
+ .textarea:user-invalid:focus-visible {
427
+ border-color: var(--color-error);
428
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
429
+ }
430
+
431
+ .input:user-valid,
432
+ .select:user-valid,
433
+ .textarea:user-valid {
434
+ border-color: var(--color-success);
435
+ }
436
+
437
+ .input:user-valid:focus-visible,
438
+ .select:user-valid:focus-visible,
439
+ .textarea:user-valid:focus-visible {
440
+ border-color: var(--color-success);
441
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
442
+ }
443
+
444
+ /* Checkbox & Radio — validation pseudo-classes */
445
+ .checkbox:user-invalid,
446
+ .radio:user-invalid {
447
+ border-color: var(--color-error);
448
+ }
449
+
450
+ .checkbox:user-invalid:focus-visible,
451
+ .radio:user-invalid:focus-visible {
452
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
453
+ }
454
+
455
+ .checkbox:user-valid:checked,
456
+ .radio:user-valid:checked {
457
+ border-color: var(--color-success);
458
+ background-color: var(--color-success);
459
+ }
460
+
461
+ /* Switch — validation pseudo-classes (required but unchecked) */
462
+ .switch:user-invalid {
463
+ border-color: var(--color-error);
464
+ }
465
+
466
+ .switch:user-invalid:focus-visible {
467
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
468
+ }
469
+
470
+ .switch:user-valid:checked {
471
+ background-color: var(--color-success);
472
+ border-color: var(--color-success);
473
+ }
474
+
475
+ /* File Input — validation pseudo-classes */
476
+ .file-input:user-invalid {
477
+ border-color: var(--color-error);
478
+ }
479
+
480
+ .file-input:user-invalid:focus-visible {
481
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
482
+ }
483
+
484
+ /* Filled Input — validation with bottom border */
485
+ .input-filled:user-invalid {
486
+ border-bottom-color: var(--color-error);
487
+ }
488
+
489
+ .input-filled:user-invalid:focus-visible {
490
+ border-bottom-color: var(--color-error);
491
+ box-shadow: none;
492
+ }
493
+
494
+ .input-filled:user-valid {
495
+ border-bottom-color: var(--color-success);
496
+ }
497
+
498
+ .input-filled:user-valid:focus-visible {
499
+ border-bottom-color: var(--color-success);
500
+ box-shadow: none;
501
+ }
341
502
  }
342
503
  `;
343
504