@lekoala/combobox 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +566 -0
  3. package/custom-elements.json +247 -0
  4. package/dist/combobox.css +447 -0
  5. package/dist/combobox.js +2220 -0
  6. package/dist/combobox.min.css +1 -0
  7. package/dist/combobox.min.js +2 -0
  8. package/dist/types/combo-box.d.ts +112 -0
  9. package/dist/types/combo-box.d.ts.map +1 -0
  10. package/dist/types/combobox.d.ts +530 -0
  11. package/dist/types/combobox.d.ts.map +1 -0
  12. package/dist/types/define.d.ts +2 -0
  13. package/dist/types/define.d.ts.map +1 -0
  14. package/dist/types/helpers.d.ts +251 -0
  15. package/dist/types/helpers.d.ts.map +1 -0
  16. package/dist/types/index.d.ts +24 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/types/locales/de.d.ts +7 -0
  19. package/dist/types/locales/de.d.ts.map +1 -0
  20. package/dist/types/locales/en.d.ts +8 -0
  21. package/dist/types/locales/en.d.ts.map +1 -0
  22. package/dist/types/locales/es.d.ts +7 -0
  23. package/dist/types/locales/es.d.ts.map +1 -0
  24. package/dist/types/locales/fr.d.ts +7 -0
  25. package/dist/types/locales/fr.d.ts.map +1 -0
  26. package/dist/types/locales/it.d.ts +7 -0
  27. package/dist/types/locales/it.d.ts.map +1 -0
  28. package/dist/types/locales/nl.d.ts +7 -0
  29. package/dist/types/locales/nl.d.ts.map +1 -0
  30. package/dist/types/locales/pt.d.ts +7 -0
  31. package/dist/types/locales/pt.d.ts.map +1 -0
  32. package/dist/types/locales/ru.d.ts +7 -0
  33. package/dist/types/locales/ru.d.ts.map +1 -0
  34. package/dist/types/locales/zh-CN.d.ts +7 -0
  35. package/dist/types/locales/zh-CN.d.ts.map +1 -0
  36. package/dist/types/messages.d.ts +48 -0
  37. package/dist/types/messages.d.ts.map +1 -0
  38. package/package.json +92 -0
  39. package/src/combo-box.js +316 -0
  40. package/src/combobox.css +447 -0
  41. package/src/combobox.js +2975 -0
  42. package/src/define.js +20 -0
  43. package/src/helpers.js +377 -0
  44. package/src/index.js +35 -0
  45. package/src/locales/de.js +17 -0
  46. package/src/locales/en.js +18 -0
  47. package/src/locales/es.js +17 -0
  48. package/src/locales/fr.js +17 -0
  49. package/src/locales/it.js +17 -0
  50. package/src/locales/nl.js +17 -0
  51. package/src/locales/pt.js +17 -0
  52. package/src/locales/ru.js +17 -0
  53. package/src/locales/zh-CN.js +17 -0
  54. package/src/messages.js +55 -0
@@ -0,0 +1,247 @@
1
+ {
2
+ "schemaVersion": "2.1.0",
3
+ "readme": "README.md",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/combo-box.js",
8
+ "declarations": [
9
+ {
10
+ "kind": "class",
11
+ "name": "ComboBoxElement",
12
+ "description": "Autonomous custom element (no Shadow DOM) wrapping the Combobox enhancement engine for a child <select> or <input list>.",
13
+ "tagName": "combo-box",
14
+ "attributes": [
15
+ {
16
+ "name": "create"
17
+ },
18
+ {
19
+ "name": "placeholder"
20
+ },
21
+ {
22
+ "name": "search"
23
+ },
24
+ {
25
+ "name": "min-chars"
26
+ },
27
+ {
28
+ "name": "max-items"
29
+ },
30
+ {
31
+ "name": "max-options"
32
+ },
33
+ {
34
+ "name": "selection-order"
35
+ },
36
+ {
37
+ "name": "separators"
38
+ },
39
+ {
40
+ "name": "create-on-blur"
41
+ },
42
+ {
43
+ "name": "close-on-select"
44
+ },
45
+ {
46
+ "name": "autoselect-first"
47
+ },
48
+ {
49
+ "name": "tab-select"
50
+ },
51
+ {
52
+ "name": "search-fields"
53
+ },
54
+ {
55
+ "name": "label-field"
56
+ },
57
+ {
58
+ "name": "value-field"
59
+ },
60
+ {
61
+ "name": "load-on-empty"
62
+ },
63
+ {
64
+ "name": "allow-empty-option"
65
+ },
66
+ {
67
+ "name": "debounce"
68
+ }
69
+ ],
70
+ "members": [
71
+ {
72
+ "kind": "getter",
73
+ "name": "source",
74
+ "description": "The enhanced source element, discovering it lazily when needed."
75
+ },
76
+ {
77
+ "kind": "getter",
78
+ "name": "combobox",
79
+ "description": "The underlying Combobox engine instance, or null before upgrade."
80
+ },
81
+ {
82
+ "kind": "getter",
83
+ "name": "options",
84
+ "description": "The merged JavaScript options currently applied to the element."
85
+ },
86
+ {
87
+ "kind": "method",
88
+ "name": "configure",
89
+ "description": "Merge JavaScript-only behavior such as load/create/render callbacks."
90
+ },
91
+ {
92
+ "kind": "method",
93
+ "name": "upgrade",
94
+ "description": "Enhance the native child source. Safe to call repeatedly. child exists."
95
+ },
96
+ {
97
+ "kind": "method",
98
+ "name": "whenReady",
99
+ "description": "Resolves once the engine has upgraded the source child."
100
+ },
101
+ {
102
+ "kind": "method",
103
+ "name": "dispose",
104
+ "description": "Tear the engine down and restore the native source."
105
+ }
106
+ ],
107
+ "events": [
108
+ {
109
+ "name": "beforefilter"
110
+ },
111
+ {
112
+ "name": "combobox:beforeclear"
113
+ },
114
+ {
115
+ "name": "combobox:beforeclose"
116
+ },
117
+ {
118
+ "name": "combobox:beforecreate"
119
+ },
120
+ {
121
+ "name": "combobox:beforeload"
122
+ },
123
+ {
124
+ "name": "combobox:beforeopen"
125
+ },
126
+ {
127
+ "name": "combobox:beforeremove"
128
+ },
129
+ {
130
+ "name": "combobox:beforereorder"
131
+ },
132
+ {
133
+ "name": "combobox:beforeselect"
134
+ },
135
+ {
136
+ "name": "combobox:clear"
137
+ },
138
+ {
139
+ "name": "combobox:create"
140
+ },
141
+ {
142
+ "name": "combobox:createerror"
143
+ },
144
+ {
145
+ "name": "combobox:guarderror"
146
+ },
147
+ {
148
+ "name": "combobox:load"
149
+ },
150
+ {
151
+ "name": "combobox:loaderror"
152
+ },
153
+ {
154
+ "name": "combobox:remove"
155
+ },
156
+ {
157
+ "name": "combobox:reorder"
158
+ },
159
+ {
160
+ "name": "combobox:select"
161
+ },
162
+ {
163
+ "name": "filter"
164
+ }
165
+ ],
166
+ "cssProperties": [
167
+ {
168
+ "name": "--cb-bg"
169
+ },
170
+ {
171
+ "name": "--cb-color"
172
+ },
173
+ {
174
+ "name": "--cb-border-color"
175
+ },
176
+ {
177
+ "name": "--cb-border-radius"
178
+ },
179
+ {
180
+ "name": "--cb-focus-color"
181
+ },
182
+ {
183
+ "name": "--cb-chip-bg"
184
+ },
185
+ {
186
+ "name": "--cb-chip-color"
187
+ },
188
+ {
189
+ "name": "--cb-chip-border-color"
190
+ },
191
+ {
192
+ "name": "--cb-chip-border-width"
193
+ },
194
+ {
195
+ "name": "--cb-chip-font-size"
196
+ },
197
+ {
198
+ "name": "--cb-chip-border-radius"
199
+ },
200
+ {
201
+ "name": "--cb-picker-bg"
202
+ },
203
+ {
204
+ "name": "--cb-option-active-bg"
205
+ },
206
+ {
207
+ "name": "--cb-option-selected-bg"
208
+ },
209
+ {
210
+ "name": "--cb-muted-color"
211
+ },
212
+ {
213
+ "name": "--cb-error-color"
214
+ },
215
+ {
216
+ "name": "--cb-control-height"
217
+ },
218
+ {
219
+ "name": "--cb-option-min-height"
220
+ },
221
+ {
222
+ "name": "--cb-check-size"
223
+ }
224
+ ]
225
+ }
226
+ ],
227
+ "exports": [
228
+ {
229
+ "kind": "js",
230
+ "name": "ComboBoxElement",
231
+ "declaration": {
232
+ "name": "ComboBoxElement",
233
+ "module": "src/combo-box.js"
234
+ }
235
+ },
236
+ {
237
+ "kind": "js",
238
+ "name": "defineCombobox",
239
+ "declaration": {
240
+ "name": "defineCombobox",
241
+ "module": "src/combo-box.js"
242
+ }
243
+ }
244
+ ]
245
+ }
246
+ ]
247
+ }
@@ -0,0 +1,447 @@
1
+ /* Structural CSS for the combobox enhancement. No Bootstrap JS dependency.
2
+ Tune appearance through the --cb-* variables below; defaults are neutral and
3
+ Bootstrap-compatible. Markup stays framework-agnostic. */
4
+
5
+ :root {
6
+ --cb-bg: #fff;
7
+ --cb-color: #212529;
8
+ --cb-border-color: #adb5bd;
9
+ --cb-border-radius: 0.375rem;
10
+ --cb-focus-color: #0d6efd;
11
+ --cb-chip-bg: #e9ecef;
12
+ --cb-chip-color: inherit;
13
+ --cb-chip-border-color: transparent;
14
+ --cb-chip-border-width: 0px;
15
+ --cb-chip-font-size: 0.875em;
16
+ --cb-chip-border-radius: 0.4286em;
17
+ --cb-picker-bg: Canvas;
18
+ --cb-option-active-bg: #0d6efd;
19
+ --cb-option-selected-bg: #e9ecef;
20
+ --cb-muted-color: #6c757d;
21
+ --cb-error-color: #dc3545;
22
+ --cb-control-height: 2.75rem;
23
+ --cb-option-min-height: 2.5rem;
24
+ --cb-check-size: 1em;
25
+ }
26
+
27
+ .cb-source-hidden {
28
+ position: absolute !important;
29
+ inline-size: 1px !important;
30
+ block-size: 1px !important;
31
+ margin: -1px !important;
32
+ padding: 0 !important;
33
+ overflow: hidden !important;
34
+ clip: rect(0 0 0 0) !important;
35
+ clip-path: inset(50%) !important;
36
+ white-space: nowrap !important;
37
+ border: 0 !important;
38
+ }
39
+
40
+ /* ------------------------------------------------------------------------- */
41
+ /* Control geometry — single, multiple and input comboboxes share one system */
42
+ /* ------------------------------------------------------------------------- */
43
+
44
+ .cb-control,
45
+ .cb-text-control,
46
+ .cb-fallback-input,
47
+ .cb-fallback-add {
48
+ box-sizing: border-box;
49
+ min-block-size: var(--cb-control-height);
50
+ border: 1px solid var(--cb-border-color);
51
+ border-radius: var(--cb-border-radius);
52
+ background: var(--cb-bg);
53
+ color: var(--cb-color);
54
+ font: inherit;
55
+ }
56
+
57
+ .cb-text-control,
58
+ .cb-fallback-input {
59
+ display: block;
60
+ inline-size: 100%;
61
+ max-inline-size: 100%;
62
+ padding-block: calc((var(--cb-control-height) - 1.625rem) / 2);
63
+ padding-inline: 0.75rem;
64
+ }
65
+
66
+ .cb-text-control:disabled {
67
+ cursor: not-allowed;
68
+ }
69
+
70
+ .cb-control {
71
+ display: flex;
72
+ align-items: center;
73
+ flex-wrap: wrap;
74
+ gap: 0.375rem;
75
+ min-inline-size: 0;
76
+ max-inline-size: 100%;
77
+ padding-block: 0.375rem;
78
+ padding-inline: 0.5rem;
79
+ cursor: text;
80
+ }
81
+
82
+ .cb-control-single {
83
+ flex-wrap: nowrap;
84
+ padding-block: 0;
85
+ padding-inline: 0.75rem;
86
+ }
87
+
88
+ .cb-control:hover,
89
+ .cb-text-control:hover {
90
+ border-color: #9aa3ad;
91
+ }
92
+
93
+ /* Chips participate directly in the control flex layout so the inter-item gap
94
+ is identical everywhere (including before the search field). */
95
+ .cb-chips {
96
+ display: contents;
97
+ }
98
+
99
+ .cb-chips:empty {
100
+ display: none;
101
+ }
102
+
103
+ /* The search input disappears into the control */
104
+ .cb-input {
105
+ flex: 1 1 4ch;
106
+ min-inline-size: 4ch;
107
+ max-inline-size: 100%;
108
+ inline-size: auto;
109
+ border: 0;
110
+ outline: 0;
111
+ margin: 0;
112
+ padding: 0;
113
+ background: transparent;
114
+ color: inherit;
115
+ font: inherit;
116
+ text-overflow: ellipsis;
117
+ }
118
+
119
+ .cb-control-single .cb-input {
120
+ flex-basis: 100%;
121
+ min-inline-size: 0;
122
+ }
123
+
124
+ .cb-input::placeholder,
125
+ .cb-text-control::placeholder,
126
+ .cb-fallback-input::placeholder {
127
+ color: var(--cb-muted-color);
128
+ opacity: 1;
129
+ }
130
+
131
+ /* ------------------------------------------------------------------------- */
132
+ /* Chips */
133
+ /* ------------------------------------------------------------------------- */
134
+
135
+ .cb-chip {
136
+ box-sizing: border-box;
137
+ display: inline-flex;
138
+ align-items: center;
139
+ gap: 0.2857em;
140
+ flex: 0 1 auto;
141
+ min-inline-size: 0;
142
+ min-block-size: 1.7143em;
143
+ max-inline-size: 100%;
144
+ padding-block: 0;
145
+ padding-inline-start: 0.5714em;
146
+ padding-inline-end: 0.1429em;
147
+ border: var(--cb-chip-border-width) solid var(--cb-chip-border-color);
148
+ border-radius: var(--cb-chip-border-radius);
149
+ background: var(--cb-chip-bg);
150
+ color: var(--cb-chip-color);
151
+ font-size: var(--cb-chip-font-size);
152
+ line-height: 1.4;
153
+ }
154
+
155
+ .cb-chip-label {
156
+ flex: 1 1 auto;
157
+ min-inline-size: 0;
158
+ overflow: hidden;
159
+ text-overflow: ellipsis;
160
+ white-space: nowrap;
161
+ }
162
+
163
+ .cb-chip .cb-chip-remove {
164
+ appearance: none;
165
+ display: inline-grid;
166
+ place-items: center;
167
+ flex: 0 0 auto;
168
+ inline-size: 1.4286em;
169
+ block-size: 1.4286em;
170
+ margin-inline-start: 0;
171
+ padding: 0;
172
+ border: 0;
173
+ border-radius: 999px;
174
+ background: transparent;
175
+ color: inherit;
176
+ font: inherit;
177
+ cursor: pointer;
178
+ }
179
+
180
+ .cb-chip .cb-chip-remove > svg {
181
+ inline-size: 1em;
182
+ block-size: 1em;
183
+ fill: none;
184
+ stroke: currentColor;
185
+ stroke-width: 2;
186
+ stroke-linecap: round;
187
+ }
188
+
189
+ @supports (color: color-mix(in srgb, red 50%, blue)) {
190
+ .cb-chip .cb-chip-remove:hover,
191
+ .cb-chip .cb-chip-remove:focus-visible {
192
+ background: color-mix(in srgb, currentColor 12%, transparent);
193
+ }
194
+ }
195
+
196
+ @supports not (color: color-mix(in srgb, red 50%, blue)) {
197
+ .cb-chip .cb-chip-remove:hover,
198
+ .cb-chip .cb-chip-remove:focus-visible {
199
+ background: rgb(0 0 0 / 0.08);
200
+ }
201
+ }
202
+
203
+ .cb-chip:focus-visible {
204
+ outline: 2px solid var(--cb-focus-color);
205
+ outline-offset: 1px;
206
+ }
207
+
208
+ /* ------------------------------------------------------------------------- */
209
+ /* Focus — whole control, no ring around the internal input */
210
+ /* ------------------------------------------------------------------------- */
211
+
212
+ .cb-text-control:focus,
213
+ .cb-control:focus-within {
214
+ border-color: var(--cb-focus-color);
215
+ outline: 2px solid rgb(13 110 253 / 0.35);
216
+ outline-offset: 2px;
217
+ }
218
+
219
+ @supports (color: color-mix(in srgb, red 50%, blue)) {
220
+ .cb-text-control:focus,
221
+ .cb-control:focus-within {
222
+ outline-color: color-mix(in srgb, var(--cb-focus-color) 40%, transparent);
223
+ }
224
+ }
225
+
226
+ @supports not (color: color-mix(in srgb, red 50%, blue)) {
227
+ .cb-text-control:focus,
228
+ .cb-control:focus-within {
229
+ outline-color: var(--cb-focus-color);
230
+ }
231
+ }
232
+
233
+ .cb-fallback-input:focus {
234
+ border-color: var(--cb-focus-color);
235
+ }
236
+
237
+ /* Open state reflection without a parallel JS state model */
238
+ .cb-control:has([aria-expanded="true"]) {
239
+ border-color: var(--cb-focus-color);
240
+ }
241
+
242
+ /* ------------------------------------------------------------------------- */
243
+ /* Picker / popover — natural continuation of the control */
244
+ /* ------------------------------------------------------------------------- */
245
+
246
+ .cb-popover {
247
+ box-sizing: border-box;
248
+ inset: auto;
249
+ margin: 0.25rem 0;
250
+ position: fixed;
251
+ position-area: bottom;
252
+ position-try: flip-block;
253
+ position-try-fallbacks: flip-block;
254
+ inline-size: anchor-size(width);
255
+ max-block-size: min(20rem, 50vh);
256
+ padding: 0.25rem;
257
+ overflow-x: hidden;
258
+ overflow-y: auto;
259
+ overscroll-behavior: contain;
260
+ border: 1px solid var(--cb-border-color);
261
+ border-radius: var(--cb-border-radius);
262
+ background: var(--cb-picker-bg);
263
+ color: var(--cb-color);
264
+ box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 15%);
265
+ }
266
+
267
+ .cb-popover::backdrop {
268
+ background: transparent;
269
+ }
270
+
271
+ .cb-listbox {
272
+ display: grid;
273
+ min-inline-size: 0;
274
+ gap: 0.125rem;
275
+ }
276
+
277
+ /* ------------------------------------------------------------------------- */
278
+ /* Options — stable geometry, active vs selected distinctly */
279
+ /* ------------------------------------------------------------------------- */
280
+
281
+ .cb-option,
282
+ .cb-empty,
283
+ .cb-group {
284
+ box-sizing: border-box;
285
+ inline-size: 100%;
286
+ min-inline-size: 0;
287
+ padding-block: 0.5rem;
288
+ padding-inline: 0.6rem;
289
+ }
290
+
291
+ .cb-option,
292
+ .cb-empty {
293
+ min-block-size: var(--cb-option-min-height);
294
+ border-radius: 0.25rem;
295
+ }
296
+
297
+ .cb-option {
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: space-between;
301
+ gap: 0.75em;
302
+ border: 0;
303
+ background: transparent;
304
+ color: inherit;
305
+ font: inherit;
306
+ text-align: start;
307
+ cursor: pointer;
308
+ user-select: none;
309
+ }
310
+
311
+ .cb-option-label {
312
+ flex: 1 1 auto;
313
+ min-inline-size: 0;
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ white-space: nowrap;
317
+ }
318
+
319
+ .cb-option:is(:hover, [data-active]) {
320
+ background: var(--cb-option-active-bg);
321
+ color: #fff;
322
+ }
323
+
324
+ .cb-option[aria-selected="true"] {
325
+ background: var(--cb-option-selected-bg);
326
+ }
327
+
328
+ .cb-option[aria-selected="true"]::after {
329
+ content: "";
330
+ flex: 0 0 auto;
331
+ inline-size: var(--cb-check-size);
332
+ block-size: var(--cb-check-size);
333
+ margin-inline-start: auto;
334
+ background: currentColor;
335
+ -webkit-mask:
336
+ url("data:image/svg+xml,%3Csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3E%3Cpath%20d='M5%2012l4%204L19%206'%20fill='none'%20stroke='%23000'%20stroke-width='2.25'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E")
337
+ center / contain no-repeat;
338
+ mask:
339
+ url("data:image/svg+xml,%3Csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3E%3Cpath%20d='M5%2012l4%204L19%206'%20fill='none'%20stroke='%23000'%20stroke-width='2.25'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E")
340
+ center / contain no-repeat;
341
+ }
342
+
343
+ .cb-option[aria-selected="true"]:is(:hover, [data-active]) {
344
+ background: var(--cb-option-active-bg);
345
+ color: #fff;
346
+ }
347
+
348
+ .cb-option[aria-disabled="true"],
349
+ .cb-option[disabled] {
350
+ opacity: 0.55;
351
+ cursor: not-allowed;
352
+ }
353
+
354
+ /* ------------------------------------------------------------------------- */
355
+ /* Empty / loading / error / create states — treated as real picker rows */
356
+ /* ------------------------------------------------------------------------- */
357
+
358
+ .cb-empty {
359
+ display: flex;
360
+ align-items: center;
361
+ color: var(--cb-muted-color);
362
+ overflow-wrap: anywhere;
363
+ }
364
+
365
+ .cb-empty.cb-error {
366
+ color: var(--cb-error-color);
367
+ }
368
+
369
+ .cb-group {
370
+ color: var(--cb-muted-color);
371
+ font-size: 0.875em;
372
+ font-weight: 600;
373
+ overflow: hidden;
374
+ text-overflow: ellipsis;
375
+ white-space: nowrap;
376
+ }
377
+
378
+ .cb-create {
379
+ font-style: italic;
380
+ }
381
+
382
+ .cb-create .cb-option-label {
383
+ color: var(--cb-focus-color);
384
+ }
385
+
386
+ .cb-status {
387
+ position: absolute;
388
+ inline-size: 1px;
389
+ block-size: 1px;
390
+ overflow: hidden;
391
+ clip-path: inset(50%);
392
+ white-space: nowrap;
393
+ }
394
+
395
+ /* ------------------------------------------------------------------------- */
396
+ /* States reflected from the native source */
397
+ /* ------------------------------------------------------------------------- */
398
+
399
+ .cb-text-control[aria-invalid="true"],
400
+ .cb-control:has([aria-invalid="true"]) {
401
+ border-color: var(--cb-error-color);
402
+ }
403
+
404
+ .cb-text-control[aria-invalid="true"]:focus,
405
+ .cb-control:has([aria-invalid="true"]):focus-within {
406
+ outline-color: var(--cb-error-color);
407
+ }
408
+
409
+ .cb-control:has(.cb-input:disabled) {
410
+ opacity: 0.65;
411
+ cursor: not-allowed;
412
+ }
413
+
414
+ .cb-input:read-only,
415
+ .cb-input:disabled {
416
+ cursor: default;
417
+ }
418
+
419
+ /* ------------------------------------------------------------------------- */
420
+ /* Fallback creation control — same system, no second engine */
421
+ /* ------------------------------------------------------------------------- */
422
+
423
+ .cb-fallback-create {
424
+ display: flex;
425
+ gap: 0.5rem;
426
+ margin-block-start: 0.5rem;
427
+ }
428
+
429
+ .cb-fallback-input {
430
+ flex: 1 1 auto;
431
+ }
432
+
433
+ .cb-fallback-add {
434
+ flex: 0 0 auto;
435
+ padding-inline: 0.875rem;
436
+ cursor: pointer;
437
+ }
438
+
439
+ .cb-fallback-add:hover {
440
+ border-color: var(--cb-focus-color);
441
+ }
442
+
443
+ /* The custom element is an enhancement/lifecycle boundary, not a shadow tree. */
444
+ combo-box {
445
+ display: block;
446
+ min-inline-size: 0;
447
+ }