@attrus-ds/core 0.2.0 → 0.3.1

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 (80) hide show
  1. package/LICENSE +27 -27
  2. package/dist/assets/flags/Brazil-rounded.svg +15 -15
  3. package/dist/assets/flags/Brazil-square.svg +16 -16
  4. package/dist/assets/flags/Chile-rounded.svg +10 -10
  5. package/dist/assets/flags/Chile-square.svg +10 -10
  6. package/dist/assets/flags/Colombia-rounded.svg +9 -9
  7. package/dist/assets/flags/Colombia-square.svg +9 -9
  8. package/dist/assets/flags/EUA-rounded.svg +10 -10
  9. package/dist/assets/flags/EUA-square.svg +10 -10
  10. package/dist/assets/flags/EUR-rounded.svg +8 -8
  11. package/dist/assets/flags/EUR-square.svg +8 -8
  12. package/dist/assets/flags/Mexico-rounded.svg +18 -18
  13. package/dist/assets/flags/Mexico-square.svg +18 -18
  14. package/dist/assets/icon-attrus-dark.svg +2 -2
  15. package/dist/assets/icon-attrus-light.svg +2 -2
  16. package/dist/assets/logo-attrus-dark.svg +7 -7
  17. package/dist/assets/logo-attrus-light.svg +7 -7
  18. package/dist/css/components/buttons.css +301 -301
  19. package/dist/css/components/callout.css +195 -195
  20. package/dist/css/components/cards.css +272 -272
  21. package/dist/css/components/combobox.css +319 -319
  22. package/dist/css/components/empty-states.css +61 -61
  23. package/dist/css/components/inputs.css +975 -975
  24. package/dist/css/components/number-input.css +138 -138
  25. package/dist/css/components/overlays.css +374 -374
  26. package/dist/css/components/primitives.css +314 -314
  27. package/dist/css/components/sidebar.css +179 -179
  28. package/dist/css/components/smart-search.css +91 -91
  29. package/dist/css/components/status-pills.css +207 -207
  30. package/dist/css/components/stepper.css +309 -309
  31. package/dist/css/components/table.css +602 -602
  32. package/dist/css/components/tabs.css +319 -319
  33. package/dist/css/components/toast.css +243 -243
  34. package/dist/css/components/tooltip.css +231 -231
  35. package/dist/css/components/topbar.css +148 -148
  36. package/dist/css/tokens.css +666 -666
  37. package/dist/react/AppSidebar/AppSidebar.d.ts +50 -50
  38. package/dist/react/AppSidebar/AppSidebar.tsx +197 -197
  39. package/dist/react/AppTopbar/AppTopbar.d.ts +58 -58
  40. package/dist/react/AppTopbar/AppTopbar.tsx +203 -203
  41. package/dist/react/Atoms/Atoms.d.ts +149 -149
  42. package/dist/react/Atoms/Atoms.tsx +407 -407
  43. package/dist/react/Button/Button.d.ts +25 -25
  44. package/dist/react/Button/Button.tsx +83 -83
  45. package/dist/react/Callout/Callout.d.ts +29 -29
  46. package/dist/react/Callout/Callout.tsx +98 -98
  47. package/dist/react/Card/Card.d.ts +38 -38
  48. package/dist/react/Card/Card.tsx +93 -93
  49. package/dist/react/Combobox/Combobox.d.ts +52 -52
  50. package/dist/react/Combobox/Combobox.tsx +254 -254
  51. package/dist/react/DataTable/DataTable.d.ts +81 -81
  52. package/dist/react/DataTable/DataTable.tsx +308 -308
  53. package/dist/react/Drawer/Drawer.d.ts +35 -35
  54. package/dist/react/Drawer/Drawer.tsx +226 -226
  55. package/dist/react/Input/Input.d.ts +155 -155
  56. package/dist/react/Input/Input.tsx +478 -478
  57. package/dist/react/Modal/Modal.d.ts +27 -27
  58. package/dist/react/Modal/Modal.tsx +173 -173
  59. package/dist/react/NumberInput/NumberInput.d.ts +25 -25
  60. package/dist/react/NumberInput/NumberInput.tsx +117 -117
  61. package/dist/react/Pill/Pill.d.ts +31 -31
  62. package/dist/react/Pill/Pill.tsx +104 -104
  63. package/dist/react/SearchPill/SearchPill.d.ts +14 -14
  64. package/dist/react/SearchPill/SearchPill.tsx +40 -40
  65. package/dist/react/SmartSearch/SmartSearch.d.ts +65 -65
  66. package/dist/react/SmartSearch/SmartSearch.tsx +271 -271
  67. package/dist/react/Stepper/Stepper.d.ts +25 -25
  68. package/dist/react/Stepper/Stepper.tsx +94 -94
  69. package/dist/react/Tabs/Tabs.d.ts +32 -32
  70. package/dist/react/Tabs/Tabs.tsx +147 -147
  71. package/dist/react/Toast/Toast.d.ts +30 -30
  72. package/dist/react/Toast/Toast.tsx +94 -94
  73. package/dist/react/Tooltip/Tooltip.d.ts +23 -23
  74. package/dist/react/Tooltip/Tooltip.tsx +80 -80
  75. package/dist/react/ZeroState/ZeroState.d.ts +17 -17
  76. package/dist/react/ZeroState/ZeroState.tsx +45 -45
  77. package/dist/react/index.ts +35 -35
  78. package/dist/tokens/attrus-tokens.flat.json +1234 -1234
  79. package/dist/tokens/attrus-tokens.json +1089 -1089
  80. package/package.json +64 -64
@@ -1,319 +1,319 @@
1
- /* ============================================================
2
- COMBOBOX — searchable single-select dropdown
3
- Trigger + popover listbox with filterable options.
4
- All values from tokens.
5
- ============================================================ */
6
-
7
- .combobox {
8
- position: relative;
9
- display: inline-block;
10
- width: 100%;
11
- font-family: var(--font-sans);
12
- }
13
-
14
- /* Trigger — looks like an input with a chevron */
15
- .combobox-trigger {
16
- display: flex;
17
- align-items: center;
18
- gap: var(--space-3);
19
- width: 100%;
20
- height: 40px;
21
- padding: 0 var(--space-3) 0 var(--space-4);
22
- background: var(--color-background-surface);
23
- border: 1px solid var(--color-border-default);
24
- border-radius: var(--radius-sm);
25
- font-family: var(--font-sans);
26
- font-size: var(--fs-sm);
27
- font-weight: var(--w-medium);
28
- color: var(--color-foreground-default);
29
- cursor: pointer;
30
- text-align: left;
31
- transition: var(--transition-fast);
32
- }
33
- .combobox-trigger:hover {
34
- background: var(--color-background-hover);
35
- border-color: var(--color-border-strong);
36
- }
37
- .combobox-trigger:focus-visible,
38
- .combobox.is-open .combobox-trigger {
39
- outline: none;
40
- border-color: var(--color-foreground-accent);
41
- box-shadow: var(--shadow-focus);
42
- }
43
-
44
- .combobox-value {
45
- flex: 1;
46
- min-width: 0;
47
- white-space: nowrap;
48
- overflow: hidden;
49
- text-overflow: ellipsis;
50
- }
51
- .combobox-placeholder {
52
- color: var(--color-foreground-muted);
53
- font-weight: var(--w-regular);
54
- }
55
- .combobox-chevron {
56
- width: 16px; height: 16px;
57
- stroke-width: var(--icon-stroke);
58
- color: var(--color-foreground-muted);
59
- flex-shrink: 0;
60
- transition: transform var(--duration-fast) var(--ease-standard);
61
- }
62
- .combobox.is-open .combobox-chevron { transform: rotate(180deg); }
63
-
64
- /* Leading icon variant */
65
- .combobox-trigger-icon {
66
- width: 16px; height: 16px;
67
- stroke-width: var(--icon-stroke);
68
- color: var(--color-foreground-secondary);
69
- flex-shrink: 0;
70
- }
71
-
72
- /* Avatar inside trigger (counterparty selector pattern) */
73
- .combobox-avatar {
74
- width: 24px; height: 24px;
75
- border-radius: var(--radius-pill);
76
- background: var(--color-brand-secondary-100);
77
- color: var(--color-brand-secondary-700);
78
- display: inline-flex; align-items: center; justify-content: center;
79
- font-size: var(--fs-xxs);
80
- font-weight: var(--w-semibold);
81
- flex-shrink: 0;
82
- margin-left: calc(var(--space-1) * -1);
83
- }
84
-
85
- /* Listbox popover */
86
- .combobox-popover {
87
- position: absolute;
88
- top: calc(100% + var(--space-2));
89
- left: 0;
90
- right: 0;
91
- z-index: 7000;
92
- background: var(--color-background-surface);
93
- border: 1px solid var(--color-border-default);
94
- border-radius: var(--radius-md);
95
- box-shadow: var(--shadow-xl);
96
- display: none;
97
- flex-direction: column;
98
- max-height: 320px;
99
- }
100
- .combobox.is-open .combobox-popover { display: flex; }
101
-
102
- /* Search header */
103
- .combobox-search {
104
- position: relative;
105
- padding: var(--space-3);
106
- border-bottom: 1px solid var(--color-border-subtle);
107
- flex-shrink: 0;
108
- }
109
- .combobox-search input {
110
- width: 100%;
111
- box-sizing: border-box;
112
- height: 32px;
113
- padding: 0 var(--space-3) 0 var(--space-7);
114
- background: var(--color-background-canvas);
115
- border: 1px solid var(--color-border-default);
116
- border-radius: var(--radius-xs);
117
- font-family: var(--font-sans);
118
- font-size: var(--fs-sm);
119
- color: var(--color-foreground-default);
120
- }
121
- .combobox-search input::placeholder { color: var(--color-foreground-muted); }
122
- .combobox-search input:focus {
123
- outline: none;
124
- border-color: var(--color-foreground-accent);
125
- box-shadow: var(--shadow-focus);
126
- }
127
- .combobox-search-icon {
128
- position: absolute;
129
- left: calc(var(--space-3) + var(--space-2));
130
- top: 50%;
131
- transform: translateY(-50%);
132
- width: 14px; height: 14px;
133
- stroke-width: var(--icon-stroke);
134
- color: var(--color-foreground-muted);
135
- pointer-events: none;
136
- }
137
-
138
- /* Listbox region */
139
- .combobox-list {
140
- list-style: none;
141
- margin: 0;
142
- padding: var(--space-1);
143
- overflow-y: auto;
144
- flex: 1;
145
- }
146
-
147
- /* Group headers */
148
- .combobox-group-label {
149
- padding: var(--space-2) var(--space-3) var(--space-1);
150
- font-family: var(--font-mono);
151
- font-size: var(--fs-xxs);
152
- font-weight: var(--w-semibold);
153
- letter-spacing: var(--ls-caps);
154
- text-transform: uppercase;
155
- color: var(--color-foreground-muted);
156
- }
157
-
158
- .combobox-option {
159
- display: flex;
160
- align-items: center;
161
- gap: var(--space-3);
162
- padding: var(--space-2) var(--space-3);
163
- border-radius: var(--radius-xs);
164
- cursor: pointer;
165
- font-size: var(--fs-sm);
166
- color: var(--color-foreground-default);
167
- transition: background var(--duration-fast) var(--ease-standard);
168
- }
169
- .combobox-option:hover,
170
- .combobox-option.is-active {
171
- background: var(--color-background-hover);
172
- }
173
- .combobox-option.is-selected {
174
- background: var(--color-background-selected);
175
- color: var(--color-foreground-accent);
176
- font-weight: var(--w-semibold);
177
- }
178
- .combobox-option.is-disabled {
179
- opacity: 0.5;
180
- cursor: not-allowed;
181
- }
182
-
183
- .combobox-option-content {
184
- flex: 1;
185
- min-width: 0;
186
- }
187
- .combobox-option-label {
188
- display: block;
189
- white-space: nowrap;
190
- overflow: hidden;
191
- text-overflow: ellipsis;
192
- }
193
- .combobox-option-meta {
194
- display: block;
195
- font-size: var(--fs-xs);
196
- color: var(--color-foreground-secondary);
197
- font-weight: var(--w-regular);
198
- margin-top: 1px;
199
- }
200
- .combobox-option.is-selected .combobox-option-meta {
201
- color: var(--color-brand-secondary-600);
202
- }
203
-
204
- .combobox-option-check {
205
- width: 16px; height: 16px;
206
- stroke-width: 2.4;
207
- color: var(--color-foreground-accent);
208
- flex-shrink: 0;
209
- opacity: 0;
210
- }
211
- .combobox-option.is-selected .combobox-option-check { opacity: 1; }
212
-
213
- .combobox-option-trailing {
214
- font-family: var(--font-mono);
215
- font-size: var(--fs-xxs);
216
- color: var(--color-foreground-muted);
217
- flex-shrink: 0;
218
- }
219
-
220
- /* Empty state */
221
- .combobox-empty {
222
- padding: var(--space-8) var(--space-4);
223
- text-align: center;
224
- color: var(--color-foreground-muted);
225
- font-size: var(--fs-sm);
226
- }
227
- .combobox-empty strong {
228
- display: block;
229
- color: var(--color-foreground-default);
230
- font-weight: var(--w-semibold);
231
- margin-bottom: var(--space-1);
232
- }
233
-
234
- /* Footer (e.g. "Create new …") */
235
- .combobox-footer {
236
- padding: var(--space-2);
237
- border-top: 1px solid var(--color-border-subtle);
238
- flex-shrink: 0;
239
- }
240
- .combobox-footer-action {
241
- display: flex;
242
- align-items: center;
243
- justify-content: center;
244
- gap: var(--space-2);
245
- padding: var(--space-3) var(--space-4);
246
- margin: var(--space-2);
247
- margin-top: 0;
248
- width: calc(100% - var(--space-4));
249
- background: var(--color-background-surface);
250
- border: 1px solid var(--color-border-default);
251
- border-radius: var(--radius-sm);
252
- font-family: var(--font-sans);
253
- font-size: var(--fs-sm);
254
- font-weight: var(--w-semibold);
255
- color: var(--color-foreground-default);
256
- cursor: pointer;
257
- text-align: center;
258
- box-shadow: var(--shadow-xs);
259
- transition: var(--transition-fast);
260
- }
261
- .combobox-footer-action:hover {
262
- background: var(--color-background-hover);
263
- border-color: var(--color-border-strong);
264
- }
265
- .combobox-footer-action:active {
266
- background: var(--color-background-press);
267
- }
268
- .combobox-footer-action:focus-visible {
269
- outline: none;
270
- box-shadow: var(--shadow-focus);
271
- }
272
- .combobox-footer-action svg,
273
- .combobox-footer-action i {
274
- width: 14px;
275
- height: 14px;
276
- stroke-width: var(--icon-stroke);
277
- color: var(--color-foreground-secondary);
278
- }
279
- .combobox-footer-action i, .combobox-footer-action svg {
280
- width: 16px; height: 16px;
281
- stroke-width: var(--icon-stroke);
282
- }
283
-
284
- /* States */
285
- .combobox-trigger[aria-disabled="true"],
286
- .combobox.is-disabled .combobox-trigger {
287
- background: var(--color-background-subtle);
288
- color: var(--color-foreground-muted);
289
- cursor: not-allowed;
290
- border-color: var(--color-border-subtle);
291
- }
292
- .combobox.is-invalid .combobox-trigger {
293
- border-color: var(--color-feedback-danger-border);
294
- }
295
- .combobox.is-invalid .combobox-trigger:focus-visible {
296
- box-shadow: 0 0 0 3px var(--color-feedback-danger-background);
297
- }
298
-
299
-
300
- /* ----------------------------------------------------------------
301
- LISTING POPOVER EXTRAS — optional rows inside the popover:
302
- filter-chip row (below search), results meta (above list),
303
- foot meta (below list). Exposed via Combobox props
304
- `filters` / `meta` / `footMeta`.
305
- ---------------------------------------------------------------- */
306
- .combobox-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3); border-bottom: 1px solid var(--color-border-subtle); }
307
- .combobox-filter-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-family: var(--font-sans); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-secondary); cursor: pointer; transition: var(--transition-fast); }
308
- .combobox-filter-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); color: var(--color-foreground-default); }
309
- .combobox-filter-chip.is-active { background: var(--color-background-selected); border-color: var(--color-brand-secondary-200); color: var(--color-foreground-brand); font-weight: var(--w-semibold); }
310
- .combobox-filter-chip .count { font-family: var(--font-mono); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
311
- .combobox-filter-chip.is-active .count { color: var(--color-brand-secondary-600); }
312
- .combobox-meta { padding: var(--space-2) var(--space-3) var(--space-1); font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); border-bottom: 1px solid var(--color-border-subtle); }
313
- .combobox-foot-meta { padding: var(--space-2) var(--space-3); font-size: var(--fs-xs); color: var(--color-foreground-muted); border-top: 1px solid var(--color-border-subtle); }
314
-
315
- /* Reduced motion */
316
- @media (prefers-reduced-motion: reduce) {
317
- .combobox-chevron { transition: none; }
318
- .combobox-option { transition: none; }
319
- }
1
+ /* ============================================================
2
+ COMBOBOX — searchable single-select dropdown
3
+ Trigger + popover listbox with filterable options.
4
+ All values from tokens.
5
+ ============================================================ */
6
+
7
+ .combobox {
8
+ position: relative;
9
+ display: inline-block;
10
+ width: 100%;
11
+ font-family: var(--font-sans);
12
+ }
13
+
14
+ /* Trigger — looks like an input with a chevron */
15
+ .combobox-trigger {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: var(--space-3);
19
+ width: 100%;
20
+ height: 40px;
21
+ padding: 0 var(--space-3) 0 var(--space-4);
22
+ background: var(--color-background-surface);
23
+ border: 1px solid var(--color-border-default);
24
+ border-radius: var(--radius-sm);
25
+ font-family: var(--font-sans);
26
+ font-size: var(--fs-sm);
27
+ font-weight: var(--w-medium);
28
+ color: var(--color-foreground-default);
29
+ cursor: pointer;
30
+ text-align: left;
31
+ transition: var(--transition-fast);
32
+ }
33
+ .combobox-trigger:hover {
34
+ background: var(--color-background-hover);
35
+ border-color: var(--color-border-strong);
36
+ }
37
+ .combobox-trigger:focus-visible,
38
+ .combobox.is-open .combobox-trigger {
39
+ outline: none;
40
+ border-color: var(--color-foreground-accent);
41
+ box-shadow: var(--shadow-focus);
42
+ }
43
+
44
+ .combobox-value {
45
+ flex: 1;
46
+ min-width: 0;
47
+ white-space: nowrap;
48
+ overflow: hidden;
49
+ text-overflow: ellipsis;
50
+ }
51
+ .combobox-placeholder {
52
+ color: var(--color-foreground-muted);
53
+ font-weight: var(--w-regular);
54
+ }
55
+ .combobox-chevron {
56
+ width: 16px; height: 16px;
57
+ stroke-width: var(--icon-stroke);
58
+ color: var(--color-foreground-muted);
59
+ flex-shrink: 0;
60
+ transition: transform var(--duration-fast) var(--ease-standard);
61
+ }
62
+ .combobox.is-open .combobox-chevron { transform: rotate(180deg); }
63
+
64
+ /* Leading icon variant */
65
+ .combobox-trigger-icon {
66
+ width: 16px; height: 16px;
67
+ stroke-width: var(--icon-stroke);
68
+ color: var(--color-foreground-secondary);
69
+ flex-shrink: 0;
70
+ }
71
+
72
+ /* Avatar inside trigger (counterparty selector pattern) */
73
+ .combobox-avatar {
74
+ width: 24px; height: 24px;
75
+ border-radius: var(--radius-pill);
76
+ background: var(--color-brand-secondary-100);
77
+ color: var(--color-brand-secondary-700);
78
+ display: inline-flex; align-items: center; justify-content: center;
79
+ font-size: var(--fs-xxs);
80
+ font-weight: var(--w-semibold);
81
+ flex-shrink: 0;
82
+ margin-left: calc(var(--space-1) * -1);
83
+ }
84
+
85
+ /* Listbox popover */
86
+ .combobox-popover {
87
+ position: absolute;
88
+ top: calc(100% + var(--space-2));
89
+ left: 0;
90
+ right: 0;
91
+ z-index: 7000;
92
+ background: var(--color-background-surface);
93
+ border: 1px solid var(--color-border-default);
94
+ border-radius: var(--radius-md);
95
+ box-shadow: var(--shadow-xl);
96
+ display: none;
97
+ flex-direction: column;
98
+ max-height: 320px;
99
+ }
100
+ .combobox.is-open .combobox-popover { display: flex; }
101
+
102
+ /* Search header */
103
+ .combobox-search {
104
+ position: relative;
105
+ padding: var(--space-3);
106
+ border-bottom: 1px solid var(--color-border-subtle);
107
+ flex-shrink: 0;
108
+ }
109
+ .combobox-search input {
110
+ width: 100%;
111
+ box-sizing: border-box;
112
+ height: 32px;
113
+ padding: 0 var(--space-3) 0 var(--space-7);
114
+ background: var(--color-background-canvas);
115
+ border: 1px solid var(--color-border-default);
116
+ border-radius: var(--radius-xs);
117
+ font-family: var(--font-sans);
118
+ font-size: var(--fs-sm);
119
+ color: var(--color-foreground-default);
120
+ }
121
+ .combobox-search input::placeholder { color: var(--color-foreground-muted); }
122
+ .combobox-search input:focus {
123
+ outline: none;
124
+ border-color: var(--color-foreground-accent);
125
+ box-shadow: var(--shadow-focus);
126
+ }
127
+ .combobox-search-icon {
128
+ position: absolute;
129
+ left: calc(var(--space-3) + var(--space-2));
130
+ top: 50%;
131
+ transform: translateY(-50%);
132
+ width: 14px; height: 14px;
133
+ stroke-width: var(--icon-stroke);
134
+ color: var(--color-foreground-muted);
135
+ pointer-events: none;
136
+ }
137
+
138
+ /* Listbox region */
139
+ .combobox-list {
140
+ list-style: none;
141
+ margin: 0;
142
+ padding: var(--space-1);
143
+ overflow-y: auto;
144
+ flex: 1;
145
+ }
146
+
147
+ /* Group headers */
148
+ .combobox-group-label {
149
+ padding: var(--space-2) var(--space-3) var(--space-1);
150
+ font-family: var(--font-mono);
151
+ font-size: var(--fs-xxs);
152
+ font-weight: var(--w-semibold);
153
+ letter-spacing: var(--ls-caps);
154
+ text-transform: uppercase;
155
+ color: var(--color-foreground-muted);
156
+ }
157
+
158
+ .combobox-option {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: var(--space-3);
162
+ padding: var(--space-2) var(--space-3);
163
+ border-radius: var(--radius-xs);
164
+ cursor: pointer;
165
+ font-size: var(--fs-sm);
166
+ color: var(--color-foreground-default);
167
+ transition: background var(--duration-fast) var(--ease-standard);
168
+ }
169
+ .combobox-option:hover,
170
+ .combobox-option.is-active {
171
+ background: var(--color-background-hover);
172
+ }
173
+ .combobox-option.is-selected {
174
+ background: var(--color-background-selected);
175
+ color: var(--color-foreground-accent);
176
+ font-weight: var(--w-semibold);
177
+ }
178
+ .combobox-option.is-disabled {
179
+ opacity: 0.5;
180
+ cursor: not-allowed;
181
+ }
182
+
183
+ .combobox-option-content {
184
+ flex: 1;
185
+ min-width: 0;
186
+ }
187
+ .combobox-option-label {
188
+ display: block;
189
+ white-space: nowrap;
190
+ overflow: hidden;
191
+ text-overflow: ellipsis;
192
+ }
193
+ .combobox-option-meta {
194
+ display: block;
195
+ font-size: var(--fs-xs);
196
+ color: var(--color-foreground-secondary);
197
+ font-weight: var(--w-regular);
198
+ margin-top: 1px;
199
+ }
200
+ .combobox-option.is-selected .combobox-option-meta {
201
+ color: var(--color-brand-secondary-600);
202
+ }
203
+
204
+ .combobox-option-check {
205
+ width: 16px; height: 16px;
206
+ stroke-width: 2.4;
207
+ color: var(--color-foreground-accent);
208
+ flex-shrink: 0;
209
+ opacity: 0;
210
+ }
211
+ .combobox-option.is-selected .combobox-option-check { opacity: 1; }
212
+
213
+ .combobox-option-trailing {
214
+ font-family: var(--font-mono);
215
+ font-size: var(--fs-xxs);
216
+ color: var(--color-foreground-muted);
217
+ flex-shrink: 0;
218
+ }
219
+
220
+ /* Empty state */
221
+ .combobox-empty {
222
+ padding: var(--space-8) var(--space-4);
223
+ text-align: center;
224
+ color: var(--color-foreground-muted);
225
+ font-size: var(--fs-sm);
226
+ }
227
+ .combobox-empty strong {
228
+ display: block;
229
+ color: var(--color-foreground-default);
230
+ font-weight: var(--w-semibold);
231
+ margin-bottom: var(--space-1);
232
+ }
233
+
234
+ /* Footer (e.g. "Create new …") */
235
+ .combobox-footer {
236
+ padding: var(--space-2);
237
+ border-top: 1px solid var(--color-border-subtle);
238
+ flex-shrink: 0;
239
+ }
240
+ .combobox-footer-action {
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ gap: var(--space-2);
245
+ padding: var(--space-3) var(--space-4);
246
+ margin: var(--space-2);
247
+ margin-top: 0;
248
+ width: calc(100% - var(--space-4));
249
+ background: var(--color-background-surface);
250
+ border: 1px solid var(--color-border-default);
251
+ border-radius: var(--radius-sm);
252
+ font-family: var(--font-sans);
253
+ font-size: var(--fs-sm);
254
+ font-weight: var(--w-semibold);
255
+ color: var(--color-foreground-default);
256
+ cursor: pointer;
257
+ text-align: center;
258
+ box-shadow: var(--shadow-xs);
259
+ transition: var(--transition-fast);
260
+ }
261
+ .combobox-footer-action:hover {
262
+ background: var(--color-background-hover);
263
+ border-color: var(--color-border-strong);
264
+ }
265
+ .combobox-footer-action:active {
266
+ background: var(--color-background-press);
267
+ }
268
+ .combobox-footer-action:focus-visible {
269
+ outline: none;
270
+ box-shadow: var(--shadow-focus);
271
+ }
272
+ .combobox-footer-action svg,
273
+ .combobox-footer-action i {
274
+ width: 14px;
275
+ height: 14px;
276
+ stroke-width: var(--icon-stroke);
277
+ color: var(--color-foreground-secondary);
278
+ }
279
+ .combobox-footer-action i, .combobox-footer-action svg {
280
+ width: 16px; height: 16px;
281
+ stroke-width: var(--icon-stroke);
282
+ }
283
+
284
+ /* States */
285
+ .combobox-trigger[aria-disabled="true"],
286
+ .combobox.is-disabled .combobox-trigger {
287
+ background: var(--color-background-subtle);
288
+ color: var(--color-foreground-muted);
289
+ cursor: not-allowed;
290
+ border-color: var(--color-border-subtle);
291
+ }
292
+ .combobox.is-invalid .combobox-trigger {
293
+ border-color: var(--color-feedback-danger-border);
294
+ }
295
+ .combobox.is-invalid .combobox-trigger:focus-visible {
296
+ box-shadow: 0 0 0 3px var(--color-feedback-danger-background);
297
+ }
298
+
299
+
300
+ /* ----------------------------------------------------------------
301
+ LISTING POPOVER EXTRAS — optional rows inside the popover:
302
+ filter-chip row (below search), results meta (above list),
303
+ foot meta (below list). Exposed via Combobox props
304
+ `filters` / `meta` / `footMeta`.
305
+ ---------------------------------------------------------------- */
306
+ .combobox-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3); border-bottom: 1px solid var(--color-border-subtle); }
307
+ .combobox-filter-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-family: var(--font-sans); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-secondary); cursor: pointer; transition: var(--transition-fast); }
308
+ .combobox-filter-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); color: var(--color-foreground-default); }
309
+ .combobox-filter-chip.is-active { background: var(--color-background-selected); border-color: var(--color-brand-secondary-200); color: var(--color-foreground-brand); font-weight: var(--w-semibold); }
310
+ .combobox-filter-chip .count { font-family: var(--font-mono); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
311
+ .combobox-filter-chip.is-active .count { color: var(--color-brand-secondary-600); }
312
+ .combobox-meta { padding: var(--space-2) var(--space-3) var(--space-1); font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); border-bottom: 1px solid var(--color-border-subtle); }
313
+ .combobox-foot-meta { padding: var(--space-2) var(--space-3); font-size: var(--fs-xs); color: var(--color-foreground-muted); border-top: 1px solid var(--color-border-subtle); }
314
+
315
+ /* Reduced motion */
316
+ @media (prefers-reduced-motion: reduce) {
317
+ .combobox-chevron { transition: none; }
318
+ .combobox-option { transition: none; }
319
+ }