@aquera/nile-visualization 2.9.8 → 2.9.10

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;
@@ -367,48 +363,41 @@ export const styles = css `
367
363
  display: block;
368
364
  width: 100%;
369
365
  border-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
366
+ padding: 0;
367
+ background: transparent;
368
+ }
369
+
370
+ .fc-prompt .fc-prompt__inner {
371
+ border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
372
+ }
373
+
374
+ .fc-prompt--ai-border {
370
375
  padding: 2px;
371
376
  background: var(
372
377
  --fc-prompt-gradient,
373
378
  linear-gradient(
374
379
  90deg,
375
- #2563eb 0%,
376
- #3b82f6 18%,
377
- #06b6d4 36%,
378
- #6366f1 54%,
379
- #8b5cf6 72%,
380
- #2563eb 100%
380
+ var(--ng-color-blue-600) 0%,
381
+ var(--ng-color-blue-500) 18%,
382
+ var(--ng-color-cyan-500) 36%,
383
+ var(--ng-color-indigo-500) 54%,
384
+ var(--ng-color-violet-500) 72%,
385
+ var(--ng-color-blue-600) 100%
381
386
  )
382
387
  );
383
388
  background-size: 300% 100%;
384
389
  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);
386
- }
387
-
388
-
389
- .fc-prompt:focus-within {
390
- box-shadow: 0 8px 8px -6px rgba(59, 130, 246, 0.6);
391
- }
392
-
393
- .fc-prompt--no-ai-border {
394
- padding: 0;
395
- background: transparent;
396
- animation: none;
397
- box-shadow: none;
390
+ box-shadow: 0 6px 6px -6px color-mix(in srgb, var(--ng-color-blue-500) 45%, transparent);
398
391
  }
399
392
 
400
- .fc-prompt--no-ai-border:focus-within {
401
- box-shadow: none;
393
+ .fc-prompt--ai-border .fc-prompt__inner {
394
+ border: 0;
402
395
  }
403
396
 
404
- .fc-prompt--no-ai-border .fc-prompt__inner {
405
- border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
397
+ .fc-prompt--ai-border:focus-within {
398
+ box-shadow: 0 8px 8px -6px color-mix(in srgb, var(--ng-color-blue-500) 60%, transparent);
406
399
  }
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. */
400
+
412
401
  .fc-prompt--error {
413
402
  padding: 0;
414
403
  background: transparent;
@@ -421,23 +410,23 @@ export const styles = css `
421
410
  }
422
411
 
423
412
  .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));
413
+ background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
414
+ border: 1.5px solid var(--ng-colors-border-error);
426
415
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
427
416
  }
428
417
 
429
418
  .fc-prompt--error:focus-within .fc-prompt__inner {
430
- border-color: var(--nile-colors-error-600, var(--ng-colors-border-error-strong, #d92d20));
419
+ border-color: var(--ng-colors-border-error-strong);
431
420
  box-shadow: 0 0 0 4px rgba(240, 68, 56, 0.14);
432
421
  }
433
422
 
434
423
  .fc-prompt__error {
435
424
  display: flex;
436
425
  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));
426
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
427
+ margin-top: var(--nile-spacing-6px, var(--ng-spacing-sm));
428
+ padding: 0 var(--nile-spacing-2px, var(--ng-spacing-xxs));
429
+ color: var(--ng-colors-text-error-primary-600);
441
430
  font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));
442
431
  line-height: 1.4;
443
432
  animation: fc-prompt-error-in 0.18s ease-out both;
@@ -450,7 +439,7 @@ export const styles = css `
450
439
  width: 14px;
451
440
  height: 14px;
452
441
  border-radius: 50%;
453
- background: var(--nile-colors-error-500, var(--ng-colors-bg-error-solid, #f04438));
442
+ background: var(--ng-colors-bg-error-solid);
454
443
  color: var(--nile-colors-white-base, var(--ng-color-base-white));
455
444
  font-weight: var(--nile-font-weight-bold, var(--ng-font-weight-700));
456
445
  font-size: 10px;
@@ -476,9 +465,8 @@ export const styles = css `
476
465
  position: relative;
477
466
  display: flex;
478
467
  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));
468
+ padding-right: var(--nile-spacing-md, var(--ng-spacing-md));
469
+ border-radius: var(--nile-radius-md, var(--ng-radius-md));
482
470
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
483
471
  }
484
472
 
@@ -490,7 +478,7 @@ export const styles = css `
490
478
  outline: none;
491
479
  background: transparent;
492
480
  border-radius: inherit;
493
- padding: var(--nile-spacing-md, var(--ng-spacing-2)) var(--nile-spacing-xl, var(--ng-spacing-4));
481
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-xl, var(--ng-spacing-xl));
494
482
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
495
483
  font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));
496
484
  font-weight: 400;
@@ -506,17 +494,17 @@ export const styles = css `
506
494
  .fc-prompt__mode {
507
495
  flex-shrink: 0;
508
496
  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));
497
+ margin-left: var(--nile-spacing-md, var(--ng-spacing-md));
498
+ border-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
511
499
  overflow: hidden;
512
500
  }
513
501
 
514
502
  .fc-prompt__mode nile-button-toggle::part(base) {
515
503
  height: 32px;
516
- padding: 0 var(--nile-spacing-xl, var(--ng-spacing-4));
504
+ padding: 0 var(--nile-spacing-xl, var(--ng-spacing-xl));
517
505
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
518
506
  letter-spacing: 0.03em;
519
- gap: var(--nile-spacing-6px, var(--ng-spacing-1-5));
507
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
520
508
  }
521
509
 
522
510
  .fc-prompt__mode-icon {
@@ -525,12 +513,35 @@ export const styles = css `
525
513
  line-height: 0;
526
514
  }
527
515
 
516
+ /* Compact glyph fallback for the mode toggle — hidden at wide widths;
517
+ swapped in for the text label when the prompt row becomes narrow
518
+ (see container query below). */
519
+ .fc-prompt__mode-glyph {
520
+ display: none;
521
+ align-items: center;
522
+ line-height: 0;
523
+ }
524
+
528
525
  /* ── Row layout: prompt input + mode toggle ─── */
529
526
  .fc-prompt-row {
530
527
  display: flex;
531
- align-items: stretch;
532
- gap: var(--nile-spacing-md, var(--ng-spacing-2));
528
+ align-items: flex-start;
529
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
533
530
  width: 100%;
531
+ container-type: inline-size;
532
+ container-name: fc-prompt-row;
533
+ }
534
+
535
+ /* Narrow filter bar: collapse the Prompt / Expression toggle to a
536
+ single glyph per segment so it fits without wrapping. */
537
+ @container fc-prompt-row (max-width: 480px) {
538
+ .fc-prompt__mode-label { display: none; }
539
+ .fc-prompt__mode-icon { display: none; }
540
+ .fc-prompt__mode-glyph { display: inline-flex; }
541
+ .fc-prompt__mode nile-button-toggle::part(base) {
542
+ padding: 0 var(--nile-spacing-md, var(--ng-spacing-md));
543
+ gap: 0;
544
+ }
534
545
  }
535
546
 
536
547
  .fc-prompt-row .fc-prompt--row-input {
@@ -539,13 +550,13 @@ export const styles = css `
539
550
  }
540
551
 
541
552
  .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));
553
+ border-top-left-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
554
+ border-bottom-left-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
544
555
  }
545
556
 
546
557
  .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));
558
+ border-top-right-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
559
+ border-bottom-right-radius: var(--nile-radius-radius-2xl, var(--ng-radius-lg));
549
560
  }
550
561
 
551
562
  /* ── Field wrapper + syntax-highlight overlay ─── */
@@ -559,12 +570,22 @@ export const styles = css `
559
570
  position: relative;
560
571
  flex: 1;
561
572
  min-width: 0;
562
- display: block;
573
+ display: flex;
574
+ align-items: center;
575
+ gap: var(--nile-spacing-6px, var(--ng-spacing-sm));
576
+ width: 100%;
577
+ }
578
+ .fc-prompt__field-input {
579
+ position: relative;
580
+ flex: 1;
581
+ min-width: 0;
582
+ display: flex;
583
+ align-items: center;
563
584
  }
564
585
  .fc-prompt__field--highlight .fc-prompt__highlight,
565
586
  .fc-prompt__field--highlight .fc-prompt__input {
566
587
  box-sizing: border-box;
567
- padding: var(--nile-spacing-md, var(--ng-spacing-2)) var(--nile-spacing-xl, var(--ng-spacing-4));
588
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-xl, var(--ng-spacing-xl));
568
589
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
569
590
  font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));
570
591
  font-weight: 400;
@@ -573,21 +594,24 @@ export const styles = css `
573
594
  white-space: pre;
574
595
  }
575
596
 
597
+ .fc-prompt__field--highlight .fc-prompt__highlight {
598
+ padding-left: 0;
599
+ padding-right: 0;
600
+ }
601
+
576
602
  .fc-prompt__highlight {
577
603
  position: absolute;
578
- inset: 0;
604
+ top: 0;
605
+ bottom: 0;
606
+ left: var(--nile-spacing-xl, var(--ng-spacing-xl));
607
+ right: var(--nile-spacing-xl, var(--ng-spacing-xl));
579
608
  pointer-events: none;
580
609
  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
610
  overflow-x: auto;
587
611
  overflow-y: hidden;
588
- scrollbar-width: none; /* Firefox */
612
+ scrollbar-width: none;
589
613
  }
590
- .fc-prompt__highlight::-webkit-scrollbar { display: none; } /* Chrome / Safari */
614
+ .fc-prompt__highlight::-webkit-scrollbar { display: none; }
591
615
 
592
616
  .fc-prompt__input {
593
617
  position: relative;
@@ -595,7 +619,6 @@ export const styles = css `
595
619
  width: 100%;
596
620
  border: 0;
597
621
  outline: none;
598
- background: transparent;
599
622
  color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
600
623
  caret-color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
601
624
  }
@@ -606,12 +629,35 @@ export const styles = css `
606
629
  color: transparent;
607
630
  }
608
631
 
632
+ .fc-prompt__field--highlight .fc-prompt__input::selection {
633
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
634
+ color: transparent;
635
+ }
636
+ .fc-prompt__field--highlight .fc-prompt__input::-moz-selection {
637
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
638
+ color: transparent;
639
+ }
640
+
609
641
  .fc-prompt__dropdown {
610
642
  flex: 1;
611
643
  min-width: 0;
612
644
  display: block;
613
645
  }
614
646
 
647
+ .fc-prompt__inner > .fc-prompt__dropdown {
648
+ display: block;
649
+ flex: 1;
650
+ min-width: 0;
651
+ width: 100%;
652
+ }
653
+ .fc-prompt__inner > .fc-prompt__dropdown > [slot="trigger"] {
654
+ width: 100%;
655
+ }
656
+ .fc-prompt__inner > .fc-prompt__dropdown::part(trigger) {
657
+ display: block;
658
+ width: 100%;
659
+ }
660
+
615
661
  .fc-prompt__dropdown::part(panel) {
616
662
  display: flex;
617
663
  flex-direction: column;
@@ -622,18 +668,18 @@ export const styles = css `
622
668
  border-radius: var(--nile-radius-md, var(--ng-radius-md));
623
669
  box-shadow: 0 12px 24px -8px rgba(16, 24, 40, 0.12),
624
670
  0 4px 8px -2px rgba(16, 24, 40, 0.06);
625
- padding: var(--nile-spacing-4px, var(--ng-spacing-1));
671
+ padding: var(--nile-spacing-4px, var(--ng-spacing-xs));
626
672
  }
627
673
 
628
674
  .fc-prompt__suggestion {
629
675
  display: flex;
630
676
  align-items: center;
631
677
  justify-content: space-between;
632
- gap: var(--nile-spacing-md, var(--ng-spacing-2));
678
+ gap: var(--nile-spacing-md, var(--ng-spacing-md));
633
679
  width: 100%;
634
- padding: var(--nile-spacing-8px, var(--ng-spacing-2)) var(--nile-spacing-md, var(--ng-spacing-2));
680
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-md, var(--ng-spacing-md));
635
681
  border: 0;
636
- border-radius: var(--nile-radius-sm, var(--ng-radius-sm));
682
+ border-radius: var(--nile-radius-radius-lg, var(--ng-radius-sm));
637
683
  background: transparent;
638
684
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
639
685
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
@@ -647,20 +693,19 @@ export const styles = css `
647
693
  .fc-prompt__suggestion:hover {
648
694
  background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
649
695
  }
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. */
696
+
652
697
  .fc-prompt__suggestion--active,
653
698
  .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));
699
+ background: var(--ng-colors-bg-brand-secondary);
700
+ box-shadow: inset 3px 0 0 var(--nile-colors-primary-600, var(--ng-colors-bg-brand-solid));
656
701
  }
657
702
 
658
703
  .fc-prompt__suggestion-label {
659
704
  flex: 1;
660
705
  min-width: 0;
661
- overflow: hidden;
662
- text-overflow: ellipsis;
663
- white-space: nowrap;
706
+ white-space: normal;
707
+ overflow-wrap: anywhere;
708
+ word-break: break-word;
664
709
  }
665
710
 
666
711
  .fc-prompt__suggestion-tag {
@@ -676,10 +721,38 @@ export const styles = css `
676
721
  }
677
722
 
678
723
  .fc-prompt__input::placeholder {
679
- color: var(--nile-colors-neutral-700, var(--ng-colors-text-secondary-700));
724
+ color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary-700));
680
725
  opacity: 0.85;
681
726
  }
682
727
 
728
+ /* ── Clear icon — nile-button variant="ghost" sibling of the input. ─── */
729
+ .fc-prompt__clear-icon {
730
+ flex-shrink: 0;
731
+ margin-right: var(--nile-spacing-6px, var(--ng-spacing-sm));
732
+ line-height: 0;
733
+ }
734
+
735
+ /* nile-button is 40px tall by default; compress it to a 24x24 circle so it
736
+ fits inside the prompt's row. ::part(base) reaches into its shadow root. */
737
+ .fc-prompt__clear-icon::part(base) {
738
+ height: 24px;
739
+ width: 24px;
740
+ min-height: 0;
741
+ padding: 0;
742
+ border-radius: 50%;
743
+ gap: 0;
744
+ background: transparent;
745
+ }
746
+
747
+ .fc-prompt__clear-icon::part(base):hover,
748
+ .fc-prompt__clear-icon::part(base):focus-visible {
749
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
750
+ }
751
+
752
+ .fc-prompt__clear-filter {
753
+ flex-shrink: 0;
754
+ }
755
+
683
756
  @keyframes fc-prompt-gradient {
684
757
  0% { background-position: 0% 50%; }
685
758
  100% { background-position: 300% 50%; }
@@ -687,7 +760,6 @@ export const styles = css `
687
760
 
688
761
  @media (prefers-reduced-motion: reduce) {
689
762
  .fc-prompt {
690
- /* Respect any consumer-supplied gradient — just stop animating it. */
691
763
  animation: none;
692
764
  }
693
765
  }