@aquera/nile-visualization 2.9.7 → 2.9.9

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.
@@ -5,7 +5,7 @@ export const styles = css `
5
5
  .fc-root {
6
6
  display: flex;
7
7
  flex-direction: column;
8
- gap: var(--nile-spacing-none, var(--ng-spacing-0));
8
+ gap: var(--nile-spacing-none, var(--ng-spacing-none));
9
9
  }
10
10
 
11
11
  /* ── Group ─── */
@@ -19,10 +19,10 @@ export const styles = css `
19
19
  display: flex;
20
20
  align-items: center;
21
21
  justify-content: space-between;
22
- padding: var(--nile-spacing-lg, var(--ng-spacing-3)) var(--nile-spacing-2xl, var(--ng-spacing-5));
22
+ padding: var(--nile-spacing-lg, var(--ng-spacing-lg)) var(--nile-spacing-2xl, var(--ng-spacing-2xl));
23
23
  background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
24
24
  border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
25
- gap: var(--nile-spacing-8px, var(--ng-spacing-2));
25
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
26
26
  }
27
27
 
28
28
  .fc-group__header--collapsible {
@@ -37,11 +37,11 @@ export const styles = css `
37
37
  .fc-group__header-text {
38
38
  display: flex;
39
39
  flex-direction: column;
40
- gap: var(--nile-spacing-2px, var(--ng-spacing-0-5));
40
+ gap: var(--nile-spacing-2px, var(--ng-spacing-xxs));
41
41
  }
42
42
 
43
43
  .fc-group__label {
44
- font-size: var(--nile-font-size-sm, 13px);
44
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
45
45
  font-weight: var(--nile-font-weight-bold, var(--ng-font-weight-700));
46
46
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
47
47
  letter-spacing: 0.02em;
@@ -55,7 +55,7 @@ export const styles = css `
55
55
 
56
56
  .fc-group__chevron {
57
57
  font-size: var(--nile-type-scale-5, var(--ng-font-size-text-lg));
58
- font-weight: var(--ng-font-weight-300, 300);
58
+ font-weight: var(ng-font-weight-regular);
59
59
  color: var(--nile-colors-neutral-700, var(--ng-colors-text-quaternary-500));
60
60
  transition: transform 0.2s ease;
61
61
  transform: rotate(0deg);
@@ -79,50 +79,53 @@ export const styles = css `
79
79
  border-bottom: none;
80
80
  }
81
81
 
82
- /* ── Control card ─── */
83
82
  .fc-control {
84
- padding: var(--nile-spacing-xl, var(--ng-spacing-4)) var(--nile-spacing-2xl, var(--ng-spacing-5));
83
+ padding: var(--nile-spacing-xl, var(--ng-spacing-xl)) var(--nile-spacing-2xl, var(--ng-spacing-2xl));
84
+ }
85
+
86
+ :host([appearance="minimal"]) .fc-control {
87
+ padding: var(--nile-spacing-6px, var(--ng-spacing-sm));
85
88
  }
86
89
 
87
90
  .fc-control__label {
88
- font-size: var(--nile-font-size-sm, 13px);
91
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
89
92
  font-weight: var(--nile-font-weight-semi-bold, var(--ng-font-weight-600));
90
93
  color: var(--nile-colors-neutral-700, var(--ng-colors-text-tertiary-600));
91
94
  text-transform: uppercase;
92
95
  letter-spacing: 0.05em;
93
96
  line-height: 1.4;
94
- padding-top: 2px;
95
- margin-bottom: var(--nile-spacing-4px, var(--ng-spacing-1));
97
+ padding-top: var(--nile-spacing-2px, var(--ng-spacing-xxs));
98
+ margin-bottom: var(--nile-spacing-4px, var(--ng-spacing-xs));
96
99
  overflow: visible;
97
100
  }
98
101
 
99
102
  .fc-control__desc {
100
103
  font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
101
104
  color: var(--nile-colors-neutral-700, var(--ng-colors-text-quaternary-500));
102
- margin-bottom: var(--nile-spacing-lg, var(--ng-spacing-3));
105
+ margin-bottom: var(--nile-spacing-lg, var(--ng-spacing-lg));
103
106
  line-height: 1.4;
104
107
  }
105
108
 
106
109
  .fc-control__body {
107
110
  display: flex;
108
111
  flex-direction: column;
109
- gap: var(--nile-spacing-8px, var(--ng-spacing-2));
112
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
110
113
  }
111
114
 
112
115
  /* ── Badge ─── */
113
116
  .fc-badge-group {
114
117
  display: flex;
115
118
  flex-wrap: wrap;
116
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
119
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
117
120
  }
118
121
 
119
122
  .fc-badge {
120
123
  display: inline-flex;
121
124
  align-items: center;
122
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
123
- padding: var(--nile-spacing-4px, var(--ng-spacing-1)) var(--nile-spacing-14px, var(--ng-spacing-3-5));
125
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
126
+ padding: var(--nile-spacing-4px, var(--ng-spacing-xs)) var(--nile-spacing-14px, var(--ng-spacing-lg-alt));
124
127
  border-radius: var(--nile-radius-full, var(--ng-radius-full));
125
- font-size: var(--nile-font-size-sm, 13px);
128
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
126
129
  font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-500));
127
130
  cursor: pointer;
128
131
  border: 1.5px solid var(--nile-colors-neutral-500, var(--ng-colors-border-primary));
@@ -147,20 +150,20 @@ export const styles = css `
147
150
  .fc-badge--selected .fc-dot { border-color: var(--nile-colors-white-500, var(--ng-color-graydarkmodealpha-500)); }
148
151
 
149
152
  .fc-dot {
150
- width: var(--nile-spacing-8px, var(--ng-spacing-2));
151
- height: var(--nile-spacing-8px, var(--ng-spacing-2));
153
+ width: var(--nile-spacing-md, var(--ng-spacing-md));
154
+ height: var(--nile-spacing-md, var(--ng-spacing-md));
152
155
  border-radius: var(--nile-radius-full, var(--ng-radius-full));
153
156
  flex-shrink: 0;
154
157
  border: 1.5px solid var(--nile-colors-transparent, var(--ng-color-base-transparent));
155
158
  }
156
159
 
157
160
  /* ── Slider ─── */
158
- .fc-slider-wrap { display: flex; flex-direction: column; gap: var(--nile-spacing-10px, var(--ng-spacing-2-5)); }
161
+ .fc-slider-wrap { display: flex; flex-direction: column; gap: var(--nile-spacing-10px, var(--ng-spacing-md-alt)); }
159
162
 
160
163
  .fc-slider-label {
161
164
  display: flex;
162
165
  justify-content: space-between;
163
- font-size: var(--nile-font-size-sm, 13px);
166
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
164
167
  color: var(--nile-colors-neutral-700, var(--ng-colors-text-tertiary-600));
165
168
  }
166
169
 
@@ -173,7 +176,7 @@ export const styles = css `
173
176
 
174
177
  nile-slider::part(base) {
175
178
  height: auto;
176
- padding: var(--nile-spacing-4px, var(--ng-spacing-1)) var(--nile-spacing-none, var(--ng-spacing-0));
179
+ padding: var(--nile-spacing-4px, var(--ng-spacing-xs)) var(--nile-spacing-none, var(--ng-spacing-none));
177
180
  }
178
181
 
179
182
  nile-slider::part(range-container) {
@@ -182,31 +185,25 @@ export const styles = css `
182
185
  min-width: 0;
183
186
  }
184
187
 
185
- /* Make the track fill the container and be easier to see */
186
188
  nile-slider::part(range) {
187
189
  width: 100%;
188
- height: var(--nile-height-6px, var(--ng-spacing-1-5));
190
+ height: var(--nile-spacing-6px, var(--ng-spacing-sm));
189
191
  }
190
192
 
191
- /* The filled portion between the two handles */
192
193
  nile-slider::part(range-completed) {
193
194
  background-color: var(--nile-colors-primary-600, var(--ng-color-bluedark-600));
194
195
  height: 100%;
195
196
  }
196
197
 
197
- /* ── Tree ─── */
198
- /* nile-tree sets font-size:0 on :host for em-based indentation maths.
199
- Without --nile-type-scale-4 defined the label inherits 0 and becomes invisible.
200
- We also enable indent guide lines and fix the indent step size. */
201
198
  nile-tree {
202
- --nile-type-scale-4: var(--nile-font-size-sm, 13px);
199
+ --nile-type-scale-4: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
203
200
  --indent-size: 0.875rem;
204
201
  --indent-guide-width: 1px;
205
202
  --indent-guide-style: solid;
206
203
  --indent-guide-color: var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
207
204
  }
208
205
 
209
- /* ── Segmented ─── */
206
+
210
207
  .fc-segmented-scroll {
211
208
  overflow-x: auto;
212
209
  overflow-y: hidden;
@@ -222,19 +219,18 @@ export const styles = css `
222
219
  min-width: max-content;
223
220
  }
224
221
 
225
- /* ── Toggle ─── */
222
+
226
223
  .fc-toggle-group {
227
224
  display: flex;
228
225
  flex-direction: column;
229
- gap: var(--nile-spacing-10px, var(--ng-spacing-2-5));
226
+ gap: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
230
227
  }
231
228
 
232
229
 
233
- /* ── Comparison ─── */
234
230
  .fc-comparison {
235
231
  display: flex;
236
232
  align-items: center;
237
- gap: var(--nile-spacing-10px, var(--ng-spacing-2-5));
233
+ gap: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
238
234
  }
239
235
 
240
236
  .fc-comparison nile-select { flex: 1; }
@@ -246,7 +242,7 @@ export const styles = css `
246
242
  color: var(--nile-colors-white-base, var(--ng-color-base-white));
247
243
  background: var(--nile-colors-neutral-700, var(--ng-color-graylightmode-700));
248
244
  border-radius: var(--nile-radius-sm, var(--ng-radius-xs));
249
- padding: 3px var(--nile-spacing-6px, var(--ng-spacing-1-5));
245
+ padding: 3px var(--nile-spacing-6px, var(--ng-spacing-sm));
250
246
  letter-spacing: 0.05em;
251
247
  }
252
248
 
@@ -254,26 +250,26 @@ export const styles = css `
254
250
  .fc-threshold {
255
251
  display: flex;
256
252
  flex-direction: column;
257
- gap: var(--nile-spacing-lg, var(--ng-spacing-3));
253
+ gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
258
254
  }
259
255
 
260
256
  .fc-threshold-metric-row {
261
257
  display: flex;
262
258
  align-items: flex-end;
263
- gap: var(--nile-spacing-10px, var(--ng-spacing-2-5));
259
+ gap: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
264
260
  }
265
261
 
266
262
  .fc-threshold-cond-row {
267
263
  display: flex;
268
264
  align-items: flex-end;
269
- gap: var(--nile-spacing-lg, var(--ng-spacing-3));
270
- padding-left: var(--nile-spacing-4px, var(--ng-spacing-1));
265
+ gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
266
+ padding-left: var(--nile-spacing-4px, var(--ng-spacing-xs));
271
267
  }
272
268
 
273
269
  .fc-threshold-field {
274
270
  display: flex;
275
271
  flex-direction: column;
276
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
272
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
277
273
  }
278
274
 
279
275
  .fc-threshold-field-label {
@@ -291,25 +287,25 @@ export const styles = css `
291
287
  .fc-threshold-where {
292
288
  flex-shrink: 0;
293
289
  align-self: flex-end;
294
- margin-bottom: var(--nile-spacing-6px, var(--ng-spacing-1-5));
290
+ margin-bottom: var(--nile-spacing-6px, var(--ng-spacing-sm));
295
291
  font-size: 11px;
296
292
  font-weight: var(--nile-font-weight-bold, var(--ng-font-weight-700));
297
293
  letter-spacing: 0.06em;
298
294
  color: var(--nile-colors-white-base, var(--ng-color-base-white));
299
295
  background: var(--nile-colors-dark-500, var(--ng-color-graylightmode-600));
300
296
  border-radius: var(--nile-radius-sm, var(--ng-radius-xs));
301
- padding: var(--nile-spacing-4px, var(--ng-spacing-1)) var(--nile-spacing-10px, var(--ng-spacing-2-5));
297
+ padding: var(--nile-spacing-4px, var(--ng-spacing-xs)) var(--nile-spacing-10px, var(--ng-spacing-md-alt));
302
298
  }
303
299
 
304
300
  .fc-threshold-preview {
305
301
  display: flex;
306
302
  align-items: center;
307
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
308
- padding: var(--nile-spacing-8px, var(--ng-spacing-2)) var(--nile-spacing-lg, var(--ng-spacing-3));
303
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
304
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg));
309
305
  border-radius: var(--nile-radius-radius-lg, var(--ng-radius-sm));
310
306
  background: var(--nile-colors-primary-100, var(--ng-colors-bg-brand-primary));
311
307
  border: 1px solid var(--nile-colors-primary-400, var(--ng-color-bluedark-200));
312
- font-size: var(--nile-font-size-sm, 13px);
308
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
313
309
  color: var(--nile-colors-primary-700, var(--ng-colors-text-brand-secondary-700));
314
310
  font-family: monospace;
315
311
  }
@@ -326,18 +322,18 @@ export const styles = css `
326
322
  .fc-preset-list {
327
323
  display: flex;
328
324
  flex-direction: column;
329
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
325
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
330
326
  }
331
327
 
332
328
  .fc-preset-item {
333
329
  display: flex;
334
330
  align-items: center;
335
- gap: var(--nile-spacing-10px, var(--ng-spacing-2-5));
336
- padding: var(--nile-spacing-10px, var(--ng-spacing-2-5)) var(--nile-spacing-14px, var(--ng-spacing-3-5));
331
+ gap: var(--nile-spacing-10px, var(--ng-spacing-md-alt));
332
+ padding: var(--nile-spacing-10px, var(--ng-spacing-md-alt)) var(--nile-spacing-14px, var(--ng-spacing-lg-alt));
337
333
  border-radius: var(--nile-radius-md, var(--ng-radius-md));
338
334
  border: 1.5px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
339
335
  background: var(--nile-colors-white-base, var(--ng-color-base-white));
340
- font-size: var(--nile-font-size-sm, 13px);
336
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
341
337
  font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-500));
342
338
  color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary-700));
343
339
  cursor: pointer;
@@ -372,22 +368,22 @@ export const styles = css `
372
368
  --fc-prompt-gradient,
373
369
  linear-gradient(
374
370
  90deg,
375
- #2563eb 0%,
376
- #3b82f6 18%,
377
- #06b6d4 36%,
378
- #6366f1 54%,
379
- #8b5cf6 72%,
380
- #2563eb 100%
371
+ var(--ng-color-blue-600) 0%,
372
+ var(--ng-color-blue-500) 18%,
373
+ var(--ng-color-cyan-500) 36%,
374
+ var(--ng-color-indigo-500) 54%,
375
+ var(--ng-color-violet-500) 72%,
376
+ var(--ng-color-blue-600) 100%
381
377
  )
382
378
  );
383
379
  background-size: 300% 100%;
384
380
  animation: fc-prompt-gradient var(--fc-prompt-gradient-speed, 4.5s) linear infinite;
385
- box-shadow: 0 6px 6px -6px rgba(59, 130, 246, 0.45);
381
+ box-shadow: 0 6px 6px -6px color-mix(in srgb, var(--ng-color-blue-500) 45%, transparent);
386
382
  }
387
383
 
388
384
 
389
385
  .fc-prompt:focus-within {
390
- box-shadow: 0 8px 8px -6px rgba(59, 130, 246, 0.6);
386
+ box-shadow: 0 8px 8px -6px color-mix(in srgb, var(--ng-color-blue-500) 60%, transparent);
391
387
  }
392
388
 
393
389
  .fc-prompt--no-ai-border {
@@ -404,11 +400,7 @@ export const styles = css `
404
400
  .fc-prompt--no-ai-border .fc-prompt__inner {
405
401
  border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
406
402
  }
407
-
408
- /* ── Error state ─── */
409
- /* Drop the animated AI gradient and the 2px outer ring; the error reads
410
- as a thin red border directly on the input with a soft focus halo,
411
- and a quiet inline message underneath — no heavy box. */
403
+
412
404
  .fc-prompt--error {
413
405
  padding: 0;
414
406
  background: transparent;
@@ -421,23 +413,23 @@ export const styles = css `
421
413
  }
422
414
 
423
415
  .fc-prompt--error .fc-prompt__inner {
424
- background: var(--nile-colors-white-base, var(--ng-colors-bg-primary, #fff));
425
- border: 1.5px solid var(--nile-colors-error-500, var(--ng-colors-border-error, #f04438));
416
+ background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
417
+ border: 1.5px solid var(--ng-colors-border-error);
426
418
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
427
419
  }
428
420
 
429
421
  .fc-prompt--error:focus-within .fc-prompt__inner {
430
- border-color: var(--nile-colors-error-600, var(--ng-colors-border-error-strong, #d92d20));
422
+ border-color: var(--ng-colors-border-error-strong);
431
423
  box-shadow: 0 0 0 4px rgba(240, 68, 56, 0.14);
432
424
  }
433
425
 
434
426
  .fc-prompt__error {
435
427
  display: flex;
436
428
  align-items: center;
437
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
438
- margin-top: var(--nile-spacing-6px, var(--ng-spacing-1-5));
439
- padding: 0 var(--nile-spacing-2px, var(--ng-spacing-0-5));
440
- color: var(--nile-colors-error-600, var(--ng-colors-text-error-primary-600, #d92d20));
429
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
430
+ margin-top: var(--nile-spacing-6px, var(--ng-spacing-sm));
431
+ padding: 0 var(--nile-spacing-2px, var(--ng-spacing-xxs));
432
+ color: var(--ng-colors-text-error-primary-600);
441
433
  font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
442
434
  line-height: 1.4;
443
435
  animation: fc-prompt-error-in 0.18s ease-out both;
@@ -450,7 +442,7 @@ export const styles = css `
450
442
  width: 14px;
451
443
  height: 14px;
452
444
  border-radius: 50%;
453
- background: var(--nile-colors-error-500, var(--ng-colors-bg-error-solid, #f04438));
445
+ background: var(--ng-colors-bg-error-solid);
454
446
  color: var(--nile-colors-white-base, var(--ng-color-base-white));
455
447
  font-weight: var(--nile-font-weight-bold, var(--ng-font-weight-700));
456
448
  font-size: 10px;
@@ -476,9 +468,8 @@ export const styles = css `
476
468
  position: relative;
477
469
  display: flex;
478
470
  align-items: center;
479
- gap: var(--nile-spacing-md, var(--ng-spacing-2));
480
- padding-right: var(--nile-spacing-md, var(--ng-spacing-2));
481
- border-radius: var(--nile-radius-radius-xl, var(--ng-radius-md));
471
+ padding-right: var(--nile-spacing-md, var(--ng-spacing-md));
472
+ border-radius: var(--nile-radius-md, var(--ng-radius-md));
482
473
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
483
474
  }
484
475
 
@@ -490,7 +481,7 @@ export const styles = css `
490
481
  outline: none;
491
482
  background: transparent;
492
483
  border-radius: inherit;
493
- padding: var(--nile-spacing-md, var(--ng-spacing-2)) var(--nile-spacing-xl, var(--ng-spacing-4));
484
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-xl, var(--ng-spacing-xl));
494
485
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
495
486
  font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));
496
487
  font-weight: 400;
@@ -506,17 +497,17 @@ export const styles = css `
506
497
  .fc-prompt__mode {
507
498
  flex-shrink: 0;
508
499
  align-self: center;
509
- margin-left: var(--nile-spacing-md, var(--ng-spacing-2));
510
- border-radius: var(--nile-radius-radius-lg, var(--ng-radius-lg));
500
+ margin-left: var(--nile-spacing-md, var(--ng-spacing-md));
501
+ border-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
511
502
  overflow: hidden;
512
503
  }
513
504
 
514
505
  .fc-prompt__mode nile-button-toggle::part(base) {
515
506
  height: 32px;
516
- padding: 0 var(--nile-spacing-xl, var(--ng-spacing-4));
507
+ padding: 0 var(--nile-spacing-xl, var(--ng-spacing-xl));
517
508
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
518
509
  letter-spacing: 0.03em;
519
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
510
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
520
511
  }
521
512
 
522
513
  .fc-prompt__mode-icon {
@@ -525,12 +516,35 @@ export const styles = css `
525
516
  line-height: 0;
526
517
  }
527
518
 
519
+ /* Compact glyph fallback for the mode toggle — hidden at wide widths;
520
+ swapped in for the text label when the prompt row becomes narrow
521
+ (see container query below). */
522
+ .fc-prompt__mode-glyph {
523
+ display: none;
524
+ align-items: center;
525
+ line-height: 0;
526
+ }
527
+
528
528
  /* ── Row layout: prompt input + mode toggle ─── */
529
529
  .fc-prompt-row {
530
530
  display: flex;
531
- align-items: stretch;
532
- gap: var(--nile-spacing-md, var(--ng-spacing-2));
531
+ align-items: flex-start;
532
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
533
533
  width: 100%;
534
+ container-type: inline-size;
535
+ container-name: fc-prompt-row;
536
+ }
537
+
538
+ /* Narrow filter bar: collapse the Prompt / Expression toggle to a
539
+ single glyph per segment so it fits without wrapping. */
540
+ @container fc-prompt-row (max-width: 480px) {
541
+ .fc-prompt__mode-label { display: none; }
542
+ .fc-prompt__mode-icon { display: none; }
543
+ .fc-prompt__mode-glyph { display: inline-flex; }
544
+ .fc-prompt__mode nile-button-toggle::part(base) {
545
+ padding: 0 var(--nile-spacing-md, var(--ng-spacing-md));
546
+ gap: 0;
547
+ }
534
548
  }
535
549
 
536
550
  .fc-prompt-row .fc-prompt--row-input {
@@ -539,13 +553,13 @@ export const styles = css `
539
553
  }
540
554
 
541
555
  .fc-prompt__mode nile-button-toggle:first-of-type::part(base) {
542
- border-top-left-radius: var(--nile-radius-radius-lg, var(--ng-radius-lg));
543
- border-bottom-left-radius: var(--nile-radius-radius-lg, var(--ng-radius-lg));
556
+ border-top-left-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
557
+ border-bottom-left-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
544
558
  }
545
559
 
546
560
  .fc-prompt__mode nile-button-toggle:last-of-type::part(base) {
547
- border-top-right-radius: var(--nile-radius-radius-lg, var(--ng-radius-lg));
548
- border-bottom-right-radius: var(--nile-radius-radius-lg, var(--ng-radius-lg));
561
+ border-top-right-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
562
+ border-bottom-right-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
549
563
  }
550
564
 
551
565
  /* ── Field wrapper + syntax-highlight overlay ─── */
@@ -559,12 +573,22 @@ export const styles = css `
559
573
  position: relative;
560
574
  flex: 1;
561
575
  min-width: 0;
562
- display: block;
576
+ display: flex;
577
+ align-items: center;
578
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
579
+ width: 100%;
580
+ }
581
+ .fc-prompt__field-input {
582
+ position: relative;
583
+ flex: 1;
584
+ min-width: 0;
585
+ display: flex;
586
+ align-items: center;
563
587
  }
564
588
  .fc-prompt__field--highlight .fc-prompt__highlight,
565
589
  .fc-prompt__field--highlight .fc-prompt__input {
566
590
  box-sizing: border-box;
567
- padding: var(--nile-spacing-md, var(--ng-spacing-2)) var(--nile-spacing-xl, var(--ng-spacing-4));
591
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-xl, var(--ng-spacing-xl));
568
592
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
569
593
  font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));
570
594
  font-weight: 400;
@@ -573,21 +597,24 @@ export const styles = css `
573
597
  white-space: pre;
574
598
  }
575
599
 
600
+ .fc-prompt__field--highlight .fc-prompt__highlight {
601
+ padding-left: 0;
602
+ padding-right: 0;
603
+ }
604
+
576
605
  .fc-prompt__highlight {
577
606
  position: absolute;
578
- inset: 0;
607
+ top: 0;
608
+ bottom: 0;
609
+ left: var(--nile-spacing-xl, var(--ng-spacing-xl));
610
+ right: var(--nile-spacing-xl, var(--ng-spacing-xl));
579
611
  pointer-events: none;
580
612
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
581
- /* overflow-x: auto (not hidden) so JS can sync scrollLeft to the input's
582
- native horizontal scroll. Without it, white-space: pre content spills
583
- past the field's right edge and visually overlaps the mode toggle.
584
- Scrollbar is suppressed since the overlay is non-interactive (only the
585
- input below it scrolls via keyboard). */
586
613
  overflow-x: auto;
587
614
  overflow-y: hidden;
588
- scrollbar-width: none; /* Firefox */
615
+ scrollbar-width: none;
589
616
  }
590
- .fc-prompt__highlight::-webkit-scrollbar { display: none; } /* Chrome / Safari */
617
+ .fc-prompt__highlight::-webkit-scrollbar { display: none; }
591
618
 
592
619
  .fc-prompt__input {
593
620
  position: relative;
@@ -606,12 +633,35 @@ export const styles = css `
606
633
  color: transparent;
607
634
  }
608
635
 
636
+ .fc-prompt__field--highlight .fc-prompt__input::selection {
637
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
638
+ color: transparent;
639
+ }
640
+ .fc-prompt__field--highlight .fc-prompt__input::-moz-selection {
641
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
642
+ color: transparent;
643
+ }
644
+
609
645
  .fc-prompt__dropdown {
610
646
  flex: 1;
611
647
  min-width: 0;
612
648
  display: block;
613
649
  }
614
650
 
651
+ .fc-prompt__inner > .fc-prompt__dropdown {
652
+ display: block;
653
+ flex: 1;
654
+ min-width: 0;
655
+ width: 100%;
656
+ }
657
+ .fc-prompt__inner > .fc-prompt__dropdown > [slot="trigger"] {
658
+ width: 100%;
659
+ }
660
+ .fc-prompt__inner > .fc-prompt__dropdown::part(trigger) {
661
+ display: block;
662
+ width: 100%;
663
+ }
664
+
615
665
  .fc-prompt__dropdown::part(panel) {
616
666
  display: flex;
617
667
  flex-direction: column;
@@ -622,18 +672,18 @@ export const styles = css `
622
672
  border-radius: var(--nile-radius-md, var(--ng-radius-md));
623
673
  box-shadow: 0 12px 24px -8px rgba(16, 24, 40, 0.12),
624
674
  0 4px 8px -2px rgba(16, 24, 40, 0.06);
625
- padding: var(--nile-spacing-4px, var(--ng-spacing-1));
675
+ padding: var(--nile-spacing-4px, var(--ng-spacing-xs));
626
676
  }
627
677
 
628
678
  .fc-prompt__suggestion {
629
679
  display: flex;
630
680
  align-items: center;
631
681
  justify-content: space-between;
632
- gap: var(--nile-spacing-md, var(--ng-spacing-2));
682
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
633
683
  width: 100%;
634
- padding: var(--nile-spacing-8px, var(--ng-spacing-2)) var(--nile-spacing-md, var(--ng-spacing-2));
684
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-md, var(--ng-spacing-md));
635
685
  border: 0;
636
- border-radius: var(--nile-radius-sm, var(--ng-radius-sm));
686
+ border-radius: var(--nile-radius-radius-lg, var(--ng-radius-sm));
637
687
  background: transparent;
638
688
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
639
689
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
@@ -647,20 +697,19 @@ export const styles = css `
647
697
  .fc-prompt__suggestion:hover {
648
698
  background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
649
699
  }
650
- /* Keyboard-highlighted state — distinct from hover via brand-tinted bg
651
- and a left accent bar so it's obvious which row Enter will select. */
700
+
652
701
  .fc-prompt__suggestion--active,
653
702
  .fc-prompt__suggestion--active:hover {
654
- background: var(--nile-colors-blue-50, var(--ng-colors-bg-brand-secondary, #eff6ff));
655
- box-shadow: inset 3px 0 0 var(--nile-colors-blue-500, var(--ng-colors-bg-brand-solid, #3b82f6));
703
+ background: var(--ng-colors-bg-brand-secondary);
704
+ box-shadow: inset 3px 0 0 var(--nile-colors-primary-600, var(--ng-colors-bg-brand-solid));
656
705
  }
657
706
 
658
707
  .fc-prompt__suggestion-label {
659
708
  flex: 1;
660
709
  min-width: 0;
661
- overflow: hidden;
662
- text-overflow: ellipsis;
663
- white-space: nowrap;
710
+ white-space: normal;
711
+ overflow-wrap: anywhere;
712
+ word-break: break-word;
664
713
  }
665
714
 
666
715
  .fc-prompt__suggestion-tag {
@@ -676,10 +725,38 @@ export const styles = css `
676
725
  }
677
726
 
678
727
  .fc-prompt__input::placeholder {
679
- color: var(--nile-colors-neutral-700, var(--ng-colors-text-secondary-700));
728
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary-700));
680
729
  opacity: 0.85;
681
730
  }
682
731
 
732
+ /* ── Clear icon — nile-button variant="ghost" sibling of the input. ─── */
733
+ .fc-prompt__clear-icon {
734
+ flex-shrink: 0;
735
+ margin-right: var(--nile-spacing-6px, var(--ng-spacing-sm));
736
+ line-height: 0;
737
+ }
738
+
739
+ /* nile-button is 40px tall by default; compress it to a 24x24 circle so it
740
+ fits inside the prompt's row. ::part(base) reaches into its shadow root. */
741
+ .fc-prompt__clear-icon::part(base) {
742
+ height: 24px;
743
+ width: 24px;
744
+ min-height: 0;
745
+ padding: 0;
746
+ border-radius: 50%;
747
+ gap: 0;
748
+ background: transparent;
749
+ }
750
+
751
+ .fc-prompt__clear-icon::part(base):hover,
752
+ .fc-prompt__clear-icon::part(base):focus-visible {
753
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
754
+ }
755
+
756
+ .fc-prompt__clear-filter {
757
+ flex-shrink: 0;
758
+ }
759
+
683
760
  @keyframes fc-prompt-gradient {
684
761
  0% { background-position: 0% 50%; }
685
762
  100% { background-position: 300% 50%; }