@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
@@ -8,7 +8,7 @@
8
8
  .collapse {
9
9
  display: flex;
10
10
  flex-direction: column;
11
- border-radius: 0.5rem;
11
+ border-radius: var(--radius-sm);
12
12
  background-color: var(--color-surface);
13
13
  /* Override Tailwind's visibility: collapse utility */
14
14
  visibility: visible !important;
@@ -36,8 +36,8 @@
36
36
  }
37
37
 
38
38
  .collapse-trigger:focus-visible {
39
- outline: 2px solid var(--color-primary);
40
- outline-offset: -2px;
39
+ outline: none;
40
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
41
41
  }
42
42
 
43
43
  /* Collapse Icon */
@@ -124,7 +124,7 @@
124
124
  border: none;
125
125
  cursor: pointer;
126
126
  transition: background-color 150ms ease-in-out;
127
- border-radius: 0.5rem;
127
+ border-radius: var(--radius-sm);
128
128
  }
129
129
 
130
130
  .collapse-toggle:hover {
@@ -132,8 +132,8 @@
132
132
  }
133
133
 
134
134
  .collapse-toggle:focus-visible {
135
- outline: 2px solid var(--color-primary);
136
- outline-offset: 2px;
135
+ outline: none;
136
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
137
137
  }
138
138
 
139
139
  /* Toggle Icon */
@@ -154,7 +154,7 @@
154
154
  .collapse-card {
155
155
  background-color: var(--color-surface);
156
156
  border: 1px solid var(--color-outline-variant);
157
- border-radius: 0.75rem;
157
+ border-radius: var(--radius-md);
158
158
  overflow: hidden;
159
159
  box-shadow: var(--shadow-sm);
160
160
  }
@@ -182,7 +182,7 @@
182
182
  /* Bordered Variant */
183
183
  .collapse-bordered {
184
184
  border: 1px solid var(--color-outline-variant);
185
- border-radius: 0.5rem;
185
+ border-radius: var(--radius-sm);
186
186
  }
187
187
 
188
188
  /* Ghost Variant */
@@ -306,7 +306,7 @@
306
306
  margin-left: 0.5rem;
307
307
  border: 2px solid var(--color-outline);
308
308
  border-top-color: var(--color-primary);
309
- border-radius: 50%;
309
+ border-radius: var(--radius-full);
310
310
  animation: collapse-spin 0.8s linear infinite;
311
311
  }
312
312
 
@@ -20,7 +20,7 @@
20
20
  color: var(--color-on-surface);
21
21
  background-color: var(--color-surface);
22
22
  border: 1px solid currentColor;
23
- border-radius: 0.5rem;
23
+ border-radius: var(--radius-sm);
24
24
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
25
25
  }
26
26
 
@@ -90,7 +90,7 @@
90
90
  padding: 0;
91
91
  background: transparent;
92
92
  border: none;
93
- border-radius: 50%;
93
+ border-radius: var(--radius-full);
94
94
  cursor: pointer;
95
95
  color: var(--color-on-surface-variant);
96
96
  transition: background-color 150ms ease-in-out;
@@ -114,7 +114,7 @@
114
114
  margin-top: 0.25rem;
115
115
  background-color: var(--color-surface);
116
116
  border: 1px solid var(--color-outline);
117
- border-radius: 0.75rem;
117
+ border-radius: var(--radius-md);
118
118
  box-shadow: var(--shadow-lg);
119
119
  opacity: 0;
120
120
  visibility: hidden;
@@ -140,7 +140,7 @@
140
140
  min-width: 18rem;
141
141
  background-color: var(--color-surface);
142
142
  border: 1px solid var(--color-outline);
143
- border-radius: 0.75rem;
143
+ border-radius: var(--radius-md);
144
144
  box-shadow: var(--shadow-lg);
145
145
  }
146
146
 
@@ -173,7 +173,7 @@
173
173
  color: var(--color-on-surface-variant);
174
174
  background-color: transparent;
175
175
  border: none;
176
- border-radius: 50%;
176
+ border-radius: var(--radius-full);
177
177
  cursor: pointer;
178
178
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
179
179
  }
@@ -230,7 +230,7 @@
230
230
  color: var(--color-on-surface);
231
231
  background-color: transparent;
232
232
  border: none;
233
- border-radius: 50%;
233
+ border-radius: var(--radius-full);
234
234
  cursor: pointer;
235
235
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
236
236
  }
@@ -240,8 +240,8 @@
240
240
  }
241
241
 
242
242
  .datepicker-day:focus-visible {
243
- outline: 2px solid var(--color-primary);
244
- outline-offset: 2px;
243
+ outline: none;
244
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
245
245
  }
246
246
 
247
247
  .datepicker-day-other-month {
@@ -255,7 +255,7 @@
255
255
 
256
256
  .datepicker-day-selected {
257
257
  background-color: var(--color-primary);
258
- color: var(--color-on-primary);
258
+ color: var(--color-primary-content);
259
259
  }
260
260
 
261
261
  .datepicker-day-selected:hover {
@@ -278,14 +278,14 @@
278
278
 
279
279
  .datepicker-day-range-start {
280
280
  background-color: var(--color-primary);
281
- color: var(--color-on-primary);
282
- border-radius: 50% 0 0 50%;
281
+ color: var(--color-primary-content);
282
+ border-radius: var(--radius-full) 0 0 var(--radius-full);
283
283
  }
284
284
 
285
285
  .datepicker-day-range-end {
286
286
  background-color: var(--color-primary);
287
- color: var(--color-on-primary);
288
- border-radius: 0 50% 50% 0;
287
+ color: var(--color-primary-content);
288
+ border-radius: 0 var(--radius-full) var(--radius-full) 0;
289
289
  }
290
290
 
291
291
  /* Month/Year View */
@@ -308,7 +308,7 @@
308
308
  color: var(--color-on-surface);
309
309
  background-color: transparent;
310
310
  border: none;
311
- border-radius: 0.5rem;
311
+ border-radius: var(--radius-sm);
312
312
  cursor: pointer;
313
313
  transition: background-color 150ms ease-in-out;
314
314
  }
@@ -323,7 +323,7 @@
323
323
  .datepicker-year.selected,
324
324
  .datepicker-year-selected {
325
325
  background-color: var(--color-primary);
326
- color: var(--color-on-primary);
326
+ color: var(--color-primary-content);
327
327
  }
328
328
 
329
329
  .datepicker-day-disabled {
@@ -360,7 +360,7 @@
360
360
  color: var(--color-on-surface);
361
361
  background-color: var(--color-surface-container);
362
362
  border: 1px solid var(--color-outline);
363
- border-radius: 0.25rem;
363
+ border-radius: var(--radius-xs);
364
364
  }
365
365
 
366
366
  .datepicker-time-input:focus {
@@ -393,17 +393,17 @@
393
393
  }
394
394
 
395
395
  .datepicker-time-period-btn:first-child {
396
- border-radius: 0.25rem 0.25rem 0 0;
396
+ border-radius: var(--radius-xs) var(--radius-xs) 0 0;
397
397
  }
398
398
 
399
399
  .datepicker-time-period-btn:last-child {
400
- border-radius: 0 0 0.25rem 0.25rem;
400
+ border-radius: 0 0 var(--radius-xs) var(--radius-xs);
401
401
  border-top: none;
402
402
  }
403
403
 
404
404
  .datepicker-time-period-btn.active {
405
405
  background-color: var(--color-primary);
406
- color: var(--color-on-primary);
406
+ color: var(--color-primary-content);
407
407
  border-color: var(--color-primary);
408
408
  }
409
409
 
@@ -465,7 +465,7 @@
465
465
  color: var(--color-on-surface);
466
466
  background-color: transparent;
467
467
  border: none;
468
- border-radius: 0.375rem;
468
+ border-radius: var(--radius-xs);
469
469
  cursor: pointer;
470
470
  text-align: left;
471
471
  transition: background-color 150ms ease-in-out;
@@ -532,7 +532,7 @@
532
532
  color: var(--color-on-surface);
533
533
  background-color: var(--color-surface);
534
534
  border: 1px solid var(--color-outline);
535
- border-radius: 0.5rem;
535
+ border-radius: var(--radius-sm);
536
536
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
537
537
  }
538
538
 
@@ -638,7 +638,7 @@
638
638
  color: var(--color-on-surface);
639
639
  background-color: var(--color-surface);
640
640
  border: 1px solid var(--color-outline);
641
- border-radius: 0.5rem;
641
+ border-radius: var(--radius-sm);
642
642
  transition: border-color 150ms ease-in-out;
643
643
  }
644
644
 
@@ -16,14 +16,14 @@
16
16
  max-height: calc(100vh - 4rem);
17
17
  background-color: var(--color-surface);
18
18
  color: var(--color-on-surface);
19
- border-radius: 1.5rem;
19
+ border-radius: var(--radius-2xl);
20
20
  box-shadow: var(--shadow-2xl);
21
21
  overflow: hidden;
22
22
  }
23
23
 
24
24
  /* Dialog Backdrop (native ::backdrop) */
25
25
  dialog.dialog::backdrop {
26
- background-color: rgb(0 0 0 / 0.5);
26
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
27
27
  }
28
28
 
29
29
  /* Dialog Box - inner container for flex layout */
@@ -62,7 +62,7 @@
62
62
  color: var(--color-on-surface-variant);
63
63
  background-color: transparent;
64
64
  border: none;
65
- border-radius: 50%;
65
+ border-radius: var(--radius-full);
66
66
  cursor: pointer;
67
67
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
68
68
  flex-shrink: 0;
@@ -74,8 +74,8 @@
74
74
  }
75
75
 
76
76
  .dialog-close:focus-visible {
77
- outline: 2px solid var(--color-primary);
78
- outline-offset: 2px;
77
+ outline: none;
78
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
79
79
  }
80
80
 
81
81
  /* Dialog Body */
@@ -9,7 +9,7 @@
9
9
  position: fixed;
10
10
  inset: 0;
11
11
  z-index: 1100;
12
- background-color: rgb(0 0 0 / 0.5);
12
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
13
13
  opacity: 0;
14
14
  visibility: hidden;
15
15
  transition: opacity 300ms ease-out, visibility 300ms ease-out;
@@ -56,7 +56,7 @@
56
56
  width: 20rem;
57
57
  max-width: calc(100vw - 3.5rem);
58
58
  transform: translateX(-100%);
59
- border-radius: 0 1rem 1rem 0;
59
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
60
60
  }
61
61
 
62
62
  .drawer-left.drawer-open {
@@ -70,7 +70,7 @@
70
70
  width: 20rem;
71
71
  max-width: calc(100vw - 3.5rem);
72
72
  transform: translateX(100%);
73
- border-radius: 1rem 0 0 1rem;
73
+ border-radius: var(--radius-lg) 0 0 var(--radius-lg);
74
74
  }
75
75
 
76
76
  .drawer-right.drawer-open {
@@ -84,7 +84,7 @@
84
84
  height: auto;
85
85
  max-height: 80vh;
86
86
  transform: translateY(-100%);
87
- border-radius: 0 0 1rem 1rem;
87
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
88
88
  }
89
89
 
90
90
  .drawer-top.drawer-open {
@@ -98,7 +98,7 @@
98
98
  height: auto;
99
99
  max-height: 80vh;
100
100
  transform: translateY(100%);
101
- border-radius: 1rem 1rem 0 0;
101
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
102
102
  }
103
103
 
104
104
  .drawer-bottom.drawer-open {
@@ -131,7 +131,7 @@
131
131
  color: var(--color-on-surface-variant);
132
132
  background-color: transparent;
133
133
  border: none;
134
- border-radius: 50%;
134
+ border-radius: var(--radius-full);
135
135
  cursor: pointer;
136
136
  transition: background-color 150ms ease-in-out;
137
137
  }
@@ -141,8 +141,8 @@
141
141
  }
142
142
 
143
143
  .drawer-close:focus-visible {
144
- outline: 2px solid var(--color-primary);
145
- outline-offset: 2px;
144
+ outline: none;
145
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
146
146
  }
147
147
 
148
148
  /* Drawer Body (main content area) */
@@ -173,7 +173,7 @@
173
173
  color: var(--color-on-surface-variant);
174
174
  background-color: transparent;
175
175
  border: none;
176
- border-radius: 1.75rem;
176
+ border-radius: var(--radius-2xl);
177
177
  cursor: pointer;
178
178
  text-decoration: none;
179
179
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
@@ -186,8 +186,8 @@
186
186
  }
187
187
 
188
188
  .drawer-item:focus-visible {
189
- outline: 2px solid var(--color-primary);
190
- outline-offset: 2px;
189
+ outline: none;
190
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
191
191
  }
192
192
 
193
193
  /* Active Item States */
@@ -225,7 +225,7 @@
225
225
  font-weight: 500;
226
226
  background-color: var(--color-error-container);
227
227
  color: var(--color-on-error-container);
228
- border-radius: 9999px;
228
+ border-radius: var(--radius-full);
229
229
  margin-left: auto;
230
230
  }
231
231
 
@@ -267,7 +267,7 @@
267
267
  .drawer-profile-avatar {
268
268
  width: 2.5rem;
269
269
  height: 2.5rem;
270
- border-radius: 50%;
270
+ border-radius: var(--radius-full);
271
271
  background-color: var(--color-primary-container);
272
272
  display: flex;
273
273
  align-items: center;
@@ -23,7 +23,7 @@
23
23
  padding: 2rem;
24
24
  background-color: var(--color-surface);
25
25
  border: 2px dashed currentColor;
26
- border-radius: 0.75rem;
26
+ border-radius: var(--radius-md);
27
27
  cursor: pointer;
28
28
  transition: border-color 150ms ease-in-out, background-color 150ms ease-in-out;
29
29
  }
@@ -106,7 +106,7 @@
106
106
  gap: 0.75rem;
107
107
  padding: 0.75rem;
108
108
  background-color: var(--color-surface-container);
109
- border-radius: 0.5rem;
109
+ border-radius: var(--radius-sm);
110
110
  }
111
111
 
112
112
  .file-upload-item-icon {
@@ -117,7 +117,7 @@
117
117
  height: 2.5rem;
118
118
  background-color: var(--color-primary-container);
119
119
  color: var(--color-on-primary-container);
120
- border-radius: 0.5rem;
120
+ border-radius: var(--radius-sm);
121
121
  font-size: 1.25rem;
122
122
  flex-shrink: 0;
123
123
  }
@@ -150,7 +150,7 @@
150
150
  color: var(--color-on-surface-variant);
151
151
  background-color: transparent;
152
152
  border: none;
153
- border-radius: 50%;
153
+ border-radius: var(--radius-full);
154
154
  cursor: pointer;
155
155
  transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
156
156
  flex-shrink: 0;
@@ -167,7 +167,7 @@
167
167
  height: 0.25rem;
168
168
  margin-top: 0.5rem;
169
169
  background-color: var(--color-surface-container-highest);
170
- border-radius: 9999px;
170
+ border-radius: var(--radius-full);
171
171
  overflow: hidden;
172
172
  }
173
173
 
@@ -177,7 +177,7 @@
177
177
  left: 0;
178
178
  height: 100%;
179
179
  background-color: var(--color-primary);
180
- border-radius: 9999px;
180
+ border-radius: var(--radius-full);
181
181
  transition: width 150ms ease-in-out;
182
182
  }
183
183
 
@@ -217,7 +217,7 @@
217
217
  .file-upload-preview-item {
218
218
  position: relative;
219
219
  aspect-ratio: 1;
220
- border-radius: 0.5rem;
220
+ border-radius: var(--radius-sm);
221
221
  overflow: hidden;
222
222
  background-color: var(--color-surface-container);
223
223
  }
@@ -240,7 +240,7 @@
240
240
  background-color: var(--color-on-surface);
241
241
  color: var(--color-surface);
242
242
  border: none;
243
- border-radius: 50%;
243
+ border-radius: var(--radius-full);
244
244
  cursor: pointer;
245
245
  opacity: 0;
246
246
  transition: opacity 150ms ease-in-out;
@@ -276,10 +276,10 @@
276
276
  padding: 0.75rem 1.5rem;
277
277
  font-size: 0.875rem;
278
278
  font-weight: 500;
279
- color: var(--color-on-primary);
279
+ color: var(--color-primary-content);
280
280
  background-color: var(--color-primary);
281
281
  border: none;
282
- border-radius: 0.5rem;
282
+ border-radius: var(--radius-sm);
283
283
  cursor: pointer;
284
284
  transition: background-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
285
285
  }
@@ -289,8 +289,8 @@
289
289
  }
290
290
 
291
291
  .file-upload-button:focus-visible {
292
- outline: 2px solid var(--color-primary);
293
- outline-offset: 2px;
292
+ outline: none;
293
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
294
294
  }
295
295
 
296
296
  .file-upload-button:disabled {
@@ -120,7 +120,7 @@
120
120
  padding: 1rem;
121
121
  margin: 0;
122
122
  border: 1px solid var(--color-outline-variant);
123
- border-radius: 0.5rem;
123
+ border-radius: var(--radius-sm);
124
124
  background-color: transparent;
125
125
  }
126
126
 
@@ -332,9 +332,170 @@
332
332
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
333
333
  }
334
334
 
335
+ /* Info State on Form Group */
336
+ .form-group-info .form-label {
337
+ color: var(--color-info);
338
+ }
339
+
340
+ .form-group-info .input,
341
+ .form-group-info .select,
342
+ .form-group-info .textarea {
343
+ border-color: var(--color-info);
344
+ }
345
+
346
+ .form-group-info .input:focus-visible,
347
+ .form-group-info .select:focus-visible,
348
+ .form-group-info .textarea:focus-visible {
349
+ border-color: var(--color-info);
350
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
351
+ }
352
+
335
353
  /* Disabled Form Group */
336
354
  .form-group-disabled {
337
355
  opacity: 0.5;
338
356
  pointer-events: none;
339
357
  }
358
+
359
+ /* ARIA-based validation states — mirrors class-based states for native form validation */
360
+ .input[aria-invalid="true"],
361
+ .select[aria-invalid="true"],
362
+ .textarea[aria-invalid="true"] {
363
+ border-color: var(--color-error);
364
+ color: var(--color-error);
365
+ }
366
+
367
+ .input[aria-invalid="true"]:focus-visible,
368
+ .select[aria-invalid="true"]:focus-visible,
369
+ .textarea[aria-invalid="true"]:focus-visible {
370
+ border-color: var(--color-error);
371
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
372
+ }
373
+
374
+ /* ARIA-based validation for checkbox, radio, switch, file-input
375
+ (frameworks like React Hook Form / Angular set aria-invalid programmatically) */
376
+ .checkbox[aria-invalid="true"],
377
+ .radio[aria-invalid="true"],
378
+ .file-input[aria-invalid="true"] {
379
+ border-color: var(--color-error);
380
+ }
381
+
382
+ .checkbox[aria-invalid="true"]:focus-visible,
383
+ .radio[aria-invalid="true"]:focus-visible,
384
+ .file-input[aria-invalid="true"]:focus-visible {
385
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
386
+ }
387
+
388
+ .switch[aria-invalid="true"] {
389
+ border-color: var(--color-error);
390
+ }
391
+
392
+ .switch[aria-invalid="true"]:focus-visible {
393
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
394
+ }
395
+
396
+ /* ARIA required indicator for labels */
397
+ .form-label[aria-required="true"]::after,
398
+ label[aria-required="true"]::after {
399
+ content: ' *';
400
+ color: var(--color-error);
401
+ }
402
+
403
+ /* Native :invalid pseudo-class (opt-in with .validate class to avoid red on page load) */
404
+ .validate .input:invalid,
405
+ .validate .select:invalid,
406
+ .validate .textarea:invalid {
407
+ border-color: var(--color-error);
408
+ }
409
+
410
+ .validate .input:valid,
411
+ .validate .select:valid,
412
+ .validate .textarea:valid {
413
+ border-color: var(--color-success);
414
+ }
415
+
416
+ /* :user-invalid — fires only after user interaction (no .validate wrapper needed) */
417
+ .input:user-invalid,
418
+ .select:user-invalid,
419
+ .textarea:user-invalid {
420
+ border-color: var(--color-error);
421
+ }
422
+
423
+ .input:user-invalid:focus-visible,
424
+ .select:user-invalid:focus-visible,
425
+ .textarea:user-invalid:focus-visible {
426
+ border-color: var(--color-error);
427
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
428
+ }
429
+
430
+ .input:user-valid,
431
+ .select:user-valid,
432
+ .textarea:user-valid {
433
+ border-color: var(--color-success);
434
+ }
435
+
436
+ .input:user-valid:focus-visible,
437
+ .select:user-valid:focus-visible,
438
+ .textarea:user-valid:focus-visible {
439
+ border-color: var(--color-success);
440
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
441
+ }
442
+
443
+ /* Checkbox & Radio — validation pseudo-classes */
444
+ .checkbox:user-invalid,
445
+ .radio:user-invalid {
446
+ border-color: var(--color-error);
447
+ }
448
+
449
+ .checkbox:user-invalid:focus-visible,
450
+ .radio:user-invalid:focus-visible {
451
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
452
+ }
453
+
454
+ .checkbox:user-valid:checked,
455
+ .radio:user-valid:checked {
456
+ border-color: var(--color-success);
457
+ background-color: var(--color-success);
458
+ }
459
+
460
+ /* Switch — validation pseudo-classes (required but unchecked) */
461
+ .switch:user-invalid {
462
+ border-color: var(--color-error);
463
+ }
464
+
465
+ .switch:user-invalid:focus-visible {
466
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
467
+ }
468
+
469
+ .switch:user-valid:checked {
470
+ background-color: var(--color-success);
471
+ border-color: var(--color-success);
472
+ }
473
+
474
+ /* File Input — validation pseudo-classes */
475
+ .file-input:user-invalid {
476
+ border-color: var(--color-error);
477
+ }
478
+
479
+ .file-input:user-invalid:focus-visible {
480
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
481
+ }
482
+
483
+ /* Filled Input — validation with bottom border */
484
+ .input-filled:user-invalid {
485
+ border-bottom-color: var(--color-error);
486
+ }
487
+
488
+ .input-filled:user-invalid:focus-visible {
489
+ border-bottom-color: var(--color-error);
490
+ box-shadow: none;
491
+ }
492
+
493
+ .input-filled:user-valid {
494
+ border-bottom-color: var(--color-success);
495
+ }
496
+
497
+ .input-filled:user-valid:focus-visible {
498
+ border-bottom-color: var(--color-success);
499
+ box-shadow: none;
500
+ }
340
501
  }