@adamarant/designsystem 0.11.2

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 (84) hide show
  1. package/README.md +101 -0
  2. package/dist/designsystem.css +13494 -0
  3. package/dist/designsystem.js +67 -0
  4. package/dist/designsystem.min.css +2 -0
  5. package/package.json +111 -0
  6. package/src/base/index.css +2 -0
  7. package/src/base/reset.css +119 -0
  8. package/src/base/typography.css +172 -0
  9. package/src/components/accordion.css +166 -0
  10. package/src/components/admin-layout.css +371 -0
  11. package/src/components/alert.css +159 -0
  12. package/src/components/avatar.css +109 -0
  13. package/src/components/badge.css +80 -0
  14. package/src/components/bottom-nav.css +125 -0
  15. package/src/components/bottom-sheet.css +146 -0
  16. package/src/components/breadcrumb.css +102 -0
  17. package/src/components/button.css +250 -0
  18. package/src/components/card.css +117 -0
  19. package/src/components/chip.css +79 -0
  20. package/src/components/collapsible.css +112 -0
  21. package/src/components/color-picker.css +82 -0
  22. package/src/components/combobox.css +420 -0
  23. package/src/components/command.css +210 -0
  24. package/src/components/context-menu.css +162 -0
  25. package/src/components/copy-button.css +106 -0
  26. package/src/components/custom-select.css +446 -0
  27. package/src/components/datepicker.css +301 -0
  28. package/src/components/description-list.css +100 -0
  29. package/src/components/divider.css +66 -0
  30. package/src/components/drawer.css +234 -0
  31. package/src/components/drop-zone.css +166 -0
  32. package/src/components/dropdown.css +169 -0
  33. package/src/components/empty-state.css +75 -0
  34. package/src/components/field.css +112 -0
  35. package/src/components/gallery.css +257 -0
  36. package/src/components/hero.css +111 -0
  37. package/src/components/icon-btn.css +103 -0
  38. package/src/components/index.css +74 -0
  39. package/src/components/input.css +311 -0
  40. package/src/components/kbd.css +54 -0
  41. package/src/components/media-library.css +230 -0
  42. package/src/components/modal.css +136 -0
  43. package/src/components/nav.css +198 -0
  44. package/src/components/number-input.css +163 -0
  45. package/src/components/pagination.css +175 -0
  46. package/src/components/pin-input.css +136 -0
  47. package/src/components/popover.css +111 -0
  48. package/src/components/progress.css +217 -0
  49. package/src/components/prose.css +337 -0
  50. package/src/components/result.css +80 -0
  51. package/src/components/scroll-area.css +73 -0
  52. package/src/components/search.css +311 -0
  53. package/src/components/segmented-control.css +94 -0
  54. package/src/components/skeleton.css +100 -0
  55. package/src/components/slider.css +133 -0
  56. package/src/components/sortable.css +70 -0
  57. package/src/components/spinner.css +60 -0
  58. package/src/components/star-rating.css +121 -0
  59. package/src/components/stat-card.css +44 -0
  60. package/src/components/table.css +359 -0
  61. package/src/components/tabs.css +215 -0
  62. package/src/components/tag.css +188 -0
  63. package/src/components/timeline.css +130 -0
  64. package/src/components/toast.css +90 -0
  65. package/src/components/toggle.css +173 -0
  66. package/src/components/toolbar.css +206 -0
  67. package/src/components/tooltip.css +167 -0
  68. package/src/components/truncated-text.css +75 -0
  69. package/src/index.css +21 -0
  70. package/src/js/theme.js +67 -0
  71. package/src/tokens/colors.css +256 -0
  72. package/src/tokens/index.css +11 -0
  73. package/src/tokens/shadows.css +55 -0
  74. package/src/tokens/spacing.css +82 -0
  75. package/src/tokens/tokens.json +413 -0
  76. package/src/tokens/typography.css +90 -0
  77. package/src/utilities/a11y.css +102 -0
  78. package/src/utilities/index.css +7 -0
  79. package/src/utilities/interactive.css +121 -0
  80. package/src/utilities/layout.css +273 -0
  81. package/src/utilities/sizing.css +85 -0
  82. package/src/utilities/spacing.css +204 -0
  83. package/src/utilities/states.css +182 -0
  84. package/src/utilities/text.css +381 -0
@@ -0,0 +1,420 @@
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
+ .ds-combobox > .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
+ .ds-combobox > .ds-combobox__input:hover {
97
+ border-color: var(--ds-color-border-hover);
98
+ }
99
+
100
+ .ds-combobox > .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-muted);
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
+ background-color: var(--ds-color-surface-hover);
222
+ color: var(--ds-color-text);
223
+ }
224
+
225
+ .ds-combobox__option--active,
226
+ .ds-combobox__option--active:hover {
227
+ background-color: var(--ds-color-surface-elevated);
228
+ color: var(--ds-color-text);
229
+ }
230
+
231
+ .ds-combobox__option:focus-visible {
232
+ outline: none;
233
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
234
+ scroll-margin-block: var(--ds-space-16, 4rem);
235
+ }
236
+
237
+ .ds-combobox__option--selected {
238
+ color: var(--ds-color-text);
239
+ font-weight: var(--ds-weight-medium);
240
+ }
241
+
242
+ /* Check indicator */
243
+ .ds-combobox__option-check {
244
+ flex-shrink: 0;
245
+ width: 1rem;
246
+ height: 1rem;
247
+ color: var(--ds-color-interactive);
248
+ margin-inline-start: auto;
249
+ }
250
+
251
+ /* Option description (secondary text) */
252
+ .ds-combobox__option-desc {
253
+ font-size: var(--ds-text-xs);
254
+ color: var(--ds-color-text-tertiary);
255
+ line-height: var(--ds-leading-snug);
256
+ }
257
+
258
+ /* --- Create new option --- */
259
+ .ds-combobox__create {
260
+ display: flex;
261
+ align-items: center;
262
+ gap: var(--ds-space-2);
263
+ padding: var(--ds-space-2) var(--ds-space-3);
264
+ margin-inline: var(--ds-space-1);
265
+ width: calc(100% - var(--ds-space-2));
266
+ font-size: var(--ds-text-sm);
267
+ color: var(--ds-color-interactive);
268
+ font-weight: var(--ds-weight-medium);
269
+ cursor: pointer;
270
+ border: none;
271
+ background: transparent;
272
+ text-align: start;
273
+ font-family: inherit;
274
+ border-radius: var(--ds-radius-md);
275
+ border-block-start: 1px solid var(--ds-color-border-subtle);
276
+ transition: background-color var(--ds-duration-fast) var(--ds-ease-default);
277
+ }
278
+
279
+ .ds-combobox__create:hover,
280
+ .ds-combobox__create:focus-visible {
281
+ background-color: var(--ds-color-surface-hover);
282
+ }
283
+
284
+ /* --- Empty state --- */
285
+ .ds-combobox__empty {
286
+ display: flex;
287
+ align-items: center;
288
+ justify-content: center;
289
+ padding: var(--ds-space-4) var(--ds-space-3);
290
+ font-size: var(--ds-text-sm);
291
+ color: var(--ds-color-text-tertiary);
292
+ }
293
+
294
+ /* --- Loading state --- */
295
+ .ds-combobox__loading {
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ gap: var(--ds-space-2);
300
+ padding: var(--ds-space-4) var(--ds-space-3);
301
+ font-size: var(--ds-text-sm);
302
+ color: var(--ds-color-text-tertiary);
303
+ }
304
+
305
+ /* ==========================================================================
306
+ Multi-select mode
307
+ ========================================================================== */
308
+
309
+ .ds-combobox--multi .ds-combobox__input-area {
310
+ flex-wrap: wrap;
311
+ padding: var(--ds-space-1) var(--ds-space-2);
312
+ gap: var(--ds-space-1);
313
+ height: auto;
314
+ }
315
+
316
+ /* Tags inside multi input */
317
+ .ds-combobox__tag {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ gap: var(--ds-space-1);
321
+ padding: var(--ds-space-0-5) var(--ds-space-1) var(--ds-space-0-5) var(--ds-space-2);
322
+ font-size: var(--ds-text-xs);
323
+ font-weight: var(--ds-weight-medium);
324
+ font-family: var(--ds-font-sans);
325
+ line-height: var(--ds-leading-none);
326
+ border-radius: var(--ds-radius-full);
327
+ background-color: var(--ds-color-surface-muted);
328
+ border: 1px solid var(--ds-color-border);
329
+ color: var(--ds-color-text-secondary);
330
+ white-space: nowrap;
331
+ }
332
+
333
+ .ds-combobox__tag-remove {
334
+ display: inline-flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ width: 1rem;
338
+ height: 1rem;
339
+ min-width: 1.5rem;
340
+ min-height: 1.5rem;
341
+ padding: 0;
342
+ border: none;
343
+ border-radius: var(--ds-radius-full);
344
+ background: transparent;
345
+ color: currentColor;
346
+ opacity: 0.6;
347
+ cursor: pointer;
348
+ transition: opacity var(--ds-duration-fast) var(--ds-ease-out);
349
+ -webkit-appearance: none;
350
+ appearance: none;
351
+ }
352
+
353
+ .ds-combobox__tag-remove:hover {
354
+ opacity: 1;
355
+ }
356
+
357
+ /* ==========================================================================
358
+ Size variants
359
+ ========================================================================== */
360
+
361
+ /* XS */
362
+ .ds-combobox--xs .ds-combobox__input-area,
363
+ .ds-combobox--xs > .ds-combobox__input {
364
+ min-height: var(--ds-size-1);
365
+ padding: 0 var(--ds-space-2);
366
+ border-radius: var(--ds-radius-md);
367
+ }
368
+
369
+ .ds-combobox--xs .ds-combobox__input {
370
+ font-size: var(--ds-text-xs);
371
+ }
372
+
373
+ /* SM */
374
+ .ds-combobox--sm .ds-combobox__input-area,
375
+ .ds-combobox--sm > .ds-combobox__input {
376
+ min-height: var(--ds-size-2);
377
+ padding: 0 var(--ds-space-2-5);
378
+ border-radius: var(--ds-radius-md);
379
+ }
380
+
381
+ .ds-combobox--sm .ds-combobox__input {
382
+ font-size: var(--ds-text-sm);
383
+ }
384
+
385
+ /* LG */
386
+ .ds-combobox--lg .ds-combobox__input-area,
387
+ .ds-combobox--lg > .ds-combobox__input {
388
+ min-height: var(--ds-size-4);
389
+ padding: 0 var(--ds-space-4);
390
+ }
391
+
392
+ .ds-combobox--lg .ds-combobox__input {
393
+ font-size: var(--ds-text-lg);
394
+ }
395
+
396
+ /* ==========================================================================
397
+ Error state
398
+ ========================================================================== */
399
+
400
+ .ds-combobox--error .ds-combobox__input-area,
401
+ .ds-combobox--error > .ds-combobox__input {
402
+ border-color: var(--ds-color-error);
403
+ }
404
+
405
+ .ds-combobox--error .ds-combobox__input-area:focus-within,
406
+ .ds-combobox--error > .ds-combobox__input:focus {
407
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-error);
408
+ }
409
+
410
+ /* ==========================================================================
411
+ Reduced motion
412
+ ========================================================================== */
413
+
414
+ @media (prefers-reduced-motion: reduce) {
415
+ .ds-combobox__listbox--open {
416
+ animation: none;
417
+ opacity: 1;
418
+ transform: none;
419
+ }
420
+ }
@@ -0,0 +1,210 @@
1
+ /* ==========================================================================
2
+ Command Palette
3
+ ==========================================================================
4
+ Command palette / search overlay following the Cmd+K pattern. Provides a
5
+ full-screen overlay with a centered search dialog, grouped results,
6
+ keyboard-navigable items, and a footer with shortcut hints.
7
+
8
+ ARIA requirements (consumer responsibility):
9
+ - Input: role="combobox", aria-expanded="true", aria-controls="[list-id]"
10
+ - Input: aria-activedescendant="[active-item-id]" for keyboard nav
11
+ - List: role="listbox", id matching aria-controls
12
+ - Items: role="option", id for aria-activedescendant
13
+ - Groups: role="group", aria-labelledby="[heading-id]"
14
+ - Overlay: role="dialog", aria-modal="true", aria-label="Command palette"
15
+ - Keyboard: ArrowUp/Down to navigate, Enter to select, Escape to close
16
+
17
+ Usage:
18
+ <div class="ds-command ds-command--open" role="dialog" aria-modal="true" aria-label="Command palette">
19
+ <div class="ds-command__content">
20
+ <div class="ds-command__input-wrapper">
21
+ <span class="ds-command__input-icon">...</span>
22
+ <input class="ds-command__input" role="combobox" placeholder="Search..." />
23
+ </div>
24
+ <div class="ds-command__list" role="listbox">
25
+ <div class="ds-command__group">
26
+ <div class="ds-command__group-heading">Results</div>
27
+ <div class="ds-command__item ds-command__item--active" role="option">
28
+ <span class="ds-command__item-icon">...</span>
29
+ <span class="ds-command__item-label">Item</span>
30
+ <span class="ds-command__item-shortcut">Ctrl+N</span>
31
+ </div>
32
+ </div>
33
+ <div class="ds-command__empty">No results found.</div>
34
+ </div>
35
+ <div class="ds-command__footer">...</div>
36
+ </div>
37
+ </div>
38
+
39
+ Modifiers:
40
+ .ds-command--open — Shows the command palette
41
+ ========================================================================== */
42
+
43
+ .ds-command {
44
+ /* Overlay */
45
+ position: fixed;
46
+ inset: 0;
47
+ z-index: var(--ds-z-modal);
48
+ display: flex;
49
+ align-items: flex-start;
50
+ justify-content: center;
51
+ padding-block-start: 20vh;
52
+ background-color: var(--ds-color-overlay);
53
+ opacity: 0;
54
+ visibility: hidden;
55
+ transition:
56
+ opacity var(--ds-duration-fast) var(--ds-ease-default),
57
+ visibility var(--ds-duration-fast) var(--ds-ease-default);
58
+
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-muted);
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-default),
147
+ color var(--ds-duration-fast) var(--ds-ease-default);
148
+
149
+ /* Item hover & active states */
150
+ &:hover {
151
+ background-color: var(--ds-color-surface-muted-hover);
152
+ color: var(--ds-color-text);
153
+ }
154
+
155
+ &--active,
156
+ &--active:hover {
157
+ background-color: var(--ds-color-surface-elevated);
158
+ color: var(--ds-color-text);
159
+
160
+ & .ds-command__item-icon,
161
+ & .ds-command__item-label,
162
+ & .ds-command__item-shortcut {
163
+ color: inherit;
164
+ }
165
+ }
166
+
167
+ &:focus-visible {
168
+ outline: none;
169
+ box-shadow: inset 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
170
+ scroll-margin-block: var(--ds-space-16, 4rem);
171
+ }
172
+ }
173
+
174
+ /* Item icon */
175
+ &__item-icon {
176
+ flex-shrink: 0;
177
+ color: var(--ds-color-text-tertiary);
178
+ }
179
+
180
+ /* Item label */
181
+ &__item-label {
182
+ flex: 1;
183
+ }
184
+
185
+ /* Item shortcut hint */
186
+ &__item-shortcut {
187
+ font-size: var(--ds-text-xs);
188
+ color: var(--ds-color-text-tertiary);
189
+ flex-shrink: 0;
190
+ }
191
+
192
+ /* Empty state */
193
+ &__empty {
194
+ padding: var(--ds-space-8);
195
+ text-align: center;
196
+ font-size: var(--ds-text-sm);
197
+ color: var(--ds-color-text-tertiary);
198
+ }
199
+
200
+ /* Footer */
201
+ &__footer {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: var(--ds-space-4);
205
+ padding: var(--ds-space-2) var(--ds-space-3);
206
+ border-block-start: 1px solid var(--ds-color-border);
207
+ font-size: var(--ds-text-xs);
208
+ color: var(--ds-color-text-tertiary);
209
+ }
210
+ }