@sproutsocial/seeds-react-menu 1.16.16 → 1.18.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 (84) hide show
  1. package/.turbo/turbo-build.log +14 -22
  2. package/CHANGELOG.md +51 -0
  3. package/dist/esm/index.js +542 -229
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/v3/index.js +870 -1081
  6. package/dist/esm/v3/index.js.map +1 -1
  7. package/dist/v3/index.d.mts +82 -38
  8. package/dist/v3/index.d.ts +82 -38
  9. package/dist/v3/index.js +887 -1098
  10. package/dist/v3/index.js.map +1 -1
  11. package/dist/v3/menu.css +947 -0
  12. package/package.json +20 -21
  13. package/src/ActionMenu/ActionMenu.stories.tsx +1 -1
  14. package/src/Autocomplete/Autocomplete.stories.tsx +1 -1
  15. package/src/MenuContent/MenuContent.stories.tsx +1 -1
  16. package/src/MenuFooter/MenuFooter.stories.tsx +1 -1
  17. package/src/MenuGroup/MenuGroup.stories.tsx +1 -1
  18. package/src/MenuHeader/MenuHeader.stories.tsx +1 -1
  19. package/src/MenuItem/MenuItem.stories.tsx +1 -1
  20. package/src/MenuToggleButton/MenuToggleButton.stories.tsx +1 -1
  21. package/src/MultiSelectMenu/MultiSelectMenu.stories.tsx +1 -1
  22. package/src/NestedMenu/NestedMenu.stories.tsx +1 -1
  23. package/src/SingleSelectMenu/SingleSelectMenu.stories.tsx +1 -1
  24. package/src/SubmenuItem/SubmenuItem.stories.tsx +1 -1
  25. package/src/v3/ActionMenu.stories.tsx +1 -1
  26. package/src/v3/ActionMenuStyles.tsx +169 -149
  27. package/src/v3/Common/ComboboxStyles.tsx +396 -511
  28. package/src/v3/Common/SelectIcons.tsx +17 -8
  29. package/src/v3/Common/SelectItem.tsx +25 -38
  30. package/src/v3/Common/SelectStyles.tsx +146 -144
  31. package/src/v3/Common/cn.ts +38 -0
  32. package/src/v3/MenuButton.stories.tsx +1 -1
  33. package/src/v3/MenuButtonStyles.tsx +55 -34
  34. package/src/v3/ModalStories.stories.tsx +1 -1
  35. package/src/v3/MultiCombobox.stories.tsx +1 -1
  36. package/src/v3/MultiCombobox.tsx +7 -0
  37. package/src/v3/MultiSearchableSelect.stories.tsx +1 -1
  38. package/src/v3/MultiSearchableSelect.tsx +15 -8
  39. package/src/v3/MultiSelect.stories.tsx +1 -1
  40. package/src/v3/MultiSelect.tsx +20 -17
  41. package/src/v3/SingleCombobox.stories.tsx +1 -1
  42. package/src/v3/SingleCombobox.tsx +7 -0
  43. package/src/v3/SingleSearchableSelect.stories.tsx +1 -1
  44. package/src/v3/SingleSearchableSelect.tsx +7 -0
  45. package/src/v3/SingleSelect.stories.tsx +1 -1
  46. package/src/v3/SingleSelect.tsx +22 -14
  47. package/src/v3/__tests__/ariaLabels.test.tsx +133 -0
  48. package/src/v3/menu.css +947 -0
  49. package/tsup.config.ts +0 -1
  50. package/dist/esm/chunk-ROQATIB7.js +0 -357
  51. package/dist/esm/chunk-ROQATIB7.js.map +0 -1
  52. package/dist/esm/v2/index.js +0 -2089
  53. package/dist/esm/v2/index.js.map +0 -1
  54. package/dist/v2/index.d.mts +0 -108
  55. package/dist/v2/index.d.ts +0 -108
  56. package/dist/v2/index.js +0 -2280
  57. package/dist/v2/index.js.map +0 -1
  58. package/src/v2/Autocomplete/Autocomplete.stories.tsx +0 -645
  59. package/src/v2/Autocomplete/MultiAutocomplete.tsx +0 -487
  60. package/src/v2/Autocomplete/SingleAutocomplete.tsx +0 -366
  61. package/src/v2/Autocomplete/index.ts +0 -2
  62. package/src/v2/Common-V2/ComboboxContent.tsx +0 -457
  63. package/src/v2/Common-V2/MenuGroup.tsx +0 -60
  64. package/src/v2/Common-V2/MenuGroupTypes.ts +0 -30
  65. package/src/v2/Common-V2/MenuHeading.tsx +0 -83
  66. package/src/v2/Common-V2/MenuItem.tsx +0 -138
  67. package/src/v2/Common-V2/Popout.tsx +0 -124
  68. package/src/v2/Common-V2/PopoutTypes.tsx +0 -109
  69. package/src/v2/Common-V2/SelectToggleButton.tsx +0 -99
  70. package/src/v2/Common-V2/index.ts +0 -11
  71. package/src/v2/Common-V2/props.ts +0 -84
  72. package/src/v2/Common-V2/styles.tsx +0 -41
  73. package/src/v2/Common-V2/types.ts +0 -16
  74. package/src/v2/Common-V2/useHighlightedIndex.ts +0 -62
  75. package/src/v2/Common-V2/utils.ts +0 -238
  76. package/src/v2/SearchableSelect/AutocompleteContent.tsx +0 -325
  77. package/src/v2/SearchableSelect/SearchableMultiSelect.tsx +0 -527
  78. package/src/v2/SearchableSelect/SearchableSelect.tsx +0 -395
  79. package/src/v2/SearchableSelect/index.ts +0 -12
  80. package/src/v2/Select/MultiSelect.tsx +0 -417
  81. package/src/v2/Select/Select.stories.tsx +0 -593
  82. package/src/v2/Select/SingleSelect.tsx +0 -285
  83. package/src/v2/Select/index.ts +0 -2
  84. package/src/v2/index.ts +0 -2
@@ -0,0 +1,947 @@
1
+ /**
2
+ * Seeds Menu v3 component classes
3
+ * Pure CSS-class implementation of the v3 (Base UI) menu surface: Select,
4
+ * Combobox, Searchable Select, and Action Menu pieces. These classes replace
5
+ * the styled-components definitions that previously lived in SelectStyles.tsx,
6
+ * ComboboxStyles.tsx, SelectItem.tsx, SelectIcons.tsx, ActionMenuStyles.tsx,
7
+ * and MenuButtonStyles.tsx.
8
+ *
9
+ * Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for the
10
+ * CSS variable definitions and dark mode support. Consumers of
11
+ * @sproutsocial/seeds-react-menu/base must also import the CSS via
12
+ * @sproutsocial/seeds-react-menu/base/css.
13
+ *
14
+ * All rules live in the `components` cascade layer so that unlayered Tailwind
15
+ * utilities always win over these component styles, letting consumers override
16
+ * layout via utility classes.
17
+ *
18
+ * State is driven by Base UI data-* attributes ([data-highlighted],
19
+ * [data-selected], [data-disabled], [data-popup-open], [data-open],
20
+ * [data-closed], [data-empty]); those selectors are carried over verbatim from
21
+ * the styled-components source so behavior is unchanged.
22
+ */
23
+
24
+ @layer components {
25
+ /* ======================================================================== */
26
+ /* Shared field / label (SelectStyles: Field, SelectLabel, ComboboxLabel) */
27
+ /* ======================================================================== */
28
+ .seeds-menu-field {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--space-200);
32
+ width: 100%;
33
+ }
34
+
35
+ /* $fullWidth === false */
36
+ .seeds-menu-field--inline {
37
+ display: inline-flex;
38
+ width: auto;
39
+ }
40
+
41
+ .seeds-menu-label {
42
+ font-size: var(--font-size-200);
43
+ font-weight: var(--font-weight-semibold);
44
+ color: var(--color-text-body);
45
+ }
46
+
47
+ /* ======================================================================== */
48
+ /* Focus ring (focusRing mixin) */
49
+ /* ======================================================================== */
50
+ .seeds-menu-focus-ring {
51
+ box-shadow:
52
+ 0 0 0 1px var(--color-button-primary-bg-base),
53
+ 0 0 0 4px
54
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
55
+ outline: none;
56
+ }
57
+ .seeds-menu-focus-ring::-moz-focus-inner {
58
+ border: 0;
59
+ }
60
+
61
+ /* ======================================================================== */
62
+ /* Select trigger / value / icon (SelectStyles) */
63
+ /* ======================================================================== */
64
+ .seeds-select-trigger {
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: space-between;
68
+ gap: var(--space-300);
69
+ padding: var(--space-300);
70
+ min-width: 160px;
71
+ border-radius: var(--radius-500);
72
+ border: 1px solid var(--color-form-border-base);
73
+ background: var(--color-form-bg-base);
74
+ font-size: var(--font-size-200);
75
+ color: var(--color-text-body);
76
+ cursor: default;
77
+ outline: none;
78
+ transition:
79
+ border-color var(--duration-fast) var(--ease-ease_in),
80
+ box-shadow var(--duration-fast) var(--ease-ease_in);
81
+ }
82
+
83
+ .seeds-select-trigger:focus-visible,
84
+ .seeds-select-trigger[data-popup-open] {
85
+ box-shadow:
86
+ 0 0 0 1px var(--color-button-primary-bg-base),
87
+ 0 0 0 4px
88
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
89
+ outline: none;
90
+ }
91
+
92
+ .seeds-select-trigger[data-popup-open] [data-chevron] {
93
+ transform: rotate(-180deg);
94
+ }
95
+
96
+ .seeds-select-trigger[data-disabled] {
97
+ opacity: 0.4;
98
+ cursor: not-allowed;
99
+ }
100
+
101
+ /* $isInvalid */
102
+ .seeds-select-trigger--invalid {
103
+ border-color: var(--color-form-border-error);
104
+ }
105
+ .seeds-select-trigger--invalid .seeds-menu-chevron {
106
+ color: var(--color-icon-error);
107
+ }
108
+
109
+ .seeds-select-value {
110
+ min-width: 0;
111
+ overflow: hidden;
112
+ }
113
+
114
+ /* SingleSelect local StyledValue */
115
+ .seeds-select-value-text {
116
+ flex: 1;
117
+ text-align: left;
118
+ overflow: hidden;
119
+ text-overflow: ellipsis;
120
+ white-space: nowrap;
121
+ }
122
+ .seeds-select-value-text[data-placeholder] {
123
+ color: var(--color-text-subtext);
124
+ }
125
+
126
+ /* MultiSelect local SelectionText */
127
+ .seeds-select-selection-text {
128
+ flex: 1;
129
+ overflow: hidden;
130
+ text-overflow: ellipsis;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ /* MultiSelect local Placeholder */
135
+ .seeds-select-placeholder {
136
+ color: var(--color-text-subtext);
137
+ font-size: var(--font-size-200);
138
+ line-height: 16px;
139
+ padding-top: 2px;
140
+ padding-bottom: 2px;
141
+ margin: 2px 8px 0 0;
142
+ }
143
+
144
+ .seeds-select-icon {
145
+ display: flex;
146
+ align-items: center;
147
+ color: var(--color-icon-base);
148
+ flex-shrink: 0;
149
+ }
150
+
151
+ /* ======================================================================== */
152
+ /* Select group / label / separator (SelectStyles) */
153
+ /* ======================================================================== */
154
+ .seeds-select-group {
155
+ display: block;
156
+ }
157
+
158
+ .seeds-select-group-label {
159
+ padding: var(--space-300) var(--space-300) var(--space-200);
160
+ font-size: var(--font-size-100);
161
+ font-weight: var(--font-weight-semibold);
162
+ text-transform: uppercase;
163
+ letter-spacing: 0.05em;
164
+ color: var(--color-text-subtext);
165
+ }
166
+
167
+ .seeds-select-separator {
168
+ height: 1px;
169
+ margin: var(--space-200) var(--space-300);
170
+ background: var(--color-container-border-base);
171
+ }
172
+
173
+ /* ======================================================================== */
174
+ /* Select positioner / popup (SelectStyles) */
175
+ /* ======================================================================== */
176
+ .seeds-select-positioner {
177
+ width: var(--anchor-width);
178
+ z-index: 7;
179
+ }
180
+
181
+ .seeds-select-popup {
182
+ font-family: var(--font-family);
183
+ background: var(--color-container-bg-base);
184
+ border: 1px solid var(--color-container-border-base);
185
+ border-radius: var(--radius-500);
186
+ box-shadow: var(--shadow-low);
187
+ outline: none;
188
+ max-height: min(var(--available-height, 400px), 400px);
189
+ overflow-y: auto;
190
+ padding: var(--space-200);
191
+ }
192
+
193
+ .seeds-select-popup[data-open] {
194
+ animation: seeds-select-popup-in 120ms ease-out;
195
+ }
196
+ .seeds-select-popup[data-closed] {
197
+ animation: seeds-select-popup-out 100ms ease-in;
198
+ }
199
+
200
+ @keyframes seeds-select-popup-in {
201
+ from {
202
+ opacity: 0;
203
+ transform: scale(0.95);
204
+ }
205
+ to {
206
+ opacity: 1;
207
+ transform: scale(1);
208
+ }
209
+ }
210
+ @keyframes seeds-select-popup-out {
211
+ from {
212
+ opacity: 1;
213
+ transform: scale(1);
214
+ }
215
+ to {
216
+ opacity: 0;
217
+ transform: scale(0.95);
218
+ }
219
+ }
220
+
221
+ /* ======================================================================== */
222
+ /* Select item (SelectItem.tsx) */
223
+ /* NOTE: font-size 14px and padding 6px are legacy literals that do NOT */
224
+ /* match a token (--font-size-200 is 13px); preserved to avoid a visual */
225
+ /* regression. */
226
+ /* ======================================================================== */
227
+ .seeds-select-item {
228
+ display: flex;
229
+ align-items: center;
230
+ gap: var(--space-300);
231
+ padding: 6px var(--space-300);
232
+ border-radius: var(--radius-500);
233
+ font-size: 14px;
234
+ color: var(--color-text-body);
235
+ cursor: default;
236
+ outline: none;
237
+ }
238
+
239
+ .seeds-select-item[data-highlighted] {
240
+ background: var(--color-listItem-bg-hover);
241
+ }
242
+ .seeds-select-item[data-selected] {
243
+ font-weight: var(--font-weight-semibold);
244
+ }
245
+ .seeds-select-item[data-disabled] {
246
+ opacity: 0.5;
247
+ cursor: not-allowed;
248
+ }
249
+
250
+ .seeds-select-item-indicator {
251
+ display: flex;
252
+ align-items: center;
253
+ width: var(--space-400);
254
+ color: var(--color-text-body);
255
+ visibility: hidden;
256
+ }
257
+ .seeds-select-item-indicator[data-selected] {
258
+ visibility: visible;
259
+ }
260
+
261
+ /* ======================================================================== */
262
+ /* Chevron (SelectIcons.tsx StyledChevron) */
263
+ /* $isOpen is keyed off the trigger's [data-popup-open] selector above. */
264
+ /* ======================================================================== */
265
+ .seeds-menu-chevron {
266
+ display: flex;
267
+ align-items: center;
268
+ transition: transform 0.15s;
269
+ }
270
+
271
+ /* $isOpen (combobox chevrons that don't sit under a [data-popup-open] trigger) */
272
+ .seeds-menu-chevron--open {
273
+ transform: rotate(-180deg);
274
+ }
275
+
276
+ /* ======================================================================== */
277
+ /* Combobox input group / input (ComboboxStyles) */
278
+ /* ======================================================================== */
279
+ .seeds-combobox-input-group {
280
+ display: flex;
281
+ align-items: center;
282
+ min-width: 160px;
283
+ border-radius: var(--radius-500);
284
+ border: 1px solid var(--color-form-border-base);
285
+ background: var(--color-form-bg-base);
286
+ color: var(--color-text-body);
287
+ transition:
288
+ border-color var(--duration-fast) var(--ease-ease_in),
289
+ box-shadow var(--duration-fast) var(--ease-ease_in);
290
+ }
291
+
292
+ .seeds-combobox-input-group:focus-within {
293
+ box-shadow:
294
+ 0 0 0 1px var(--color-button-primary-bg-base),
295
+ 0 0 0 4px
296
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
297
+ outline: none;
298
+ }
299
+
300
+ .seeds-combobox-input-group[data-disabled] {
301
+ opacity: 0.4;
302
+ cursor: not-allowed;
303
+ }
304
+
305
+ .seeds-combobox-input-group--invalid {
306
+ border-color: var(--color-form-border-error);
307
+ }
308
+ .seeds-combobox-input-group--invalid .seeds-menu-chevron {
309
+ color: var(--color-icon-error);
310
+ }
311
+
312
+ .seeds-combobox-input {
313
+ flex: 1;
314
+ min-width: 30px;
315
+ padding: var(--space-300);
316
+ border: none !important;
317
+ background: transparent;
318
+ font-size: var(--font-size-200);
319
+ line-height: var(--line-height-200);
320
+ color: var(--color-text-body);
321
+ outline: none;
322
+ }
323
+ .seeds-combobox-input::placeholder {
324
+ color: var(--color-text-subtext);
325
+ }
326
+ .seeds-combobox-input:disabled {
327
+ cursor: not-allowed;
328
+ }
329
+
330
+ .seeds-combobox-token-input {
331
+ flex: 1;
332
+ min-width: 60px;
333
+ padding: var(--space-200) var(--space-300) var(--space-200) var(--space-350);
334
+ border: none !important;
335
+ background: transparent;
336
+ font-size: var(--font-size-200);
337
+ line-height: var(--line-height-200);
338
+ color: var(--color-text-body);
339
+ outline: none;
340
+ }
341
+ .seeds-combobox-token-input::placeholder {
342
+ color: var(--color-text-subtext);
343
+ }
344
+ .seeds-combobox-token-input:disabled {
345
+ cursor: not-allowed;
346
+ }
347
+
348
+ /* ======================================================================== */
349
+ /* Combobox action buttons / clear / trigger (ComboboxStyles) */
350
+ /* ======================================================================== */
351
+ .seeds-combobox-action-buttons {
352
+ display: flex;
353
+ align-items: center;
354
+ flex-shrink: 0;
355
+ margin-left: auto;
356
+ gap: var(--space-100);
357
+ }
358
+
359
+ /* radii[300] had no token (undefined at runtime); mapped to --radius-400 */
360
+ .seeds-combobox-clear {
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ width: 20px;
365
+ height: 20px;
366
+ border: none;
367
+ background: transparent;
368
+ color: var(--color-icon-base);
369
+ cursor: pointer;
370
+ border-radius: var(--radius-400);
371
+ padding: 0;
372
+ }
373
+ .seeds-combobox-clear:hover {
374
+ color: var(--color-text-body);
375
+ }
376
+ .seeds-combobox-clear:focus-visible {
377
+ box-shadow:
378
+ 0 0 0 1px var(--color-button-primary-bg-base),
379
+ 0 0 0 4px
380
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
381
+ outline: none;
382
+ }
383
+ .seeds-combobox-clear[data-empty] {
384
+ display: none;
385
+ }
386
+
387
+ .seeds-combobox-trigger {
388
+ display: flex;
389
+ align-items: center;
390
+ justify-content: center;
391
+ width: 20px;
392
+ height: 20px;
393
+ border: none;
394
+ background: transparent;
395
+ color: var(--color-icon-base);
396
+ cursor: default;
397
+ padding: 0;
398
+ }
399
+ .seeds-combobox-trigger:hover {
400
+ color: var(--color-text-body);
401
+ }
402
+
403
+ /* ======================================================================== */
404
+ /* Combobox positioner / popup / list / status / empty (ComboboxStyles) */
405
+ /* ======================================================================== */
406
+ .seeds-combobox-positioner {
407
+ width: var(--anchor-width);
408
+ z-index: 7;
409
+ }
410
+
411
+ .seeds-combobox-popup {
412
+ font-family: var(--font-family);
413
+ background: var(--color-container-bg-base);
414
+ border: 1px solid var(--color-container-border-base);
415
+ border-radius: var(--radius-500);
416
+ box-shadow: var(--shadow-medium);
417
+ outline: none;
418
+ width: 100%;
419
+ max-height: min(var(--available-height, 400px), 400px);
420
+ overflow-y: auto;
421
+ padding: 0;
422
+ }
423
+
424
+ .seeds-combobox-popup[data-open] {
425
+ animation: seeds-combobox-popup-in 120ms ease-out;
426
+ }
427
+ .seeds-combobox-popup[data-closed] {
428
+ animation: seeds-combobox-popup-out 100ms ease-in;
429
+ }
430
+
431
+ @keyframes seeds-combobox-popup-in {
432
+ from {
433
+ opacity: 0;
434
+ transform: scale(0.95);
435
+ }
436
+ to {
437
+ opacity: 1;
438
+ transform: scale(1);
439
+ }
440
+ }
441
+ @keyframes seeds-combobox-popup-out {
442
+ from {
443
+ opacity: 1;
444
+ transform: scale(1);
445
+ }
446
+ to {
447
+ opacity: 0;
448
+ transform: scale(0.95);
449
+ }
450
+ }
451
+
452
+ .seeds-combobox-list {
453
+ padding: var(--space-200);
454
+ }
455
+ .seeds-combobox-list:empty {
456
+ padding: 0;
457
+ }
458
+
459
+ .seeds-combobox-status,
460
+ .seeds-combobox-empty {
461
+ padding: var(--space-300) var(--space-350);
462
+ font-size: var(--font-size-200);
463
+ color: var(--color-text-subtext);
464
+ }
465
+ .seeds-combobox-status:empty,
466
+ .seeds-combobox-empty:empty {
467
+ padding: 0;
468
+ }
469
+
470
+ /* ======================================================================== */
471
+ /* Combobox item / indicator (ComboboxStyles) */
472
+ /* ======================================================================== */
473
+ .seeds-combobox-item {
474
+ display: flex;
475
+ align-items: center;
476
+ gap: var(--space-300);
477
+ padding: var(--space-300) var(--space-300);
478
+ border-radius: var(--radius-500);
479
+ font-size: var(--font-size-200);
480
+ color: var(--color-text-body);
481
+ cursor: default;
482
+ outline: none;
483
+ }
484
+ .seeds-combobox-item[data-highlighted] {
485
+ background: var(--color-listItem-bg-hover);
486
+ }
487
+ .seeds-combobox-item[data-selected] {
488
+ font-weight: var(--font-weight-semibold);
489
+ }
490
+ .seeds-combobox-item[data-disabled] {
491
+ opacity: 0.5;
492
+ cursor: not-allowed;
493
+ }
494
+
495
+ .seeds-combobox-item-indicator {
496
+ display: flex;
497
+ align-items: center;
498
+ width: var(--space-400);
499
+ color: var(--color-text-body);
500
+ visibility: hidden;
501
+ }
502
+ .seeds-combobox-item-indicator[data-selected] {
503
+ visibility: visible;
504
+ }
505
+
506
+ /* ======================================================================== */
507
+ /* Combobox group / label / separator (ComboboxStyles) */
508
+ /* ======================================================================== */
509
+ .seeds-combobox-group {
510
+ display: block;
511
+ }
512
+
513
+ .seeds-combobox-group-label {
514
+ padding: var(--space-300) var(--space-300) var(--space-200);
515
+ font-size: var(--font-size-100);
516
+ font-weight: var(--font-weight-semibold);
517
+ text-transform: uppercase;
518
+ letter-spacing: 0.05em;
519
+ color: var(--color-text-subtext);
520
+ }
521
+
522
+ .seeds-combobox-separator {
523
+ height: 1px;
524
+ margin: var(--space-200) var(--space-300);
525
+ background: var(--color-container-border-base);
526
+ }
527
+
528
+ /* ======================================================================== */
529
+ /* Combobox group-header item / select-all item (ComboboxStyles) */
530
+ /* ======================================================================== */
531
+ .seeds-combobox-group-header-item {
532
+ display: flex;
533
+ align-items: center;
534
+ gap: var(--space-300);
535
+ padding: var(--space-300) var(--space-300);
536
+ border-radius: var(--radius-500);
537
+ font-size: var(--font-size-100);
538
+ font-weight: var(--font-weight-semibold);
539
+ text-transform: uppercase;
540
+ letter-spacing: 0.05em;
541
+ color: var(--color-text-subtext);
542
+ cursor: default;
543
+ outline: none;
544
+ }
545
+ .seeds-combobox-group-header-item[data-highlighted] {
546
+ background: var(--color-listItem-bg-hover);
547
+ color: var(--color-text-body);
548
+ }
549
+ .seeds-combobox-group-header-item[data-disabled] {
550
+ opacity: 0.4;
551
+ cursor: not-allowed;
552
+ pointer-events: none;
553
+ }
554
+
555
+ .seeds-combobox-select-all-item {
556
+ display: flex;
557
+ align-items: center;
558
+ gap: var(--space-300);
559
+ padding: var(--space-300) var(--space-300);
560
+ border-radius: var(--radius-500);
561
+ font-size: var(--font-size-200);
562
+ font-weight: var(--font-weight-semibold);
563
+ color: var(--color-text-body);
564
+ cursor: default;
565
+ outline: none;
566
+ border-bottom: 1px solid var(--color-container-border-base);
567
+ margin-bottom: var(--space-200);
568
+ }
569
+ .seeds-combobox-select-all-item[data-highlighted] {
570
+ background: var(--color-listItem-bg-hover);
571
+ }
572
+
573
+ /* ======================================================================== */
574
+ /* Multi-select tokens (ComboboxStyles: ComboboxToken, Token, TokenRemove) */
575
+ /* ======================================================================== */
576
+ .seeds-combobox-tokens {
577
+ display: flex;
578
+ width: 100%;
579
+ flex-wrap: wrap;
580
+ gap: var(--space-200);
581
+ }
582
+
583
+ .seeds-combobox-token-input-group {
584
+ display: flex;
585
+ align-items: center;
586
+ flex-wrap: wrap;
587
+ border-radius: var(--radius-500);
588
+ border: 1px solid var(--color-form-border-base);
589
+ background: var(--color-form-bg-base);
590
+ color: var(--color-text-body);
591
+ padding: var(--space-200) var(--space-300) var(--space-200) var(--space-200);
592
+ gap: var(--space-200);
593
+ transition:
594
+ border-color var(--duration-fast) var(--ease-ease_in),
595
+ box-shadow var(--duration-fast) var(--ease-ease_in);
596
+ }
597
+ .seeds-combobox-token-input-group:focus-within {
598
+ box-shadow:
599
+ 0 0 0 1px var(--color-button-primary-bg-base),
600
+ 0 0 0 4px
601
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
602
+ outline: none;
603
+ }
604
+ .seeds-combobox-token-input-group[data-disabled] {
605
+ opacity: 0.4;
606
+ cursor: not-allowed;
607
+ }
608
+ .seeds-combobox-token-input-group--invalid {
609
+ border-color: var(--color-form-border-error);
610
+ }
611
+ .seeds-combobox-token-input-group--invalid .seeds-menu-chevron {
612
+ color: var(--color-icon-error);
613
+ }
614
+
615
+ .seeds-combobox-token {
616
+ display: inline-flex;
617
+ align-items: center;
618
+ gap: var(--space-200);
619
+ padding: var(--space-200) var(--space-300);
620
+ border-radius: var(--radius-500);
621
+ border: 1px solid var(--color-container-border-base);
622
+ background: var(--color-container-bg-base);
623
+ color: var(--color-text-body);
624
+ font-size: var(--font-size-200);
625
+ font-weight: var(--font-weight-normal);
626
+ line-height: 1;
627
+ white-space: nowrap;
628
+ transition: all var(--duration-fast) var(--ease-ease_inout);
629
+ }
630
+ .seeds-combobox-token:hover {
631
+ box-shadow: var(--shadow-low);
632
+ border-color: var(--color-container-border-base);
633
+ }
634
+
635
+ .seeds-combobox-token-remove {
636
+ display: flex;
637
+ align-items: center;
638
+ justify-content: center;
639
+ border: none;
640
+ background: transparent;
641
+ color: inherit;
642
+ cursor: pointer;
643
+ padding: 0;
644
+ line-height: 1;
645
+ }
646
+ .seeds-combobox-token-remove:focus-visible {
647
+ box-shadow:
648
+ 0 0 0 1px var(--color-button-primary-bg-base),
649
+ 0 0 0 4px
650
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
651
+ outline: none;
652
+ }
653
+
654
+ /* ======================================================================== */
655
+ /* Searchable select (ComboboxStyles) */
656
+ /* ======================================================================== */
657
+ .seeds-searchable-select-trigger {
658
+ display: flex;
659
+ align-items: center;
660
+ justify-content: space-between;
661
+ gap: var(--space-300);
662
+ padding: var(--space-200) var(--space-350);
663
+ min-width: 160px;
664
+ border-radius: var(--radius-500);
665
+ border: 1px solid var(--color-form-border-base);
666
+ background: var(--color-form-bg-base);
667
+ font-size: var(--font-size-200);
668
+ color: var(--color-text-body);
669
+ cursor: default;
670
+ outline: none;
671
+ user-select: none;
672
+ transition:
673
+ border-color var(--duration-fast) var(--ease-ease_in),
674
+ box-shadow var(--duration-fast) var(--ease-ease_in);
675
+ }
676
+ .seeds-searchable-select-trigger:focus-visible {
677
+ box-shadow:
678
+ 0 0 0 1px var(--color-button-primary-bg-base),
679
+ 0 0 0 4px
680
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
681
+ outline: none;
682
+ }
683
+ .seeds-searchable-select-trigger[data-popup-open] [data-chevron] {
684
+ transform: rotate(-180deg);
685
+ }
686
+ .seeds-searchable-select-trigger[data-disabled] {
687
+ opacity: 0.4;
688
+ cursor: not-allowed;
689
+ }
690
+ .seeds-searchable-select-trigger--invalid {
691
+ border-color: var(--color-form-border-error);
692
+ }
693
+ .seeds-searchable-select-trigger--invalid .seeds-menu-chevron {
694
+ color: var(--color-icon-error);
695
+ }
696
+
697
+ .seeds-searchable-select-trigger-icon {
698
+ display: flex;
699
+ align-items: center;
700
+ color: var(--color-icon-base);
701
+ flex-shrink: 0;
702
+ }
703
+
704
+ .seeds-searchable-select-placeholder {
705
+ color: var(--color-text-subtext);
706
+ padding: var(--space-200) 0;
707
+ }
708
+
709
+ .seeds-searchable-select-search-container {
710
+ padding: var(--space-300);
711
+ border-bottom: 1px solid var(--color-container-border-base);
712
+ flex-shrink: 0;
713
+ }
714
+
715
+ .seeds-searchable-select-input {
716
+ width: 100%;
717
+ height: var(--space-500);
718
+ padding: 0 var(--space-300);
719
+ border-radius: var(--radius-500);
720
+ border: 1px solid var(--color-container-border-base);
721
+ background: var(--color-container-bg-base);
722
+ font-size: var(--font-size-200);
723
+ color: var(--color-text-body);
724
+ outline: none;
725
+ box-sizing: border-box;
726
+ }
727
+ .seeds-searchable-select-input:focus {
728
+ box-shadow:
729
+ 0 0 0 1px var(--color-button-primary-bg-base),
730
+ 0 0 0 4px
731
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
732
+ outline: none;
733
+ }
734
+ .seeds-searchable-select-input::placeholder {
735
+ color: var(--color-text-subtext);
736
+ }
737
+
738
+ .seeds-searchable-select-list {
739
+ overflow-y: auto;
740
+ padding: var(--space-200);
741
+ flex: 1;
742
+ min-height: 0;
743
+ }
744
+ .seeds-searchable-select-list:empty {
745
+ padding: 0;
746
+ }
747
+
748
+ .seeds-searchable-select-token-trigger {
749
+ display: flex;
750
+ align-items: center;
751
+ flex-wrap: wrap;
752
+ min-width: 160px;
753
+ border-radius: var(--radius-500);
754
+ border: 1px solid var(--color-form-border-base);
755
+ background: var(--color-form-bg-base);
756
+ color: var(--color-text-body);
757
+ padding: var(--space-200) var(--space-300);
758
+ gap: var(--space-200);
759
+ cursor: default;
760
+ text-align: left;
761
+ outline: none;
762
+ user-select: none;
763
+ transition:
764
+ border-color var(--duration-fast) var(--ease-ease_in),
765
+ box-shadow var(--duration-fast) var(--ease-ease_in);
766
+ }
767
+ .seeds-searchable-select-token-trigger:focus-visible {
768
+ box-shadow:
769
+ 0 0 0 1px var(--color-button-primary-bg-base),
770
+ 0 0 0 4px
771
+ color-mix(in srgb, var(--color-button-primary-bg-base), transparent 70%);
772
+ outline: none;
773
+ }
774
+ .seeds-searchable-select-token-trigger[data-popup-open] {
775
+ border-color: var(--color-blue-600);
776
+ }
777
+ .seeds-searchable-select-token-trigger[data-popup-open] [data-chevron] {
778
+ transform: rotate(-180deg);
779
+ }
780
+ .seeds-searchable-select-token-trigger[data-disabled] {
781
+ opacity: 0.4;
782
+ cursor: not-allowed;
783
+ }
784
+ .seeds-searchable-select-token-trigger--invalid {
785
+ border-color: var(--color-form-border-error);
786
+ }
787
+ .seeds-searchable-select-token-trigger--invalid .seeds-menu-chevron {
788
+ color: var(--color-icon-error);
789
+ }
790
+
791
+ /* ======================================================================== */
792
+ /* Action menu (ActionMenuStyles) */
793
+ /* ======================================================================== */
794
+ .seeds-action-menu-positioner {
795
+ min-width: var(--anchor-width);
796
+ z-index: 7;
797
+ }
798
+
799
+ .seeds-action-menu-popup {
800
+ font-family: var(--font-family);
801
+ background: var(--color-container-bg-base);
802
+ border: 1px solid var(--color-container-border-base);
803
+ border-radius: var(--radius-500);
804
+ box-shadow: var(--shadow-low);
805
+ outline: none;
806
+ max-height: min(var(--available-height, 400px), 400px);
807
+ overflow-y: auto;
808
+ padding: var(--space-300);
809
+ }
810
+ .seeds-action-menu-popup[data-open] {
811
+ animation: seeds-action-menu-popup-in 120ms ease-out;
812
+ }
813
+ .seeds-action-menu-popup[data-closed] {
814
+ animation: seeds-action-menu-popup-out 100ms ease-in;
815
+ }
816
+
817
+ @keyframes seeds-action-menu-popup-in {
818
+ from {
819
+ opacity: 0;
820
+ transform: scale(0.95);
821
+ }
822
+ to {
823
+ opacity: 1;
824
+ transform: scale(1);
825
+ }
826
+ }
827
+ @keyframes seeds-action-menu-popup-out {
828
+ from {
829
+ opacity: 1;
830
+ transform: scale(1);
831
+ }
832
+ to {
833
+ opacity: 0;
834
+ transform: scale(0.95);
835
+ }
836
+ }
837
+
838
+ .seeds-action-menu-group {
839
+ display: block;
840
+ }
841
+
842
+ .seeds-action-menu-group-label {
843
+ padding: var(--space-300);
844
+ font-size: var(--font-size-100);
845
+ color: var(--color-text-body);
846
+ }
847
+
848
+ .seeds-action-menu-separator {
849
+ height: 1px;
850
+ margin: var(--space-300) calc(-1 * var(--space-300));
851
+ background: var(--color-container-border-base);
852
+ }
853
+
854
+ /* menuItemStyles shared block (MenuItem / LinkItem base) */
855
+ .seeds-action-menu-item {
856
+ box-sizing: border-box;
857
+ display: block;
858
+ width: 100%;
859
+ border-radius: var(--radius-500);
860
+ background-color: var(--color-listItem-bg-base);
861
+ border: 1px solid var(--color-listItem-bg-base);
862
+ color: var(--color-text-body);
863
+ font-family: var(--font-family);
864
+ font-weight: var(--font-weight-normal);
865
+ text-align: left;
866
+ text-decoration: none;
867
+ padding: var(--space-300);
868
+ outline: 0;
869
+ font-size: var(--font-size-200);
870
+ line-height: var(--line-height-200);
871
+ transition: all var(--duration-fast);
872
+ cursor: pointer;
873
+ user-select: none;
874
+ }
875
+ .seeds-action-menu-item[data-highlighted] {
876
+ border-color: var(--color-listItem-border-base);
877
+ background-color: var(--color-listItem-bg-hover);
878
+ color: var(--color-text-body);
879
+ text-decoration: none;
880
+ }
881
+ .seeds-action-menu-item[data-disabled] {
882
+ cursor: not-allowed;
883
+ opacity: 0.4;
884
+ }
885
+
886
+ /* CheckboxItem / RadioItem add flex layout on top of the base */
887
+ .seeds-action-menu-item--flex {
888
+ display: flex;
889
+ align-items: center;
890
+ gap: var(--space-300);
891
+ }
892
+
893
+ .seeds-action-menu-item-indicator {
894
+ display: flex;
895
+ align-items: center;
896
+ width: 16px;
897
+ color: var(--color-text-body);
898
+ }
899
+
900
+ /* SubmenuTrigger: base + flex + space-between + open state */
901
+ .seeds-action-menu-submenu-trigger {
902
+ display: flex;
903
+ align-items: center;
904
+ gap: var(--space-300);
905
+ justify-content: space-between;
906
+ }
907
+ .seeds-action-menu-submenu-trigger[data-popup-open] {
908
+ border-color: var(--color-listItem-border-base);
909
+ background-color: var(--color-listItem-bg-hover);
910
+ }
911
+
912
+ /* ======================================================================== */
913
+ /* Menu button / split button (MenuButtonStyles) */
914
+ /* ======================================================================== */
915
+ .seeds-menu-button-container {
916
+ display: inline-flex;
917
+ gap: 1px;
918
+ }
919
+
920
+ /*
921
+ * Qualifying with Button's base `.seeds-btn` class gives these overrides
922
+ * (0,2,0) specificity, so they beat the base Button's own equal-specificity
923
+ * border-radius rule regardless of source order — reproducing the old
924
+ * styled-components `&&` bump. This relies on Button's Tailwind-path base
925
+ * class; MenuButton's buttons are always primary/secondary with no styled
926
+ * props, so they always take that path. Button forwards `className` and
927
+ * spreads data-* onto its root, so both the class and `[data-popup-open]`
928
+ * land on the button element.
929
+ */
930
+ .seeds-btn.seeds-menu-button-main {
931
+ border-top-right-radius: 0;
932
+ border-bottom-right-radius: 0;
933
+ }
934
+
935
+ .seeds-btn.seeds-menu-button-trigger {
936
+ border-top-left-radius: 0;
937
+ border-bottom-left-radius: 0;
938
+ }
939
+
940
+ .seeds-menu-button-trigger .Icon-svg {
941
+ transition: transform var(--duration-fast) ease;
942
+ }
943
+
944
+ .seeds-menu-button-trigger[data-popup-open] .Icon-svg {
945
+ transform: rotate(180deg);
946
+ }
947
+ }