@auronui/styles 1.0.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 (268) hide show
  1. package/DATA_ATTRIBUTES.md +163 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -0
  4. package/base/base.css +40 -0
  5. package/components/accordion.css +201 -0
  6. package/components/alert-dialog.css +307 -0
  7. package/components/alert.css +143 -0
  8. package/components/aspect-ratio.css +8 -0
  9. package/components/autocomplete.css +685 -0
  10. package/components/avatar.css +78 -0
  11. package/components/badge.css +186 -0
  12. package/components/breadcrumbs.css +76 -0
  13. package/components/button-group.css +126 -0
  14. package/components/button.css +282 -0
  15. package/components/calendar-year-picker.css +193 -0
  16. package/components/calendar.css +332 -0
  17. package/components/card.css +225 -0
  18. package/components/checkbox-group.css +7 -0
  19. package/components/checkbox.css +268 -0
  20. package/components/chip.css +227 -0
  21. package/components/close-button.css +65 -0
  22. package/components/collapsible-group.css +7 -0
  23. package/components/collapsible.css +74 -0
  24. package/components/color-area.css +81 -0
  25. package/components/color-field.css +99 -0
  26. package/components/color-input-group.css +153 -0
  27. package/components/color-picker.css +121 -0
  28. package/components/color-slider.css +266 -0
  29. package/components/color-swatch-picker.css +247 -0
  30. package/components/color-swatch.css +42 -0
  31. package/components/combo-box.css +203 -0
  32. package/components/date-input-group.css +125 -0
  33. package/components/date-input.css +529 -0
  34. package/components/date-picker.css +86 -0
  35. package/components/date-range-field.css +538 -0
  36. package/components/date-range-picker.css +93 -0
  37. package/components/description.css +4 -0
  38. package/components/drawer.css +222 -0
  39. package/components/dropdown.css +67 -0
  40. package/components/empty-state.css +4 -0
  41. package/components/error-message.css +13 -0
  42. package/components/field-error.css +19 -0
  43. package/components/fieldset.css +39 -0
  44. package/components/header.css +7 -0
  45. package/components/index.css +164 -0
  46. package/components/input-otp.css +124 -0
  47. package/components/input.css +603 -0
  48. package/components/kbd.css +27 -0
  49. package/components/label.css +28 -0
  50. package/components/link.css +144 -0
  51. package/components/list-box-item.css +29 -0
  52. package/components/list-box-section.css +13 -0
  53. package/components/list-box.css +11 -0
  54. package/components/menu-item.css +68 -0
  55. package/components/menu-section.css +18 -0
  56. package/components/menu.css +7 -0
  57. package/components/meter.css +104 -0
  58. package/components/modal.css +335 -0
  59. package/components/number-field.css +395 -0
  60. package/components/pagination.css +157 -0
  61. package/components/popover.css +96 -0
  62. package/components/progress-bar.css +126 -0
  63. package/components/progress-circle.css +82 -0
  64. package/components/radio-group.css +47 -0
  65. package/components/radio.css +157 -0
  66. package/components/range-calendar.css +402 -0
  67. package/components/scroll-area.css +70 -0
  68. package/components/scroll-shadow.css +77 -0
  69. package/components/select.css +649 -0
  70. package/components/separator.css +59 -0
  71. package/components/skeleton.css +48 -0
  72. package/components/slider.css +155 -0
  73. package/components/spinner.css +42 -0
  74. package/components/splitter.css +74 -0
  75. package/components/stepper.css +160 -0
  76. package/components/surface.css +23 -0
  77. package/components/switch-group.css +17 -0
  78. package/components/switch.css +194 -0
  79. package/components/table.css +341 -0
  80. package/components/tabs.css +262 -0
  81. package/components/tag-group.css +66 -0
  82. package/components/tag.css +99 -0
  83. package/components/textarea.css +536 -0
  84. package/components/time-field.css +530 -0
  85. package/components/toast.css +267 -0
  86. package/components/toggle-button-group.css +174 -0
  87. package/components/toggle-button.css +149 -0
  88. package/components/toolbar.css +32 -0
  89. package/components/tooltip.css +47 -0
  90. package/components/tree.css +81 -0
  91. package/index.css +29 -0
  92. package/package.json +415 -0
  93. package/src/components/accordion/accordion.styles.ts +46 -0
  94. package/src/components/accordion/index.ts +1 -0
  95. package/src/components/alert/alert.styles.ts +37 -0
  96. package/src/components/alert/index.ts +1 -0
  97. package/src/components/alert-dialog/alert-dialog.styles.ts +72 -0
  98. package/src/components/alert-dialog/index.ts +1 -0
  99. package/src/components/aspect-ratio/aspect-ratio.styles.ts +10 -0
  100. package/src/components/aspect-ratio/index.ts +1 -0
  101. package/src/components/autocomplete/autocomplete.styles.ts +86 -0
  102. package/src/components/autocomplete/index.ts +1 -0
  103. package/src/components/avatar/avatar.styles.ts +53 -0
  104. package/src/components/avatar/index.ts +1 -0
  105. package/src/components/badge/badge.styles.ts +77 -0
  106. package/src/components/badge/index.ts +1 -0
  107. package/src/components/breadcrumbs/breadcrumbs.styles.ts +14 -0
  108. package/src/components/breadcrumbs/index.ts +1 -0
  109. package/src/components/button/__tests__/button.styles.test.ts +79 -0
  110. package/src/components/button/button.styles.ts +65 -0
  111. package/src/components/button/index.ts +1 -0
  112. package/src/components/button-group/button-group.styles.ts +32 -0
  113. package/src/components/button-group/index.ts +1 -0
  114. package/src/components/calendar/calendar.styles.ts +60 -0
  115. package/src/components/calendar/index.ts +1 -0
  116. package/src/components/calendar-year-picker/calendar-year-picker.styles.ts +15 -0
  117. package/src/components/calendar-year-picker/index.ts +1 -0
  118. package/src/components/card/card.styles.ts +65 -0
  119. package/src/components/card/index.ts +1 -0
  120. package/src/components/checkbox/checkbox.styles.ts +27 -0
  121. package/src/components/checkbox/index.ts +1 -0
  122. package/src/components/checkbox-group/checkbox-group.styles.ts +18 -0
  123. package/src/components/checkbox-group/index.ts +1 -0
  124. package/src/components/chip/chip.styles.ts +65 -0
  125. package/src/components/chip/index.ts +1 -0
  126. package/src/components/close-button/close-button.styles.ts +17 -0
  127. package/src/components/close-button/index.ts +1 -0
  128. package/src/components/collapsible/collapsible.styles.ts +25 -0
  129. package/src/components/collapsible/index.ts +1 -0
  130. package/src/components/collapsible-group/collapsible-group.styles.ts +13 -0
  131. package/src/components/collapsible-group/index.ts +1 -0
  132. package/src/components/color-area/color-area.styles.ts +23 -0
  133. package/src/components/color-area/index.ts +1 -0
  134. package/src/components/color-field/color-field.styles.ts +18 -0
  135. package/src/components/color-field/index.ts +1 -0
  136. package/src/components/color-input-group/color-input-group.styles.ts +34 -0
  137. package/src/components/color-input-group/index.ts +1 -0
  138. package/src/components/color-picker/color-picker.styles.ts +13 -0
  139. package/src/components/color-picker/index.ts +1 -0
  140. package/src/components/color-slider/color-slider.styles.ts +14 -0
  141. package/src/components/color-slider/index.ts +1 -0
  142. package/src/components/color-swatch/color-swatch.styles.ts +26 -0
  143. package/src/components/color-swatch/index.ts +1 -0
  144. package/src/components/color-swatch-picker/color-swatch-picker.styles.ts +54 -0
  145. package/src/components/color-swatch-picker/index.ts +1 -0
  146. package/src/components/combo-box/combo-box.styles.ts +26 -0
  147. package/src/components/combo-box/index.ts +1 -0
  148. package/src/components/date-input/date-input.styles.ts +86 -0
  149. package/src/components/date-input/index.ts +1 -0
  150. package/src/components/date-picker/date-picker.styles.ts +14 -0
  151. package/src/components/date-picker/index.ts +1 -0
  152. package/src/components/date-range-field/date-range-field.styles.ts +87 -0
  153. package/src/components/date-range-field/index.ts +1 -0
  154. package/src/components/date-range-picker/date-range-picker.styles.ts +14 -0
  155. package/src/components/date-range-picker/index.ts +1 -0
  156. package/src/components/description/description.styles.ts +9 -0
  157. package/src/components/description/index.ts +1 -0
  158. package/src/components/drawer/drawer.styles.ts +55 -0
  159. package/src/components/drawer/index.ts +1 -0
  160. package/src/components/dropdown/dropdown.styles.ts +14 -0
  161. package/src/components/dropdown/index.ts +1 -0
  162. package/src/components/empty-state/empty-state.styles.ts +9 -0
  163. package/src/components/empty-state/index.ts +1 -0
  164. package/src/components/error-message/error-message.styles.ts +9 -0
  165. package/src/components/error-message/index.ts +1 -0
  166. package/src/components/fieldset/fieldset.styles.ts +29 -0
  167. package/src/components/fieldset/index.ts +1 -0
  168. package/src/components/header/header.styles.ts +5 -0
  169. package/src/components/header/index.ts +1 -0
  170. package/src/components/index.ts +84 -0
  171. package/src/components/input/index.ts +1 -0
  172. package/src/components/input/input.styles.ts +87 -0
  173. package/src/components/input-otp/index.ts +1 -0
  174. package/src/components/input-otp/input-otp.styles.ts +30 -0
  175. package/src/components/kbd/index.ts +1 -0
  176. package/src/components/kbd/kbd.styles.ts +20 -0
  177. package/src/components/label/index.ts +1 -0
  178. package/src/components/label/label.styles.ts +25 -0
  179. package/src/components/link/index.ts +1 -0
  180. package/src/components/link/link.styles.ts +38 -0
  181. package/src/components/list-box/index.ts +1 -0
  182. package/src/components/list-box/list-box.styles.ts +18 -0
  183. package/src/components/list-box-item/index.ts +1 -0
  184. package/src/components/list-box-item/list-box-item.styles.ts +25 -0
  185. package/src/components/list-box-section/index.ts +1 -0
  186. package/src/components/list-box-section/list-box-section.styles.ts +13 -0
  187. package/src/components/menu/index.ts +1 -0
  188. package/src/components/menu/menu.styles.ts +9 -0
  189. package/src/components/menu-item/index.ts +1 -0
  190. package/src/components/menu-item/menu-item.styles.ts +26 -0
  191. package/src/components/menu-section/index.ts +1 -0
  192. package/src/components/menu-section/menu-section.styles.ts +14 -0
  193. package/src/components/meter/index.ts +1 -0
  194. package/src/components/meter/meter.styles.ts +48 -0
  195. package/src/components/modal/index.ts +1 -0
  196. package/src/components/modal/modal.styles.ts +70 -0
  197. package/src/components/number-field/index.ts +1 -0
  198. package/src/components/number-field/number-field.styles.ts +80 -0
  199. package/src/components/pagination/index.ts +1 -0
  200. package/src/components/pagination/pagination.styles.ts +32 -0
  201. package/src/components/popover/index.ts +1 -0
  202. package/src/components/popover/popover.styles.ts +14 -0
  203. package/src/components/progress-bar/index.ts +1 -0
  204. package/src/components/progress-bar/progress-bar.styles.ts +97 -0
  205. package/src/components/progress-circle/index.ts +1 -0
  206. package/src/components/progress-circle/progress-circle.styles.ts +74 -0
  207. package/src/components/radio/index.ts +1 -0
  208. package/src/components/radio/radio.styles.ts +14 -0
  209. package/src/components/radio-group/index.ts +1 -0
  210. package/src/components/radio-group/radio-group.styles.ts +18 -0
  211. package/src/components/range-calendar/index.ts +1 -0
  212. package/src/components/range-calendar/range-calendar.styles.ts +60 -0
  213. package/src/components/scroll-shadow/index.ts +1 -0
  214. package/src/components/scroll-shadow/scroll-shadow.styles.ts +37 -0
  215. package/src/components/select/index.ts +1 -0
  216. package/src/components/select/select.styles.ts +86 -0
  217. package/src/components/separator/index.ts +1 -0
  218. package/src/components/separator/separator.styles.ts +25 -0
  219. package/src/components/skeleton/index.ts +1 -0
  220. package/src/components/skeleton/skeleton.styles.ts +21 -0
  221. package/src/components/slider/index.ts +1 -0
  222. package/src/components/slider/slider.styles.ts +40 -0
  223. package/src/components/spinner/index.ts +1 -0
  224. package/src/components/spinner/spinner.styles.ts +28 -0
  225. package/src/components/splitter/index.ts +1 -0
  226. package/src/components/splitter/splitter.styles.ts +28 -0
  227. package/src/components/stepper/index.ts +1 -0
  228. package/src/components/stepper/stepper.styles.ts +57 -0
  229. package/src/components/surface/index.ts +1 -0
  230. package/src/components/surface/surface.styles.ts +20 -0
  231. package/src/components/switch/index.ts +1 -0
  232. package/src/components/switch/switch.styles.ts +31 -0
  233. package/src/components/switch-group/index.ts +1 -0
  234. package/src/components/switch-group/switch-group.styles.ts +25 -0
  235. package/src/components/table/index.ts +1 -0
  236. package/src/components/table/table.styles.ts +47 -0
  237. package/src/components/tabs/index.ts +1 -0
  238. package/src/components/tabs/tabs.styles.ts +31 -0
  239. package/src/components/tag/index.ts +1 -0
  240. package/src/components/tag/tag.styles.ts +37 -0
  241. package/src/components/tag-group/index.ts +1 -0
  242. package/src/components/tag-group/tag-group.styles.ts +12 -0
  243. package/src/components/text/index.ts +1 -0
  244. package/src/components/text/text.styles.ts +29 -0
  245. package/src/components/textarea/index.ts +1 -0
  246. package/src/components/textarea/textarea.styles.ts +86 -0
  247. package/src/components/time-field/index.ts +1 -0
  248. package/src/components/time-field/time-field.styles.ts +86 -0
  249. package/src/components/toast/index.ts +1 -0
  250. package/src/components/toast/toast.styles.ts +67 -0
  251. package/src/components/toggle-button/index.ts +1 -0
  252. package/src/components/toggle-button/toggle-button.styles.ts +28 -0
  253. package/src/components/toggle-button-group/index.ts +1 -0
  254. package/src/components/toggle-button-group/toggle-button-group.styles.ts +39 -0
  255. package/src/components/toolbar/index.ts +1 -0
  256. package/src/components/toolbar/toolbar.styles.ts +23 -0
  257. package/src/components/tooltip/index.ts +1 -0
  258. package/src/components/tooltip/tooltip.styles.ts +12 -0
  259. package/src/components/tree/index.ts +1 -0
  260. package/src/components/tree/tree.styles.ts +33 -0
  261. package/src/index.ts +5 -0
  262. package/src/utils/index.ts +15 -0
  263. package/themes/default/components/index.css +6 -0
  264. package/themes/default/index.css +8 -0
  265. package/themes/default/variables.css +168 -0
  266. package/themes/shared/theme.css +196 -0
  267. package/utilities/index.css +244 -0
  268. package/variants/index.css +106 -0
@@ -0,0 +1,685 @@
1
+ .autocomplete__trigger {
2
+ @apply relative flex items-center gap-2 rounded-field border bg-field px-3 py-2 text-sm text-field-foreground shadow-field outline-none sm:text-xs;
3
+
4
+ /* Default size - matches autocomplete__trigger--md (height equivalent to h-9) */
5
+ height: 2.25rem;
6
+
7
+ border-width: var(--border-width-field);
8
+ border-color: var(--color-field-border);
9
+
10
+ /**
11
+ * Transitions
12
+ * CRITICAL: motion-reduce must be AFTER transition for correct override specificity
13
+ */
14
+ transition:
15
+ background-color 300ms var(--ease-smooth),
16
+ border-color 300ms var(--ease-smooth),
17
+ box-shadow 300ms var(--ease-out);
18
+ @apply motion-reduce:transition-none;
19
+
20
+ /* Add padding-right when indicator is present */
21
+ &:has(.autocomplete__indicator) {
22
+ @apply pr-7;
23
+ }
24
+
25
+ @media (hover: hover) {
26
+ &:has(> input:hover):not(:focus-within),
27
+ &[data-hovered="true"]:not([data-focused="true"]):not([data-focus-visible="true"]) {
28
+ @apply bg-field-hover;
29
+ border-color: var(--color-field-border-hover);
30
+ }
31
+ }
32
+
33
+ &.autocomplete__trigger--sm {
34
+ @apply gap-[0.40rem];
35
+ }
36
+
37
+ &.autocomplete__trigger--lg {
38
+ @apply gap-4;
39
+ }
40
+
41
+ /* Focus state */
42
+ &:focus-within,
43
+ &[data-focused="true"] {
44
+ @apply status-focused-field;
45
+ border-color: var(--color-field-border-focus);
46
+ background-color: var(--color-field-focus);
47
+ }
48
+
49
+ /* Focus visible state */
50
+ &:has(> input:focus-visible):not(:focus-within),
51
+ &[data-focus-visible="true"] {
52
+ }
53
+
54
+ /* Invalid state */
55
+ &:has(> input:invalid),
56
+ &[data-invalid="true"] {
57
+ @apply status-invalid-field;
58
+ background-color: var(--color-field-focus);
59
+ border-color: var(--color-field-border-invalid);
60
+ }
61
+
62
+ /* Disabled state */
63
+ &:has(> input:disabled),
64
+ &[data-disabled="true"] {
65
+ @apply status-disabled;
66
+ }
67
+
68
+ /* Readonly state */
69
+ &:has(> input:read-only),
70
+ &[data-readonly="true"] {
71
+ background-color: var(--color-default-100);
72
+ cursor: default;
73
+ }
74
+ }
75
+
76
+ /* ─── Variant modifiers ─────────────────────────────────────────────────────── */
77
+
78
+ .autocomplete__trigger--flat {
79
+ /* Transparent background across all states, no border, no shadow */
80
+ @apply shadow-none bg-transparent;
81
+ border-color: transparent;
82
+
83
+ @media (hover: hover) {
84
+ &:has(> input:hover):not(:focus-within),
85
+ &[data-hovered="true"]:not([data-focused="true"]):not([data-focus-visible="true"]) {
86
+ @apply bg-transparent;
87
+ }
88
+ }
89
+
90
+ &:focus-within,
91
+ &[data-focused="true"] {
92
+ @apply bg-transparent;
93
+ border-color: var(--color-field-border-focus);
94
+ }
95
+ }
96
+
97
+ .autocomplete__trigger--bordered {
98
+ /* Transparent background + light border */
99
+ @apply shadow-none;
100
+ background-color: transparent;
101
+ border-width: var(--border-width);
102
+ border-color: var(--border);
103
+
104
+ @media (hover: hover) {
105
+ &:has(> input:hover):not(:focus-within),
106
+ &[data-hovered="true"]:not([data-focused="true"]):not([data-focus-visible="true"]) {
107
+ background-color: transparent;
108
+ border-color: color-mix(in oklab, var(--border) 80%, var(--foreground) 20%);
109
+ }
110
+ }
111
+
112
+ &:focus-within,
113
+ &[data-focused="true"] {
114
+ background-color: transparent;
115
+ border-color: var(--color-field-border-focus);
116
+ }
117
+ }
118
+
119
+ .autocomplete__trigger--faded {
120
+ /* Muted background + visible border */
121
+ @apply shadow-none;
122
+ background-color: var(--color-background-tertiary);
123
+ border-color: var(--color-border);
124
+
125
+ &:focus-within,
126
+ &[data-focused="true"] {
127
+ background-color: var(--color-background-tertiary);
128
+ border-color: var(--color-field-border-focus);
129
+ }
130
+ }
131
+
132
+ .autocomplete__trigger--underlined {
133
+ /* Bottom border only — always-visible underline. Flush left so text starts at
134
+ the underline edge; keep right padding so the absolute-positioned indicator
135
+ doesn't collide with the in-flow clear button. */
136
+ @apply rounded-none shadow-none bg-transparent !pl-0;
137
+ border-top: none;
138
+ border-left: none;
139
+ border-right: none;
140
+ border-bottom-width: var(--border-width);
141
+ border-bottom-color: var(--border);
142
+
143
+ @media (hover: hover) {
144
+ &:has(> input:hover):not(:focus-within),
145
+ &[data-hovered="true"]:not([data-focused="true"]):not([data-focus-visible="true"]) {
146
+ background-color: transparent;
147
+ border-bottom-color: color-mix(in oklab, var(--border) 80%, var(--foreground) 20%);
148
+ }
149
+ }
150
+
151
+ &:focus-within,
152
+ &[data-focused="true"] {
153
+ @apply bg-transparent;
154
+ border-bottom-color: var(--color-field-border-focus);
155
+ --tw-ring-color: var(--focus);
156
+ box-shadow: 0 1.2px 0 0 var(--tw-ring-color, var(--color-field-border-focus));
157
+ }
158
+ }
159
+
160
+ .autocomplete__trigger--raised {
161
+ /* Elevated look: white bg + shadow, transparent border */
162
+ @apply shadow-md;
163
+ background-color: var(--snow);
164
+ border-color: transparent;
165
+
166
+ @media (hover: hover) {
167
+ &:has(> input:hover):not(:focus-within),
168
+ &[data-hovered="true"]:not([data-focused="true"]):not([data-focus-visible="true"]) {
169
+ @apply shadow-lg;
170
+ background-color: var(--background);
171
+ border-color: transparent;
172
+ }
173
+ }
174
+
175
+ &:focus-within,
176
+ &[data-focused="true"] {
177
+ @apply shadow-lg;
178
+ background-color: var(--snow);
179
+ border-color: var(--color-field-border-focus);
180
+ }
181
+ }
182
+
183
+ /* ─── Size modifiers ─────────────────────────────────────────────────────────── */
184
+
185
+ .autocomplete__trigger--sm {
186
+ @apply text-xs px-2 py-1;
187
+ height: 1.75rem;
188
+ }
189
+
190
+ .autocomplete__trigger--lg {
191
+ @apply text-base px-4 py-2.5;
192
+ height: 2.75rem;
193
+ }
194
+
195
+ /* ─── Color modifiers ────────────────────────────────────────────────────────── */
196
+
197
+ .autocomplete__trigger--default {
198
+ /* Default accent */
199
+ --autocomplete-accent: var(--color-default-foreground);
200
+ accent-color: var(--autocomplete-accent);
201
+ }
202
+
203
+ .autocomplete__trigger--primary {
204
+ --autocomplete-accent: var(--color-primary);
205
+ accent-color: var(--autocomplete-accent);
206
+
207
+ &:focus-within,
208
+ &[data-focused="true"] {
209
+ border-color: var(--color-primary);
210
+ --tw-ring-color: var(--color-secondary);
211
+ }
212
+ }
213
+
214
+ .autocomplete__trigger--secondary {
215
+ --autocomplete-accent: var(--color-secondary);
216
+ accent-color: var(--autocomplete-accent);
217
+
218
+ &:focus-within,
219
+ &[data-focused="true"] {
220
+ border-color: var(--color-secondary);
221
+ --tw-ring-color: var(--color-secondary);
222
+ }
223
+ }
224
+
225
+ .autocomplete__trigger--success {
226
+ --autocomplete-accent: var(--color-success);
227
+ accent-color: var(--autocomplete-accent);
228
+
229
+ &:focus-within,
230
+ &[data-focused="true"] {
231
+ border-color: var(--color-success);
232
+ --tw-ring-color: var(--color-success);
233
+ }
234
+ }
235
+
236
+ .autocomplete__trigger--warning {
237
+ --autocomplete-accent: var(--color-warning);
238
+ accent-color: var(--autocomplete-accent);
239
+
240
+ &:focus-within,
241
+ &[data-focused="true"] {
242
+ border-color: var(--color-warning);
243
+ --tw-ring-color: var(--color-warning);
244
+ }
245
+ }
246
+
247
+ .autocomplete__trigger--danger {
248
+ --autocomplete-accent: var(--color-danger);
249
+ accent-color: var(--autocomplete-accent);
250
+
251
+ &:focus-within,
252
+ &[data-focused="true"] {
253
+ border-color: var(--color-danger);
254
+ --tw-ring-color: var(--color-danger);
255
+ }
256
+ }
257
+
258
+ /* ─── Underlined + color variant overrides ─────────────────────────────────── */
259
+ /* When .autocomplete__trigger--underlined is combined with any color variant, enforce
260
+ the bottom-only underline silhouette on focus (no full-box border, no full-ring
261
+ shadow). Each rule overrides .autocomplete__trigger--{color}'s focus box-shadow. */
262
+
263
+ .autocomplete__trigger--underlined.autocomplete__trigger--primary,
264
+ .autocomplete__trigger--underlined.autocomplete__trigger--secondary,
265
+ .autocomplete__trigger--underlined.autocomplete__trigger--success,
266
+ .autocomplete__trigger--underlined.autocomplete__trigger--warning,
267
+ .autocomplete__trigger--underlined.autocomplete__trigger--danger {
268
+ /* Re-assert underline-only silhouette even when color variant is applied */
269
+ border-top: none;
270
+ border-left: none;
271
+ border-right: none;
272
+ border-bottom-width: var(--border-width);
273
+ }
274
+
275
+
276
+ /* ─── State modifiers ────────────────────────────────────────────────────────── */
277
+
278
+ .autocomplete__trigger--invalid {
279
+ /* Applied by tv() isInvalid variant — mirrors native :invalid */
280
+ border-color: var(--color-danger) !important;
281
+ @apply status-invalid-field;
282
+ }
283
+
284
+ .autocomplete__trigger--disabled {
285
+ /* Applied by tv() isDisabled variant — mirrors native :disabled */
286
+ @apply status-disabled opacity-60 cursor-not-allowed;
287
+ }
288
+
289
+ .autocomplete__trigger--readonly {
290
+ /* Applied by tv() isReadonly variant — mirrors native :read-only */
291
+ background-color: var(--color-default-100);
292
+ cursor: default;
293
+ }
294
+
295
+ /* ─── Layout modifiers ───────────────────────────────────────────────────────── */
296
+
297
+ .autocomplete__trigger--full-width {
298
+ @apply w-full;
299
+ }
300
+
301
+ /* ─── Slots ──────────────────────────────────────────────────────────────────── */
302
+
303
+ .autocomplete__input {
304
+ @apply flex-1 bg-transparent outline-none border-0 p-0 h-auto text-inherit;
305
+ @apply placeholder:text-field-placeholder;
306
+
307
+ &:focus,
308
+ &:focus-visible {
309
+ outline: none;
310
+ box-shadow: none;
311
+ }
312
+ }
313
+
314
+ /* ─── Label slot ─────────────────────────────────────────────────────────────── */
315
+
316
+ .autocomplete__label {
317
+ @apply text-sm font-medium select-none;
318
+ color: var(--color-field-placeholder);
319
+ pointer-events: none;
320
+ transition:
321
+ transform 300ms var(--ease-smooth),
322
+ color 300ms var(--ease-smooth),
323
+ scale 300ms var(--ease-smooth);
324
+ @apply motion-reduce:transition-none;
325
+ }
326
+
327
+ /* ─── Floating label (inside the trigger) ──────────────────────────────────── */
328
+
329
+ /* When a label is present, the trigger is taller to make room for the
330
+ floated label above the caret. Heights override the base/size defaults. */
331
+ .autocomplete__trigger--label-inside {
332
+ position: relative;
333
+ height: 3.5rem; /* md: was 2.25rem; +0.75rem room for floated label */
334
+ padding-top: 0;
335
+ padding-bottom: 0;
336
+ }
337
+
338
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm {
339
+ height: 2.5rem; /* sm: was 1.75rem */
340
+ }
341
+
342
+ .autocomplete__trigger--label-inside.autocomplete__trigger--lg {
343
+ height: 4rem; /* lg: was 2.75rem */
344
+ }
345
+
346
+ .autocomplete__trigger--label-inside .autocomplete__label {
347
+ position: absolute;
348
+ left: 0.75rem; /* matches .autocomplete__trigger px-3 */
349
+ top: 50%;
350
+ transform: translateY(-50%);
351
+ transform-origin: left center;
352
+ font-size: var(--text-sm);
353
+ color: var(--color-field-placeholder);
354
+ }
355
+
356
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined .autocomplete__label {
357
+ left: 0rem;
358
+ }
359
+
360
+ /* Push the input caret/text down so it doesn't sit under the floated label.
361
+ Applied statically (not only in up-state) to keep the input box stable. */
362
+ .autocomplete__trigger--label-inside .autocomplete__input {
363
+ padding-top: 1rem;
364
+ padding-bottom: 0;
365
+ }
366
+
367
+ /* Hide the native placeholder while the label occupies the resting position.
368
+ Placeholder reveals only once the label has floated up (focused or filled). */
369
+ .autocomplete__trigger--label-inside .autocomplete__input::placeholder {
370
+ color: transparent;
371
+ }
372
+
373
+ .autocomplete__trigger--label-inside.autocomplete__trigger--default:focus-within .autocomplete__label,
374
+ .autocomplete__trigger--label-inside.autocomplete__trigger--default[data-focused="true"] .autocomplete__label {
375
+ color: var(--color-foreground);
376
+ }
377
+
378
+ .autocomplete__trigger--label-inside:focus-within .autocomplete__input::placeholder,
379
+ .autocomplete__trigger--label-inside[data-focused="true"] .autocomplete__input::placeholder,
380
+ .autocomplete__trigger--label-inside[data-filled="true"] .autocomplete__input::placeholder {
381
+ color: var(--color-field-placeholder);
382
+ }
383
+
384
+ /* Up-state: focused OR filled. Paired pseudo-class + data-attribute per the
385
+ Reka UI selector pairing rule. */
386
+ .autocomplete__trigger--label-inside:focus-within .autocomplete__label,
387
+ .autocomplete__trigger--label-inside[data-focused="true"] .autocomplete__label,
388
+ .autocomplete__trigger--label-inside[data-filled="true"] .autocomplete__label {
389
+ transform: translateY(-110%) scale(0.85);
390
+ }
391
+
392
+ /* Size-aware offsets for the inside variant */
393
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm .autocomplete__label {
394
+ font-size: var(--text-xs, 0.75rem);
395
+ left: 0.5rem; /* matches .autocomplete__trigger--sm px-2 */
396
+ }
397
+
398
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm .autocomplete__input {
399
+ padding-top: 0.625rem;
400
+ }
401
+
402
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm:focus-within .autocomplete__label,
403
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm[data-focused="true"] .autocomplete__label,
404
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm[data-filled="true"] .autocomplete__label {
405
+ transform: translateY(-100%) scale(0.8);
406
+ }
407
+
408
+ .autocomplete__trigger--label-inside.autocomplete__trigger--lg .autocomplete__label {
409
+ font-size: var(--text-base, 1rem);
410
+ left: 1rem; /* matches .autocomplete__trigger--lg px-4 */
411
+ }
412
+
413
+ .autocomplete__trigger--label-inside.autocomplete__trigger--lg .autocomplete__input {
414
+ padding-top: 1.125rem;
415
+ }
416
+
417
+ /* Underlined + sm/lg: force the inside label flush-left (override the size-specific
418
+ left offsets above, which assume horizontal padding that underlined strips away). */
419
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined.autocomplete__trigger--sm .autocomplete__label,
420
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined.autocomplete__trigger--lg .autocomplete__label {
421
+ left: 0rem;
422
+ }
423
+
424
+ /* Underlined variant + inside label: ensure the input has enough top padding */
425
+ .autocomplete__trigger--underlined.autocomplete__trigger--label-inside .autocomplete__input {
426
+ padding-top: 1.125rem;
427
+ }
428
+
429
+ /* Invalid state — label color flips to danger */
430
+ .autocomplete__trigger--label-inside:has(> input:invalid) .autocomplete__label,
431
+ .autocomplete__trigger--label-inside[data-invalid="true"] .autocomplete__label {
432
+ color: var(--color-danger);
433
+ }
434
+
435
+ /* ─── Root wrapper (holds label + field + helper) ───────────────────────── */
436
+
437
+ .autocomplete-root {
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: 0.375rem;
441
+ }
442
+
443
+ .autocomplete-root--full-width {
444
+ @apply w-full;
445
+ }
446
+
447
+ .autocomplete-root--label-outside-left {
448
+ flex-direction: row;
449
+ align-items: flex-start;
450
+ gap: 0.75rem;
451
+ }
452
+
453
+ .autocomplete__main-wrapper {
454
+ display: flex;
455
+ flex-direction: column;
456
+ gap: 0.25rem;
457
+ flex: 1;
458
+ min-width: 0;
459
+ }
460
+
461
+ /* ─── Outside label ──────────────────────────────────────────────────────── */
462
+
463
+ .autocomplete-root--label-outside > .autocomplete__label,
464
+ .autocomplete-root--label-outside-left > .autocomplete__label {
465
+ position: static;
466
+ transform: none;
467
+ display: block;
468
+ pointer-events: auto;
469
+ font-size: var(--text-sm);
470
+ font-weight: 500;
471
+ color: var(--color-foreground);
472
+ }
473
+
474
+ /* Align outside-left label with input text baseline; defaults tuned for md. */
475
+ .autocomplete-root--label-outside-left > .autocomplete__label {
476
+ padding-top: 0.5rem;
477
+ min-width: 5rem;
478
+ flex-shrink: 0;
479
+ }
480
+
481
+ .autocomplete-root--label-outside[data-invalid="true"] > .autocomplete__label,
482
+ .autocomplete-root--label-outside-left[data-invalid="true"] > .autocomplete__label {
483
+ color: var(--color-danger);
484
+ }
485
+
486
+ /* ─── Helper text (description / error message) ─────────────────────────── */
487
+
488
+ .autocomplete__helper-wrapper { @apply picker-helper-wrapper; }
489
+ .autocomplete__description { @apply picker-description; }
490
+ .autocomplete__error-message { @apply picker-error-message; }
491
+
492
+ /* Color up-state — floated label picks up the focus accent per color variant */
493
+ .autocomplete__trigger--label-inside.autocomplete__trigger--primary:focus-within .autocomplete__label,
494
+ .autocomplete__trigger--label-inside.autocomplete__trigger--primary[data-focused="true"] .autocomplete__label {
495
+ color: var(--color-primary);
496
+ }
497
+ .autocomplete__trigger--label-inside.autocomplete__trigger--secondary:focus-within .autocomplete__label,
498
+ .autocomplete__trigger--label-inside.autocomplete__trigger--secondary[data-focused="true"] .autocomplete__label {
499
+ color: var(--color-secondary);
500
+ }
501
+ .autocomplete__trigger--label-inside.autocomplete__trigger--success:focus-within .autocomplete__label,
502
+ .autocomplete__trigger--label-inside.autocomplete__trigger--success[data-focused="true"] .autocomplete__label {
503
+ color: var(--color-success);
504
+ }
505
+ .autocomplete__trigger--label-inside.autocomplete__trigger--warning:focus-within .autocomplete__label,
506
+ .autocomplete__trigger--label-inside.autocomplete__trigger--warning[data-focused="true"] .autocomplete__label {
507
+ color: var(--color-warning);
508
+ }
509
+ .autocomplete__trigger--label-inside.autocomplete__trigger--danger:focus-within .autocomplete__label,
510
+ .autocomplete__trigger--label-inside.autocomplete__trigger--danger[data-focused="true"] .autocomplete__label {
511
+ color: var(--color-danger);
512
+ }
513
+
514
+ /* ─── Indicator (chevron / loading spinner) ─────────────────────────────── */
515
+
516
+ .autocomplete__indicator {
517
+ @apply absolute inset-y-0 right-2 my-auto flex shrink-0 items-center justify-center text-field-placeholder transition duration-300;
518
+
519
+ /* Cursor */
520
+ cursor: var(--cursor-interactive);
521
+
522
+ &[data-state="open"] {
523
+ @apply rotate-180;
524
+ }
525
+
526
+ &[data-slot="autocomplete-default-indicator"] {
527
+ @apply size-4;
528
+ }
529
+ }
530
+
531
+ /* ─── Start Content ──────────────────────────────────────────────────────── */
532
+
533
+ .autocomplete__start-content {
534
+ @apply inline-flex items-center justify-center shrink-0;
535
+ color: var(--color-field-placeholder);
536
+ }
537
+
538
+ .autocomplete__start-content svg {
539
+ @apply size-4;
540
+ }
541
+
542
+ /* Inside label offset when a startContent adornment is present — push the
543
+ floated label past the icon so it doesn't collide. Mirrors input.css. */
544
+ .autocomplete__trigger--label-inside:has(> .autocomplete__start-content) .autocomplete__label {
545
+ left: calc(0.75rem + 1rem + 0.5rem); /* px-3 + size-4 icon + gap-2 */
546
+ }
547
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined:has(> .autocomplete__start-content) .autocomplete__label {
548
+ left: calc(1rem + 0.5rem); /* icon + gap */
549
+ }
550
+
551
+ .autocomplete__trigger--label-inside.autocomplete__trigger--sm:has(> .autocomplete__start-content) .autocomplete__label {
552
+ left: calc(0.5rem + 1rem + 0.4rem);
553
+ }
554
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined.autocomplete__trigger--sm:has(> .autocomplete__start-content) .autocomplete__label {
555
+ left: calc(1rem + 0.4rem);
556
+ }
557
+
558
+ .autocomplete__trigger--label-inside.autocomplete__trigger--lg:has(> .autocomplete__start-content) .autocomplete__label {
559
+ left: calc(1rem + 1rem + 1rem);
560
+ }
561
+ .autocomplete__trigger--label-inside.autocomplete__trigger--underlined.autocomplete__trigger--lg:has(> .autocomplete__start-content) .autocomplete__label {
562
+ left: calc(1rem + 1rem);
563
+ }
564
+
565
+ /* ─── Clear Button ───────────────────────────────────────────────────────── */
566
+
567
+ .autocomplete__clear-button {
568
+ @apply relative isolate inline-flex h-6 w-6 shrink-0 origin-center items-center justify-center rounded-xl p-1 text-muted select-none no-highlight;
569
+ @apply mr-0 size-5 shrink-0 self-center bg-transparent;
570
+
571
+ /* Cursor */
572
+ cursor: var(--cursor-interactive);
573
+
574
+ @apply transform-gpu;
575
+
576
+ /* Transition only when visible - disappears immediately when cleared */
577
+ &:not([data-empty="true"]) {
578
+ transition: opacity 300ms var(--ease-smooth);
579
+ @apply motion-reduce:transition-none;
580
+ }
581
+
582
+ &[data-empty="true"] {
583
+ @apply pointer-events-none opacity-0;
584
+ }
585
+
586
+ [data-slot="autocomplete-clear-button-icon"] {
587
+ @apply size-3.5;
588
+ }
589
+
590
+ @media (hover: hover) {
591
+ &:hover,
592
+ &[data-hovered="true"] {
593
+ @apply bg-default-hover;
594
+ }
595
+ }
596
+
597
+ &:active,
598
+ &[data-pressed="true"] {
599
+ transform: scale(0.93);
600
+ }
601
+ }
602
+
603
+ /* ─── Popover (listbox content) ─────────────────────────────────────────── */
604
+ /* Similar to popover content styles */
605
+ .autocomplete__popover {
606
+ /* Reka exposes --reka-combobox-trigger-width + --reka-combobox-content-transform-origin
607
+ on the content element; alias them into the design-system-wide names used below. */
608
+ --trigger-width: var(--reka-combobox-trigger-width);
609
+ --trigger-anchor-point: var(--reka-combobox-content-transform-origin);
610
+
611
+ @apply scroll-py-1 overflow-y-auto overscroll-contain rounded-3xl bg-overlay p-0 text-sm;
612
+ width: var(--trigger-width);
613
+ transform-origin: var(--trigger-anchor-point);
614
+ box-shadow: var(--shadow-overlay);
615
+
616
+ /* Constrain height to available viewport space (exposed by Reka's popper layer),
617
+ with an absolute cap so it never becomes a full-screen column. */
618
+ max-height: min(var(--reka-combobox-content-available-height, 20rem), 20rem);
619
+ scroll-behavior: smooth;
620
+
621
+ @apply overlay-popover-scrollbar;
622
+
623
+ /* Focus visible state */
624
+ &:has(> *:focus-visible):not(:focus-within),
625
+ &[data-focus-visible="true"] {
626
+ @apply outline-none;
627
+ }
628
+
629
+ /* Entering animations */
630
+ & {
631
+ @apply animate-in duration-300 ease-out-fluid fade-in-0 zoom-in-95;
632
+
633
+ /* Placement-specific translations */
634
+ &[data-placement="top"] {
635
+ @apply slide-in-from-bottom-1;
636
+ }
637
+
638
+ &[data-placement="bottom"] {
639
+ @apply slide-in-from-top-1;
640
+ }
641
+
642
+ &[data-placement="left"] {
643
+ @apply slide-in-from-right-1;
644
+ }
645
+
646
+ &[data-placement="right"] {
647
+ @apply slide-in-from-left-1;
648
+ }
649
+ }
650
+
651
+ /* Exiting animations */
652
+ & {
653
+ @apply animate-out duration-300 ease-out-quad zoom-out-95 fade-out;
654
+ }
655
+
656
+ &,
657
+ & {
658
+ @apply will-change-[opacity,transform];
659
+ }
660
+
661
+ /* Arrow styling */
662
+ & [data-slot="popover-overlay-arrow"] {
663
+ fill: var(--overlay);
664
+ }
665
+
666
+ /* Arrow rotation based on placement */
667
+ &[data-placement="bottom"] [data-slot="popover-overlay-arrow"] {
668
+ rotate: 180deg;
669
+ }
670
+
671
+ &[data-placement="left"] [data-slot="popover-overlay-arrow"] {
672
+ rotate: -90deg;
673
+ }
674
+
675
+ &[data-placement="right"] [data-slot="popover-overlay-arrow"] {
676
+ rotate: 90deg;
677
+ }
678
+
679
+ @apply overlay-popover-listbox;
680
+
681
+ /* Search Field styles */
682
+ [data-slot="search-field"] {
683
+ @apply px-3 py-1 outline-none;
684
+ }
685
+ }