@aquera/nile-elements 2.0.11 → 2.0.13

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 (74) hide show
  1. package/README.md +7 -0
  2. package/demo/app-shell.html +21 -21
  3. package/dist/index.js +170 -167
  4. package/dist/nile-app-shell/nile-app-shell.cjs.js +1 -1
  5. package/dist/nile-app-shell/nile-app-shell.cjs.js.map +1 -1
  6. package/dist/nile-app-shell/nile-app-shell.css.cjs.js +1 -1
  7. package/dist/nile-app-shell/nile-app-shell.css.cjs.js.map +1 -1
  8. package/dist/nile-app-shell/nile-app-shell.css.esm.js +35 -32
  9. package/dist/nile-app-shell/nile-app-shell.esm.js +39 -34
  10. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js +1 -1
  11. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js.map +1 -1
  12. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.esm.js +3 -1
  13. package/dist/nile-select/nile-select.cjs.js +2 -2
  14. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  15. package/dist/nile-select/nile-select.css.cjs.js +1 -1
  16. package/dist/nile-select/nile-select.css.cjs.js.map +1 -1
  17. package/dist/nile-select/nile-select.css.esm.js +12 -17
  18. package/dist/nile-select/nile-select.esm.js +43 -42
  19. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  20. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  21. package/dist/nile-select/virtual-scroll-helper.esm.js +2 -0
  22. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +4 -4
  23. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  24. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js +1 -1
  25. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js.map +1 -1
  26. package/dist/nile-virtual-select/nile-virtual-select.css.esm.js +12 -17
  27. package/dist/nile-virtual-select/nile-virtual-select.esm.js +26 -26
  28. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js +9 -5
  29. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js.map +1 -1
  30. package/dist/src/nile-app-shell/nile-app-shell.css.js +33 -30
  31. package/dist/src/nile-app-shell/nile-app-shell.css.js.map +1 -1
  32. package/dist/src/nile-app-shell/nile-app-shell.d.ts +22 -22
  33. package/dist/src/nile-app-shell/nile-app-shell.js +86 -76
  34. package/dist/src/nile-app-shell/nile-app-shell.js.map +1 -1
  35. package/dist/src/nile-app-shell/nile-app-shell.test.d.ts +1 -0
  36. package/dist/src/nile-app-shell/nile-app-shell.test.js +307 -89
  37. package/dist/src/nile-app-shell/nile-app-shell.test.js.map +1 -1
  38. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js +3 -1
  39. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js.map +1 -1
  40. package/dist/src/nile-select/nile-select.css.js +12 -17
  41. package/dist/src/nile-select/nile-select.css.js.map +1 -1
  42. package/dist/src/nile-select/nile-select.d.ts +18 -2
  43. package/dist/src/nile-select/nile-select.js +226 -64
  44. package/dist/src/nile-select/nile-select.js.map +1 -1
  45. package/dist/src/nile-select/nile-select.test.d.ts +1 -0
  46. package/dist/src/nile-select/nile-select.test.js +896 -17
  47. package/dist/src/nile-select/nile-select.test.js.map +1 -1
  48. package/dist/src/nile-select/virtual-scroll-helper.js +2 -0
  49. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  50. package/dist/src/nile-virtual-select/nile-virtual-select.css.js +12 -17
  51. package/dist/src/nile-virtual-select/nile-virtual-select.css.js.map +1 -1
  52. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +10 -2
  53. package/dist/src/nile-virtual-select/nile-virtual-select.js +142 -30
  54. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  55. package/dist/src/nile-virtual-select/nile-virtual-select.test.d.ts +1 -0
  56. package/dist/src/nile-virtual-select/nile-virtual-select.test.js +331 -16
  57. package/dist/src/nile-virtual-select/nile-virtual-select.test.js.map +1 -1
  58. package/dist/src/version.js +1 -1
  59. package/dist/src/version.js.map +1 -1
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +1 -1
  62. package/src/nile-app-shell/nile-app-shell-regions.test.ts +9 -5
  63. package/src/nile-app-shell/nile-app-shell.css.ts +33 -30
  64. package/src/nile-app-shell/nile-app-shell.test.ts +348 -105
  65. package/src/nile-app-shell/nile-app-shell.ts +89 -82
  66. package/src/nile-app-shell-panel/nile-app-shell-panel.css.ts +3 -1
  67. package/src/nile-select/nile-select.css.ts +12 -17
  68. package/src/nile-select/nile-select.test.ts +1112 -17
  69. package/src/nile-select/nile-select.ts +237 -67
  70. package/src/nile-select/virtual-scroll-helper.ts +2 -0
  71. package/src/nile-virtual-select/nile-virtual-select.css.ts +12 -17
  72. package/src/nile-virtual-select/nile-virtual-select.test.ts +404 -16
  73. package/src/nile-virtual-select/nile-virtual-select.ts +200 -79
  74. package/vscode-html-custom-data.json +36 -41
@@ -22,8 +22,10 @@ export type NileAppShellTopBarPlacement = 'content' | 'shell';
22
22
  /** How the main region lays its content out. */
23
23
  export type NileAppShellContentAlign = 'fluid' | 'centered';
24
24
 
25
- /** What sits before the page title in the top bar. */
26
- export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
25
+ /** The `detail` of the `nile-click` the header back control emits. */
26
+ export interface NileAppShellClickDetail {
27
+ value: 'back';
28
+ }
27
29
 
28
30
  /** The shell's own track and region widths, in px. */
29
31
  interface ShellGeometry {
@@ -51,7 +53,7 @@ interface ShellGeometry {
51
53
  * @slot top-bar - The page-title bar, mounted inside the container by default or spanning the shell when `top-bar-placement="shell"`.
52
54
  * @slot top-bar-actions - Controls pinned to the end of the top bar.
53
55
  * @slot tabs - A hoisted second-level tab strip, flush under the top bar and outside `<main>`'s scroller.
54
- * @slot app-icon - The mark shown when `leading="app-icon"`, clipped to the shell's box.
56
+ * @slot app-icon - The mark shown before the page title whenever this slot has content, clipped to the shell's box.
55
57
  * @slot side-nav - The navigation track. Works best with `<nile-side-bar>`.
56
58
  * @slot aside - A secondary column between the content container and the panel.
57
59
  * @slot panel - The AI panel's body. When empty the panel is unmounted and `openPanel()` is a no-op.
@@ -62,7 +64,7 @@ interface ShellGeometry {
62
64
  * @event nile-nav-toggle - Emitted after the nav's collapsed state or forced-rail lock changes. `detail: { collapsed, locked }`.
63
65
  * @event nile-panel-toggle - Emitted after the panel opens or closes. `detail: { open, mode }`.
64
66
  * @event nile-panel-mode-change - Emitted when the panel flips between docked and overlay. `detail: { mode }`.
65
- * @event nile-header-back - Emitted when the header's back control is pressed.
67
+ * @event nile-click - Emitted when the header's back control is pressed, or `goBackHeader()` is called. `detail: { value: 'back' }`. Emitted on the shell itself, so check `event.target === shell` as well as the value: a `nile-click` from page content bubbles through the shell too.
66
68
  * @event nile-panel-back - Emitted when the panel's back control is pressed, whether the shell's built-in panel chrome or a slotted `nile-app-shell-panel` draws it.
67
69
  *
68
70
  * @csspart skip-link - The skip-to-content link.
@@ -71,15 +73,15 @@ interface ShellGeometry {
71
73
  * @csspart top-bar - The top bar, in either placement.
72
74
  * @csspart nav-toggle - The built-in nav toggle button.
73
75
  * @csspart rule - The vertical rule after the nav toggle.
76
+ * @csspart ask-rule - The vertical rule before the Ask button, drawn when `top-bar-actions` has content.
74
77
  * @csspart top-bar-actions - The end-aligned top bar action group.
75
78
  * @csspart ask - The built-in Ask button, the shell's single door to the panel.
76
- * @csspart title-area - The header's own title block: leading, title, badge and description.
79
+ * @csspart title-area - The header's own title block: back control, app icon, title, badge and description.
77
80
  * @csspart page-title - The title text, exposed as a heading whose level `headingLevel` sets.
78
81
  * @csspart description - The second line under the title.
79
82
  * @csspart badge - The pill after the title.
80
- * @csspart leading - The line box holding the leading control.
81
- * @csspart back - The back control shown by `leading="back"`.
82
- * @csspart app-icon - The block shown by `leading="app-icon"`, sized by `--nile-app-shell-app-icon-size`.
83
+ * @csspart back - The header back control, shown by `headerBack`.
84
+ * @csspart app-icon - The block holding the `app-icon` slot, shown when the slot has content and sized by `--nile-app-shell-app-icon-size`.
83
85
  * @csspart tabs - The hoisted tab-strip region, under the top bar.
84
86
  * @csspart side-nav - The navigation track.
85
87
  * @csspart content-section - The flex row holding container, aside and panel.
@@ -111,7 +113,7 @@ interface ShellGeometry {
111
113
  * @cssproperty [--nile-app-shell-content-min-width=640px] - Container floor.
112
114
  * @cssproperty [--nile-app-shell-min-width=768px] - Below this the window scrolls rather than the shell compressing.
113
115
  * @cssproperty [--nile-app-shell-centered-width=824px] - Column width under `content-align="centered"`.
114
- * @cssproperty [--nile-app-shell-app-icon-size=20px] - The leading app icon's box.
116
+ * @cssproperty [--nile-app-shell-app-icon-size=20px] - The app icon's box.
115
117
  * @cssproperty [--nile-app-shell-utility-size=32px] - Box the shell's own icon controls sit in.
116
118
  * @cssproperty [--nile-app-shell-radius=16px] - Container, aside and panel radius.
117
119
  * @cssproperty [--nile-app-shell-duration=250ms] - Track and panel motion.
@@ -123,9 +125,8 @@ interface ShellGeometry {
123
125
  * @method expandNav() - Expand the side nav.
124
126
  * @method collapseNav() - Collapse the side nav to a rail.
125
127
  * @method toggleNav(force?) - Toggle, or force a specific collapsed state.
126
- * @method goBackHeader() - Emit `nile-header-back`, as the header's back control does.
128
+ * @method goBackHeader() - Emit `nile-click` with `{ value: 'back' }`, as the header's back control does.
127
129
  * @method goBackPanel() - Emit `nile-panel-back`, as the panel's back control does.
128
- * @method goBackPage() - Deprecated alias of `goBackHeader()`.
129
130
  * @method goBack() - Deprecated alias of `goBackPanel()`.
130
131
  */
131
132
  @customElement('nile-app-shell')
@@ -166,13 +167,13 @@ export class NileAppShell extends NileElement {
166
167
  @property({ type: String, attribute: true, reflect: true })
167
168
  badge?: string;
168
169
 
169
- /** What sits before the page title: `back` draws a breadcrumb and emits `nile-header-back`; `app-icon` draws a 20px block for the `app-icon` slot. */
170
- @property({ type: String, attribute: true, reflect: true })
171
- leading: NileAppShellLeading = 'none';
170
+ /** Shows the back arrow before the page title; pressing it emits `nile-click` with `{ value: 'back' }`. Independent of the `app-icon` slot. */
171
+ @property({ type: Boolean, attribute: true, reflect: true })
172
+ headerBack: boolean = false;
172
173
 
173
- /** The previous-page label drawn by `leading="back"`. */
174
+ /** Accessible name of the header back control. Never rendered as visible text. */
174
175
  @property({ type: String, attribute: true, reflect: true })
175
- backLabel: string = 'Back';
176
+ headerBackLabel: string = 'Back';
176
177
 
177
178
  /** Hides the built-in nav toggle. Mount `nile-app-shell-nav-toggle` yourself. */
178
179
  @property({ type: Boolean, reflect: true, attribute: 'no-nav-toggle' })
@@ -257,6 +258,7 @@ export class NileAppShell extends NileElement {
257
258
  @state() private _hasTopBar: boolean = false;
258
259
  @state() private _hasTopBarActions: boolean = false;
259
260
  @state() private _hasTabs: boolean = false;
261
+ @state() private _hasAppIcon: boolean = false;
260
262
  @state() private _hasPanel: boolean = false;
261
263
  @state() private _hasPanelFooter: boolean = false;
262
264
 
@@ -352,6 +354,7 @@ export class NileAppShell extends NileElement {
352
354
  !!this.description && !!this.pageTitle
353
355
  );
354
356
  this.toggleAttribute('has-top-bar-actions', this._hasTopBarActions);
357
+ this.toggleAttribute('has-app-icon', this._hasAppIcon);
355
358
  this.toggleAttribute('has-ask', this.askVisible);
356
359
  this.toggleAttribute('has-tabs', this.tabsVisible);
357
360
  this.toggleAttribute('has-aside', this._hasAside);
@@ -384,9 +387,10 @@ export class NileAppShell extends NileElement {
384
387
  else this.closePanel();
385
388
  }
386
389
 
387
- /** Emit `nile-header-back`, as the header's back control does; the page owns the history. */
390
+ /** Emit `nile-click` with `{ value: 'back' }`, as the header's back control does; the page owns the history. */
388
391
  public goBackHeader(): void {
389
- this.emit('nile-header-back');
392
+ const detail: NileAppShellClickDetail = { value: 'back' };
393
+ this.emit('nile-click', detail);
390
394
  }
391
395
 
392
396
  /** Emit `nile-panel-back`, as the panel's back control does; the page owns the view stack. */
@@ -394,11 +398,6 @@ export class NileAppShell extends NileElement {
394
398
  this.emit('nile-panel-back');
395
399
  }
396
400
 
397
- /** @deprecated Use `goBackHeader()`; kept as an alias that emits `nile-header-back`. */
398
- public goBackPage(): void {
399
- this.goBackHeader();
400
- }
401
-
402
401
  /** @deprecated Use `goBackPanel()`; kept as an alias that emits `nile-panel-back`. */
403
402
  public goBack(): void {
404
403
  this.goBackPanel();
@@ -613,6 +612,9 @@ export class NileAppShell extends NileElement {
613
612
  case 'tabs':
614
613
  this._hasTabs = filled;
615
614
  break;
615
+ case 'app-icon':
616
+ this._hasAppIcon = filled;
617
+ break;
616
618
  case 'aside':
617
619
  this._hasAside = filled;
618
620
  break;
@@ -667,14 +669,9 @@ export class NileAppShell extends NileElement {
667
669
  `;
668
670
  }
669
671
 
670
- /** Whether the header has a title block of its own to draw: only a title or a leading control mounts it. */
672
+ /** Whether the header has a title block of its own to draw: a title, the back arrow or a slotted app icon mounts it. */
671
673
  private get _hasTitleBlock(): boolean {
672
- return !!this.pageTitle || this._hasLeading;
673
- }
674
-
675
- /** Whether `leading` names a control that renders; an empty or unknown value draws nothing, like `none`. */
676
- private get _hasLeading(): boolean {
677
- return this.leading === 'back' || this.leading === 'app-icon';
674
+ return !!this.pageTitle || this.headerBack || this._hasAppIcon;
678
675
  }
679
676
 
680
677
  /** `headingLevel` as a safe `aria-level`: a whole number clamped to 1–6, and 1 for anything non-numeric. */
@@ -683,70 +680,77 @@ export class NileAppShell extends NileElement {
683
680
  return Number.isFinite(level) ? Math.min(6, Math.max(1, level)) : 1;
684
681
  }
685
682
 
686
- private _renderLeading(): TemplateResult | string {
687
- if (this.leading === 'app-icon') {
688
- return html`
689
- <span class="app-icon" part="app-icon">
690
- <slot name="app-icon"></slot>
691
- </span>
692
- `;
693
- }
694
-
695
- if (this.leading === 'back') {
696
- return html`
683
+ private _renderBack(): TemplateResult | string {
684
+ if (!this.headerBack) return '';
685
+ return html`
686
+ <span class="back-line">
697
687
  <button
698
688
  class="back"
699
689
  part="back"
700
690
  type="button"
691
+ aria-label=${this.headerBackLabel}
692
+ title=${this.headerBackLabel}
701
693
  @click=${() => this.goBackHeader()}
702
694
  >
703
- ${renderGlyph('ng-chevron-left', 20, 'currentColor')}
704
- <span>${this.backLabel}</span>
695
+ ${renderGlyph('ng-arrow-narrow-left', 20, 'currentColor')}
705
696
  </button>
706
- ${this.pageTitle
707
- ? html`<span class="crumb-divider" aria-hidden="true">
708
- ${renderGlyph('ng-slash', 16, 'currentColor')}
709
- </span>`
710
- : ''}
711
- `;
712
- }
697
+ </span>
698
+ `;
699
+ }
700
+
701
+ private _renderAppIconSlot(): TemplateResult {
702
+ return html`<slot
703
+ name="app-icon"
704
+ @slotchange=${(e: Event) => this._onSlotChange('app-icon', e)}
705
+ ></slot>`;
706
+ }
713
707
 
714
- return '';
708
+ /* The app-icon slot has to exist whenever the stack does not, or a slotted icon could never mount it: park it, hidden. */
709
+ private _renderAppIconProbe(): TemplateResult {
710
+ return html`<span class="app-icon-probe" hidden
711
+ >${this._renderAppIconSlot()}</span
712
+ >`;
715
713
  }
716
714
 
717
- private _renderTitleBlock(): TemplateResult | string {
718
- if (!this._hasTitleBlock) return '';
715
+ private _renderTitleBlock(): TemplateResult {
716
+ if (!this._hasTitleBlock) return this._renderAppIconProbe();
717
+
718
+ /* The stack is the title and/or the app icon; a back arrow on its own brings no empty stack. */
719
+ if (!this.pageTitle && !this._hasAppIcon) {
720
+ return html`
721
+ <div class="title-area" part="title-area">
722
+ ${this._renderBack()} ${this._renderAppIconProbe()}
723
+ </div>
724
+ `;
725
+ }
719
726
 
720
- /* Both leading modes render beside the title stack, never inside the title row, so the description stays under the page title in every leading mode. */
727
+ /* The back arrow sits beside the stack; the app icon starts the stack's first row, so the description lines up under the icon when there is one and under the title when not. */
721
728
  return html`
722
729
  <div class="title-area" part="title-area">
723
- ${this._hasLeading
724
- ? html`<span class="leading" part="leading"
725
- >${this._renderLeading()}</span
726
- >`
727
- : ''}
728
- ${this.pageTitle
729
- ? html`
730
- <div class="title-stack">
731
- <div class="title-row">
732
- <div
733
- class="page-title"
734
- part="page-title"
735
- role="heading"
736
- aria-level=${this._headingLevel}
737
- >${this.pageTitle}</div>
738
- ${this.badge
739
- ? html`<span class="badge" part="badge">${this.badge}</span>`
740
- : ''}
741
- </div>
742
- ${this.description
743
- ? html`<p class="description" part="description">
744
- ${this.description}
745
- </p>`
746
- : ''}
747
- </div>
748
- `
749
- : ''}
730
+ ${this._renderBack()}
731
+ <div class="title-stack">
732
+ <div class="title-row">
733
+ <span class="app-icon" part="app-icon"
734
+ >${this._renderAppIconSlot()}</span
735
+ >
736
+ ${this.pageTitle
737
+ ? html`<div
738
+ class="page-title"
739
+ part="page-title"
740
+ role="heading"
741
+ aria-level=${this._headingLevel}
742
+ >${this.pageTitle}</div>`
743
+ : ''}
744
+ ${this.pageTitle && this.badge
745
+ ? html`<span class="badge" part="badge">${this.badge}</span>`
746
+ : ''}
747
+ </div>
748
+ ${this.pageTitle && this.description
749
+ ? html`<p class="description" part="description">
750
+ ${this.description}
751
+ </p>`
752
+ : ''}
753
+ </div>
750
754
  </div>
751
755
  `;
752
756
  }
@@ -773,13 +777,16 @@ export class NileAppShell extends NileElement {
773
777
  @slotchange=${(e: Event) =>
774
778
  this._onSlotChange('top-bar-actions', e)}
775
779
  ></slot>
780
+ ${this.askVisible && this._hasTopBarActions
781
+ ? html`<span class="rule ask-rule" part="ask-rule"></span>`
782
+ : ''}
776
783
  ${this.askVisible
777
784
  ? html`
778
785
  <nile-button
779
786
  class="ask"
780
787
  part="ask"
781
788
  exportparts="base: ask__base, label: ask__label"
782
- variant="primary"
789
+ variant="secondary"
783
790
  @click=${() => this.openPanel()}
784
791
  >
785
792
  <span slot="prefix" class="ask-mark">
@@ -80,7 +80,9 @@ export const styles = css`
80
80
 
81
81
  .title {
82
82
  margin: 0;
83
- font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
83
+ /* Figma's Assistant Title: Text lg/Semibold, 18/28 on NxtGen. Enterprise keeps --nile-type-scale-3, and it defines no --ng-* tokens, so the line-height declaration is invalid there and the title inherits its line height exactly as before. */
84
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-lg));
85
+ line-height: var(--ng-line-height-text-lg);
84
86
  font-weight: var(
85
87
  --nile-font-weight-semi-bold,
86
88
  var(--ng-font-weight-semibold)
@@ -235,35 +235,23 @@ export const styles = css`
235
235
  display: contents;
236
236
  }
237
237
 
238
- .select__tags nile-tag {
238
+ :host([showtooltip]) .select__tags nile-tag {
239
239
  flex: 0 1 auto;
240
240
  cursor: pointer;
241
241
  min-width: 0;
242
- }
243
-
244
- /* A chip is capped - and so truncated - only when a tooltip can reveal the
245
- full value. Without one it keeps its natural width and the fit pass moves
246
- the surplus into the +N button instead. */
247
- :host([showtooltip]) .select__tags nile-tag {
248
242
  max-width: var(--nile-width-180px, var(--ng-height-180px));
249
243
  }
250
244
 
251
- /* Only the fitted layout can move a chip into the +N button, so only there
252
- can a chip refuse to shrink. */
253
- :host(:not([showtooltip])) .select__tags--fitted nile-tag {
254
- flex-shrink: 0;
255
- }
256
-
257
- .select__tags nile-tag::part(base) {
245
+ :host([showtooltip]) .select__tags nile-tag::part(base) {
258
246
  max-width: 100%;
259
247
  }
260
248
 
261
- .select__tags nile-tag::part(prefix_content_wrapper) {
249
+ :host([showtooltip]) .select__tags nile-tag::part(prefix_content_wrapper) {
262
250
  flex: 1 1 auto;
263
251
  min-width: 0;
264
252
  }
265
253
 
266
- .select__tags nile-tag::part(content) {
254
+ :host([showtooltip]) .select__tags nile-tag::part(content) {
267
255
  display: block;
268
256
  flex: 1 1 auto;
269
257
  min-width: 0;
@@ -279,7 +267,7 @@ export const styles = css`
279
267
  text-overflow: ellipsis;
280
268
  }
281
269
 
282
- .select__tags nile-tag::part(remove-button) {
270
+ :host([showtooltip]) .select__tags nile-tag::part(remove-button) {
283
271
  flex: 0 0 auto;
284
272
  }
285
273
 
@@ -535,6 +523,9 @@ export const styles = css`
535
523
  bottom: 0;
536
524
  z-index: 1;
537
525
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
526
+ }
527
+
528
+ .select__pre-footer-area--query {
538
529
  container-type: inline-size;
539
530
  container-name: nile-select-footer;
540
531
  }
@@ -640,6 +631,10 @@ export const styles = css`
640
631
  }
641
632
  }
642
633
 
634
+ .select__invisible {
635
+ opacity: 0;
636
+ }
637
+
643
638
  .select__prefix--from-options {
644
639
  margin-inline-end: var(--nile-spacing-lg, var(--ng-spacing-md));
645
640
  }