@duskmoon-dev/core 1.12.3 → 1.13.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 (65) hide show
  1. package/dist/cjs/tailwind-plugin.cjs +8 -0
  2. package/dist/components/alert.css +64 -2
  3. package/dist/components/appbar.css +119 -21
  4. package/dist/components/autocomplete.css +63 -3
  5. package/dist/components/avatar.css +22 -2
  6. package/dist/components/button.css +101 -49
  7. package/dist/components/card.css +38 -2
  8. package/dist/components/cascader.css +59 -9
  9. package/dist/components/checkbox.css +15 -5
  10. package/dist/components/chip.css +122 -2
  11. package/dist/components/collapse.css +32 -0
  12. package/dist/components/datepicker.css +79 -6
  13. package/dist/components/file-upload.css +68 -8
  14. package/dist/components/form.css +2 -1
  15. package/dist/components/index.css +1583 -409
  16. package/dist/components/input.css +21 -67
  17. package/dist/components/multi-select.css +59 -9
  18. package/dist/components/otp-input.css +48 -16
  19. package/dist/components/pin-input.css +50 -13
  20. package/dist/components/radio.css +12 -2
  21. package/dist/components/rating.css +35 -3
  22. package/dist/components/segment-control.css +23 -2
  23. package/dist/components/select.css +21 -37
  24. package/dist/components/slider.css +130 -6
  25. package/dist/components/switch.css +27 -4
  26. package/dist/components/textarea.css +21 -96
  27. package/dist/components/time-input.css +61 -12
  28. package/dist/components/toast.css +72 -3
  29. package/dist/components/toggle.css +63 -6
  30. package/dist/components/tooltip.css +84 -0
  31. package/dist/components/tree-select.css +60 -11
  32. package/dist/esm/components/alert.js +64 -2
  33. package/dist/esm/components/appbar.js +119 -21
  34. package/dist/esm/components/autocomplete.js +63 -3
  35. package/dist/esm/components/avatar.js +22 -2
  36. package/dist/esm/components/button.js +101 -49
  37. package/dist/esm/components/card.js +38 -2
  38. package/dist/esm/components/cascader.js +59 -9
  39. package/dist/esm/components/checkbox.js +15 -5
  40. package/dist/esm/components/chip.js +122 -2
  41. package/dist/esm/components/collapse.js +32 -0
  42. package/dist/esm/components/datepicker.js +79 -6
  43. package/dist/esm/components/file-upload.js +68 -8
  44. package/dist/esm/components/form.js +2 -1
  45. package/dist/esm/components/input.js +21 -67
  46. package/dist/esm/components/multi-select.js +59 -9
  47. package/dist/esm/components/otp-input.js +48 -16
  48. package/dist/esm/components/pin-input.js +50 -13
  49. package/dist/esm/components/radio.js +12 -2
  50. package/dist/esm/components/rating.js +35 -3
  51. package/dist/esm/components/segment-control.js +23 -2
  52. package/dist/esm/components/select.js +21 -37
  53. package/dist/esm/components/slider.js +130 -6
  54. package/dist/esm/components/switch.js +27 -4
  55. package/dist/esm/components/textarea.js +21 -96
  56. package/dist/esm/components/time-input.js +61 -12
  57. package/dist/esm/components/toast.js +72 -3
  58. package/dist/esm/components/toggle.js +63 -6
  59. package/dist/esm/components/tooltip.js +84 -0
  60. package/dist/esm/components/tree-select.js +60 -11
  61. package/dist/esm/tailwind-plugin.js +8 -0
  62. package/dist/index.css +1583 -409
  63. package/dist/index.min.css +1 -1
  64. package/dist/types/tailwind-plugin.d.ts.map +1 -1
  65. package/package.json +1 -1
@@ -13,7 +13,7 @@
13
13
  line-height: 1.5rem;
14
14
  background-color: var(--color-surface);
15
15
  color: var(--color-on-surface);
16
- border: 1px solid transparent;
16
+ border: 1px solid currentColor;
17
17
  border-radius: 0.5rem;
18
18
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
19
19
  }
@@ -28,8 +28,7 @@
28
28
  }
29
29
 
30
30
  .input:focus-visible {
31
- border-color: var(--color-primary);
32
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
31
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
33
32
  outline: none;
34
33
  }
35
34
 
@@ -49,70 +48,17 @@
49
48
  border-color: var(--color-outline-variant);
50
49
  }
51
50
 
52
- /* Color Variants */
53
- .input-primary {
54
- border-color: var(--color-primary);
55
- }
56
-
57
- .input-primary:focus-visible {
58
- border-color: var(--color-primary);
59
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
60
- }
61
-
62
- .input-secondary {
63
- border-color: var(--color-secondary);
64
- }
65
-
66
- .input-secondary:focus-visible {
67
- border-color: var(--color-secondary);
68
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
69
- }
70
-
71
- .input-tertiary {
72
- border-color: var(--color-tertiary);
73
- }
74
-
75
- .input-tertiary:focus-visible {
76
- border-color: var(--color-tertiary);
77
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
78
- }
51
+ /* Color Variants — base .input:focus-visible uses currentColor 20%, so no per-variant
52
+ focus-visible overrides needed; setting color: here is sufficient. */
53
+ .input-primary { color: var(--color-primary); }
54
+ .input-secondary { color: var(--color-secondary); }
55
+ .input-tertiary { color: var(--color-tertiary); }
79
56
 
80
57
  /* Semantic Colors */
81
- .input-info {
82
- border-color: var(--color-info);
83
- }
84
-
85
- .input-info:focus-visible {
86
- border-color: var(--color-info);
87
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
88
- }
89
-
90
- .input-success {
91
- border-color: var(--color-success);
92
- }
93
-
94
- .input-success:focus-visible {
95
- border-color: var(--color-success);
96
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
97
- }
98
-
99
- .input-warning {
100
- border-color: var(--color-warning);
101
- }
102
-
103
- .input-warning:focus-visible {
104
- border-color: var(--color-warning);
105
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
106
- }
107
-
108
- .input-error {
109
- border-color: var(--color-error);
110
- }
111
-
112
- .input-error:focus-visible {
113
- border-color: var(--color-error);
114
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
115
- }
58
+ .input-info { color: var(--color-info); }
59
+ .input-success { color: var(--color-success); }
60
+ .input-warning { color: var(--color-warning); }
61
+ .input-error { color: var(--color-error); }
116
62
 
117
63
  /* Size Variants */
118
64
  .input-xs {
@@ -148,7 +94,7 @@
148
94
  .input-ghost:focus-visible {
149
95
  background-color: var(--color-surface-container);
150
96
  border-color: transparent;
151
- box-shadow: none;
97
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
152
98
  }
153
99
 
154
100
  /* Filled Input */
@@ -164,6 +110,14 @@
164
110
  box-shadow: none;
165
111
  }
166
112
 
113
+ .input-filled.input-primary:focus-visible { border-bottom-color: var(--color-primary); }
114
+ .input-filled.input-secondary:focus-visible { border-bottom-color: var(--color-secondary); }
115
+ .input-filled.input-tertiary:focus-visible { border-bottom-color: var(--color-tertiary); }
116
+ .input-filled.input-info:focus-visible { border-bottom-color: var(--color-info); }
117
+ .input-filled.input-success:focus-visible { border-bottom-color: var(--color-success); }
118
+ .input-filled.input-warning:focus-visible { border-bottom-color: var(--color-warning); }
119
+ .input-filled.input-error:focus-visible { border-bottom-color: var(--color-error); }
120
+
167
121
  /* Input with Icon */
168
122
  .input-group {
169
123
  display: flex;
@@ -234,7 +188,7 @@
234
188
  }
235
189
 
236
190
  .file-input:focus-visible {
237
- border-color: var(--color-primary);
191
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
238
192
  outline: none;
239
193
  }
240
194
  }
@@ -24,20 +24,19 @@
24
24
  line-height: 1.5rem;
25
25
  color: var(--color-on-surface);
26
26
  background-color: var(--color-surface);
27
- border: 1px solid var(--color-outline);
27
+ border: 1px solid currentColor;
28
28
  border-radius: 0.5rem;
29
29
  cursor: pointer;
30
30
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
31
31
  }
32
32
 
33
33
  .multi-select-trigger:hover:not(:disabled) {
34
- border-color: var(--color-on-surface-variant);
34
+ background-color: var(--color-surface-container);
35
35
  }
36
36
 
37
37
  .multi-select-trigger:focus-within {
38
38
  outline: none;
39
- border-color: var(--color-primary);
40
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
39
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
41
40
  }
42
41
 
43
42
  /* Placeholder */
@@ -431,20 +430,71 @@
431
430
  }
432
431
 
433
432
  .multi-select-filled .multi-select-trigger:focus-within {
434
- border-bottom-color: var(--color-primary);
433
+ border-bottom-color: currentColor;
435
434
  box-shadow: none;
436
435
  }
437
436
 
438
- /* Error State */
439
- .multi-select-error .multi-select-trigger {
440
- border-color: var(--color-error);
437
+ /* Color Variants */
438
+ .multi-select-primary .multi-select-trigger {
439
+ color: var(--color-primary);
440
+ }
441
+ .multi-select-primary .multi-select-trigger:focus-within {
442
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
443
+ }
444
+
445
+ .multi-select-secondary .multi-select-trigger {
446
+ color: var(--color-secondary);
447
+ }
448
+ .multi-select-secondary .multi-select-trigger:focus-within {
449
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
450
+ }
451
+
452
+ .multi-select-tertiary .multi-select-trigger {
453
+ color: var(--color-tertiary);
454
+ }
455
+ .multi-select-tertiary .multi-select-trigger:focus-within {
456
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
457
+ }
458
+
459
+ .multi-select-info .multi-select-trigger {
460
+ color: var(--color-info);
461
+ }
462
+ .multi-select-info .multi-select-trigger:focus-within {
463
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
464
+ }
465
+
466
+ .multi-select-success .multi-select-trigger {
467
+ color: var(--color-success);
468
+ }
469
+ .multi-select-success .multi-select-trigger:focus-within {
470
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
471
+ }
472
+
473
+ .multi-select-warning .multi-select-trigger {
474
+ color: var(--color-warning);
475
+ }
476
+ .multi-select-warning .multi-select-trigger:focus-within {
477
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
441
478
  }
442
479
 
480
+ .multi-select-error .multi-select-trigger {
481
+ color: var(--color-error);
482
+ }
443
483
  .multi-select-error .multi-select-trigger:focus-within {
444
- border-color: var(--color-error);
445
484
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
446
485
  }
447
486
 
487
+ /* Ghost Variant */
488
+ .multi-select-ghost .multi-select-trigger {
489
+ background-color: transparent;
490
+ border-color: transparent;
491
+ }
492
+ .multi-select-ghost .multi-select-trigger:focus-within {
493
+ background-color: var(--color-surface-container);
494
+ border-color: transparent;
495
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
496
+ }
497
+
448
498
  /* Disabled State */
449
499
  .multi-select-disabled .multi-select-trigger {
450
500
  cursor: not-allowed;
@@ -21,7 +21,7 @@
21
21
  text-align: center;
22
22
  color: var(--color-on-surface);
23
23
  background-color: var(--color-surface);
24
- border: 2px solid var(--color-outline);
24
+ border: 2px solid currentColor;
25
25
  border-radius: 0.5rem;
26
26
  outline: none;
27
27
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
@@ -34,12 +34,11 @@
34
34
  }
35
35
 
36
36
  .otp-input-field:hover:not(:disabled):not(:focus) {
37
- border-color: var(--color-on-surface-variant);
37
+ background-color: var(--color-surface-container);
38
38
  }
39
39
 
40
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);
41
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
43
42
  }
44
43
 
45
44
  .otp-input-field:disabled {
@@ -122,41 +121,74 @@
122
121
  }
123
122
 
124
123
  /* Color Variants */
124
+ .otp-input-primary .otp-input-field {
125
+ color: var(--color-primary);
126
+ }
127
+
125
128
  .otp-input-primary .otp-input-field:focus {
126
- border-color: var(--color-primary);
127
129
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
128
130
  }
129
131
 
132
+ .otp-input-secondary .otp-input-field {
133
+ color: var(--color-secondary);
134
+ }
135
+
130
136
  .otp-input-secondary .otp-input-field:focus {
131
- border-color: var(--color-secondary);
132
137
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
133
138
  }
134
139
 
140
+ .otp-input-tertiary .otp-input-field {
141
+ color: var(--color-tertiary);
142
+ }
143
+
135
144
  .otp-input-tertiary .otp-input-field:focus {
136
- border-color: var(--color-tertiary);
137
145
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
138
146
  }
139
147
 
140
- /* Error State */
141
- .otp-input-error .otp-input-field {
142
- border-color: var(--color-error);
148
+ .otp-input-info .otp-input-field {
149
+ color: var(--color-info);
143
150
  }
144
151
 
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);
152
+ .otp-input-info .otp-input-field:focus {
153
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
148
154
  }
149
155
 
150
- /* Success State */
151
156
  .otp-input-success .otp-input-field {
152
- border-color: var(--color-success);
157
+ color: var(--color-success);
153
158
  }
154
159
 
155
160
  .otp-input-success .otp-input-field:focus {
156
- border-color: var(--color-success);
157
161
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
158
162
  }
159
163
 
164
+ .otp-input-warning .otp-input-field {
165
+ color: var(--color-warning);
166
+ }
167
+
168
+ .otp-input-warning .otp-input-field:focus {
169
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
170
+ }
171
+
172
+ .otp-input-error .otp-input-field {
173
+ color: var(--color-error);
174
+ }
175
+
176
+ .otp-input-error .otp-input-field:focus {
177
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
178
+ }
179
+
180
+ /* Ghost Variant */
181
+ .otp-input-ghost .otp-input-field {
182
+ background-color: transparent;
183
+ border-color: transparent;
184
+ }
185
+
186
+ .otp-input-ghost .otp-input-field:focus {
187
+ background-color: var(--color-surface-container);
188
+ border-color: transparent;
189
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
190
+ }
191
+
160
192
  /* Masked Input (dots) */
161
193
  .otp-input-masked .otp-input-field {
162
194
  -webkit-text-security: disc;
@@ -21,7 +21,7 @@
21
21
  text-align: center;
22
22
  color: var(--color-on-surface);
23
23
  background-color: var(--color-surface);
24
- border: 2px solid var(--color-outline);
24
+ border: 2px solid currentColor;
25
25
  border-radius: 0.5rem;
26
26
  outline: none;
27
27
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
@@ -35,12 +35,11 @@
35
35
  }
36
36
 
37
37
  .pin-input-field:hover:not(:disabled):not(:focus) {
38
- border-color: var(--color-on-surface-variant);
38
+ background-color: var(--color-surface-container);
39
39
  }
40
40
 
41
41
  .pin-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);
42
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
44
43
  }
45
44
 
46
45
  .pin-input-field:disabled {
@@ -111,29 +110,60 @@
111
110
  }
112
111
 
113
112
  /* Color Variants */
113
+ .pin-input-primary .pin-input-field {
114
+ color: var(--color-primary);
115
+ }
116
+
114
117
  .pin-input-primary .pin-input-field:focus {
115
- border-color: var(--color-primary);
116
118
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
117
119
  }
118
120
 
121
+ .pin-input-secondary .pin-input-field {
122
+ color: var(--color-secondary);
123
+ }
124
+
119
125
  .pin-input-secondary .pin-input-field:focus {
120
- border-color: var(--color-secondary);
121
126
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
122
127
  }
123
128
 
129
+ .pin-input-tertiary .pin-input-field {
130
+ color: var(--color-tertiary);
131
+ }
132
+
124
133
  .pin-input-tertiary .pin-input-field:focus {
125
- border-color: var(--color-tertiary);
126
134
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
127
135
  }
128
136
 
129
- /* Error State */
137
+ .pin-input-info .pin-input-field {
138
+ color: var(--color-info);
139
+ }
140
+
141
+ .pin-input-info .pin-input-field:focus {
142
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
143
+ }
144
+
145
+ .pin-input-success .pin-input-field {
146
+ color: var(--color-success);
147
+ }
148
+
149
+ .pin-input-success .pin-input-field:focus {
150
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
151
+ }
152
+
153
+ .pin-input-warning .pin-input-field {
154
+ color: var(--color-warning);
155
+ }
156
+
157
+ .pin-input-warning .pin-input-field:focus {
158
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
159
+ }
160
+
130
161
  .pin-input-error .pin-input-field {
131
- border-color: var(--color-error);
162
+ color: var(--color-error);
132
163
  animation: pin-shake 300ms ease-in-out;
133
164
  }
134
165
 
135
166
  .pin-input-error .pin-input-field:focus {
136
- border-color: var(--color-error);
137
167
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
138
168
  }
139
169
 
@@ -143,9 +173,16 @@
143
173
  40%, 80% { transform: translateX(4px); }
144
174
  }
145
175
 
146
- /* Success State */
147
- .pin-input-success .pin-input-field {
148
- border-color: var(--color-success);
176
+ /* Ghost Variant */
177
+ .pin-input-ghost .pin-input-field {
178
+ background-color: transparent;
179
+ border-color: transparent;
180
+ }
181
+
182
+ .pin-input-ghost .pin-input-field:focus {
183
+ background-color: var(--color-surface-container);
184
+ border-color: transparent;
185
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
149
186
  }
150
187
 
151
188
  /* PIN Group with Label */
@@ -12,6 +12,7 @@
12
12
  --radio-size: 1.25rem;
13
13
  --radio-color: var(--color-primary);
14
14
  --radio-border-color: var(--color-on-surface-variant);
15
+ color: var(--color-on-surface);
15
16
 
16
17
  position: relative;
17
18
  display: inline-grid;
@@ -62,8 +63,8 @@
62
63
 
63
64
  /* Focus State */
64
65
  .radio:focus-visible {
65
- outline: 2px solid var(--radio-color);
66
- outline-offset: 2px;
66
+ outline: none;
67
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--radio-color) 20%, transparent);
67
68
  }
68
69
 
69
70
  /* Disabled State */
@@ -128,6 +129,15 @@
128
129
  --radio-color: var(--color-info);
129
130
  }
130
131
 
132
+ /* Ghost Variant — borderless unchecked state */
133
+ .radio-ghost {
134
+ --radio-border-color: transparent;
135
+ }
136
+
137
+ .radio-ghost:hover:not(:disabled):not(:checked) {
138
+ border-color: transparent;
139
+ }
140
+
131
141
  /* ========================================
132
142
  * Radio with Label (wrapper pattern)
133
143
  * ======================================== */
@@ -9,6 +9,7 @@
9
9
  display: inline-flex;
10
10
  align-items: center;
11
11
  gap: 0.125rem;
12
+ color: var(--color-on-surface);
12
13
  }
13
14
 
14
15
  /* Rating Item */
@@ -112,6 +113,21 @@
112
113
  color: var(--color-success);
113
114
  }
114
115
 
116
+ .rating-tertiary .rating-item.filled {
117
+ color: var(--color-tertiary);
118
+ }
119
+
120
+ .rating-info .rating-item.filled {
121
+ color: var(--color-info);
122
+ }
123
+
124
+ /* Note: .rating-warning is explicit even though the default rating filled color is
125
+ already --color-warning. This allows resetting to warning after applying another
126
+ color variant (e.g. class="rating rating-primary rating-warning"). */
127
+ .rating-warning .rating-item.filled {
128
+ color: var(--color-warning);
129
+ }
130
+
115
131
  /* Read Only */
116
132
  .rating-readonly .rating-item {
117
133
  cursor: default;
@@ -155,13 +171,29 @@
155
171
  color: var(--color-warning);
156
172
  }
157
173
 
158
- /* Focus Visible */
174
+ .rating-primary:not(.rating-readonly):hover .rating-item { color: var(--color-primary); }
175
+ .rating-secondary:not(.rating-readonly):hover .rating-item { color: var(--color-secondary); }
176
+ .rating-tertiary:not(.rating-readonly):hover .rating-item { color: var(--color-tertiary); }
177
+ .rating-info:not(.rating-readonly):hover .rating-item { color: var(--color-info); }
178
+ .rating-success:not(.rating-readonly):hover .rating-item { color: var(--color-success); }
179
+ .rating-error:not(.rating-readonly):hover .rating-item { color: var(--color-error); }
180
+
181
+ /* Focus Visible — use warning (the default fill color) for the base ring;
182
+ per-variant overrides below match the active fill color for each variant. */
159
183
  .rating-item:focus-visible {
160
- outline: 2px solid var(--color-primary);
161
- outline-offset: 2px;
184
+ outline: none;
185
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 20%, transparent);
162
186
  border-radius: 0.25rem;
163
187
  }
164
188
 
189
+ .rating-primary .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 20%, transparent); }
190
+ .rating-secondary .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 20%, transparent); }
191
+ .rating-tertiary .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 20%, transparent); }
192
+ .rating-info .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 20%, transparent); }
193
+ .rating-success .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 20%, transparent); }
194
+ .rating-error .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent); }
195
+ .rating-warning .rating-item:focus-visible { box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 20%, transparent); }
196
+
165
197
  /* Rating Display (static) */
166
198
  .rating-display {
167
199
  display: inline-flex;
@@ -8,6 +8,7 @@
8
8
  .segment-control {
9
9
  display: inline-flex;
10
10
  align-items: stretch;
11
+ color: var(--color-on-surface);
11
12
  background-color: var(--color-surface-container);
12
13
  border: 1px solid var(--color-outline);
13
14
  border-radius: 1.25rem;
@@ -41,8 +42,8 @@
41
42
  }
42
43
 
43
44
  .segment-item:focus-visible {
44
- outline: 2px solid var(--color-primary);
45
- outline-offset: 2px;
45
+ outline: none;
46
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
46
47
  }
47
48
 
48
49
  .segment-item:disabled {
@@ -112,6 +113,26 @@
112
113
  color: var(--color-on-tertiary-container);
113
114
  }
114
115
 
116
+ .segment-control-info .segment-item-active {
117
+ background-color: var(--color-info-container);
118
+ color: var(--color-on-info-container);
119
+ }
120
+
121
+ .segment-control-success .segment-item-active {
122
+ background-color: var(--color-success-container);
123
+ color: var(--color-on-success-container);
124
+ }
125
+
126
+ .segment-control-warning .segment-item-active {
127
+ background-color: var(--color-warning-container);
128
+ color: var(--color-on-warning-container);
129
+ }
130
+
131
+ .segment-control-error .segment-item-active {
132
+ background-color: var(--color-error-container);
133
+ color: var(--color-on-error-container);
134
+ }
135
+
115
136
  /* Full Width */
116
137
  .segment-control-full {
117
138
  display: flex;
@@ -13,7 +13,7 @@
13
13
  line-height: 1.5rem;
14
14
  color: var(--color-on-surface);
15
15
  background-color: var(--color-surface);
16
- border: 1px solid var(--color-outline);
16
+ border: 1px solid currentColor;
17
17
  border-radius: 0.5rem;
18
18
  outline: none;
19
19
  cursor: pointer;
@@ -26,7 +26,7 @@
26
26
  }
27
27
 
28
28
  .select:hover:not(:disabled) {
29
- border-color: var(--color-on-surface-variant);
29
+ background-color: var(--color-surface-container);
30
30
  }
31
31
 
32
32
  .select:focus {
@@ -34,8 +34,7 @@
34
34
  }
35
35
 
36
36
  .select:focus-visible {
37
- border-color: var(--color-primary);
38
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
37
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
39
38
  }
40
39
 
41
40
  .select:disabled {
@@ -62,6 +61,14 @@
62
61
  box-shadow: none;
63
62
  }
64
63
 
64
+ .select-filled.select-primary:focus-visible { border-bottom-color: var(--color-primary); }
65
+ .select-filled.select-secondary:focus-visible { border-bottom-color: var(--color-secondary); }
66
+ .select-filled.select-tertiary:focus-visible { border-bottom-color: var(--color-tertiary); }
67
+ .select-filled.select-info:focus-visible { border-bottom-color: var(--color-info); }
68
+ .select-filled.select-success:focus-visible { border-bottom-color: var(--color-success); }
69
+ .select-filled.select-warning:focus-visible { border-bottom-color: var(--color-warning); }
70
+ .select-filled.select-error:focus-visible { border-bottom-color: var(--color-error); }
71
+
65
72
  /* Outlined Variant (default is outlined) */
66
73
  .select-outlined {
67
74
  background-color: transparent;
@@ -69,40 +76,17 @@
69
76
  border-radius: 0.5rem;
70
77
  }
71
78
 
72
- /* Color Variants */
73
- .select-primary:focus-visible {
74
- border-color: var(--color-primary);
75
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-primary) 10%, transparent);
76
- }
77
-
78
- .select-secondary:focus-visible {
79
- border-color: var(--color-secondary);
80
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-secondary) 10%, transparent);
81
- }
82
-
83
- .select-tertiary:focus-visible {
84
- border-color: var(--color-tertiary);
85
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-tertiary) 10%, transparent);
86
- }
79
+ /* Color Variants — base .select:focus-visible uses currentColor 20%, so no per-variant
80
+ focus-visible overrides needed; setting color: here is sufficient. */
81
+ .select-primary { color: var(--color-primary); }
82
+ .select-secondary { color: var(--color-secondary); }
83
+ .select-tertiary { color: var(--color-tertiary); }
87
84
 
88
85
  /* Semantic Colors */
89
- .select-error {
90
- border-color: var(--color-error);
91
- }
92
-
93
- .select-error:focus-visible {
94
- border-color: var(--color-error);
95
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
96
- }
97
-
98
- .select-success {
99
- border-color: var(--color-success);
100
- }
101
-
102
- .select-success:focus-visible {
103
- border-color: var(--color-success);
104
- box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
105
- }
86
+ .select-info { color: var(--color-info); }
87
+ .select-success { color: var(--color-success); }
88
+ .select-warning { color: var(--color-warning); }
89
+ .select-error { color: var(--color-error); }
106
90
 
107
91
  /* Size Variants */
108
92
  .select-xs {
@@ -193,7 +177,7 @@
193
177
  .select-ghost:focus-visible {
194
178
  background-color: var(--color-surface-container);
195
179
  border-color: transparent;
196
- box-shadow: none;
180
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
197
181
  }
198
182
 
199
183
  /* Reduce Motion */