@aquera/nile-elements 2.0.4 → 2.0.6

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 (225) hide show
  1. package/README.md +9 -0
  2. package/demo/nxtgen-classes.css +609 -12
  3. package/demo/nxtgen-dark.css +254 -35
  4. package/demo/nxtgen-properties.css +27 -24
  5. package/demo/nxtgen-utilities.css +633 -36
  6. package/demo/nxtgen.css +70 -12
  7. package/demo/utilities.css +3 -0
  8. package/demo/variables.css +3 -0
  9. package/dist/index.cjs.js +1 -1
  10. package/dist/index.esm.js +1 -1
  11. package/dist/index.js +1375 -358
  12. package/dist/internal/glyph.cjs.js +1 -1
  13. package/dist/internal/glyph.cjs.js.map +1 -1
  14. package/dist/internal/glyph.esm.js +6 -5
  15. package/dist/nile-app-shell/index.cjs.js +2 -0
  16. package/dist/nile-app-shell/index.cjs.js.map +1 -0
  17. package/dist/nile-app-shell/index.esm.js +1 -0
  18. package/dist/nile-app-shell/nile-app-shell.cjs.js +2 -0
  19. package/dist/nile-app-shell/nile-app-shell.cjs.js.map +1 -0
  20. package/dist/nile-app-shell/nile-app-shell.css.cjs.js +2 -0
  21. package/dist/nile-app-shell/nile-app-shell.css.cjs.js.map +1 -0
  22. package/dist/nile-app-shell/nile-app-shell.css.esm.js +554 -0
  23. package/dist/nile-app-shell/nile-app-shell.esm.js +155 -0
  24. package/dist/nile-app-shell/shell-controller.cjs.js +2 -0
  25. package/dist/nile-app-shell/shell-controller.cjs.js.map +1 -0
  26. package/dist/nile-app-shell/shell-controller.esm.js +1 -0
  27. package/dist/nile-app-shell-main/index.cjs.js +2 -0
  28. package/dist/nile-app-shell-main/index.cjs.js.map +1 -0
  29. package/dist/nile-app-shell-main/index.esm.js +1 -0
  30. package/dist/nile-app-shell-main/nile-app-shell-main.cjs.js +2 -0
  31. package/dist/nile-app-shell-main/nile-app-shell-main.cjs.js.map +1 -0
  32. package/dist/nile-app-shell-main/nile-app-shell-main.css.cjs.js +2 -0
  33. package/dist/nile-app-shell-main/nile-app-shell-main.css.cjs.js.map +1 -0
  34. package/dist/nile-app-shell-main/nile-app-shell-main.css.esm.js +18 -0
  35. package/dist/nile-app-shell-main/nile-app-shell-main.esm.js +1 -0
  36. package/dist/nile-app-shell-nav-toggle/index.cjs.js +2 -0
  37. package/dist/nile-app-shell-nav-toggle/index.cjs.js.map +1 -0
  38. package/dist/nile-app-shell-nav-toggle/index.esm.js +1 -0
  39. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.cjs.js +2 -0
  40. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.cjs.js.map +1 -0
  41. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.cjs.js +2 -0
  42. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.cjs.js.map +1 -0
  43. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.esm.js +29 -0
  44. package/dist/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.esm.js +16 -0
  45. package/dist/nile-app-shell-panel/index.cjs.js +2 -0
  46. package/dist/nile-app-shell-panel/index.cjs.js.map +1 -0
  47. package/dist/nile-app-shell-panel/index.esm.js +1 -0
  48. package/dist/nile-app-shell-panel/nile-app-shell-panel.cjs.js +2 -0
  49. package/dist/nile-app-shell-panel/nile-app-shell-panel.cjs.js.map +1 -0
  50. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js +2 -0
  51. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js.map +1 -0
  52. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.esm.js +103 -0
  53. package/dist/nile-app-shell-panel/nile-app-shell-panel.esm.js +33 -0
  54. package/dist/nile-app-shell-side-nav/index.cjs.js +2 -0
  55. package/dist/nile-app-shell-side-nav/index.cjs.js.map +1 -0
  56. package/dist/nile-app-shell-side-nav/index.esm.js +1 -0
  57. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.cjs.js +2 -0
  58. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.cjs.js.map +1 -0
  59. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.css.cjs.js +2 -0
  60. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.css.cjs.js.map +1 -0
  61. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.css.esm.js +55 -0
  62. package/dist/nile-app-shell-side-nav/nile-app-shell-side-nav.esm.js +5 -0
  63. package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
  64. package/dist/nile-combobox/nile-combobox.cjs.js.map +1 -1
  65. package/dist/nile-combobox/nile-combobox.css.cjs.js +1 -1
  66. package/dist/nile-combobox/nile-combobox.css.cjs.js.map +1 -1
  67. package/dist/nile-combobox/nile-combobox.css.esm.js +28 -15
  68. package/dist/nile-combobox/nile-combobox.esm.js +11 -8
  69. package/dist/nile-combobox/portal-manager.cjs.js +1 -1
  70. package/dist/nile-combobox/portal-manager.cjs.js.map +1 -1
  71. package/dist/nile-combobox/portal-manager.esm.js +1 -1
  72. package/dist/nile-combobox/renderer.cjs.js +1 -1
  73. package/dist/nile-combobox/renderer.cjs.js.map +1 -1
  74. package/dist/nile-combobox/renderer.esm.js +31 -43
  75. package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
  76. package/dist/nile-floating-panel/nile-floating-panel.cjs.js.map +1 -1
  77. package/dist/nile-floating-panel/nile-floating-panel.css.cjs.js +1 -1
  78. package/dist/nile-floating-panel/nile-floating-panel.css.cjs.js.map +1 -1
  79. package/dist/nile-floating-panel/nile-floating-panel.css.esm.js +46 -8
  80. package/dist/nile-floating-panel/nile-floating-panel.esm.js +1 -1
  81. package/dist/nile-popover/nile-popover.cjs.js +1 -1
  82. package/dist/nile-popover/nile-popover.cjs.js.map +1 -1
  83. package/dist/nile-popover/nile-popover.css.cjs.js +1 -1
  84. package/dist/nile-popover/nile-popover.css.cjs.js.map +1 -1
  85. package/dist/nile-popover/nile-popover.css.esm.js +32 -17
  86. package/dist/nile-popover/nile-popover.esm.js +1 -1
  87. package/dist/nile-wysiwyg-editor/index.cjs.js +1 -1
  88. package/dist/nile-wysiwyg-editor/index.esm.js +1 -1
  89. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  90. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +1 -1
  91. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +1 -1
  92. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -1
  93. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +1 -1
  94. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +1 -1
  95. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  96. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  97. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +1 -1
  98. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +1 -1
  99. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -1
  100. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +2 -2
  101. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +1 -1
  102. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -1
  103. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +4 -4
  104. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  105. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  106. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +1 -1
  107. package/dist/src/index.d.ts +7 -2
  108. package/dist/src/index.js +6 -1
  109. package/dist/src/index.js.map +1 -1
  110. package/dist/src/internal/glyph.d.ts +6 -1
  111. package/dist/src/internal/glyph.js +8 -1
  112. package/dist/src/internal/glyph.js.map +1 -1
  113. package/dist/src/nile-app-shell/index.d.ts +7 -0
  114. package/dist/src/nile-app-shell/index.js +8 -0
  115. package/dist/src/nile-app-shell/index.js.map +1 -0
  116. package/dist/src/nile-app-shell/nile-app-shell-regions.test.d.ts +4 -0
  117. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js +177 -0
  118. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js.map +1 -0
  119. package/dist/src/nile-app-shell/nile-app-shell.css.d.ts +18 -0
  120. package/dist/src/nile-app-shell/nile-app-shell.css.js +572 -0
  121. package/dist/src/nile-app-shell/nile-app-shell.css.js.map +1 -0
  122. package/dist/src/nile-app-shell/nile-app-shell.d.ts +292 -0
  123. package/dist/src/nile-app-shell/nile-app-shell.js +796 -0
  124. package/dist/src/nile-app-shell/nile-app-shell.js.map +1 -0
  125. package/dist/src/nile-app-shell/nile-app-shell.test.d.ts +3 -0
  126. package/dist/src/nile-app-shell/nile-app-shell.test.js +454 -0
  127. package/dist/src/nile-app-shell/nile-app-shell.test.js.map +1 -0
  128. package/dist/src/nile-app-shell/shell-controller.d.ts +34 -0
  129. package/dist/src/nile-app-shell/shell-controller.js +80 -0
  130. package/dist/src/nile-app-shell/shell-controller.js.map +1 -0
  131. package/dist/src/nile-app-shell-main/index.d.ts +7 -0
  132. package/dist/src/nile-app-shell-main/index.js +8 -0
  133. package/dist/src/nile-app-shell-main/index.js.map +1 -0
  134. package/dist/src/nile-app-shell-main/nile-app-shell-main.css.d.ts +9 -0
  135. package/dist/src/nile-app-shell-main/nile-app-shell-main.css.js +27 -0
  136. package/dist/src/nile-app-shell-main/nile-app-shell-main.css.js.map +1 -0
  137. package/dist/src/nile-app-shell-main/nile-app-shell-main.d.ts +38 -0
  138. package/dist/src/nile-app-shell-main/nile-app-shell-main.js +51 -0
  139. package/dist/src/nile-app-shell-main/nile-app-shell-main.js.map +1 -0
  140. package/dist/src/nile-app-shell-nav-toggle/index.d.ts +7 -0
  141. package/dist/src/nile-app-shell-nav-toggle/index.js +8 -0
  142. package/dist/src/nile-app-shell-nav-toggle/index.js.map +1 -0
  143. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.d.ts +13 -0
  144. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.js +42 -0
  145. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.js.map +1 -0
  146. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.d.ts +56 -0
  147. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.js +126 -0
  148. package/dist/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.js.map +1 -0
  149. package/dist/src/nile-app-shell-panel/index.d.ts +7 -0
  150. package/dist/src/nile-app-shell-panel/index.js +8 -0
  151. package/dist/src/nile-app-shell-panel/index.js.map +1 -0
  152. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.d.ts +9 -0
  153. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js +112 -0
  154. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js.map +1 -0
  155. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.d.ts +73 -0
  156. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.js +158 -0
  157. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.js.map +1 -0
  158. package/dist/src/nile-app-shell-side-nav/index.d.ts +7 -0
  159. package/dist/src/nile-app-shell-side-nav/index.js +8 -0
  160. package/dist/src/nile-app-shell-side-nav/index.js.map +1 -0
  161. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.css.d.ts +13 -0
  162. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.css.js +68 -0
  163. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.css.js.map +1 -0
  164. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.d.ts +54 -0
  165. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.js +83 -0
  166. package/dist/src/nile-app-shell-side-nav/nile-app-shell-side-nav.js.map +1 -0
  167. package/dist/src/nile-combobox/nile-combobox.css.js +28 -15
  168. package/dist/src/nile-combobox/nile-combobox.css.js.map +1 -1
  169. package/dist/src/nile-combobox/nile-combobox.js +49 -10
  170. package/dist/src/nile-combobox/nile-combobox.js.map +1 -1
  171. package/dist/src/nile-combobox/portal-manager.js +2 -22
  172. package/dist/src/nile-combobox/portal-manager.js.map +1 -1
  173. package/dist/src/nile-combobox/renderer.d.ts +2 -3
  174. package/dist/src/nile-combobox/renderer.js +14 -45
  175. package/dist/src/nile-combobox/renderer.js.map +1 -1
  176. package/dist/src/nile-floating-panel/nile-floating-panel.css.js +46 -8
  177. package/dist/src/nile-floating-panel/nile-floating-panel.css.js.map +1 -1
  178. package/dist/src/nile-floating-panel/nile-floating-panel.js +13 -1
  179. package/dist/src/nile-floating-panel/nile-floating-panel.js.map +1 -1
  180. package/dist/src/nile-popover/nile-popover.css.js +30 -15
  181. package/dist/src/nile-popover/nile-popover.css.js.map +1 -1
  182. package/dist/src/nile-popover/nile-popover.js +1 -1
  183. package/dist/src/nile-popover/nile-popover.js.map +1 -1
  184. package/dist/src/nile-popover/nile-popover.test.js +1 -1
  185. package/dist/src/nile-popover/nile-popover.test.js.map +1 -1
  186. package/dist/src/version.d.ts +11 -1
  187. package/dist/src/version.js +56 -5
  188. package/dist/src/version.js.map +1 -1
  189. package/dist/tsconfig.tsbuildinfo +1 -1
  190. package/dist/version.cjs.js +1 -1
  191. package/dist/version.cjs.js.map +1 -1
  192. package/dist/version.esm.js +1 -1
  193. package/package.json +8 -2
  194. package/scripts/replace-version.cjs +12 -10
  195. package/src/index.ts +16 -4
  196. package/src/internal/glyph.ts +12 -1
  197. package/src/nile-app-shell/index.ts +8 -0
  198. package/src/nile-app-shell/nile-app-shell-regions.test.ts +215 -0
  199. package/src/nile-app-shell/nile-app-shell.css.ts +574 -0
  200. package/src/nile-app-shell/nile-app-shell.test.ts +536 -0
  201. package/src/nile-app-shell/nile-app-shell.ts +838 -0
  202. package/src/nile-app-shell/shell-controller.ts +100 -0
  203. package/src/nile-app-shell-main/index.ts +8 -0
  204. package/src/nile-app-shell-main/nile-app-shell-main.css.ts +29 -0
  205. package/src/nile-app-shell-main/nile-app-shell-main.ts +52 -0
  206. package/src/nile-app-shell-nav-toggle/index.ts +8 -0
  207. package/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.css.ts +44 -0
  208. package/src/nile-app-shell-nav-toggle/nile-app-shell-nav-toggle.ts +138 -0
  209. package/src/nile-app-shell-panel/index.ts +8 -0
  210. package/src/nile-app-shell-panel/nile-app-shell-panel.css.ts +114 -0
  211. package/src/nile-app-shell-panel/nile-app-shell-panel.ts +161 -0
  212. package/src/nile-app-shell-side-nav/index.ts +8 -0
  213. package/src/nile-app-shell-side-nav/nile-app-shell-side-nav.css.ts +70 -0
  214. package/src/nile-app-shell-side-nav/nile-app-shell-side-nav.ts +86 -0
  215. package/src/nile-combobox/nile-combobox.css.ts +28 -15
  216. package/src/nile-combobox/nile-combobox.ts +61 -12
  217. package/src/nile-combobox/portal-manager.ts +4 -22
  218. package/src/nile-combobox/renderer.ts +26 -69
  219. package/src/nile-floating-panel/nile-floating-panel.css.ts +46 -8
  220. package/src/nile-floating-panel/nile-floating-panel.ts +19 -1
  221. package/src/nile-popover/nile-popover.css.ts +30 -15
  222. package/src/nile-popover/nile-popover.test.ts +1 -1
  223. package/src/nile-popover/nile-popover.ts +1 -1
  224. package/src/version.ts +61 -4
  225. package/vscode-html-custom-data.json +216 -5
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Copyright Aquera Inc 2023
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 { CSSResultArray, TemplateResult } from 'lit';
8
+ import NileElement from '../internal/nile-element';
9
+ /**
10
+ * @summary The shell's left region — the navigation track. Assigns itself to the
11
+ * shell's `side-nav` slot and mirrors the shell's rail state, so nav content can
12
+ * style against it.
13
+ *
14
+ * @status stable
15
+ * @since 2.0
16
+ *
17
+ * @tag nile-app-shell-side-nav
18
+ *
19
+ * @dependency nile-app-shell
20
+ *
21
+ * @slot - The nav body. Scrolls.
22
+ * @slot header - Pinned above the scroll region — a wordmark or product switcher.
23
+ * @slot footer - Pinned below it — an account row or help link.
24
+ *
25
+ * @csspart header - The pinned header.
26
+ * @csspart body - The scrolling nav body.
27
+ * @csspart footer - The pinned footer.
28
+ *
29
+ * @cssproperty [--nile-app-shell-side-nav-padding=12px] - Body inset. 12 + 40 +
30
+ * 12 is what makes a 64px rail.
31
+ * @cssproperty [--nile-app-shell-side-nav-bg=transparent] - Surface behind the
32
+ * nav. Transparent by default: the nav and the page share one.
33
+ */
34
+ export declare class NileAppShellSideNav extends NileElement {
35
+ static get styles(): CSSResultArray;
36
+ private shellLink;
37
+ /**
38
+ * Mirrors the shell's effective rail state — the user's preference, or a rail
39
+ * forced by the shell's width. Set by the shell; treat it as read-only and
40
+ * style against it (`nile-app-shell-side-nav[collapsed] .label`).
41
+ */
42
+ collapsed: boolean;
43
+ /** Id of the shell to follow. Defaults to the nearest ancestor. */
44
+ shell?: string;
45
+ connectedCallback(): void;
46
+ protected willUpdate(): void;
47
+ render(): TemplateResult;
48
+ }
49
+ export default NileAppShellSideNav;
50
+ declare global {
51
+ interface HTMLElementTagNameMap {
52
+ 'nile-app-shell-side-nav': NileAppShellSideNav;
53
+ }
54
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Copyright Aquera Inc 2023
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 { __decorate } from "tslib";
8
+ import { html } from 'lit';
9
+ import { customElement, property } from 'lit/decorators.js';
10
+ import { styles } from './nile-app-shell-side-nav.css';
11
+ import { AppShellController } from '../nile-app-shell/shell-controller';
12
+ import NileElement from '../internal/nile-element';
13
+ /**
14
+ * @summary The shell's left region — the navigation track. Assigns itself to the
15
+ * shell's `side-nav` slot and mirrors the shell's rail state, so nav content can
16
+ * style against it.
17
+ *
18
+ * @status stable
19
+ * @since 2.0
20
+ *
21
+ * @tag nile-app-shell-side-nav
22
+ *
23
+ * @dependency nile-app-shell
24
+ *
25
+ * @slot - The nav body. Scrolls.
26
+ * @slot header - Pinned above the scroll region — a wordmark or product switcher.
27
+ * @slot footer - Pinned below it — an account row or help link.
28
+ *
29
+ * @csspart header - The pinned header.
30
+ * @csspart body - The scrolling nav body.
31
+ * @csspart footer - The pinned footer.
32
+ *
33
+ * @cssproperty [--nile-app-shell-side-nav-padding=12px] - Body inset. 12 + 40 +
34
+ * 12 is what makes a 64px rail.
35
+ * @cssproperty [--nile-app-shell-side-nav-bg=transparent] - Surface behind the
36
+ * nav. Transparent by default: the nav and the page share one.
37
+ */
38
+ let NileAppShellSideNav = class NileAppShellSideNav extends NileElement {
39
+ constructor() {
40
+ super(...arguments);
41
+ this.shellLink = new AppShellController(this);
42
+ /**
43
+ * Mirrors the shell's effective rail state — the user's preference, or a rail
44
+ * forced by the shell's width. Set by the shell; treat it as read-only and
45
+ * style against it (`nile-app-shell-side-nav[collapsed] .label`).
46
+ */
47
+ this.collapsed = false;
48
+ }
49
+ static get styles() {
50
+ return [styles];
51
+ }
52
+ connectedCallback() {
53
+ super.connectedCallback();
54
+ // Claim the shell's left region unless the author placed it elsewhere.
55
+ if (!this.hasAttribute('slot'))
56
+ this.setAttribute('slot', 'side-nav');
57
+ }
58
+ willUpdate() {
59
+ this.shellLink.shellId = this.shell;
60
+ const shell = this.shellLink.shell;
61
+ if (shell)
62
+ this.collapsed = shell.rail;
63
+ }
64
+ render() {
65
+ return html `
66
+ <slot name="header" part="header" class="header"></slot>
67
+ <div class="body" part="body"><slot></slot></div>
68
+ <slot name="footer" part="footer" class="footer"></slot>
69
+ `;
70
+ }
71
+ };
72
+ __decorate([
73
+ property({ type: Boolean, reflect: true })
74
+ ], NileAppShellSideNav.prototype, "collapsed", void 0);
75
+ __decorate([
76
+ property({ type: String })
77
+ ], NileAppShellSideNav.prototype, "shell", void 0);
78
+ NileAppShellSideNav = __decorate([
79
+ customElement('nile-app-shell-side-nav')
80
+ ], NileAppShellSideNav);
81
+ export { NileAppShellSideNav };
82
+ export default NileAppShellSideNav;
83
+ //# sourceMappingURL=nile-app-shell-side-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-app-shell-side-nav.js","sourceRoot":"","sources":["../../../src/nile-app-shell-side-nav/nile-app-shell-side-nav.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAEH,OAAO,EAAE,IAAI,EAAkC,MAAM,KAAK,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,WAAW;IAA7C;;QAKG,cAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEjD;;;;WAIG;QAEH,cAAS,GAAY,KAAK,CAAC;IAyB7B,CAAC;IArCQ,MAAM,KAAK,MAAM;QACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAgBM,iBAAiB;QACtB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,uEAAuE;QACvE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IAES,UAAU;QAClB,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACnC,IAAI,KAAK;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IACzC,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAA;;;;KAIV,CAAC;IACJ,CAAC;CACF,CAAA;AAzBC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;sDAChB;AAI3B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACZ;AAjBJ,mBAAmB;IAD/B,aAAa,CAAC,yBAAyB,CAAC;GAC5B,mBAAmB,CAsC/B;;AAED,eAAe,mBAAmB,CAAC","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, CSSResultArray, TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { styles } from './nile-app-shell-side-nav.css';\nimport { AppShellController } from '../nile-app-shell/shell-controller';\nimport NileElement from '../internal/nile-element';\n\n/**\n * @summary The shell's left region — the navigation track. Assigns itself to the\n * shell's `side-nav` slot and mirrors the shell's rail state, so nav content can\n * style against it.\n *\n * @status stable\n * @since 2.0\n *\n * @tag nile-app-shell-side-nav\n *\n * @dependency nile-app-shell\n *\n * @slot - The nav body. Scrolls.\n * @slot header - Pinned above the scroll region — a wordmark or product switcher.\n * @slot footer - Pinned below it — an account row or help link.\n *\n * @csspart header - The pinned header.\n * @csspart body - The scrolling nav body.\n * @csspart footer - The pinned footer.\n *\n * @cssproperty [--nile-app-shell-side-nav-padding=12px] - Body inset. 12 + 40 +\n * 12 is what makes a 64px rail.\n * @cssproperty [--nile-app-shell-side-nav-bg=transparent] - Surface behind the\n * nav. Transparent by default: the nav and the page share one.\n */\n@customElement('nile-app-shell-side-nav')\nexport class NileAppShellSideNav extends NileElement {\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n private shellLink = new AppShellController(this);\n\n /**\n * Mirrors the shell's effective rail state — the user's preference, or a rail\n * forced by the shell's width. Set by the shell; treat it as read-only and\n * style against it (`nile-app-shell-side-nav[collapsed] .label`).\n */\n @property({ type: Boolean, reflect: true })\n collapsed: boolean = false;\n\n /** Id of the shell to follow. Defaults to the nearest ancestor. */\n @property({ type: String })\n shell?: string;\n\n public connectedCallback(): void {\n super.connectedCallback();\n // Claim the shell's left region unless the author placed it elsewhere.\n if (!this.hasAttribute('slot')) this.setAttribute('slot', 'side-nav');\n }\n\n protected willUpdate(): void {\n this.shellLink.shellId = this.shell;\n const shell = this.shellLink.shell;\n if (shell) this.collapsed = shell.rail;\n }\n\n public render(): TemplateResult {\n return html`\n <slot name=\"header\" part=\"header\" class=\"header\"></slot>\n <div class=\"body\" part=\"body\"><slot></slot></div>\n <slot name=\"footer\" part=\"footer\" class=\"footer\"></slot>\n `;\n }\n}\n\nexport default NileAppShellSideNav;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-app-shell-side-nav': NileAppShellSideNav;\n }\n}\n"]}
@@ -348,20 +348,26 @@ export const styles = css `
348
348
  /* ── Listbox (dropdown) ── */
349
349
 
350
350
  .combobox__listbox {
351
- display: block;
351
+ display: flex;
352
+ flex-direction: column;
352
353
  position: relative;
353
354
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));
354
355
  font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));
355
356
  background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));
356
357
  border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-secondary-alt));
357
358
  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;
359
+ padding: 0;
362
360
  max-width: var(--auto-size-available-width);
363
361
  max-height: var(--auto-size-available-height);
364
362
  box-shadow: 0px 2px 4px 0px rgba(119, 125, 130, 0.15);
363
+ overflow: hidden; /* Scrolling is handled by .combobox__options-scroll below */
364
+ box-sizing: border-box;
365
+ }
366
+
367
+ .combobox__options-scroll {
368
+ overflow-y: auto;
369
+ flex: 0 1 auto;
370
+ min-height: 0;
365
371
  }
366
372
 
367
373
  /* ── Options ── */
@@ -369,7 +375,11 @@ export const styles = css `
369
375
  .combobox__options {
370
376
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
371
377
  color: rgb(133, 129, 129);
378
+ display: block;
379
+ position: relative;
372
380
  width: 100%;
381
+ padding-bottom: 0;
382
+ box-sizing: border-box;
373
383
  }
374
384
 
375
385
  .combobox__options.loading {
@@ -423,9 +433,6 @@ export const styles = css `
423
433
  /* ── Top actions (Select All + Selected/All filter toggle) ── */
424
434
 
425
435
  .combobox__top-actions {
426
- position: sticky;
427
- top: 0;
428
- z-index: 2;
429
436
  display: flex;
430
437
  flex-direction: row;
431
438
  align-items: center;
@@ -480,16 +487,15 @@ export const styles = css `
480
487
  /* ── Footer ── */
481
488
 
482
489
  .combobox__footer {
483
- position: sticky;
484
- bottom: 0;
490
+ flex-shrink: 0;
485
491
  background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
486
492
  border-top: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
487
493
  display: flex;
488
494
  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));
495
+ align-items: center;
492
496
  justify-content: space-between;
497
+ padding: var(--nile-spacing-md, 8px) var(--nile-spacing-lg, 12px);
498
+ margin-top: 0;
493
499
  }
494
500
 
495
501
  .combobox__footer.loading {
@@ -547,7 +553,7 @@ export const styles = css `
547
553
 
548
554
  /* ── Grid layout ── */
549
555
 
550
- :host([grid-columns]) .combobox__listbox {
556
+ :host([grid-columns]) .combobox__options-scroll {
551
557
  overflow-y: auto;
552
558
  }
553
559
 
@@ -567,8 +573,11 @@ export const styles = css `
567
573
  /* ── Bidirectional grid layout (vertical + horizontal scroll) ── */
568
574
 
569
575
  .combobox__listbox.combobox__listbox--bidirectional {
570
- overflow: auto;
571
576
  max-width: none;
577
+ }
578
+
579
+ .combobox__listbox--bidirectional .combobox__options-scroll {
580
+ overflow: auto;
572
581
  scrollbar-width: thin;
573
582
  scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;
574
583
  }
@@ -652,6 +661,8 @@ export const styles = css `
652
661
  * header (computed on scroll). */
653
662
  .combobox__group-header-slot {
654
663
  pointer-events: none;
664
+ z-index: 3;
665
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
655
666
  }
656
667
  .combobox__group-header-slot .combobox__group-header {
657
668
  height: 100%;
@@ -663,6 +674,8 @@ export const styles = css `
663
674
  top: 0;
664
675
  z-index: 2;
665
676
  pointer-events: none;
677
+ height: 32px;
678
+ overflow: hidden;
666
679
  }
667
680
  .combobox__group-sticky-overlay .combobox__group-header {
668
681
  box-shadow: 0 1px 0 0 var(--nile-colors-neutral-300, var(--ng-colors-border-secondary));
@@ -1 +1 @@
1
- {"version":3,"file":"nile-combobox.css.js","sourceRoot":"","sources":["../../../src/nile-combobox/nile-combobox.css.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0sBxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n -webkit-font-smoothing: var(--nile-webkit-font-smoothing, var(--ng-webkit-font-smoothing));\n -moz-osx-font-smoothing: var(--nile-moz-osx-font-smoothing, var(--ng-moz-osx-font-smoothing));\n text-rendering: var(--nile-text-rendering, var(--ng-text-rendering));\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n [hidden] {\n display: none;\n }\n\n /* ── Form control ── */\n\n .form-control .form-control__label {\n display: none;\n }\n\n .form-control--has-label .form-control__label {\n display: block;\n margin-bottom: var(--nile-spacing-sm, var(--ng-spacing-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-text-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n font-style: normal;\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n line-height: var(--nile-spacing-2xl, var(--ng-line-height-text-sm));\n letter-spacing: 0.2px;\n }\n\n .form-control--has-label.form-control--medium .form-control__label {\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n }\n\n :host([required]) .form-control--has-label .form-control__label::after {\n content: '*';\n margin-inline-start: -2px;\n color: var(--nile-colors-red-700, var(--ng-colors-text-error-primary-600));\n }\n\n :host([disabled]) .form-control--has-label .form-control__label {\n user-select: none;\n -webkit-user-select: none;\n }\n\n /* ── Popup ── */\n\n .combobox-popup {\n flex: 1 1 auto;\n display: inline-flex;\n width: 100%;\n position: relative;\n vertical-align: middle;\n }\n\n .combobox-popup::part(popup) {\n z-index: 9999;\n }\n\n .combobox-popup[data-current-placement^='top']::part(popup) {\n transform-origin: bottom;\n }\n\n .combobox-popup[data-current-placement^='bottom']::part(popup) {\n transform-origin: top;\n }\n\n /* ── Trigger: outer row that never scrolls ── */\n\n .combobox__trigger {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n position: relative;\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n letter-spacing: normal;\n cursor: text;\n transition: 150ms color, 150ms border, 150ms box-shadow, 150ms background-color;\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-primary));\n outline: none;\n }\n\n .combobox__trigger:hover {\n border-color: var(--nile-colors-dark-900, var(--ng-colors-border-neutral));\n }\n\n .combobox--open .combobox__trigger,\n .combobox--focused .combobox__trigger {\n border-color: var(--ng-colors-border-brand);\n box-shadow: 0 0 0 1px var(--ng-colors-border-brand) inset;\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox--disabled .combobox__trigger {\n background-color: var(--nile-colors-dark-200, var(--ng-colors-bg-disabled-subtle));\n border-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));\n cursor: not-allowed;\n user-select: none;\n }\n\n .combobox--warning .combobox__trigger {\n border-color: var(--nile-colors-yellow-500, var(--ng-colors-border-warning));\n }\n\n .combobox--error .combobox__trigger {\n border-color: var(--nile-colors-red-500, var(--ng-colors-border-error));\n }\n\n .combobox--success .combobox__trigger {\n border-color: var(--nile-colors-green-500, var(--ng-componentcolors-utility-success-500));\n }\n\n /* Size: small */\n .combobox--small .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n padding: var(--nile-spacing-md, var(--ng-spacing-sm)) var(--nile-spacing-md, var(--ng-spacing-md));\n min-height: var(--nile-height-32px, var(--ng-height-32px));\n }\n\n /* Size: medium */\n .combobox--medium .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n padding: var(--nile-spacing-lg, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg));\n min-height: var(--nile-height-40px, var(--ng-height-40px));\n box-sizing: border-box;\n }\n\n /* Size: large */\n .combobox--large .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));\n padding: var(--nile-spacing-xl, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));\n min-height: var(--nile-height-48px, var(--ng-height-48px));\n }\n\n .combobox--pill .combobox__trigger {\n border-radius: var(--nile-radius-3xl, var(--ng-radius-3xl));\n }\n\n .combobox--filled .combobox__trigger {\n border: none;\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox--filled.combobox--open .combobox__trigger,\n .combobox--filled.combobox--focused .combobox__trigger {\n outline: 3px solid rgba(0, 89, 255, 0.4);\n }\n\n /* ── Inner area: holds tags + input ── */\n\n .combobox__scroll-area {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n overflow: hidden;\n }\n\n /* Single-line: horizontal scroll for overflowing tags */\n .combobox__scroll-area--single-line {\n flex-wrap: nowrap;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary)) transparent;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar {\n height: 3px;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-thumb {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));\n border-radius: 3px;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-thumb:hover {\n background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n }\n\n /* Wrap: tags flow to multiple lines, trigger grows in height */\n .combobox__scroll-area--wrap {\n flex-wrap: wrap;\n overflow: visible;\n }\n\n /* ── Tags inside the scroll area ── */\n\n .combobox__scroll-area nile-tag {\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .combobox--disabled .combobox__scroll-area nile-tag {\n cursor: not-allowed;\n }\n\n .combobox__tags-count {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n line-height: var(--nile-line-height-xsmall, var(--ng-line-height-text-sm));\n letter-spacing: 0.2px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n /* ── Input wrapper inside scroll area ── */\n\n .combobox__input-wrapper {\n flex: 1;\n min-width: 60px;\n display: flex;\n align-items: center;\n }\n\n .combobox__input {\n width: 100%;\n font: inherit;\n border: none;\n background: none;\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n cursor: inherit;\n overflow: hidden;\n padding: 0;\n margin: 0;\n -webkit-appearance: none;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: inherit;\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n text-overflow: ellipsis;\n line-height: var(--nile-line-height-xsmall, var(--ng-line-height-text-sm));\n }\n\n .combobox__input::placeholder {\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n color: var(--nile-colors-text-placeholder, var(--ng-colors-text-placeholder));\n }\n\n .combobox__input:focus {\n outline: none;\n }\n\n .combobox--disabled .combobox__input {\n color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));\n pointer-events: none;\n }\n\n /* ── Hidden form value input ── */\n\n .combobox__value-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n margin: 0;\n opacity: 0;\n z-index: -1;\n }\n\n /* ── Action icons (clear, expand) ── */\n\n .combobox__actions {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n margin-inline-start: auto;\n }\n\n .combobox__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n color: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n transition: 150ms color;\n }\n\n .combobox__clear:hover {\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n }\n\n .combobox__clear:focus {\n outline: none;\n }\n\n .combobox__expand-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n transition: 250ms rotate ease;\n rotate: 0;\n }\n\n .combobox--open .combobox__expand-icon {\n rotate: -180deg;\n }\n\n /* ── Prefix / suffix ── */\n\n .combobox__prefix,\n .combobox__suffix {\n flex: 0;\n display: inline-flex;\n align-items: center;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n }\n\n .combobox__prefix {\n margin-inline-end: var(--nile-spacing-md, var(--ng-spacing-md));\n }\n\n /* ── Listbox (dropdown) ── */\n\n .combobox__listbox {\n display: block;\n position: relative;\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-secondary-alt));\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n padding-block: var(--nile-spacing-none, var(--ng-spacing-xs));\n padding-inline: var(--nile-spacing-none, var(--ng-spacing-xs));\n overscroll-behavior: none;\n overflow-y: auto;\n max-width: var(--auto-size-available-width);\n max-height: var(--auto-size-available-height);\n box-shadow: 0px 2px 4px 0px rgba(119, 125, 130, 0.15);\n }\n\n /* ── Options ── */\n\n .combobox__options {\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: rgb(133, 129, 129);\n width: 100%;\n }\n\n .combobox__options.loading {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .combobox__no-results {\n padding: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n text-align: center;\n }\n\n .combobox__no-results-title {\n font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));\n color: var(--nile-colors-dark-700, var(--ng-colors-text-secondary-700));\n }\n\n .combobox__no-results-subtitle {\n margin-top: var(--nile-spacing-xs, var(--ng-spacing-xs));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n }\n\n /* ── Options (both virtual and plain) ── */\n\n .combobox__options nile-option {\n width: 100%;\n display: block;\n }\n\n .combobox__options nile-option[selected] {\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox__options nile-option[selected]::part(base) {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n }\n\n .combobox__options-plain {\n display: flex;\n flex-direction: column;\n }\n\n .combobox__options-plain nile-option {\n flex-shrink: 0;\n }\n\n /* ── Top actions (Select All + Selected/All filter toggle) ── */\n\n .combobox__top-actions {\n position: sticky;\n top: 0;\n z-index: 2;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n padding: var(--nile-spacing-lg, var(--ng-spacing-lg));\n user-select: none;\n }\n\n .combobox__top-actions--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .combobox__select-all {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-md));\n cursor: pointer;\n flex: 1 1 auto;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n line-height: 14px;\n letter-spacing: 0.2px;\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n }\n\n .combobox__show-toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-md));\n border: none;\n background: none;\n padding: 0;\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n cursor: pointer;\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n line-height: 14px;\n letter-spacing: 0.2px;\n white-space: nowrap;\n }\n\n .combobox__show-toggle[disabled] {\n color: var(--nile-colors-primary-500, var(--ng-colors-fg-quaternary-400));\n cursor: not-allowed;\n }\n\n /* ── Footer ── */\n\n .combobox__footer {\n position: sticky;\n bottom: 0;\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-top: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n 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));\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n justify-content: space-between;\n }\n\n .combobox__footer.loading {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .combobox__footer-clear {\n display: inline-flex;\n align-items: center;\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n letter-spacing: 0.2px;\n }\n\n .combobox__footer-clear:hover {\n text-decoration: underline;\n }\n\n /* ── Loader ── */\n\n .combobox__loader {\n width: 100%;\n text-align: center;\n display: block;\n }\n\n .combobox__loader--icon {\n margin-top: var(--nile-spacing-xl, var(--ng-spacing-xl));\n animation: combobox-spin 0.6s linear infinite;\n }\n\n .combobox__loader--center {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 75%;\n }\n\n @keyframes combobox-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .combobox__add-option::part(base) {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n }\n\n /* ── Grid layout ── */\n\n :host([grid-columns]) .combobox__listbox {\n overflow-y: auto;\n }\n\n .combobox__grid-row {\n width: 100%;\n }\n\n .combobox__grid-row nile-option {\n min-width: 0;\n overflow: hidden;\n }\n\n .combobox__grid-row nile-option::part(base) {\n border-radius: var(--nile-radius-xs, var(--ng-radius-sm));\n }\n\n /* ── Bidirectional grid layout (vertical + horizontal scroll) ── */\n\n .combobox__listbox.combobox__listbox--bidirectional {\n overflow: auto;\n max-width: none;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;\n }\n\n .combobox__listbox--bidirectional .combobox__options {\n width: max-content;\n min-width: 100%;\n }\n\n .combobox__listbox--bidirectional .combobox__grid-row {\n width: max-content;\n min-width: 100%;\n }\n\n /* ── Horizontal grid layout ── */\n\n .combobox__listbox.combobox__listbox--horizontal {\n overflow-x: auto;\n overflow-y: hidden;\n max-height: none;\n max-width: none;\n width: 100%;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar {\n height: 6px;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-thumb {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));\n border-radius: 3px;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-thumb:hover {\n background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n }\n\n .combobox__options--horizontal {\n display: block;\n width: max-content;\n min-width: 100%;\n }\n\n .combobox__grid-col {\n border-right: 1px solid var(--nile-colors-neutral-200, var(--ng-colors-border-secondary));\n }\n\n .combobox__grid-col:last-child {\n border-right: none;\n }\n\n .combobox__grid-col nile-option {\n width: 100%;\n display: block;\n }\n\n .combobox__grid-col nile-option::part(base) {\n border-radius: 0;\n }\n\n /* ── Group headers (data-driven grouping) ── */\n\n /* Plain (non-virtualized) listbox: sticky relative to the scroll container.\n * Activated only when the host has [sticky-group-header]. */\n :host([sticky-group-header]) .combobox__options-plain .combobox__group-header {\n position: sticky;\n top: calc(var(--group-depth, 0) * 28px);\n z-index: 1;\n }\n\n /* Virtualized listbox: each row is absolutely positioned by the virtualizer.\n * Sticky doesn't pin against the scroll container because the row wrapper's\n * transform creates a containing block. Instead we render a separate\n * overlay inside the listbox that mirrors the currently-active group\n * header (computed on scroll). */\n .combobox__group-header-slot {\n pointer-events: none;\n }\n .combobox__group-header-slot .combobox__group-header {\n height: 100%;\n box-sizing: border-box;\n }\n\n .combobox__group-sticky-overlay {\n position: sticky;\n top: 0;\n z-index: 2;\n pointer-events: none;\n }\n .combobox__group-sticky-overlay .combobox__group-header {\n box-shadow: 0 1px 0 0 var(--nile-colors-neutral-300, var(--ng-colors-border-secondary));\n }\n\n .combobox__group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n /* Match the listbox's natural inline padding so the header sits like a\n * section divider, edge-to-edge with options. Nested groups indent by\n * depth. Override with --combobox-group-header-indent if needed. */\n padding-block: 8px;\n padding-inline-end: var(--nile-spacing-lg, var(--ng-spacing-lg));\n padding-inline-start: calc(var(--combobox-group-header-indent, var(--nile-spacing-lg, var(--ng-spacing-lg))) + var(--group-depth, 0) * 16px);\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-bottom: 1px solid var(--nile-colors-neutral-300, var(--ng-colors-border-secondary));\n pointer-events: none;\n user-select: none;\n }\n\n .combobox__group-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .combobox__group-prefix {\n flex-shrink: 0;\n color: inherit;\n }\n\n /* ── Help / Error ── */\n\n .form-control__help-text {\n display: none;\n }\n\n .form-control--has-help-text .form-control__help-text {\n display: block;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n margin-top: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n }\n`;\n\nexport default [styles];\n"]}
1
+ {"version":3,"file":"nile-combobox.css.js","sourceRoot":"","sources":["../../../src/nile-combobox/nile-combobox.css.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAutBxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["/**\n * Copyright Aquera Inc 2025\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n box-sizing: border-box;\n -webkit-font-smoothing: var(--nile-webkit-font-smoothing, var(--ng-webkit-font-smoothing));\n -moz-osx-font-smoothing: var(--nile-moz-osx-font-smoothing, var(--ng-moz-osx-font-smoothing));\n text-rendering: var(--nile-text-rendering, var(--ng-text-rendering));\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: inherit;\n }\n\n [hidden] {\n display: none;\n }\n\n /* ── Form control ── */\n\n .form-control .form-control__label {\n display: none;\n }\n\n .form-control--has-label .form-control__label {\n display: block;\n margin-bottom: var(--nile-spacing-sm, var(--ng-spacing-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-text-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n font-style: normal;\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n line-height: var(--nile-spacing-2xl, var(--ng-line-height-text-sm));\n letter-spacing: 0.2px;\n }\n\n .form-control--has-label.form-control--medium .form-control__label {\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n }\n\n :host([required]) .form-control--has-label .form-control__label::after {\n content: '*';\n margin-inline-start: -2px;\n color: var(--nile-colors-red-700, var(--ng-colors-text-error-primary-600));\n }\n\n :host([disabled]) .form-control--has-label .form-control__label {\n user-select: none;\n -webkit-user-select: none;\n }\n\n /* ── Popup ── */\n\n .combobox-popup {\n flex: 1 1 auto;\n display: inline-flex;\n width: 100%;\n position: relative;\n vertical-align: middle;\n }\n\n .combobox-popup::part(popup) {\n z-index: 9999;\n }\n\n .combobox-popup[data-current-placement^='top']::part(popup) {\n transform-origin: bottom;\n }\n\n .combobox-popup[data-current-placement^='bottom']::part(popup) {\n transform-origin: top;\n }\n\n /* ── Trigger: outer row that never scrolls ── */\n\n .combobox__trigger {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n position: relative;\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n letter-spacing: normal;\n cursor: text;\n transition: 150ms color, 150ms border, 150ms box-shadow, 150ms background-color;\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-primary));\n outline: none;\n }\n\n .combobox__trigger:hover {\n border-color: var(--nile-colors-dark-900, var(--ng-colors-border-neutral));\n }\n\n .combobox--open .combobox__trigger,\n .combobox--focused .combobox__trigger {\n border-color: var(--ng-colors-border-brand);\n box-shadow: 0 0 0 1px var(--ng-colors-border-brand) inset;\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox--disabled .combobox__trigger {\n background-color: var(--nile-colors-dark-200, var(--ng-colors-bg-disabled-subtle));\n border-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));\n cursor: not-allowed;\n user-select: none;\n }\n\n .combobox--warning .combobox__trigger {\n border-color: var(--nile-colors-yellow-500, var(--ng-colors-border-warning));\n }\n\n .combobox--error .combobox__trigger {\n border-color: var(--nile-colors-red-500, var(--ng-colors-border-error));\n }\n\n .combobox--success .combobox__trigger {\n border-color: var(--nile-colors-green-500, var(--ng-componentcolors-utility-success-500));\n }\n\n /* Size: small */\n .combobox--small .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n padding: var(--nile-spacing-md, var(--ng-spacing-sm)) var(--nile-spacing-md, var(--ng-spacing-md));\n min-height: var(--nile-height-32px, var(--ng-height-32px));\n }\n\n /* Size: medium */\n .combobox--medium .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n padding: var(--nile-spacing-lg, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg));\n min-height: var(--nile-height-40px, var(--ng-height-40px));\n box-sizing: border-box;\n }\n\n /* Size: large */\n .combobox--large .combobox__trigger {\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n font-size: var(--nile-type-scale-4, var(--ng-font-size-text-md));\n padding: var(--nile-spacing-xl, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));\n min-height: var(--nile-height-48px, var(--ng-height-48px));\n }\n\n .combobox--pill .combobox__trigger {\n border-radius: var(--nile-radius-3xl, var(--ng-radius-3xl));\n }\n\n .combobox--filled .combobox__trigger {\n border: none;\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox--filled.combobox--open .combobox__trigger,\n .combobox--filled.combobox--focused .combobox__trigger {\n outline: 3px solid rgba(0, 89, 255, 0.4);\n }\n\n /* ── Inner area: holds tags + input ── */\n\n .combobox__scroll-area {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n overflow: hidden;\n }\n\n /* Single-line: horizontal scroll for overflowing tags */\n .combobox__scroll-area--single-line {\n flex-wrap: nowrap;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-border-primary)) transparent;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar {\n height: 3px;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-thumb {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));\n border-radius: 3px;\n }\n\n .combobox__scroll-area--single-line::-webkit-scrollbar-thumb:hover {\n background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n }\n\n /* Wrap: tags flow to multiple lines, trigger grows in height */\n .combobox__scroll-area--wrap {\n flex-wrap: wrap;\n overflow: visible;\n }\n\n /* ── Tags inside the scroll area ── */\n\n .combobox__scroll-area nile-tag {\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .combobox--disabled .combobox__scroll-area nile-tag {\n cursor: not-allowed;\n }\n\n .combobox__tags-count {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-medium));\n line-height: var(--nile-line-height-xsmall, var(--ng-line-height-text-sm));\n letter-spacing: 0.2px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n /* ── Input wrapper inside scroll area ── */\n\n .combobox__input-wrapper {\n flex: 1;\n min-width: 60px;\n display: flex;\n align-items: center;\n }\n\n .combobox__input {\n width: 100%;\n font: inherit;\n border: none;\n background: none;\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n cursor: inherit;\n overflow: hidden;\n padding: 0;\n margin: 0;\n -webkit-appearance: none;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: inherit;\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n text-overflow: ellipsis;\n line-height: var(--nile-line-height-xsmall, var(--ng-line-height-text-sm));\n }\n\n .combobox__input::placeholder {\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n color: var(--nile-colors-text-placeholder, var(--ng-colors-text-placeholder));\n }\n\n .combobox__input:focus {\n outline: none;\n }\n\n .combobox--disabled .combobox__input {\n color: var(--nile-colors-dark-500, var(--ng-colors-text-disabled));\n pointer-events: none;\n }\n\n /* ── Hidden form value input ── */\n\n .combobox__value-input {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n margin: 0;\n opacity: 0;\n z-index: -1;\n }\n\n /* ── Action icons (clear, expand) ── */\n\n .combobox__actions {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n margin-inline-start: auto;\n }\n\n .combobox__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n color: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n transition: 150ms color;\n }\n\n .combobox__clear:hover {\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n }\n\n .combobox__clear:focus {\n outline: none;\n }\n\n .combobox__expand-icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n transition: 250ms rotate ease;\n rotate: 0;\n }\n\n .combobox--open .combobox__expand-icon {\n rotate: -180deg;\n }\n\n /* ── Prefix / suffix ── */\n\n .combobox__prefix,\n .combobox__suffix {\n flex: 0;\n display: inline-flex;\n align-items: center;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n }\n\n .combobox__prefix {\n margin-inline-end: var(--nile-spacing-md, var(--ng-spacing-md));\n }\n\n /* ── Listbox (dropdown) ── */\n\n .combobox__listbox {\n display: flex;\n flex-direction: column;\n position: relative;\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n background: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n border: solid 1px var(--nile-colors-neutral-500, var(--ng-colors-border-secondary-alt));\n border-radius: var(--nile-radius-sm, var(--ng-radius-md));\n padding: 0;\n max-width: var(--auto-size-available-width);\n max-height: var(--auto-size-available-height);\n box-shadow: 0px 2px 4px 0px rgba(119, 125, 130, 0.15);\n overflow: hidden; /* Scrolling is handled by .combobox__options-scroll below */\n box-sizing: border-box;\n }\n\n .combobox__options-scroll {\n overflow-y: auto;\n flex: 0 1 auto;\n min-height: 0;\n }\n\n /* ── Options ── */\n\n .combobox__options {\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: rgb(133, 129, 129);\n display: block;\n position: relative;\n width: 100%;\n padding-bottom: 0;\n box-sizing: border-box;\n }\n\n .combobox__options.loading {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .combobox__no-results {\n padding: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n text-align: center;\n }\n\n .combobox__no-results-title {\n font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));\n color: var(--nile-colors-dark-700, var(--ng-colors-text-secondary-700));\n }\n\n .combobox__no-results-subtitle {\n margin-top: var(--nile-spacing-xs, var(--ng-spacing-xs));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n }\n\n /* ── Options (both virtual and plain) ── */\n\n .combobox__options nile-option {\n width: 100%;\n display: block;\n }\n\n .combobox__options nile-option[selected] {\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n\n .combobox__options nile-option[selected]::part(base) {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n }\n\n .combobox__options-plain {\n display: flex;\n flex-direction: column;\n }\n\n .combobox__options-plain nile-option {\n flex-shrink: 0;\n }\n\n /* ── Top actions (Select All + Selected/All filter toggle) ── */\n\n .combobox__top-actions {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n padding: var(--nile-spacing-lg, var(--ng-spacing-lg));\n user-select: none;\n }\n\n .combobox__top-actions--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .combobox__select-all {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-md));\n cursor: pointer;\n flex: 1 1 auto;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n line-height: 14px;\n letter-spacing: 0.2px;\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n }\n\n .combobox__show-toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-md));\n border: none;\n background: none;\n padding: 0;\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n cursor: pointer;\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n line-height: 14px;\n letter-spacing: 0.2px;\n white-space: nowrap;\n }\n\n .combobox__show-toggle[disabled] {\n color: var(--nile-colors-primary-500, var(--ng-colors-fg-quaternary-400));\n cursor: not-allowed;\n }\n\n /* ── Footer ── */\n\n .combobox__footer {\n flex-shrink: 0;\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-top: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: var(--nile-spacing-md, 8px) var(--nile-spacing-lg, 12px);\n margin-top: 0;\n }\n\n .combobox__footer.loading {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .combobox__footer-clear {\n display: inline-flex;\n align-items: center;\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n letter-spacing: 0.2px;\n }\n\n .combobox__footer-clear:hover {\n text-decoration: underline;\n }\n\n /* ── Loader ── */\n\n .combobox__loader {\n width: 100%;\n text-align: center;\n display: block;\n }\n\n .combobox__loader--icon {\n margin-top: var(--nile-spacing-xl, var(--ng-spacing-xl));\n animation: combobox-spin 0.6s linear infinite;\n }\n\n .combobox__loader--center {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 75%;\n }\n\n @keyframes combobox-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .combobox__add-option::part(base) {\n color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));\n }\n\n /* ── Grid layout ── */\n\n :host([grid-columns]) .combobox__options-scroll {\n overflow-y: auto;\n }\n\n .combobox__grid-row {\n width: 100%;\n }\n\n .combobox__grid-row nile-option {\n min-width: 0;\n overflow: hidden;\n }\n\n .combobox__grid-row nile-option::part(base) {\n border-radius: var(--nile-radius-xs, var(--ng-radius-sm));\n }\n\n /* ── Bidirectional grid layout (vertical + horizontal scroll) ── */\n\n .combobox__listbox.combobox__listbox--bidirectional {\n max-width: none;\n }\n\n .combobox__listbox--bidirectional .combobox__options-scroll {\n overflow: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;\n }\n\n .combobox__listbox--bidirectional .combobox__options {\n width: max-content;\n min-width: 100%;\n }\n\n .combobox__listbox--bidirectional .combobox__grid-row {\n width: max-content;\n min-width: 100%;\n }\n\n /* ── Horizontal grid layout ── */\n\n .combobox__listbox.combobox__listbox--horizontal {\n overflow-x: auto;\n overflow-y: hidden;\n max-height: none;\n max-width: none;\n width: 100%;\n scrollbar-width: thin;\n scrollbar-color: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary)) transparent;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar {\n height: 6px;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-thumb {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-quaternary));\n border-radius: 3px;\n }\n\n .combobox__listbox--horizontal::-webkit-scrollbar-thumb:hover {\n background: var(--nile-colors-dark-500, var(--ng-colors-fg-quaternary-400));\n }\n\n .combobox__options--horizontal {\n display: block;\n width: max-content;\n min-width: 100%;\n }\n\n .combobox__grid-col {\n border-right: 1px solid var(--nile-colors-neutral-200, var(--ng-colors-border-secondary));\n }\n\n .combobox__grid-col:last-child {\n border-right: none;\n }\n\n .combobox__grid-col nile-option {\n width: 100%;\n display: block;\n }\n\n .combobox__grid-col nile-option::part(base) {\n border-radius: 0;\n }\n\n /* ── Group headers (data-driven grouping) ── */\n\n /* Plain (non-virtualized) listbox: sticky relative to the scroll container.\n * Activated only when the host has [sticky-group-header]. */\n :host([sticky-group-header]) .combobox__options-plain .combobox__group-header {\n position: sticky;\n top: calc(var(--group-depth, 0) * 28px);\n z-index: 1;\n }\n\n /* Virtualized listbox: each row is absolutely positioned by the virtualizer.\n * Sticky doesn't pin against the scroll container because the row wrapper's\n * transform creates a containing block. Instead we render a separate\n * overlay inside the listbox that mirrors the currently-active group\n * header (computed on scroll). */\n .combobox__group-header-slot {\n pointer-events: none;\n z-index: 3;\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n }\n .combobox__group-header-slot .combobox__group-header {\n height: 100%;\n box-sizing: border-box;\n }\n\n .combobox__group-sticky-overlay {\n position: sticky;\n top: 0;\n z-index: 2;\n pointer-events: none;\n height: 32px;\n overflow: hidden;\n }\n .combobox__group-sticky-overlay .combobox__group-header {\n box-shadow: 0 1px 0 0 var(--nile-colors-neutral-300, var(--ng-colors-border-secondary));\n }\n\n .combobox__group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n /* Match the listbox's natural inline padding so the header sits like a\n * section divider, edge-to-edge with options. Nested groups indent by\n * depth. Override with --combobox-group-header-indent if needed. */\n padding-block: 8px;\n padding-inline-end: var(--nile-spacing-lg, var(--ng-spacing-lg));\n padding-inline-start: calc(var(--combobox-group-header-indent, var(--nile-spacing-lg, var(--ng-spacing-lg))) + var(--group-depth, 0) * 16px);\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));\n border-bottom: 1px solid var(--nile-colors-neutral-300, var(--ng-colors-border-secondary));\n pointer-events: none;\n user-select: none;\n }\n\n .combobox__group-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .combobox__group-prefix {\n flex-shrink: 0;\n color: inherit;\n }\n\n /* ── Help / Error ── */\n\n .form-control__help-text {\n display: none;\n }\n\n .form-control--has-help-text .form-control__help-text {\n display: block;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-tertiary-600));\n margin-top: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n }\n`;\n\nexport default [styles];\n"]}
@@ -999,8 +999,43 @@ let NileCombobox = class NileCombobox extends NileElement {
999
999
  this.popup.popup.style.visibility = 'hidden';
1000
1000
  }
1001
1001
  this.popup.active = true;
1002
- await new Promise(r => requestAnimationFrame(r));
1003
- await new Promise(r => requestAnimationFrame(r));
1002
+ // Wait for Lit to render the listbox and attach scrollElementRef.
1003
+ await this.updateComplete;
1004
+ const scrollEl = this.isHorizontalGrid
1005
+ ? this.hScrollElementRef.value
1006
+ : this.scrollElementRef.value;
1007
+ await new Promise(resolve => {
1008
+ let attempts = 0;
1009
+ const maxAttempts = 10;
1010
+ const check = () => {
1011
+ attempts++;
1012
+ const hasSize = this.isHorizontalGrid
1013
+ ? (scrollEl?.offsetWidth ?? 0) > 0
1014
+ : (scrollEl?.offsetHeight ?? 0) > 0;
1015
+ if (hasSize || attempts >= maxAttempts) {
1016
+ resolve();
1017
+ }
1018
+ else {
1019
+ requestAnimationFrame(check);
1020
+ }
1021
+ };
1022
+ requestAnimationFrame(check);
1023
+ });
1024
+ if (this.isHorizontalGrid) {
1025
+ const hVirtualizer = this.hVirtualizerCtrl.getVirtualizer();
1026
+ hVirtualizer.scrollOffset = 0;
1027
+ hVirtualizer.measure();
1028
+ }
1029
+ else {
1030
+ const virtualizer = this.virtualizerCtrl.getVirtualizer();
1031
+ virtualizer.scrollOffset = 0;
1032
+ virtualizer.measure();
1033
+ }
1034
+ this.requestUpdate();
1035
+ await this.updateComplete;
1036
+ await new Promise(resolve => {
1037
+ requestAnimationFrame(() => resolve());
1038
+ });
1004
1039
  if (this.popup?.popup) {
1005
1040
  this.popup.popup.style.visibility = '';
1006
1041
  }
@@ -1098,6 +1133,7 @@ let NileCombobox = class NileCombobox extends NileElement {
1098
1133
  this.updateComplete.then(() => this.formControlController.updateValidity());
1099
1134
  }
1100
1135
  async resetScrollPosition() {
1136
+ this.stickyHeaderIndex = -1;
1101
1137
  await this.portalManager.resetScrollPosition();
1102
1138
  }
1103
1139
  // ── Render ──
@@ -1294,8 +1330,8 @@ let NileCombobox = class NileCombobox extends NileElement {
1294
1330
  </button>
1295
1331
  `;
1296
1332
  }
1297
- renderStickyHeaderOverlay(grouped, useVirtual) {
1298
- if (!this.stickyGroupHeader || !grouped || !useVirtual)
1333
+ renderStickyHeaderOverlay() {
1334
+ if (!this.stickyGroupHeader)
1299
1335
  return html ``;
1300
1336
  const idx = this.stickyHeaderIndex;
1301
1337
  if (idx < 0 || idx >= this.filteredRows.length)
@@ -1342,29 +1378,32 @@ let NileCombobox = class NileCombobox extends NileElement {
1342
1378
  class="combobox__listbox ${this.isBidirectionalGrid ? 'combobox__listbox--bidirectional' : ''} ${this.portal ? 'combobox__portal-hidden' : ''}"
1343
1379
  tabindex="-1"
1344
1380
  @mouseup=${this.onOptionClick}
1345
- @scroll=${this.onScroll}
1346
1381
  style="${this.portal ? 'display: none;' : ''}${this.isBidirectionalGrid ? `max-height:${this.gridRows * 38 + 16}px;` : ''}"
1347
- ${ref(this.scrollElementRef)}
1348
1382
  >
1349
- ${this.renderLoader()}
1350
1383
  ${this.renderSelectAll()}
1351
- ${this.renderStickyHeaderOverlay(grouped, useVirtual)}
1384
+ <div
1385
+ class="combobox__options-scroll"
1386
+ @scroll=${this.onScroll}
1387
+ ${ref(this.scrollElementRef)}
1388
+ >
1389
+ ${this.renderLoader()}
1352
1390
  ${this.showNoResults && !this.optionsLoading && !this.loading
1353
1391
  ? this.renderEmptyState()
1354
1392
  : isGrid
1355
1393
  ? ComboboxRenderer.renderVirtualizedGrid(virtualItems, totalSize, this.filteredData, this.value, this.multiple, this.gridColumns, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.optionsLoading || this.loading, this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined, this.isBidirectionalGrid ? this.gridColumnWidth : undefined)
1356
1394
  : grouped
1357
1395
  ? (useVirtual
1358
- ? ComboboxRenderer.renderRowsVirtualized(virtualItems, totalSize, this.filteredRows, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.optionsLoading || this.loading, this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined)
1396
+ ? ComboboxRenderer.renderRowsVirtualized(virtualItems, totalSize, this.filteredRows, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.optionsLoading || this.loading, this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined, undefined, this.renderStickyHeaderOverlay(), this.stickyGroupHeader ? this.stickyHeaderIndex : -1)
1359
1397
  : ComboboxRenderer.renderRowsPlain(this.filteredRows, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.showNoResults, this.noResultsMessage, this.optionsLoading || this.loading, this.onScroll.bind(this), this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined, undefined, this.hasActiveFilter ? this.noResultsSubtitle : undefined))
1360
1398
  : useVirtual
1361
- ? ComboboxRenderer.renderVirtualizedOptions(virtualItems, totalSize, this.filteredData, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.optionsLoading || this.loading, this.allowHtmlLabel, virtualizer.measureElement, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined)
1399
+ ? ComboboxRenderer.renderVirtualizedOptions(virtualItems, totalSize, this.filteredData, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.optionsLoading || this.loading, this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined)
1362
1400
  : ComboboxRenderer.renderPlainOptions(this.filteredData, this.value, this.multiple, this.getDisplayText.bind(this), this.getItemValue.bind(this), this.showNoResults, this.noResultsMessage, this.optionsLoading || this.loading, this.onScroll.bind(this), this.allowHtmlLabel, this.renderItemConfig?.getDescription ? this.getItemDescription.bind(this) : undefined, this.renderItemConfig?.getPrefix ? this.getItemPrefix.bind(this) : undefined, this.renderItemConfig?.getSuffix ? this.getItemSuffix.bind(this) : undefined, undefined, this.hasActiveFilter ? this.noResultsSubtitle : undefined)}
1363
1401
  ${showAddOption ? html `
1364
1402
  <div @mouseup=${(e) => { e.stopPropagation(); this.addCustomValue(this.searchValue.trim()); }}>
1365
1403
  ${ComboboxRenderer.renderAddCustomOption(this.searchValue.trim(), this.multiple)}
1366
1404
  </div>
1367
1405
  ` : ''}
1406
+ </div>
1368
1407
  ${this.multiple && this.showFooter && !this.selectAllEnabled ? this.renderFooter() : ''}
1369
1408
  </div>
1370
1409
  `;