@aquera/nile-elements 1.7.1 → 1.7.3

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