gbs-add-block 2.0.4 → 2.3.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 (129) hide show
  1. package/.gbs/skills/gbs-components/SKILL.md +190 -134
  2. package/.gbs/skills/gbs-components/references/install.md +25 -3
  3. package/.gbs/skills/gbs-components/references/styling.md +246 -201
  4. package/CHANGELOG.md +74 -0
  5. package/README.md +157 -11
  6. package/index.cjs +212 -3
  7. package/package.json +41 -10
  8. package/schema/passport-v1.schema.json +204 -0
  9. package/source/beta-components/accordion/passport.json +259 -0
  10. package/source/beta-components/accordion/styles.css +207 -208
  11. package/source/beta-components/alert/passport.json +250 -0
  12. package/source/beta-components/alert/styles.css +154 -155
  13. package/source/beta-components/avatar/passport.json +294 -0
  14. package/source/beta-components/avatar/styles.css +201 -203
  15. package/source/beta-components/badge/passport.json +332 -0
  16. package/source/beta-components/badge/styles.css +203 -204
  17. package/source/beta-components/breadcrumb/passport.json +243 -0
  18. package/source/beta-components/breadcrumb/styles.css +138 -139
  19. package/source/beta-components/button/passport.json +402 -0
  20. package/source/beta-components/button/passport.manual.json +31 -0
  21. package/source/beta-components/button/styles.css +232 -233
  22. package/source/beta-components/card/passport.json +337 -0
  23. package/source/beta-components/card/styles.css +230 -231
  24. package/source/beta-components/checkbox/passport.json +456 -0
  25. package/source/beta-components/checkbox/styles.css +211 -212
  26. package/source/beta-components/combobox/passport.json +456 -0
  27. package/source/beta-components/combobox/styles.css +419 -417
  28. package/source/beta-components/data-grid/agent/coerce.ts +368 -0
  29. package/source/beta-components/data-grid/agent/contract.ts +410 -0
  30. package/source/beta-components/data-grid/agent/dataset.ts +92 -0
  31. package/source/beta-components/data-grid/agent/engine.ts +470 -0
  32. package/source/beta-components/data-grid/agent/executors.ts +155 -0
  33. package/source/beta-components/data-grid/agent/index.ts +79 -0
  34. package/source/beta-components/data-grid/agent/intent.ts +324 -0
  35. package/source/beta-components/data-grid/agent/operations.ts +335 -0
  36. package/source/beta-components/data-grid/agent/validate.ts +630 -0
  37. package/source/beta-components/data-grid/agent/webmcp.ts +107 -0
  38. package/source/beta-components/data-grid/index.ts +14 -7
  39. package/source/beta-components/data-grid/passport.json +1051 -0
  40. package/source/beta-components/data-grid/passport.manual.json +255 -0
  41. package/source/beta-components/data-grid/react/AskGrid.tsx +164 -0
  42. package/source/beta-components/data-grid/react/DataGrid.tsx +39 -0
  43. package/source/beta-components/data-grid/styles.css +874 -717
  44. package/source/beta-components/date-picker/passport.json +407 -0
  45. package/source/beta-components/date-picker/styles.css +445 -446
  46. package/source/beta-components/dialog/passport.json +344 -0
  47. package/source/beta-components/dialog/styles.css +280 -278
  48. package/source/beta-components/file-uploader/passport.json +518 -0
  49. package/source/beta-components/file-uploader/styles.css +394 -395
  50. package/source/beta-components/input/passport.json +536 -0
  51. package/source/beta-components/input/styles.css +295 -296
  52. package/source/beta-components/menu/passport.json +322 -0
  53. package/source/beta-components/menu/styles.css +224 -222
  54. package/source/beta-components/modal/passport.json +289 -0
  55. package/source/beta-components/modal/styles.css +241 -239
  56. package/source/beta-components/number-input/passport.json +541 -0
  57. package/source/beta-components/number-input/styles.css +230 -231
  58. package/source/beta-components/popover/passport.json +238 -0
  59. package/source/beta-components/popover/styles.css +148 -146
  60. package/source/beta-components/progress/passport.json +270 -0
  61. package/source/beta-components/progress/styles.css +200 -202
  62. package/source/beta-components/radio-group/passport.json +477 -0
  63. package/source/beta-components/radio-group/styles.css +241 -242
  64. package/source/beta-components/shared/core/agent/adapter.ts +65 -0
  65. package/source/beta-components/shared/core/agent/history.ts +120 -0
  66. package/source/beta-components/shared/core/agent/index.ts +46 -0
  67. package/source/beta-components/shared/core/agent/numbers.ts +217 -0
  68. package/source/beta-components/shared/core/agent/schema.ts +180 -0
  69. package/source/beta-components/shared/core/agent/types.ts +169 -0
  70. package/source/beta-components/shared/core/agent/webmcp.ts +328 -0
  71. package/source/beta-components/shared/index.ts +9 -0
  72. package/source/beta-components/shared/react/GramproAIProvider.tsx +50 -0
  73. package/source/beta-components/shared/react/useAskAgent.ts +217 -0
  74. package/source/beta-components/shared/styles.css +79 -0
  75. package/source/beta-components/shared/version.json +4 -4
  76. package/source/beta-components/shared/version.ts +6 -6
  77. package/source/beta-components/skeleton/passport.json +251 -0
  78. package/source/beta-components/skeleton/styles.css +185 -186
  79. package/source/beta-components/spinner/passport.json +245 -0
  80. package/source/beta-components/spinner/styles.css +145 -146
  81. package/source/beta-components/switch/passport.json +421 -0
  82. package/source/beta-components/switch/styles.css +194 -196
  83. package/source/beta-components/tabs/passport.json +315 -0
  84. package/source/beta-components/tabs/styles.css +234 -235
  85. package/source/beta-components/textarea/passport.json +382 -0
  86. package/source/beta-components/textarea/styles.css +158 -159
  87. package/source/beta-components/toaster/passport.json +221 -0
  88. package/source/beta-components/toaster/styles.css +282 -283
  89. package/source/beta-components/tooltip/passport.json +170 -0
  90. package/source/beta-components/tooltip/styles.css +71 -72
  91. package/tools/env.cjs +61 -0
  92. package/tools/passport/cli.cjs +79 -0
  93. package/tools/passport/extract.cjs +493 -0
  94. package/tools/passport/index.cjs +185 -0
  95. package/tools/passport/merge.cjs +131 -0
  96. package/tools/passport/policy.cjs +65 -0
  97. package/tools/passport/validate.cjs +277 -0
  98. package/tools/ts-require.cjs +79 -0
  99. package/source/beta-components/accordion/__tests__/core.test.ts +0 -58
  100. package/source/beta-components/alert/__tests__/core.test.ts +0 -17
  101. package/source/beta-components/avatar/__tests__/core.test.ts +0 -88
  102. package/source/beta-components/badge/__tests__/core.test.ts +0 -46
  103. package/source/beta-components/breadcrumb/__tests__/core.test.ts +0 -58
  104. package/source/beta-components/button/__tests__/core.test.ts +0 -31
  105. package/source/beta-components/card/__tests__/core.test.ts +0 -57
  106. package/source/beta-components/checkbox/__tests__/core.test.ts +0 -40
  107. package/source/beta-components/combobox/__tests__/core.test.ts +0 -134
  108. package/source/beta-components/data-grid/__tests__/core.test.ts +0 -356
  109. package/source/beta-components/data-grid/__tests__/export.test.ts +0 -70
  110. package/source/beta-components/data-grid/__tests__/pdf.test.ts +0 -209
  111. package/source/beta-components/date-picker/__tests__/core.test.ts +0 -273
  112. package/source/beta-components/dialog/__tests__/core.test.ts +0 -86
  113. package/source/beta-components/file-uploader/__tests__/core.test.ts +0 -395
  114. package/source/beta-components/input/__tests__/core.test.ts +0 -75
  115. package/source/beta-components/menu/__tests__/core.test.ts +0 -120
  116. package/source/beta-components/modal/__tests__/core.test.ts +0 -55
  117. package/source/beta-components/number-input/__tests__/core.test.ts +0 -151
  118. package/source/beta-components/progress/__tests__/core.test.ts +0 -56
  119. package/source/beta-components/radio-group/__tests__/core.test.ts +0 -64
  120. package/source/beta-components/shared/__tests__/boundaries.test.ts +0 -95
  121. package/source/beta-components/shared/__tests__/core.test.ts +0 -55
  122. package/source/beta-components/shared/__tests__/position.test.ts +0 -143
  123. package/source/beta-components/skeleton/__tests__/core.test.ts +0 -41
  124. package/source/beta-components/spinner/__tests__/core.test.ts +0 -48
  125. package/source/beta-components/switch/__tests__/core.test.ts +0 -64
  126. package/source/beta-components/tabs/__tests__/core.test.ts +0 -51
  127. package/source/beta-components/textarea/__tests__/core.test.ts +0 -38
  128. package/source/beta-components/toaster/__tests__/core.test.ts +0 -256
  129. package/source/beta-components/tooltip/__tests__/core.test.ts +0 -42
@@ -1,417 +1,419 @@
1
- /*
2
- * Combobox styles (Select and MultiSelect).
3
- *
4
- * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
- * (set them on :root to theme every component at once) and fall back to the
6
- * same default palette otherwise. Rules live in the `components` layer, so
7
- * utility classes passed through `className` / `classNames` override them.
8
- */
9
- @layer theme, base, components, utilities;
10
-
11
- @layer components {
12
- .cb-root {
13
- --cb-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
14
- --cb-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
15
- --cb-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
16
- --cb-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
17
- --cb-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
18
- --cb-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
19
- --cb-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
20
- --cb-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
21
- --cb-accent-soft: var(--gbs-accent-soft, var(--dg-accent-soft, light-dark(#eff6ff, #172554)));
22
- --cb-accent-strong: var(--gbs-accent-strong, var(--dg-accent-strong, light-dark(#1d4ed8, #bfdbfe)));
23
- --cb-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
24
- --cb-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
25
- --cb-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
26
- --cb-radius: var(--gbs-radius, var(--dg-radius, 8px));
27
- --cb-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
28
- --cb-height: 36px;
29
- --cb-px: 10px;
30
-
31
- color-scheme: inherit;
32
- position: relative;
33
- display: flex;
34
- flex-direction: column;
35
- gap: 4px;
36
- width: 100%;
37
- min-width: 0;
38
- font-size: var(--cb-font-size);
39
- line-height: 1.4;
40
- color: var(--cb-fg);
41
- }
42
-
43
- :where(.dark, [data-theme="dark"]) .cb-root {
44
- color-scheme: dark;
45
- }
46
- :where(.light, [data-theme="light"]) .cb-root {
47
- color-scheme: light;
48
- }
49
-
50
- :where(.cb-root, .cb-popover) *,
51
- :where(.cb-root, .cb-popover) *::before,
52
- :where(.cb-root, .cb-popover) *::after {
53
- box-sizing: border-box;
54
- }
55
-
56
- .cb-root[data-size="sm"] {
57
- --cb-height: 30px;
58
- --cb-font-size: 12px;
59
- --cb-px: 8px;
60
- }
61
- .cb-root[data-size="lg"] {
62
- --cb-height: 44px;
63
- --cb-font-size: 14px;
64
- --cb-px: 12px;
65
- }
66
-
67
- .cb-label {
68
- font-weight: 500;
69
- }
70
- .cb-label[data-required]::after {
71
- content: " *";
72
- color: var(--cb-danger);
73
- }
74
- .cb-description {
75
- color: var(--cb-muted);
76
- font-size: 0.92em;
77
- }
78
- .cb-error {
79
- color: var(--cb-danger);
80
- font-size: 0.92em;
81
- }
82
-
83
- /* -------------------------------------------------------------- trigger */
84
-
85
- .cb-control {
86
- display: flex;
87
- align-items: center;
88
- gap: 6px;
89
- width: 100%;
90
- min-height: var(--cb-height);
91
- padding: 3px var(--cb-px);
92
- border: 1px solid var(--cb-border);
93
- border-radius: var(--cb-radius);
94
- background: var(--cb-input-bg);
95
- color: inherit;
96
- font: inherit;
97
- text-align: start;
98
- cursor: pointer;
99
- }
100
- .cb-control:hover:not([data-disabled]) {
101
- border-color: color-mix(in oklab, var(--cb-border), var(--cb-fg) 25%);
102
- }
103
- .cb-control:focus-visible,
104
- .cb-root[data-state="open"] .cb-control {
105
- outline: 2px solid var(--cb-focus);
106
- outline-offset: -1px;
107
- }
108
- .cb-control[data-invalid] {
109
- border-color: var(--cb-danger);
110
- }
111
- .cb-control[data-invalid]:focus-visible,
112
- .cb-root[data-invalid][data-state="open"] .cb-control {
113
- outline-color: var(--cb-danger);
114
- }
115
- .cb-control[data-disabled] {
116
- opacity: 0.55;
117
- cursor: not-allowed;
118
- }
119
-
120
- .cb-value {
121
- flex: 1 1 auto;
122
- min-width: 0;
123
- overflow: hidden;
124
- text-overflow: ellipsis;
125
- white-space: nowrap;
126
- }
127
- .cb-placeholder {
128
- color: var(--cb-muted);
129
- }
130
- .cb-value-icon {
131
- display: inline-flex;
132
- margin-inline-end: 6px;
133
- vertical-align: -2px;
134
- color: var(--cb-muted);
135
- }
136
-
137
- .cb-tags {
138
- display: flex;
139
- flex: 1 1 auto;
140
- flex-wrap: wrap;
141
- align-items: center;
142
- gap: 4px;
143
- min-width: 0;
144
- }
145
- .cb-tag {
146
- display: inline-flex;
147
- align-items: center;
148
- gap: 2px;
149
- max-width: 100%;
150
- padding-inline: 8px 3px;
151
- border-radius: 999px;
152
- background: var(--cb-accent-soft);
153
- color: var(--cb-accent-strong);
154
- font-size: 0.92em;
155
- line-height: 20px;
156
- }
157
- .cb-tag-label {
158
- overflow: hidden;
159
- text-overflow: ellipsis;
160
- white-space: nowrap;
161
- }
162
- .cb-tag-remove {
163
- display: inline-grid;
164
- place-items: center;
165
- width: 16px;
166
- height: 16px;
167
- padding: 0;
168
- border: 0;
169
- border-radius: 50%;
170
- background: transparent;
171
- color: inherit;
172
- cursor: pointer;
173
- }
174
- .cb-tag-remove:hover {
175
- background: color-mix(in oklab, var(--cb-accent-strong), transparent 85%);
176
- }
177
- .cb-tag-overflow {
178
- color: var(--cb-muted);
179
- font-size: 0.92em;
180
- white-space: nowrap;
181
- }
182
-
183
- .cb-actions {
184
- display: flex;
185
- flex: none;
186
- align-items: center;
187
- gap: 2px;
188
- color: var(--cb-muted);
189
- }
190
- .cb-icon-button {
191
- display: inline-grid;
192
- place-items: center;
193
- width: 22px;
194
- height: 22px;
195
- padding: 0;
196
- border: 0;
197
- border-radius: 4px;
198
- background: transparent;
199
- color: inherit;
200
- cursor: pointer;
201
- }
202
- .cb-icon-button:hover {
203
- background: var(--cb-hover);
204
- color: var(--cb-fg);
205
- }
206
- .cb-icon-button:focus-visible {
207
- outline: 2px solid var(--cb-focus);
208
- outline-offset: 1px;
209
- }
210
- .cb-chevron {
211
- transition: transform 120ms ease;
212
- }
213
- .cb-root[data-state="open"] .cb-chevron {
214
- transform: rotate(180deg);
215
- }
216
- @media (prefers-reduced-motion: reduce) {
217
- .cb-chevron {
218
- transition: none;
219
- }
220
- }
221
-
222
- /* -------------------------------------------------------------- popover */
223
-
224
- .cb-popover {
225
- position: fixed;
226
- inset: auto;
227
- margin: 0;
228
- padding: 0;
229
- overflow: hidden;
230
- border: 1px solid var(--cb-border);
231
- border-radius: var(--cb-radius);
232
- background: var(--cb-bg);
233
- color: var(--cb-fg);
234
- box-shadow: var(--cb-shadow);
235
- font-size: var(--cb-font-size);
236
- }
237
- .cb-search {
238
- display: flex;
239
- align-items: center;
240
- gap: 6px;
241
- padding: 6px 10px;
242
- border-bottom: 1px solid var(--cb-border);
243
- color: var(--cb-muted);
244
- }
245
- .cb-search input {
246
- width: 100%;
247
- min-width: 0;
248
- border: 0;
249
- outline: 0;
250
- background: transparent;
251
- color: var(--cb-fg);
252
- font: inherit;
253
- }
254
-
255
- .cb-list {
256
- position: relative;
257
- overflow: auto;
258
- overscroll-behavior: contain;
259
- padding: 4px;
260
- outline: none;
261
- }
262
- .cb-list:focus-visible {
263
- outline: 2px solid var(--cb-focus);
264
- outline-offset: -2px;
265
- }
266
- .cb-list[data-virtual] .cb-item,
267
- .cb-list[data-virtual] .cb-group {
268
- position: absolute;
269
- inset-inline: 4px;
270
- }
271
-
272
- .cb-group {
273
- display: flex;
274
- align-items: center;
275
- padding: 6px 8px 2px;
276
- color: var(--cb-muted);
277
- font-size: 0.85em;
278
- font-weight: 600;
279
- letter-spacing: 0.04em;
280
- text-transform: uppercase;
281
- }
282
-
283
- .cb-item {
284
- display: flex;
285
- align-items: center;
286
- gap: 8px;
287
- width: 100%;
288
- padding: 6px 8px;
289
- border: 0;
290
- border-radius: 6px;
291
- background: transparent;
292
- color: inherit;
293
- font: inherit;
294
- text-align: start;
295
- cursor: pointer;
296
- }
297
- .cb-item[data-active] {
298
- background: var(--cb-hover);
299
- }
300
- .cb-item[data-selected] {
301
- color: var(--cb-accent-strong);
302
- font-weight: 500;
303
- }
304
- .cb-item[data-disabled] {
305
- opacity: 0.45;
306
- cursor: not-allowed;
307
- }
308
- .cb-item-check {
309
- flex: none;
310
- width: 16px;
311
- color: var(--cb-accent);
312
- opacity: 0;
313
- }
314
- .cb-item[data-selected] .cb-item-check {
315
- opacity: 1;
316
- }
317
- .cb-item-icon {
318
- flex: none;
319
- display: inline-flex;
320
- color: var(--cb-muted);
321
- }
322
- .cb-item-body {
323
- flex: 1 1 auto;
324
- min-width: 0;
325
- }
326
- .cb-item-label {
327
- overflow: hidden;
328
- text-overflow: ellipsis;
329
- white-space: nowrap;
330
- }
331
- .cb-item-description {
332
- overflow: hidden;
333
- color: var(--cb-muted);
334
- font-size: 0.9em;
335
- text-overflow: ellipsis;
336
- white-space: nowrap;
337
- }
338
- .cb-mark {
339
- background: color-mix(in oklab, var(--cb-accent), transparent 82%);
340
- border-radius: 2px;
341
- color: inherit;
342
- font-weight: 600;
343
- }
344
-
345
- .cb-empty,
346
- .cb-status {
347
- display: flex;
348
- align-items: center;
349
- justify-content: center;
350
- gap: 8px;
351
- padding: 16px 8px;
352
- color: var(--cb-muted);
353
- }
354
- .cb-footer {
355
- display: flex;
356
- align-items: center;
357
- justify-content: space-between;
358
- gap: 8px;
359
- padding: 4px 6px;
360
- border-top: 1px solid var(--cb-border);
361
- }
362
- .cb-link-button {
363
- padding: 4px 6px;
364
- border: 0;
365
- border-radius: 4px;
366
- background: none;
367
- color: var(--cb-accent);
368
- font: inherit;
369
- cursor: pointer;
370
- }
371
- .cb-link-button:hover {
372
- background: var(--cb-hover);
373
- }
374
- .cb-link-button:disabled {
375
- opacity: 0.5;
376
- cursor: default;
377
- }
378
- .cb-footer-count {
379
- color: var(--cb-muted);
380
- }
381
-
382
- .cb-spinner {
383
- animation: cb-spin 0.7s linear infinite;
384
- }
385
- @keyframes cb-spin {
386
- to {
387
- transform: rotate(360deg);
388
- }
389
- }
390
- @media (prefers-reduced-motion: reduce) {
391
- .cb-spinner {
392
- animation-duration: 2s;
393
- }
394
- }
395
-
396
- .cb-sr-only {
397
- position: absolute;
398
- width: 1px;
399
- height: 1px;
400
- margin: -1px;
401
- padding: 0;
402
- overflow: hidden;
403
- clip-path: inset(50%);
404
- white-space: nowrap;
405
- border: 0;
406
- }
407
-
408
- @media (forced-colors: active) {
409
- .cb-item[data-active] {
410
- outline: 1px solid Highlight;
411
- }
412
- .cb-mark {
413
- background: Highlight;
414
- color: HighlightText;
415
- }
416
- }
417
- }
1
+ /*
2
+ * Combobox styles (Select and MultiSelect).
3
+ *
4
+ * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
+ * (set them on :root to theme every component at once) and fall back to the
6
+ * same default palette otherwise. Rules are unlayered: they beat a framework
7
+ * reset on specificity, and lose to anything you pass through `className`.
8
+ * With Tailwind v4, import this file after the framework and inside its
9
+ * components layer - see the README.
10
+ */
11
+
12
+ .cb-root {
13
+ --cb-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
14
+ --cb-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
15
+ --cb-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
16
+ --cb-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
17
+ --cb-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
18
+ --cb-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
19
+ --cb-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
20
+ --cb-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
21
+ --cb-accent-soft: var(--gbs-accent-soft, var(--dg-accent-soft, light-dark(#eff6ff, #172554)));
22
+ --cb-accent-strong: var(--gbs-accent-strong, var(--dg-accent-strong, light-dark(#1d4ed8, #bfdbfe)));
23
+ --cb-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
24
+ --cb-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
25
+ --cb-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
26
+ --cb-radius: var(--gbs-radius, var(--dg-radius, 8px));
27
+ --cb-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
28
+ --cb-height: 36px;
29
+ --cb-px: 10px;
30
+
31
+ color-scheme: inherit;
32
+ position: relative;
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 4px;
36
+ width: 100%;
37
+ min-width: 0;
38
+ font-size: var(--cb-font-size);
39
+ line-height: 1.4;
40
+ color: var(--cb-fg);
41
+ }
42
+
43
+ :where(.dark, [data-theme="dark"]) .cb-root {
44
+ color-scheme: dark;
45
+ }
46
+ :where(.light, [data-theme="light"]) .cb-root {
47
+ color-scheme: light;
48
+ }
49
+
50
+ :where(.cb-root, .cb-popover) *,
51
+ :where(.cb-root, .cb-popover) *::before,
52
+ :where(.cb-root, .cb-popover) *::after {
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ .cb-root[data-size="sm"] {
57
+ --cb-height: 30px;
58
+ --cb-font-size: 12px;
59
+ --cb-px: 8px;
60
+ }
61
+ .cb-root[data-size="lg"] {
62
+ --cb-height: 44px;
63
+ --cb-font-size: 14px;
64
+ --cb-px: 12px;
65
+ }
66
+
67
+ .cb-label {
68
+ font-weight: 500;
69
+ }
70
+ .cb-label[data-required]::after {
71
+ content: " *";
72
+ color: var(--cb-danger);
73
+ }
74
+ .cb-description {
75
+ color: var(--cb-muted);
76
+ font-size: 0.92em;
77
+ }
78
+ .cb-error {
79
+ color: var(--cb-danger);
80
+ font-size: 0.92em;
81
+ }
82
+
83
+ /* -------------------------------------------------------------- trigger */
84
+
85
+ .cb-control {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 6px;
89
+ width: 100%;
90
+ min-height: var(--cb-height);
91
+ padding: 3px var(--cb-px);
92
+ border: 1px solid var(--cb-border);
93
+ border-radius: var(--cb-radius);
94
+ background: var(--cb-input-bg);
95
+ color: inherit;
96
+ font: inherit;
97
+ text-align: start;
98
+ cursor: pointer;
99
+ }
100
+ .cb-control:hover:not([data-disabled]) {
101
+ border-color: color-mix(in oklab, var(--cb-border), var(--cb-fg) 25%);
102
+ }
103
+ .cb-control:focus-visible,
104
+ .cb-root[data-state="open"] .cb-control {
105
+ outline: 2px solid var(--cb-focus);
106
+ outline-offset: -1px;
107
+ }
108
+ .cb-control[data-invalid] {
109
+ border-color: var(--cb-danger);
110
+ }
111
+ .cb-control[data-invalid]:focus-visible,
112
+ .cb-root[data-invalid][data-state="open"] .cb-control {
113
+ outline-color: var(--cb-danger);
114
+ }
115
+ .cb-control[data-disabled] {
116
+ opacity: 0.55;
117
+ cursor: not-allowed;
118
+ }
119
+
120
+ .cb-value {
121
+ flex: 1 1 auto;
122
+ min-width: 0;
123
+ overflow: hidden;
124
+ text-overflow: ellipsis;
125
+ white-space: nowrap;
126
+ }
127
+ .cb-placeholder {
128
+ color: var(--cb-muted);
129
+ }
130
+ .cb-value-icon {
131
+ display: inline-flex;
132
+ margin-inline-end: 6px;
133
+ vertical-align: -2px;
134
+ color: var(--cb-muted);
135
+ }
136
+
137
+ .cb-tags {
138
+ display: flex;
139
+ flex: 1 1 auto;
140
+ flex-wrap: wrap;
141
+ align-items: center;
142
+ gap: 4px;
143
+ min-width: 0;
144
+ }
145
+ .cb-tag {
146
+ display: inline-flex;
147
+ align-items: center;
148
+ gap: 2px;
149
+ max-width: 100%;
150
+ padding-inline: 8px 3px;
151
+ border-radius: 999px;
152
+ background: var(--cb-accent-soft);
153
+ color: var(--cb-accent-strong);
154
+ font-size: 0.92em;
155
+ line-height: 20px;
156
+ }
157
+ .cb-tag-label {
158
+ overflow: hidden;
159
+ text-overflow: ellipsis;
160
+ white-space: nowrap;
161
+ }
162
+ .cb-tag-remove {
163
+ display: inline-grid;
164
+ place-items: center;
165
+ width: 16px;
166
+ height: 16px;
167
+ padding: 0;
168
+ border: 0;
169
+ border-radius: 50%;
170
+ background: transparent;
171
+ color: inherit;
172
+ cursor: pointer;
173
+ }
174
+ .cb-tag-remove:hover {
175
+ background: color-mix(in oklab, var(--cb-accent-strong), transparent 85%);
176
+ }
177
+ .cb-tag-overflow {
178
+ color: var(--cb-muted);
179
+ font-size: 0.92em;
180
+ white-space: nowrap;
181
+ }
182
+
183
+ .cb-actions {
184
+ display: flex;
185
+ flex: none;
186
+ align-items: center;
187
+ gap: 2px;
188
+ color: var(--cb-muted);
189
+ }
190
+ .cb-icon-button {
191
+ display: inline-grid;
192
+ place-items: center;
193
+ width: 22px;
194
+ height: 22px;
195
+ padding: 0;
196
+ border: 0;
197
+ border-radius: 4px;
198
+ background: transparent;
199
+ color: inherit;
200
+ cursor: pointer;
201
+ }
202
+ .cb-icon-button:hover {
203
+ background: var(--cb-hover);
204
+ color: var(--cb-fg);
205
+ }
206
+ .cb-icon-button:focus-visible {
207
+ outline: 2px solid var(--cb-focus);
208
+ outline-offset: 1px;
209
+ }
210
+ .cb-chevron {
211
+ transition: transform 120ms ease;
212
+ }
213
+ .cb-root[data-state="open"] .cb-chevron {
214
+ transform: rotate(180deg);
215
+ }
216
+ @media (prefers-reduced-motion: reduce) {
217
+ .cb-chevron {
218
+ transition: none;
219
+ }
220
+ }
221
+
222
+ /* -------------------------------------------------------------- popover */
223
+
224
+ .cb-popover {
225
+ position: fixed;
226
+ inset: auto;
227
+ margin: 0;
228
+ padding: 0;
229
+ overflow: hidden;
230
+ border: 1px solid var(--cb-border);
231
+ border-radius: var(--cb-radius);
232
+ background: var(--cb-bg);
233
+ color: var(--cb-fg);
234
+ box-shadow: var(--cb-shadow);
235
+ font-size: var(--cb-font-size);
236
+ }
237
+ .cb-search {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 6px;
241
+ padding: 6px 10px;
242
+ border-bottom: 1px solid var(--cb-border);
243
+ color: var(--cb-muted);
244
+ }
245
+ .cb-search input {
246
+ width: 100%;
247
+ min-width: 0;
248
+ border: 0;
249
+ outline: 0;
250
+ background: transparent;
251
+ color: var(--cb-fg);
252
+ font: inherit;
253
+ }
254
+
255
+ .cb-list {
256
+ position: relative;
257
+ overflow: auto;
258
+ overscroll-behavior: contain;
259
+ padding: 4px;
260
+ outline: none;
261
+ scrollbar-width: var(--gbs-scrollbar-width, thin);
262
+ scrollbar-color: var(--gbs-scrollbar-thumb, light-dark(#c4c4ca, #3f3f46))
263
+ var(--gbs-scrollbar-track, transparent);
264
+ }
265
+ .cb-list:focus-visible {
266
+ outline: 2px solid var(--cb-focus);
267
+ outline-offset: -2px;
268
+ }
269
+ .cb-list[data-virtual] .cb-item,
270
+ .cb-list[data-virtual] .cb-group {
271
+ position: absolute;
272
+ inset-inline: 4px;
273
+ }
274
+
275
+ .cb-group {
276
+ display: flex;
277
+ align-items: center;
278
+ padding: 6px 8px 2px;
279
+ color: var(--cb-muted);
280
+ font-size: 0.85em;
281
+ font-weight: 600;
282
+ letter-spacing: 0.04em;
283
+ text-transform: uppercase;
284
+ }
285
+
286
+ .cb-item {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 8px;
290
+ width: 100%;
291
+ padding: 6px 8px;
292
+ border: 0;
293
+ border-radius: 6px;
294
+ background: transparent;
295
+ color: inherit;
296
+ font: inherit;
297
+ text-align: start;
298
+ cursor: pointer;
299
+ }
300
+ .cb-item[data-active] {
301
+ background: var(--cb-hover);
302
+ }
303
+ .cb-item[data-selected] {
304
+ color: var(--cb-accent-strong);
305
+ font-weight: 500;
306
+ }
307
+ .cb-item[data-disabled] {
308
+ opacity: 0.45;
309
+ cursor: not-allowed;
310
+ }
311
+ .cb-item-check {
312
+ flex: none;
313
+ width: 16px;
314
+ color: var(--cb-accent);
315
+ opacity: 0;
316
+ }
317
+ .cb-item[data-selected] .cb-item-check {
318
+ opacity: 1;
319
+ }
320
+ .cb-item-icon {
321
+ flex: none;
322
+ display: inline-flex;
323
+ color: var(--cb-muted);
324
+ }
325
+ .cb-item-body {
326
+ flex: 1 1 auto;
327
+ min-width: 0;
328
+ }
329
+ .cb-item-label {
330
+ overflow: hidden;
331
+ text-overflow: ellipsis;
332
+ white-space: nowrap;
333
+ }
334
+ .cb-item-description {
335
+ overflow: hidden;
336
+ color: var(--cb-muted);
337
+ font-size: 0.9em;
338
+ text-overflow: ellipsis;
339
+ white-space: nowrap;
340
+ }
341
+ .cb-mark {
342
+ background: color-mix(in oklab, var(--cb-accent), transparent 82%);
343
+ border-radius: 2px;
344
+ color: inherit;
345
+ font-weight: 600;
346
+ }
347
+
348
+ .cb-empty,
349
+ .cb-status {
350
+ display: flex;
351
+ align-items: center;
352
+ justify-content: center;
353
+ gap: 8px;
354
+ padding: 16px 8px;
355
+ color: var(--cb-muted);
356
+ }
357
+ .cb-footer {
358
+ display: flex;
359
+ align-items: center;
360
+ justify-content: space-between;
361
+ gap: 8px;
362
+ padding: 4px 6px;
363
+ border-top: 1px solid var(--cb-border);
364
+ }
365
+ .cb-link-button {
366
+ padding: 4px 6px;
367
+ border: 0;
368
+ border-radius: 4px;
369
+ background: none;
370
+ color: var(--cb-accent);
371
+ font: inherit;
372
+ cursor: pointer;
373
+ }
374
+ .cb-link-button:hover {
375
+ background: var(--cb-hover);
376
+ }
377
+ .cb-link-button:disabled {
378
+ opacity: 0.5;
379
+ cursor: default;
380
+ }
381
+ .cb-footer-count {
382
+ color: var(--cb-muted);
383
+ }
384
+
385
+ .cb-spinner {
386
+ animation: cb-spin 0.7s linear infinite;
387
+ }
388
+ @keyframes cb-spin {
389
+ to {
390
+ transform: rotate(360deg);
391
+ }
392
+ }
393
+ @media (prefers-reduced-motion: reduce) {
394
+ .cb-spinner {
395
+ animation-duration: 2s;
396
+ }
397
+ }
398
+
399
+ .cb-sr-only {
400
+ position: absolute;
401
+ width: 1px;
402
+ height: 1px;
403
+ margin: -1px;
404
+ padding: 0;
405
+ overflow: hidden;
406
+ clip-path: inset(50%);
407
+ white-space: nowrap;
408
+ border: 0;
409
+ }
410
+
411
+ @media (forced-colors: active) {
412
+ .cb-item[data-active] {
413
+ outline: 1px solid Highlight;
414
+ }
415
+ .cb-mark {
416
+ background: Highlight;
417
+ color: HighlightText;
418
+ }
419
+ }