@aquera/nile-elements 1.7.1 → 1.7.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 (75) hide show
  1. package/README.md +3 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +1396 -413
  5. package/dist/nile-combobox/index.cjs.js +2 -0
  6. package/dist/nile-combobox/index.cjs.js.map +1 -0
  7. package/dist/nile-combobox/index.esm.js +1 -0
  8. package/dist/nile-combobox/nile-combobox.cjs.js +2 -0
  9. package/dist/nile-combobox/nile-combobox.cjs.js.map +1 -0
  10. package/dist/nile-combobox/nile-combobox.css.cjs.js +2 -0
  11. package/dist/nile-combobox/nile-combobox.css.cjs.js.map +1 -0
  12. package/dist/nile-combobox/nile-combobox.css.esm.js +642 -0
  13. package/dist/nile-combobox/nile-combobox.esm.js +233 -0
  14. package/dist/nile-combobox/portal-manager.cjs.js +2 -0
  15. package/dist/nile-combobox/portal-manager.cjs.js.map +1 -0
  16. package/dist/nile-combobox/portal-manager.esm.js +1 -0
  17. package/dist/nile-combobox/renderer.cjs.js +2 -0
  18. package/dist/nile-combobox/renderer.cjs.js.map +1 -0
  19. package/dist/nile-combobox/renderer.esm.js +105 -0
  20. package/dist/nile-combobox/search-manager.cjs.js +2 -0
  21. package/dist/nile-combobox/search-manager.cjs.js.map +1 -0
  22. package/dist/nile-combobox/search-manager.esm.js +1 -0
  23. package/dist/nile-combobox/selection-manager.cjs.js +2 -0
  24. package/dist/nile-combobox/selection-manager.cjs.js.map +1 -0
  25. package/dist/nile-combobox/selection-manager.esm.js +1 -0
  26. package/dist/nile-combobox/types.cjs.js +2 -0
  27. package/dist/nile-combobox/types.cjs.js.map +1 -0
  28. package/dist/nile-combobox/types.esm.js +1 -0
  29. package/dist/src/index.d.ts +1 -0
  30. package/dist/src/index.js +1 -0
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/nile-combobox/index.d.ts +1 -0
  33. package/dist/src/nile-combobox/index.js +2 -0
  34. package/dist/src/nile-combobox/index.js.map +1 -0
  35. package/dist/src/nile-combobox/nile-combobox.css.d.ts +9 -0
  36. package/dist/src/nile-combobox/nile-combobox.css.js +651 -0
  37. package/dist/src/nile-combobox/nile-combobox.css.js.map +1 -0
  38. package/dist/src/nile-combobox/nile-combobox.d.ts +287 -0
  39. package/dist/src/nile-combobox/nile-combobox.js +1602 -0
  40. package/dist/src/nile-combobox/nile-combobox.js.map +1 -0
  41. package/dist/src/nile-combobox/nile-combobox.test.d.ts +1 -0
  42. package/dist/src/nile-combobox/nile-combobox.test.js +551 -0
  43. package/dist/src/nile-combobox/nile-combobox.test.js.map +1 -0
  44. package/dist/src/nile-combobox/portal-manager.d.ts +26 -0
  45. package/dist/src/nile-combobox/portal-manager.js +218 -0
  46. package/dist/src/nile-combobox/portal-manager.js.map +1 -0
  47. package/dist/src/nile-combobox/renderer.d.ts +20 -0
  48. package/dist/src/nile-combobox/renderer.js +210 -0
  49. package/dist/src/nile-combobox/renderer.js.map +1 -0
  50. package/dist/src/nile-combobox/search-manager.d.ts +15 -0
  51. package/dist/src/nile-combobox/search-manager.js +41 -0
  52. package/dist/src/nile-combobox/search-manager.js.map +1 -0
  53. package/dist/src/nile-combobox/selection-manager.d.ts +12 -0
  54. package/dist/src/nile-combobox/selection-manager.js +44 -0
  55. package/dist/src/nile-combobox/selection-manager.js.map +1 -0
  56. package/dist/src/nile-combobox/types.d.ts +23 -0
  57. package/dist/src/nile-combobox/types.js +8 -0
  58. package/dist/src/nile-combobox/types.js.map +1 -0
  59. package/dist/src/version.js +1 -1
  60. package/dist/src/version.js.map +1 -1
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +3 -1
  63. package/src/index.ts +1 -0
  64. package/src/nile-combobox/index.ts +1 -0
  65. package/src/nile-combobox/nile-combobox.css.ts +653 -0
  66. package/src/nile-combobox/nile-combobox.test.ts +704 -0
  67. package/src/nile-combobox/nile-combobox.ts +1663 -0
  68. package/src/nile-combobox/portal-manager.ts +263 -0
  69. package/src/nile-combobox/renderer.ts +349 -0
  70. package/src/nile-combobox/search-manager.ts +53 -0
  71. package/src/nile-combobox/selection-manager.ts +57 -0
  72. package/src/nile-combobox/types.ts +27 -0
  73. package/vscode-html-custom-data.json +306 -4
  74. package/web-dev-server.config.mjs +9 -0
  75. package/web-test-runner.config.mjs +11 -0
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent nile-elements following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "nile-elements",
6
- "version": "1.7.1",
6
+ "version": "1.7.2",
7
7
  "main": "dist/src/index.js",
8
8
  "type": "module",
9
9
  "module": "dist/src/index.js",
@@ -119,6 +119,7 @@
119
119
  "./nile-inline-sidebar-item": "./dist/src/nile-inline-sidebar-item/index.js",
120
120
  "./nile-lite-tooltip": "./dist/src/nile-lite-tooltip/index.js",
121
121
  "./nile-qr-code": "./dist/src/nile-qr-code/index.js",
122
+ "./nile-combobox": "./dist/src/nile-combobox/index.js",
122
123
  "./nile-floating-panel": "./dist/src/nile-floating-panel/index.js",
123
124
  "./nile-inline-sidebar-item-header": "./dist/src/nile-inline-sidebar-item-header/index.js",
124
125
  "./nile-inline-sidebar-item-body": "./dist/src/nile-inline-sidebar-item-body/index.js",
@@ -154,6 +155,7 @@
154
155
  "@floating-ui/dom": "^1.2.1",
155
156
  "@lit-labs/observers": "^2.0.6",
156
157
  "@lit-labs/virtualizer": "^2.0.15",
158
+ "@tanstack/lit-virtual": "^3.13.22",
157
159
  "@open-wc/form-control": "^0.5.0",
158
160
  "@open-wc/form-helpers": "^0.2.1",
159
161
  "@rollup/plugin-commonjs": "^25.0.3",
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export { NileIconButton } from './nile-icon-button';
25
25
  export { NileMenuItem } from './nile-menu-item';
26
26
  export { NileDropdown } from './nile-dropdown';
27
27
  export { NileAutoComplete } from './nile-auto-complete';
28
+ export { NileCombobox } from './nile-combobox';
28
29
  export { NileChip } from './nile-chip';
29
30
  export { NileTextarea } from './nile-textarea';
30
31
  export { NileDatePicker } from './nile-date-picker';
@@ -0,0 +1 @@
1
+ export { NileCombobox } from './nile-combobox';
@@ -0,0 +1,653 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import { css } from 'lit';
9
+
10
+ export const styles = css`
11
+ :host {
12
+ display: block;
13
+ box-sizing: border-box;
14
+ -webkit-font-smoothing: var(--nile-webkit-font-smoothing, var(--ng-webkit-font-smoothing));
15
+ -moz-osx-font-smoothing: var(--nile-moz-osx-font-smoothing, var(--ng-moz-osx-font-smoothing));
16
+ text-rendering: var(--nile-text-rendering, var(--ng-text-rendering));
17
+ }
18
+
19
+ :host *,
20
+ :host *::before,
21
+ :host *::after {
22
+ box-sizing: inherit;
23
+ }
24
+
25
+ [hidden] {
26
+ display: none;
27
+ }
28
+
29
+ /* ── Form control ── */
30
+
31
+ .form-control .form-control__label {
32
+ display: none;
33
+ }
34
+
35
+ .form-control--has-label .form-control__label {
36
+ display: block;
37
+ margin-bottom: var(--nile-spacing-sm, var(--ng-spacing-sm));
38
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-secondary-700));
39
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
40
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));
41
+ font-style: normal;
42
+ font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));
43
+ line-height: var(--nile-spacing-2xl, var(--ng-line-height-text-sm));
44
+ letter-spacing: 0.2px;
45
+ }
46
+
47
+ .form-control--has-label.form-control--medium .form-control__label {
48
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
49
+ }
50
+
51
+ :host([required]) .form-control--has-label .form-control__label::after {
52
+ content: '*';
53
+ margin-inline-start: -2px;
54
+ color: var(--nile-colors-red-700, var(--ng-colors-text-error-primary-600));
55
+ }
56
+
57
+ :host([disabled]) .form-control--has-label .form-control__label {
58
+ user-select: none;
59
+ -webkit-user-select: none;
60
+ }
61
+
62
+ /* ── Popup ── */
63
+
64
+ .combobox-popup {
65
+ flex: 1 1 auto;
66
+ display: inline-flex;
67
+ width: 100%;
68
+ position: relative;
69
+ vertical-align: middle;
70
+ }
71
+
72
+ .combobox-popup::part(popup) {
73
+ z-index: 9999;
74
+ }
75
+
76
+ .combobox-popup[data-current-placement^='top']::part(popup) {
77
+ transform-origin: bottom;
78
+ }
79
+
80
+ .combobox-popup[data-current-placement^='bottom']::part(popup) {
81
+ transform-origin: top;
82
+ }
83
+
84
+ /* ── Trigger: outer row that never scrolls ── */
85
+
86
+ .combobox__trigger {
87
+ display: flex;
88
+ align-items: center;
89
+ width: 100%;
90
+ min-width: 0;
91
+ position: relative;
92
+ font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));
93
+ font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));
94
+ letter-spacing: normal;
95
+ cursor: text;
96
+ transition: 150ms color, 150ms border, 150ms box-shadow, 150ms background-color;
97
+ background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
98
+ border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-primary));
99
+ outline: none;
100
+ }
101
+
102
+ .combobox__trigger:hover {
103
+ border-color: var(--nile-colors-dark-900, var(--ng-colors-border-neutral));
104
+ }
105
+
106
+ .combobox--open .combobox__trigger,
107
+ .combobox--focused .combobox__trigger {
108
+ border-color: var(--ng-colors-border-brand);
109
+ box-shadow: 0 0 0 1px var(--ng-colors-border-brand) inset;
110
+ background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
111
+ }
112
+
113
+ .combobox--disabled .combobox__trigger {
114
+ background-color: var(--nile-colors-dark-200, var(--ng-colors-bg-disabled-subtle));
115
+ border-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary));
116
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));
117
+ cursor: not-allowed;
118
+ user-select: none;
119
+ }
120
+
121
+ .combobox--warning .combobox__trigger {
122
+ border-color: var(--nile-colors-yellow-500, var(--ng-colors-border-warning));
123
+ }
124
+
125
+ .combobox--error .combobox__trigger {
126
+ border-color: var(--nile-colors-red-500, var(--ng-colors-border-error));
127
+ }
128
+
129
+ .combobox--success .combobox__trigger {
130
+ border-color: var(--nile-colors-green-500, var(--ng-componentcolors-utility-success-500));
131
+ }
132
+
133
+ /* Size: small */
134
+ .combobox--small .combobox__trigger {
135
+ border-radius: var(--nile-radius-sm, var(--ng-radius-md));
136
+ font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
137
+ padding: var(--nile-spacing-md, var(--ng-spacing-sm)) var(--nile-spacing-md, var(--ng-spacing-md));
138
+ min-height: var(--nile-height-32px, var(--ng-height-32px));
139
+ }
140
+
141
+ /* Size: medium */
142
+ .combobox--medium .combobox__trigger {
143
+ border-radius: var(--nile-radius-sm, var(--ng-radius-md));
144
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
145
+ padding: var(--nile-spacing-5px, var(--ng-spacing-md)) var(--nile-spacing-10px, var(--ng-spacing-lg));
146
+ min-height: var(--nile-height-40px, var(--ng-height-40px));
147
+ }
148
+
149
+ /* Size: large */
150
+ .combobox--large .combobox__trigger {
151
+ border-radius: var(--nile-radius-sm, var(--ng-radius-md));
152
+ font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));
153
+ padding: var(--nile-spacing-xl, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));
154
+ min-height: var(--nile-height-48px, var(--ng-height-48px));
155
+ }
156
+
157
+ .combobox--pill .combobox__trigger {
158
+ border-radius: var(--nile-radius-3xl, var(--ng-radius-3xl));
159
+ }
160
+
161
+ .combobox--filled .combobox__trigger {
162
+ border: none;
163
+ background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
164
+ }
165
+
166
+ .combobox--filled.combobox--open .combobox__trigger,
167
+ .combobox--filled.combobox--focused .combobox__trigger {
168
+ outline: 3px solid rgba(0, 89, 255, 0.4);
169
+ }
170
+
171
+ /* ── Inner area: holds tags + input ── */
172
+
173
+ .combobox__scroll-area {
174
+ flex: 1;
175
+ min-width: 0;
176
+ display: flex;
177
+ flex-wrap: wrap;
178
+ align-items: center;
179
+ gap: 4px;
180
+ overflow: hidden;
181
+ }
182
+
183
+ /* Single-line: horizontal scroll for overflowing tags */
184
+ .combobox__scroll-area--single-line {
185
+ flex-wrap: nowrap;
186
+ overflow-x: auto;
187
+ overflow-y: hidden;
188
+ -webkit-overflow-scrolling: touch;
189
+ scrollbar-width: thin;
190
+ scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary)) transparent;
191
+ }
192
+
193
+ .combobox__scroll-area--single-line::-webkit-scrollbar {
194
+ height: 3px;
195
+ }
196
+
197
+ .combobox__scroll-area--single-line::-webkit-scrollbar-track {
198
+ background: transparent;
199
+ }
200
+
201
+ .combobox__scroll-area--single-line::-webkit-scrollbar-thumb {
202
+ background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));
203
+ border-radius: 3px;
204
+ }
205
+
206
+ .combobox__scroll-area--single-line::-webkit-scrollbar-thumb:hover {
207
+ background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));
208
+ }
209
+
210
+ /* Wrap: tags flow to multiple lines, trigger grows in height */
211
+ .combobox__scroll-area--wrap {
212
+ flex-wrap: wrap;
213
+ overflow: visible;
214
+ }
215
+
216
+ /* ── Tags inside the scroll area ── */
217
+
218
+ .combobox__scroll-area nile-tag {
219
+ cursor: pointer;
220
+ flex-shrink: 0;
221
+ }
222
+
223
+ .combobox--disabled .combobox__scroll-area nile-tag {
224
+ cursor: not-allowed;
225
+ }
226
+
227
+ .combobox__tags-count {
228
+ color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
229
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
230
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
231
+ font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));
232
+ line-height: var(--nile-line-height-xsmall, var(--ng-line-height-text-sm));
233
+ letter-spacing: 0.2px;
234
+ white-space: nowrap;
235
+ flex-shrink: 0;
236
+ }
237
+
238
+ /* ── Input wrapper inside scroll area ── */
239
+
240
+ .combobox__input-wrapper {
241
+ flex: 1;
242
+ min-width: 60px;
243
+ display: flex;
244
+ align-items: center;
245
+ }
246
+
247
+ .combobox__input {
248
+ width: 100%;
249
+ font: inherit;
250
+ border: none;
251
+ background: none;
252
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
253
+ cursor: inherit;
254
+ overflow: hidden;
255
+ padding: 0;
256
+ margin: 0;
257
+ -webkit-appearance: none;
258
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
259
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));
260
+ font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));
261
+ text-overflow: ellipsis;
262
+ line-height: var(--nile-spacing-2xl, var(--ng-line-height-text-sm));
263
+ }
264
+
265
+ .combobox__input::placeholder {
266
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
267
+ color: var(--nile-colors-text-placeholder, var(--ng-colors-text-placeholder));
268
+ }
269
+
270
+ .combobox__input:focus {
271
+ outline: none;
272
+ }
273
+
274
+ .combobox--disabled .combobox__input {
275
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));
276
+ pointer-events: none;
277
+ }
278
+
279
+ /* ── Hidden form value input ── */
280
+
281
+ .combobox__value-input {
282
+ position: absolute;
283
+ top: 0;
284
+ left: 0;
285
+ width: 100%;
286
+ height: 100%;
287
+ padding: 0;
288
+ margin: 0;
289
+ opacity: 0;
290
+ z-index: -1;
291
+ }
292
+
293
+ /* ── Action icons (clear, expand) ── */
294
+
295
+ .combobox__actions {
296
+ display: flex;
297
+ align-items: center;
298
+ flex-shrink: 0;
299
+ gap: var(--nile-spacing-sm, var(--ng-spacing-sm));
300
+ margin-inline-start: auto;
301
+ }
302
+
303
+ .combobox__clear {
304
+ display: inline-flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ border: none;
308
+ background: none;
309
+ padding: 0;
310
+ cursor: pointer;
311
+ color: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));
312
+ transition: 150ms color;
313
+ }
314
+
315
+ .combobox__clear:hover {
316
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
317
+ }
318
+
319
+ .combobox__clear:focus {
320
+ outline: none;
321
+ }
322
+
323
+ .combobox__expand-icon {
324
+ display: flex;
325
+ align-items: center;
326
+ flex-shrink: 0;
327
+ transition: 250ms rotate ease;
328
+ rotate: 0;
329
+ }
330
+
331
+ .combobox--open .combobox__expand-icon {
332
+ rotate: -180deg;
333
+ }
334
+
335
+ /* ── Prefix / suffix ── */
336
+
337
+ .combobox__prefix,
338
+ .combobox__suffix {
339
+ flex: 0;
340
+ display: inline-flex;
341
+ align-items: center;
342
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));
343
+ }
344
+
345
+ .combobox__prefix {
346
+ margin-inline-end: var(--nile-spacing-md, var(--ng-spacing-md));
347
+ }
348
+
349
+ /* ── Listbox (dropdown) ── */
350
+
351
+ .combobox__listbox {
352
+ display: block;
353
+ position: relative;
354
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));
355
+ font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));
356
+ background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
357
+ border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-secondary-alt));
358
+ border-radius: var(--nile-radius-sm, var(--ng-radius-md));
359
+ padding-block: var(--nile-spacing-none, var(--ng-spacing-xs));
360
+ padding-inline: var(--nile-spacing-none, var(--ng-spacing-xs));
361
+ overscroll-behavior: none;
362
+ overflow-y: auto;
363
+ max-width: var(--auto-size-available-width);
364
+ max-height: var(--auto-size-available-height);
365
+ box-shadow: 0px 2px 4px 0px rgba(119, 125, 130, 0.15);
366
+ }
367
+
368
+ /* ── Options ── */
369
+
370
+ .combobox__options {
371
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
372
+ color: rgb(133, 129, 129);
373
+ width: 100%;
374
+ }
375
+
376
+ .combobox__options.loading {
377
+ opacity: 0.5;
378
+ pointer-events: none;
379
+ }
380
+
381
+ .combobox__no-results {
382
+ padding: var(--nile-spacing-lg, var(--ng-spacing-lg));
383
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
384
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
385
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));
386
+ text-align: center;
387
+ }
388
+
389
+ .combobox__no-results-title {
390
+ font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));
391
+ color: var(--nile-colors-dark-700, var(--ng-colors-text-secondary-700));
392
+ }
393
+
394
+ .combobox__no-results-subtitle {
395
+ margin-top: var(--nile-spacing-xs, var(--ng-spacing-xs));
396
+ font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
397
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));
398
+ }
399
+
400
+ /* ── Options (both virtual and plain) ── */
401
+
402
+ .combobox__options nile-option {
403
+ width: 100%;
404
+ display: block;
405
+ }
406
+
407
+ .combobox__options nile-option[selected] {
408
+ background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
409
+ }
410
+
411
+ .combobox__options nile-option[selected]::part(base) {
412
+ color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
413
+ }
414
+
415
+ .combobox__options-plain {
416
+ display: flex;
417
+ flex-direction: column;
418
+ }
419
+
420
+ .combobox__options-plain nile-option {
421
+ flex-shrink: 0;
422
+ }
423
+
424
+ /* ── Top actions (Select All + Selected/All filter toggle) ── */
425
+
426
+ .combobox__top-actions {
427
+ position: sticky;
428
+ top: 0;
429
+ z-index: 2;
430
+ display: flex;
431
+ flex-direction: row;
432
+ align-items: center;
433
+ justify-content: space-between;
434
+ gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
435
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
436
+ border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
437
+ padding: var(--nile-spacing-lg, var(--ng-spacing-lg));
438
+ user-select: none;
439
+ }
440
+
441
+ .combobox__top-actions--disabled {
442
+ opacity: 0.6;
443
+ pointer-events: none;
444
+ }
445
+
446
+ .combobox__select-all {
447
+ display: flex;
448
+ align-items: center;
449
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
450
+ cursor: pointer;
451
+ flex: 1 1 auto;
452
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
453
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
454
+ line-height: 14px;
455
+ letter-spacing: 0.2px;
456
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary));
457
+ }
458
+
459
+ .combobox__show-toggle {
460
+ display: inline-flex;
461
+ align-items: center;
462
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
463
+ border: none;
464
+ background: none;
465
+ padding: 0;
466
+ border-radius: var(--nile-radius-sm, var(--ng-radius-sm));
467
+ cursor: pointer;
468
+ color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
469
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
470
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
471
+ line-height: 14px;
472
+ letter-spacing: 0.2px;
473
+ white-space: nowrap;
474
+ }
475
+
476
+ .combobox__show-toggle[disabled] {
477
+ color: var(--nile-colors-primary-500, var(--ng-colors-fg-quaternary-400));
478
+ cursor: not-allowed;
479
+ }
480
+
481
+ /* ── Footer ── */
482
+
483
+ .combobox__footer {
484
+ position: sticky;
485
+ bottom: 0;
486
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
487
+ border-top: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
488
+ display: flex;
489
+ flex-direction: row;
490
+ align-items: flex-start;
491
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));
492
+ gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
493
+ justify-content: space-between;
494
+ }
495
+
496
+ .combobox__footer.loading {
497
+ opacity: 0.5;
498
+ pointer-events: none;
499
+ }
500
+
501
+ .combobox__footer-clear {
502
+ display: inline-flex;
503
+ align-items: center;
504
+ color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
505
+ border: none;
506
+ background: none;
507
+ padding: 0;
508
+ cursor: pointer;
509
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
510
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
511
+ letter-spacing: 0.2px;
512
+ }
513
+
514
+ .combobox__footer-clear:hover {
515
+ text-decoration: underline;
516
+ }
517
+
518
+ /* ── Loader ── */
519
+
520
+ .combobox__loader {
521
+ width: 100%;
522
+ text-align: center;
523
+ display: block;
524
+ }
525
+
526
+ .combobox__loader--icon {
527
+ margin-top: var(--nile-spacing-xl, var(--ng-spacing-xl));
528
+ animation: combobox-spin 0.6s linear infinite;
529
+ }
530
+
531
+ .combobox__loader--center {
532
+ position: absolute;
533
+ display: flex;
534
+ justify-content: center;
535
+ align-items: center;
536
+ width: 100%;
537
+ height: 75%;
538
+ }
539
+
540
+ @keyframes combobox-spin {
541
+ 0% { transform: rotate(0deg); }
542
+ 100% { transform: rotate(360deg); }
543
+ }
544
+
545
+ .combobox__add-option::part(base) {
546
+ color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
547
+ }
548
+
549
+ /* ── Grid layout ── */
550
+
551
+ :host([grid-columns]) .combobox__listbox {
552
+ overflow-y: auto;
553
+ }
554
+
555
+ .combobox__grid-row {
556
+ width: 100%;
557
+ }
558
+
559
+ .combobox__grid-row nile-option {
560
+ min-width: 0;
561
+ overflow: hidden;
562
+ }
563
+
564
+ .combobox__grid-row nile-option::part(base) {
565
+ border-radius: var(--nile-radius-xs, var(--ng-radius-sm));
566
+ }
567
+
568
+ /* ── Bidirectional grid layout (vertical + horizontal scroll) ── */
569
+
570
+ .combobox__listbox.combobox__listbox--bidirectional {
571
+ overflow: auto;
572
+ max-width: none;
573
+ scrollbar-width: thin;
574
+ scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;
575
+ }
576
+
577
+ .combobox__listbox--bidirectional .combobox__options {
578
+ width: max-content;
579
+ min-width: 100%;
580
+ }
581
+
582
+ .combobox__listbox--bidirectional .combobox__grid-row {
583
+ width: max-content;
584
+ min-width: 100%;
585
+ }
586
+
587
+ /* ── Horizontal grid layout ── */
588
+
589
+ .combobox__listbox.combobox__listbox--horizontal {
590
+ overflow-x: auto;
591
+ overflow-y: hidden;
592
+ max-height: none;
593
+ max-width: none;
594
+ width: 100%;
595
+ scrollbar-width: thin;
596
+ scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;
597
+ }
598
+
599
+ .combobox__listbox--horizontal::-webkit-scrollbar {
600
+ height: 6px;
601
+ }
602
+
603
+ .combobox__listbox--horizontal::-webkit-scrollbar-track {
604
+ background: transparent;
605
+ }
606
+
607
+ .combobox__listbox--horizontal::-webkit-scrollbar-thumb {
608
+ background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));
609
+ border-radius: 3px;
610
+ }
611
+
612
+ .combobox__listbox--horizontal::-webkit-scrollbar-thumb:hover {
613
+ background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));
614
+ }
615
+
616
+ .combobox__options--horizontal {
617
+ display: block;
618
+ width: max-content;
619
+ min-width: 100%;
620
+ }
621
+
622
+ .combobox__grid-col {
623
+ border-right: 1px solid var(--nile-colors-neutral-200, var(--ng-colors-border-secondary));
624
+ }
625
+
626
+ .combobox__grid-col:last-child {
627
+ border-right: none;
628
+ }
629
+
630
+ .combobox__grid-col nile-option {
631
+ width: 100%;
632
+ display: block;
633
+ }
634
+
635
+ .combobox__grid-col nile-option::part(base) {
636
+ border-radius: 0;
637
+ }
638
+
639
+ /* ── Help / Error ── */
640
+
641
+ .form-control__help-text {
642
+ display: none;
643
+ }
644
+
645
+ .form-control--has-help-text .form-control__help-text {
646
+ display: block;
647
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));
648
+ margin-top: var(--nile-spacing-lg, var(--ng-spacing-lg));
649
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
650
+ }
651
+ `;
652
+
653
+ export default [styles];