@digiko-npm/designsystem 0.7.2 → 0.8.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 (58) hide show
  1. package/dist/designsystem.css +8334 -4728
  2. package/dist/designsystem.min.css +2 -2
  3. package/package.json +18 -3
  4. package/src/components/accordion.css +129 -128
  5. package/src/components/alert.css +137 -134
  6. package/src/components/avatar.css +77 -77
  7. package/src/components/badge.css +52 -52
  8. package/src/components/bottom-nav.css +71 -71
  9. package/src/components/bottom-sheet.css +146 -0
  10. package/src/components/breadcrumb.css +61 -61
  11. package/src/components/button.css +162 -154
  12. package/src/components/card.css +94 -72
  13. package/src/components/chip.css +38 -38
  14. package/src/components/collapsible.css +96 -100
  15. package/src/components/color-picker.css +82 -0
  16. package/src/components/combobox.css +418 -0
  17. package/src/components/command.css +141 -140
  18. package/src/components/copy-button.css +106 -0
  19. package/src/components/datepicker.css +257 -251
  20. package/src/components/description-list.css +89 -87
  21. package/src/components/divider.css +45 -45
  22. package/src/components/drawer.css +185 -174
  23. package/src/components/drop-zone.css +85 -84
  24. package/src/components/dropdown.css +148 -140
  25. package/src/components/empty-state.css +50 -50
  26. package/src/components/field.css +35 -0
  27. package/src/components/gallery.css +257 -0
  28. package/src/components/icon-btn.css +2 -1
  29. package/src/components/index.css +14 -3
  30. package/src/components/input.css +205 -146
  31. package/src/components/kbd.css +10 -10
  32. package/src/components/modal.css +92 -90
  33. package/src/components/nav.css +140 -138
  34. package/src/components/number-input.css +163 -0
  35. package/src/components/pagination.css +153 -139
  36. package/src/components/pin-input.css +136 -0
  37. package/src/components/popover.css +72 -72
  38. package/src/components/progress.css +128 -129
  39. package/src/components/result.css +53 -57
  40. package/src/components/scroll-area.css +73 -0
  41. package/src/components/search.css +10 -4
  42. package/src/components/segmented-control.css +93 -0
  43. package/src/components/skeleton.css +58 -58
  44. package/src/components/slider.css +102 -100
  45. package/src/components/sortable.css +44 -45
  46. package/src/components/spinner.css +27 -27
  47. package/src/components/star-rating.css +121 -0
  48. package/src/components/stat-card.css +38 -25
  49. package/src/components/table.css +288 -3
  50. package/src/components/tabs.css +121 -121
  51. package/src/components/tag.css +124 -124
  52. package/src/components/timeline.css +99 -99
  53. package/src/components/toast.css +37 -38
  54. package/src/components/toggle.css +88 -88
  55. package/src/components/toolbar.css +137 -121
  56. package/src/components/tooltip.css +150 -150
  57. package/src/components/truncated-text.css +75 -0
  58. package/src/tokens/tokens.json +413 -0
@@ -0,0 +1,418 @@
1
+ /* ==========================================================================
2
+ Component: Combobox
3
+ Text input with filterable dropdown results. Supports single-select,
4
+ multi-select (with tags), inline creation, and keyboard navigation.
5
+ Distinct from ds-custom-select (click-to-open, fixed options).
6
+
7
+ ARIA requirements (consumer responsibility):
8
+ - Input: role="combobox", aria-expanded="true|false",
9
+ aria-controls="[listbox-id]", aria-autocomplete="list"
10
+ - Listbox: role="listbox", id matching aria-controls
11
+ - Options: role="option", aria-selected="true|false"
12
+ - Active option: aria-activedescendant="[option-id]" on input
13
+ - Multi-select: aria-multiselectable="true" on listbox
14
+ - Keyboard: ArrowUp/Down navigate, Enter selects, Escape closes
15
+ - Clear button: aria-label="Clear"
16
+
17
+ Usage:
18
+ <div class="ds-combobox">
19
+ <input class="ds-combobox__input" role="combobox" placeholder="Search..." />
20
+ <div class="ds-combobox__listbox ds-combobox__listbox--open">
21
+ <div class="ds-combobox__option ds-combobox__option--active">Option 1</div>
22
+ <div class="ds-combobox__option ds-combobox__option--selected">Option 2</div>
23
+ </div>
24
+ </div>
25
+
26
+ Modifiers:
27
+ .ds-combobox--open — Listbox visible
28
+ .ds-combobox--multi — Multi-select with tags in input area
29
+ .ds-combobox--error — Error state (red border)
30
+ .ds-combobox--xs/--sm/--lg — Size variants
31
+ ========================================================================== */
32
+
33
+ /* --- Container --- */
34
+ .ds-combobox {
35
+ position: relative;
36
+ width: 100%;
37
+ }
38
+
39
+ /* --- Input area --- */
40
+ .ds-combobox__input-area {
41
+ display: flex;
42
+ align-items: center;
43
+ gap: var(--ds-space-1);
44
+ width: 100%;
45
+ min-height: var(--ds-size-3);
46
+ padding: 0 var(--ds-space-3);
47
+ background-color: var(--ds-color-surface);
48
+ border: 1px solid var(--ds-color-border);
49
+ border-radius: var(--ds-radius-lg);
50
+ transition:
51
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
52
+ box-shadow var(--ds-duration-fast) var(--ds-ease-default);
53
+ }
54
+
55
+ .ds-combobox__input-area:hover {
56
+ border-color: var(--ds-color-border-hover);
57
+ }
58
+
59
+ .ds-combobox__input-area:focus-within {
60
+ border-color: var(--ds-color-border-active);
61
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
62
+ }
63
+
64
+ /* --- Text input --- */
65
+ .ds-combobox__input {
66
+ flex: 1;
67
+ min-width: 4rem;
68
+ height: 100%;
69
+ padding: 0;
70
+ border: none;
71
+ outline: none;
72
+ background: transparent;
73
+ color: var(--ds-color-text);
74
+ font-family: var(--ds-font-sans);
75
+ font-size: var(--ds-text-base);
76
+ line-height: var(--ds-leading-normal);
77
+ }
78
+
79
+ .ds-combobox__input::placeholder {
80
+ color: var(--ds-color-text-tertiary);
81
+ }
82
+
83
+ /* Stand-alone input (no input-area wrapper) */
84
+ input.ds-combobox__input {
85
+ width: 100%;
86
+ min-height: var(--ds-size-3);
87
+ padding: 0 var(--ds-space-3);
88
+ background-color: var(--ds-color-surface);
89
+ border: 1px solid var(--ds-color-border);
90
+ border-radius: var(--ds-radius-lg);
91
+ transition:
92
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
93
+ box-shadow var(--ds-duration-fast) var(--ds-ease-default);
94
+ }
95
+
96
+ input.ds-combobox__input:hover {
97
+ border-color: var(--ds-color-border-hover);
98
+ }
99
+
100
+ input.ds-combobox__input:focus {
101
+ border-color: var(--ds-color-border-active);
102
+ outline: none;
103
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
104
+ scroll-margin-block: var(--ds-space-16, 4rem);
105
+ }
106
+
107
+ /* --- Icon (prefix) --- */
108
+ .ds-combobox__icon {
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ flex-shrink: 0;
113
+ color: var(--ds-color-text-tertiary);
114
+ }
115
+
116
+ /* --- Clear button --- */
117
+ .ds-combobox__clear {
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ flex-shrink: 0;
122
+ width: 1.25rem;
123
+ height: 1.25rem;
124
+ min-width: 1.5rem;
125
+ min-height: 1.5rem;
126
+ padding: 0;
127
+ border: none;
128
+ border-radius: var(--ds-radius-sm);
129
+ background: transparent;
130
+ color: var(--ds-color-text-tertiary);
131
+ cursor: pointer;
132
+ transition:
133
+ color var(--ds-duration-fast) var(--ds-ease-default),
134
+ background-color var(--ds-duration-fast) var(--ds-ease-default);
135
+ }
136
+
137
+ .ds-combobox__clear:hover {
138
+ background: var(--ds-color-surface-hover);
139
+ color: var(--ds-color-text-secondary);
140
+ }
141
+
142
+ /* --- Listbox (dropdown) --- */
143
+ .ds-combobox__listbox {
144
+ position: absolute;
145
+ inset-inline-start: 0;
146
+ inset-inline-end: 0;
147
+ inset-block-start: calc(100% + var(--ds-offset-sm));
148
+ z-index: var(--ds-z-dropdown);
149
+ max-height: 16rem;
150
+ overflow-y: auto;
151
+ overscroll-behavior: contain;
152
+ background-color: var(--ds-color-surface);
153
+ border: 1px solid var(--ds-color-border);
154
+ border-radius: var(--ds-radius-xl);
155
+ box-shadow: var(--ds-shadow-lg);
156
+ padding-block: var(--ds-space-1);
157
+
158
+ /* Hidden by default */
159
+ display: none;
160
+
161
+ /* Animation */
162
+ opacity: 0;
163
+ transform: translateY(-4px) scale(0.98);
164
+ transform-origin: top center;
165
+ }
166
+
167
+ .ds-combobox__listbox--open {
168
+ display: block;
169
+ animation: ds-combobox-in var(--ds-duration-fast) var(--ds-ease-out-expo) forwards;
170
+ }
171
+
172
+ @keyframes ds-combobox-in {
173
+ to {
174
+ opacity: 1;
175
+ transform: translateY(0) scale(1);
176
+ }
177
+ }
178
+
179
+ /* --- Option group --- */
180
+ .ds-combobox__group {
181
+ padding-block: var(--ds-space-1);
182
+ }
183
+
184
+ .ds-combobox__group + .ds-combobox__group {
185
+ border-block-start: 1px solid var(--ds-color-border-subtle);
186
+ }
187
+
188
+ .ds-combobox__group-label {
189
+ display: block;
190
+ padding: var(--ds-space-1) var(--ds-space-3);
191
+ font-size: var(--ds-text-2xs);
192
+ font-weight: var(--ds-weight-medium);
193
+ color: var(--ds-color-text-tertiary);
194
+ text-transform: uppercase;
195
+ letter-spacing: var(--ds-tracking-wide);
196
+ }
197
+
198
+ /* --- Option --- */
199
+ .ds-combobox__option {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: var(--ds-space-2);
203
+ width: 100%;
204
+ padding: var(--ds-space-2) var(--ds-space-3);
205
+ margin-inline: var(--ds-space-1);
206
+ width: calc(100% - var(--ds-space-2));
207
+ font-size: var(--ds-text-sm);
208
+ color: var(--ds-color-text-secondary);
209
+ cursor: pointer;
210
+ border: none;
211
+ background: transparent;
212
+ text-align: start;
213
+ font-family: inherit;
214
+ border-radius: var(--ds-radius-md);
215
+ transition:
216
+ color var(--ds-duration-fast) var(--ds-ease-default),
217
+ background-color var(--ds-duration-fast) var(--ds-ease-default);
218
+ }
219
+
220
+ .ds-combobox__option:hover,
221
+ .ds-combobox__option--active {
222
+ background-color: var(--ds-color-bg-elevated);
223
+ color: var(--ds-color-text);
224
+ }
225
+
226
+ .ds-combobox__option:focus-visible {
227
+ outline: none;
228
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
229
+ scroll-margin-block: var(--ds-space-16, 4rem);
230
+ }
231
+
232
+ .ds-combobox__option--selected {
233
+ color: var(--ds-color-text);
234
+ font-weight: var(--ds-weight-medium);
235
+ }
236
+
237
+ /* Check indicator */
238
+ .ds-combobox__option-check {
239
+ flex-shrink: 0;
240
+ width: 1rem;
241
+ height: 1rem;
242
+ color: var(--ds-color-interactive);
243
+ margin-inline-start: auto;
244
+ }
245
+
246
+ /* Option description (secondary text) */
247
+ .ds-combobox__option-desc {
248
+ font-size: var(--ds-text-xs);
249
+ color: var(--ds-color-text-tertiary);
250
+ line-height: var(--ds-leading-snug);
251
+ }
252
+
253
+ /* --- Create new option --- */
254
+ .ds-combobox__create {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: var(--ds-space-2);
258
+ padding: var(--ds-space-2) var(--ds-space-3);
259
+ margin-inline: var(--ds-space-1);
260
+ width: calc(100% - var(--ds-space-2));
261
+ font-size: var(--ds-text-sm);
262
+ color: var(--ds-color-interactive);
263
+ font-weight: var(--ds-weight-medium);
264
+ cursor: pointer;
265
+ border: none;
266
+ background: transparent;
267
+ text-align: start;
268
+ font-family: inherit;
269
+ border-radius: var(--ds-radius-md);
270
+ border-block-start: 1px solid var(--ds-color-border-subtle);
271
+ transition: background-color var(--ds-duration-fast) var(--ds-ease-default);
272
+ }
273
+
274
+ .ds-combobox__create:hover,
275
+ .ds-combobox__create:focus-visible {
276
+ background-color: var(--ds-color-bg-elevated);
277
+ }
278
+
279
+ /* --- Empty state --- */
280
+ .ds-combobox__empty {
281
+ display: flex;
282
+ align-items: center;
283
+ justify-content: center;
284
+ padding: var(--ds-space-4) var(--ds-space-3);
285
+ font-size: var(--ds-text-sm);
286
+ color: var(--ds-color-text-tertiary);
287
+ }
288
+
289
+ /* --- Loading state --- */
290
+ .ds-combobox__loading {
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ gap: var(--ds-space-2);
295
+ padding: var(--ds-space-4) var(--ds-space-3);
296
+ font-size: var(--ds-text-sm);
297
+ color: var(--ds-color-text-tertiary);
298
+ }
299
+
300
+ /* ==========================================================================
301
+ Multi-select mode
302
+ ========================================================================== */
303
+
304
+ .ds-combobox--multi .ds-combobox__input-area {
305
+ flex-wrap: wrap;
306
+ padding: var(--ds-space-1) var(--ds-space-2);
307
+ gap: var(--ds-space-1);
308
+ height: auto;
309
+ }
310
+
311
+ /* Tags inside multi input */
312
+ .ds-combobox__tag {
313
+ display: inline-flex;
314
+ align-items: center;
315
+ gap: var(--ds-space-1);
316
+ padding: var(--ds-space-0-5) var(--ds-space-1) var(--ds-space-0-5) var(--ds-space-2);
317
+ font-size: var(--ds-text-xs);
318
+ font-weight: var(--ds-weight-medium);
319
+ font-family: var(--ds-font-sans);
320
+ line-height: var(--ds-leading-none);
321
+ border-radius: var(--ds-radius-full);
322
+ background-color: var(--ds-color-bg-elevated);
323
+ border: 1px solid var(--ds-color-border);
324
+ color: var(--ds-color-text-secondary);
325
+ white-space: nowrap;
326
+ }
327
+
328
+ .ds-combobox__tag-remove {
329
+ display: inline-flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ width: 1rem;
333
+ height: 1rem;
334
+ min-width: 1.5rem;
335
+ min-height: 1.5rem;
336
+ padding: 0;
337
+ border: none;
338
+ border-radius: var(--ds-radius-full);
339
+ background: transparent;
340
+ color: currentColor;
341
+ opacity: 0.6;
342
+ cursor: pointer;
343
+ transition: opacity var(--ds-duration-fast) var(--ds-ease-out);
344
+ -webkit-appearance: none;
345
+ appearance: none;
346
+ }
347
+
348
+ .ds-combobox__tag-remove:hover {
349
+ opacity: 1;
350
+ }
351
+
352
+ /* ==========================================================================
353
+ Size variants
354
+ ========================================================================== */
355
+
356
+ /* XS */
357
+ .ds-combobox--xs .ds-combobox__input-area,
358
+ .ds-combobox--xs input.ds-combobox__input {
359
+ min-height: var(--ds-size-1);
360
+ padding: 0 var(--ds-space-2);
361
+ border-radius: var(--ds-radius-md);
362
+ }
363
+
364
+ .ds-combobox--xs .ds-combobox__input,
365
+ .ds-combobox--xs input.ds-combobox__input {
366
+ font-size: var(--ds-text-xs);
367
+ }
368
+
369
+ /* SM */
370
+ .ds-combobox--sm .ds-combobox__input-area,
371
+ .ds-combobox--sm input.ds-combobox__input {
372
+ min-height: var(--ds-size-2);
373
+ padding: 0 var(--ds-space-2-5);
374
+ border-radius: var(--ds-radius-md);
375
+ }
376
+
377
+ .ds-combobox--sm .ds-combobox__input,
378
+ .ds-combobox--sm input.ds-combobox__input {
379
+ font-size: var(--ds-text-sm);
380
+ }
381
+
382
+ /* LG */
383
+ .ds-combobox--lg .ds-combobox__input-area,
384
+ .ds-combobox--lg input.ds-combobox__input {
385
+ min-height: var(--ds-size-4);
386
+ padding: 0 var(--ds-space-4);
387
+ }
388
+
389
+ .ds-combobox--lg .ds-combobox__input,
390
+ .ds-combobox--lg input.ds-combobox__input {
391
+ font-size: var(--ds-text-lg);
392
+ }
393
+
394
+ /* ==========================================================================
395
+ Error state
396
+ ========================================================================== */
397
+
398
+ .ds-combobox--error .ds-combobox__input-area,
399
+ .ds-combobox--error input.ds-combobox__input {
400
+ border-color: var(--ds-color-error);
401
+ }
402
+
403
+ .ds-combobox--error .ds-combobox__input-area:focus-within,
404
+ .ds-combobox--error input.ds-combobox__input:focus {
405
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-error);
406
+ }
407
+
408
+ /* ==========================================================================
409
+ Reduced motion
410
+ ========================================================================== */
411
+
412
+ @media (prefers-reduced-motion: reduce) {
413
+ .ds-combobox__listbox--open {
414
+ animation: none;
415
+ opacity: 1;
416
+ transform: none;
417
+ }
418
+ }
@@ -40,8 +40,8 @@
40
40
  .ds-command--open — Shows the command palette
41
41
  ========================================================================== */
42
42
 
43
- /* Overlay */
44
43
  .ds-command {
44
+ /* Overlay */
45
45
  position: fixed;
46
46
  inset: 0;
47
47
  z-index: var(--ds-z-modal);
@@ -55,144 +55,145 @@
55
55
  transition:
56
56
  opacity var(--ds-duration-fast) var(--ds-ease),
57
57
  visibility var(--ds-duration-fast) var(--ds-ease);
58
- }
59
-
60
- /* Open state */
61
- .ds-command--open {
62
- opacity: 1;
63
- visibility: visible;
64
- }
65
-
66
- /* Content panel */
67
- .ds-command__content {
68
- background-color: var(--ds-color-surface);
69
- border: 1px solid var(--ds-color-border);
70
- border-radius: var(--ds-radius-xl);
71
- box-shadow: var(--ds-shadow-lg);
72
- width: 100%;
73
- max-width: 32rem;
74
- overflow: hidden;
75
- transform: scale(0.96) translateY(-8px);
76
- transition:
77
- transform var(--ds-duration-fast) var(--ds-ease-out-expo);
78
- }
79
-
80
- .ds-command--open .ds-command__content {
81
- transform: scale(1) translateY(0);
82
- }
83
-
84
- /* Input wrapper */
85
- .ds-command__input-wrapper {
86
- display: flex;
87
- align-items: center;
88
- gap: var(--ds-space-3);
89
- padding: var(--ds-space-3) var(--ds-space-4);
90
- border-block-end: 1px solid var(--ds-color-border);
91
- }
92
-
93
- /* Search icon */
94
- .ds-command__input-icon {
95
- color: var(--ds-color-text-tertiary);
96
- flex-shrink: 0;
97
- }
98
-
99
- /* Search input */
100
- .ds-command__input {
101
- flex: 1;
102
- background-color: transparent;
103
- border: none;
104
- outline: none;
105
- font-size: var(--ds-text-base);
106
- color: var(--ds-color-text);
107
- font-family: var(--ds-font-sans);
108
- }
109
58
 
110
- .ds-command__input::placeholder {
111
- color: var(--ds-color-text-tertiary);
112
- }
113
-
114
- /* Results list */
115
- .ds-command__list {
116
- max-height: 20rem;
117
- overflow-y: auto;
118
- padding: var(--ds-space-2);
119
- }
120
-
121
- /* Group of results */
122
- .ds-command__group {
123
- /* structural grouping — no additional visual styles needed */
124
- }
125
-
126
- /* Group heading */
127
- .ds-command__group-heading {
128
- font-size: var(--ds-text-xs);
129
- text-transform: uppercase;
130
- letter-spacing: var(--ds-tracking-wide);
131
- color: var(--ds-color-text-tertiary);
132
- padding: var(--ds-space-2) var(--ds-space-3);
133
- font-weight: var(--ds-weight-medium);
134
- }
135
-
136
- /* Individual item */
137
- .ds-command__item {
138
- display: flex;
139
- align-items: center;
140
- gap: var(--ds-space-3);
141
- padding: var(--ds-space-2-5) var(--ds-space-3);
142
- border-radius: var(--ds-radius-lg);
143
- cursor: pointer;
144
- font-size: var(--ds-text-sm);
145
- color: var(--ds-color-text-secondary);
146
- transition:
147
- background-color var(--ds-duration-fast) var(--ds-ease),
148
- color var(--ds-duration-fast) var(--ds-ease);
149
- }
150
-
151
- /* Item hover & active states */
152
- .ds-command__item:hover,
153
- .ds-command__item--active {
154
- background-color: var(--ds-color-bg-elevated);
155
- color: var(--ds-color-text);
156
- }
157
- .ds-command__item:focus-visible {
158
- outline: none;
159
- box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
160
- scroll-margin-block: var(--ds-space-16, 4rem);
161
- }
162
-
163
- /* Item icon */
164
- .ds-command__item-icon {
165
- flex-shrink: 0;
166
- color: var(--ds-color-text-tertiary);
167
- }
168
-
169
- /* Item label */
170
- .ds-command__item-label {
171
- flex: 1;
172
- }
173
-
174
- /* Item shortcut hint */
175
- .ds-command__item-shortcut {
176
- font-size: var(--ds-text-xs);
177
- color: var(--ds-color-text-tertiary);
178
- flex-shrink: 0;
179
- }
180
-
181
- /* Empty state */
182
- .ds-command__empty {
183
- padding: var(--ds-space-8);
184
- text-align: center;
185
- font-size: var(--ds-text-sm);
186
- color: var(--ds-color-text-tertiary);
187
- }
188
-
189
- /* Footer */
190
- .ds-command__footer {
191
- display: flex;
192
- align-items: center;
193
- gap: var(--ds-space-4);
194
- padding: var(--ds-space-2) var(--ds-space-3);
195
- border-block-start: 1px solid var(--ds-color-border);
196
- font-size: var(--ds-text-xs);
197
- color: var(--ds-color-text-tertiary);
59
+ /* Open state */
60
+ &--open {
61
+ opacity: 1;
62
+ visibility: visible;
63
+
64
+ & .ds-command__content {
65
+ transform: scale(1) translateY(0);
66
+ }
67
+ }
68
+
69
+ /* Content panel */
70
+ &__content {
71
+ background-color: var(--ds-color-surface);
72
+ border: 1px solid var(--ds-color-border);
73
+ border-radius: var(--ds-radius-xl);
74
+ box-shadow: var(--ds-shadow-lg);
75
+ width: 100%;
76
+ max-width: 32rem;
77
+ overflow: hidden;
78
+ transform: scale(0.96) translateY(-8px);
79
+ transition:
80
+ transform var(--ds-duration-fast) var(--ds-ease-out-expo);
81
+ }
82
+
83
+ /* Input wrapper */
84
+ &__input-wrapper {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: var(--ds-space-3);
88
+ padding: var(--ds-space-3) var(--ds-space-4);
89
+ border-block-end: 1px solid var(--ds-color-border);
90
+ }
91
+
92
+ /* Search icon */
93
+ &__input-icon {
94
+ color: var(--ds-color-text-tertiary);
95
+ flex-shrink: 0;
96
+ }
97
+
98
+ /* Search input */
99
+ &__input {
100
+ flex: 1;
101
+ background-color: transparent;
102
+ border: none;
103
+ outline: none;
104
+ font-size: var(--ds-text-base);
105
+ color: var(--ds-color-text);
106
+ font-family: var(--ds-font-sans);
107
+
108
+ &::placeholder {
109
+ color: var(--ds-color-text-tertiary);
110
+ }
111
+ }
112
+
113
+ /* Results list */
114
+ &__list {
115
+ max-height: 20rem;
116
+ overflow-y: auto;
117
+ padding: var(--ds-space-2);
118
+ }
119
+
120
+ /* Group of results */
121
+ &__group {
122
+ /* structural grouping — no additional visual styles needed */
123
+ }
124
+
125
+ /* Group heading */
126
+ &__group-heading {
127
+ font-size: var(--ds-text-xs);
128
+ text-transform: uppercase;
129
+ letter-spacing: var(--ds-tracking-wide);
130
+ color: var(--ds-color-text-tertiary);
131
+ padding: var(--ds-space-2) var(--ds-space-3);
132
+ font-weight: var(--ds-weight-medium);
133
+ }
134
+
135
+ /* Individual item */
136
+ &__item {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: var(--ds-space-3);
140
+ padding: var(--ds-space-2-5) var(--ds-space-3);
141
+ border-radius: var(--ds-radius-lg);
142
+ cursor: pointer;
143
+ font-size: var(--ds-text-sm);
144
+ color: var(--ds-color-text-secondary);
145
+ transition:
146
+ background-color var(--ds-duration-fast) var(--ds-ease),
147
+ color var(--ds-duration-fast) var(--ds-ease);
148
+
149
+ /* Item hover & active states */
150
+ &:hover,
151
+ &--active {
152
+ background-color: var(--ds-color-bg-elevated);
153
+ color: var(--ds-color-text);
154
+ }
155
+
156
+ &:focus-visible {
157
+ outline: none;
158
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
159
+ scroll-margin-block: var(--ds-space-16, 4rem);
160
+ }
161
+ }
162
+
163
+ /* Item icon */
164
+ &__item-icon {
165
+ flex-shrink: 0;
166
+ color: var(--ds-color-text-tertiary);
167
+ }
168
+
169
+ /* Item label */
170
+ &__item-label {
171
+ flex: 1;
172
+ }
173
+
174
+ /* Item shortcut hint */
175
+ &__item-shortcut {
176
+ font-size: var(--ds-text-xs);
177
+ color: var(--ds-color-text-tertiary);
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ /* Empty state */
182
+ &__empty {
183
+ padding: var(--ds-space-8);
184
+ text-align: center;
185
+ font-size: var(--ds-text-sm);
186
+ color: var(--ds-color-text-tertiary);
187
+ }
188
+
189
+ /* Footer */
190
+ &__footer {
191
+ display: flex;
192
+ align-items: center;
193
+ gap: var(--ds-space-4);
194
+ padding: var(--ds-space-2) var(--ds-space-3);
195
+ border-block-start: 1px solid var(--ds-color-border);
196
+ font-size: var(--ds-text-xs);
197
+ color: var(--ds-color-text-tertiary);
198
+ }
198
199
  }