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