@aquera/nile-elements 2.0.0 → 2.0.2

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 (238) hide show
  1. package/README.md +11 -0
  2. package/demo/nxtgen-dark.css +2 -2
  3. package/dist/{index-ccff99d6.esm.js → index-0fe57384.esm.js} +1 -1
  4. package/dist/index-f6944844.cjs.js +2 -0
  5. package/dist/{index-e43755f5.cjs.js.map → index-f6944844.cjs.js.map} +1 -1
  6. package/dist/index.cjs.js +1 -1
  7. package/dist/index.esm.js +1 -1
  8. package/dist/index.js +1127 -741
  9. package/dist/nile-code-editor/extensionSetup.cjs.js +1 -1
  10. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  11. package/dist/nile-code-editor/index.cjs.js +1 -1
  12. package/dist/nile-code-editor/index.esm.js +1 -1
  13. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  14. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  15. package/dist/nile-code-editor/nile-code-editor.css.cjs.js +1 -1
  16. package/dist/nile-code-editor/nile-code-editor.css.cjs.js.map +1 -1
  17. package/dist/nile-code-editor/nile-code-editor.css.esm.js +2 -2
  18. package/dist/nile-code-editor/nile-code-editor.esm.js +4 -4
  19. package/dist/nile-code-editor/theme.cjs.js +1 -1
  20. package/dist/nile-code-editor/theme.cjs.js.map +1 -1
  21. package/dist/nile-code-editor/theme.esm.js +1 -1
  22. package/dist/nile-combobox/nile-combobox.css.cjs.js +1 -1
  23. package/dist/nile-combobox/nile-combobox.css.cjs.js.map +1 -1
  24. package/dist/nile-combobox/nile-combobox.css.esm.js +1 -1
  25. package/dist/nile-detail/nile-detail.css.cjs.js +1 -1
  26. package/dist/nile-detail/nile-detail.css.cjs.js.map +1 -1
  27. package/dist/nile-detail/nile-detail.css.esm.js +1 -1
  28. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.cjs.js +1 -1
  29. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.cjs.js.map +1 -1
  30. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.esm.js +3 -3
  31. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.cjs.js +1 -1
  32. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.cjs.js.map +1 -1
  33. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.esm.js +13 -7
  34. package/dist/nile-timestamp-builder/index.cjs.js +2 -0
  35. package/dist/nile-timestamp-builder/index.cjs.js.map +1 -0
  36. package/dist/nile-timestamp-builder/index.esm.js +1 -0
  37. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.cjs.js +2 -0
  38. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.cjs.js.map +1 -0
  39. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.esm.js +1 -0
  40. package/dist/nile-timestamp-builder/nile-timestamp-builder.cjs.js +2 -0
  41. package/dist/nile-timestamp-builder/nile-timestamp-builder.cjs.js.map +1 -0
  42. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.cjs.js +2 -0
  43. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.cjs.js.map +1 -0
  44. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.esm.js +195 -0
  45. package/dist/nile-timestamp-builder/nile-timestamp-builder.esm.js +154 -0
  46. package/dist/nile-timestamp-builder/timezones.cjs.js +2 -0
  47. package/dist/nile-timestamp-builder/timezones.cjs.js.map +1 -0
  48. package/dist/nile-timestamp-builder/timezones.esm.js +1 -0
  49. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  50. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -1
  51. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +1 -1
  52. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -1
  53. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +91 -58
  54. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +1 -1
  55. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +1 -1
  56. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -1
  57. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +19 -19
  58. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +1 -1
  59. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -1
  60. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +14 -14
  61. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  62. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  63. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +13 -13
  64. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +1 -1
  65. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -1
  66. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +12 -12
  67. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +1 -1
  68. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -1
  69. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +10 -10
  70. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +1 -1
  71. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -1
  72. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +4 -4
  73. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +1 -1
  74. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -1
  75. package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +11 -11
  76. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +1 -1
  77. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -1
  78. package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +9 -9
  79. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +1 -1
  80. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -1
  81. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +11 -11
  82. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +1 -1
  83. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -1
  84. package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +6 -6
  85. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +1 -1
  86. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -1
  87. package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +14 -14
  88. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +1 -1
  89. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -1
  90. package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +16 -16
  91. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +1 -1
  92. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -1
  93. package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +8 -8
  94. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +1 -1
  95. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -1
  96. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +4 -4
  97. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +1 -1
  98. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -1
  99. package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +16 -16
  100. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +1 -1
  101. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -1
  102. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +29 -29
  103. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +1 -1
  104. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -1
  105. package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +8 -8
  106. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +1 -1
  107. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -1
  108. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +9 -9
  109. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +1 -1
  110. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -1
  111. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +23 -23
  112. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  113. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  114. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +7 -7
  115. package/dist/src/index.d.ts +1 -0
  116. package/dist/src/index.js +1 -0
  117. package/dist/src/index.js.map +1 -1
  118. package/dist/src/nile-code-editor/nile-code-editor.css.js +2 -2
  119. package/dist/src/nile-code-editor/nile-code-editor.css.js.map +1 -1
  120. package/dist/src/nile-code-editor/nile-code-editor.d.ts +15 -0
  121. package/dist/src/nile-code-editor/nile-code-editor.js +65 -6
  122. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  123. package/dist/src/nile-code-editor/theme.d.ts +6 -117
  124. package/dist/src/nile-code-editor/theme.js +100 -147
  125. package/dist/src/nile-code-editor/theme.js.map +1 -1
  126. package/dist/src/nile-combobox/nile-combobox.css.js +1 -1
  127. package/dist/src/nile-combobox/nile-combobox.css.js.map +1 -1
  128. package/dist/src/nile-detail/nile-detail.css.js +1 -1
  129. package/dist/src/nile-detail/nile-detail.css.js.map +1 -1
  130. package/dist/src/nile-side-bar-footer/nile-side-bar-footer.css.js +3 -3
  131. package/dist/src/nile-side-bar-footer/nile-side-bar-footer.css.js.map +1 -1
  132. package/dist/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.js +11 -5
  133. package/dist/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.js.map +1 -1
  134. package/dist/src/nile-timestamp-builder/index.d.ts +1 -0
  135. package/dist/src/nile-timestamp-builder/index.js +2 -0
  136. package/dist/src/nile-timestamp-builder/index.js.map +1 -0
  137. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.d.ts +54 -0
  138. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.js +254 -0
  139. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.js.map +1 -0
  140. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.d.ts +7 -0
  141. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.js +203 -0
  142. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.js.map +1 -0
  143. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.d.ts +94 -0
  144. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.js +578 -0
  145. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.js.map +1 -0
  146. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.d.ts +1 -0
  147. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.js +890 -0
  148. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.js.map +1 -0
  149. package/dist/src/nile-timestamp-builder/timezones.d.ts +8 -0
  150. package/dist/src/nile-timestamp-builder/timezones.js +357 -0
  151. package/dist/src/nile-timestamp-builder/timezones.js.map +1 -0
  152. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +91 -58
  153. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -1
  154. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +2 -1
  155. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +23 -1
  156. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -1
  157. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +19 -19
  158. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -1
  159. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +10 -10
  160. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -1
  161. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +7 -7
  162. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -1
  163. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js +5 -5
  164. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js.map +1 -1
  165. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +6 -6
  166. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -1
  167. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +4 -4
  168. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -1
  169. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +6 -6
  170. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -1
  171. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +7 -7
  172. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -1
  173. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +6 -6
  174. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -1
  175. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +6 -6
  176. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -1
  177. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +7 -7
  178. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -1
  179. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +9 -9
  180. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -1
  181. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +8 -8
  182. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -1
  183. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +4 -4
  184. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -1
  185. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +9 -9
  186. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -1
  187. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +24 -24
  188. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -1
  189. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +4 -4
  190. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -1
  191. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +7 -7
  192. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -1
  193. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +16 -16
  194. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -1
  195. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +4 -4
  196. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -1
  197. package/dist/src/version.js +2 -2
  198. package/dist/src/version.js.map +1 -1
  199. package/dist/tsconfig.tsbuildinfo +1 -1
  200. package/package.json +1 -1
  201. package/src/index.ts +1 -0
  202. package/src/nile-code-editor/nile-code-editor.css.ts +2 -2
  203. package/src/nile-code-editor/nile-code-editor.ts +68 -5
  204. package/src/nile-code-editor/theme.ts +129 -162
  205. package/src/nile-combobox/nile-combobox.css.ts +1 -1
  206. package/src/nile-detail/nile-detail.css.ts +1 -1
  207. package/src/nile-side-bar-footer/nile-side-bar-footer.css.ts +3 -3
  208. package/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.ts +11 -5
  209. package/src/nile-timestamp-builder/index.ts +1 -0
  210. package/src/nile-timestamp-builder/nile-timestamp-builder-utils.ts +321 -0
  211. package/src/nile-timestamp-builder/nile-timestamp-builder.css.ts +204 -0
  212. package/src/nile-timestamp-builder/nile-timestamp-builder.test.ts +1089 -0
  213. package/src/nile-timestamp-builder/nile-timestamp-builder.ts +625 -0
  214. package/src/nile-timestamp-builder/timezones.ts +356 -0
  215. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +91 -58
  216. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +21 -1
  217. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +19 -19
  218. package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +10 -10
  219. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +7 -7
  220. package/src/nile-wysiwyg-editor/ui/code-block-menu.ts +5 -5
  221. package/src/nile-wysiwyg-editor/ui/embed-menu.ts +6 -6
  222. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +4 -4
  223. package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +6 -6
  224. package/src/nile-wysiwyg-editor/ui/find-replace.ts +7 -7
  225. package/src/nile-wysiwyg-editor/ui/image-menu.ts +6 -6
  226. package/src/nile-wysiwyg-editor/ui/image-panel.ts +6 -6
  227. package/src/nile-wysiwyg-editor/ui/insert-menu.ts +7 -7
  228. package/src/nile-wysiwyg-editor/ui/link-editor.ts +9 -9
  229. package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +8 -8
  230. package/src/nile-wysiwyg-editor/ui/math-panel.ts +4 -4
  231. package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +9 -9
  232. package/src/nile-wysiwyg-editor/ui/source-view.ts +24 -24
  233. package/src/nile-wysiwyg-editor/ui/special-chars.ts +4 -4
  234. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +7 -7
  235. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +16 -16
  236. package/src/nile-wysiwyg-editor/ui/table-menu.ts +4 -4
  237. package/vscode-html-custom-data.json +94 -2
  238. package/dist/index-e43755f5.cjs.js +0 -2
@@ -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));\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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"]}
@@ -46,7 +46,7 @@ export const styles = css `
46
46
  background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-tertiary));
47
47
  font-size: var(--nile-type-scale-4, var(--ng-spacing-xl));
48
48
  font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));
49
- color: var(--nile-colors-neutral-900, var(--ng-colors-text-primary));
49
+ color: var(--nile-colors-neutral-900, var(--ng-colors-text-primary-900));
50
50
  user-select: none;
51
51
  cursor: pointer;
52
52
  list-style: none;
@@ -1 +1 @@
1
- {"version":3,"file":"nile-detail.css.js","sourceRoot":"","sources":["../../../src/nile-detail/nile-detail.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n :host {\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 :host {\n display: block;\n width: 100%;\n }\n\n .detail {\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n border-radius: var(--nile-radius-md, var(--ng-radius-xl));\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n box-shadow: var(--nile-box-shadow-3, var(--ng-shadow-xs));\n overflow: hidden;\n width: 100%;\n line-height: var(--nile-line-height-inherit, var(--ng-line-height-text-sm));\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n }\n\n .detail--disabled {\n opacity: var(--nile-opacity-50, var(--ng-opacity-50));\n }\n\n .detail__header {\n display: flex;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n align-items: center;\n border-radius: inherit;\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-tertiary));\n font-size: var(--nile-type-scale-4, var(--ng-spacing-xl));\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n color: var(--nile-colors-neutral-900, var(--ng-colors-text-primary));\n user-select: none;\n cursor: pointer;\n list-style: none;\n }\n\n .detail__header::-webkit-details-marker {\n display: none;\n }\n\n .detail__header::marker {\n content: '';\n }\n\n .detail__header--icon-left {\n flex-direction: row-reverse;\n }\n\n .detail__header:focus {\n outline: none;\n }\n\n .detail__header:focus-visible {\n outline: solid 3px var(--nile-colors-blue-500, var(--ng-colors-fg-brand-primary-600));\n outline-offset: calc(1px + 1px);\n }\n\n .detail--disabled .detail__header {\n cursor: not-allowed;\n }\n\n .detail--disabled .detail__header:focus-visible {\n outline: none;\n box-shadow: none;\n }\n\n .detail__label {\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .detail__header-actions {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__prefix {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__suffix {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__heading-text {\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n font-family: var(--nile-font-family-medium, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-4, var(--ng-spacing-xl));\n }\n\n .detail__description {\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n margin-top: 2px;\n }\n\n .detail__summary-icon {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n transition: 250ms transform ease;\n color: var(--nile-colors-neutral-700, var(--ng-colors-text-secondary));\n transform: rotate(90deg);\n }\n\n .detail--open .detail__summary-icon {\n transform: rotate(-90deg);\n }\n\n .detail__body {\n overflow: hidden;\n }\n\n .detail__body[hidden] {\n display: none;\n }\n\n .detail__content {\n display: block;\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n }\n\n .detail__content--empty {\n display: none;\n padding: 0;\n }\n\n /* ── Preview state ──────────────────────────────────────────────────────── */\n\n .detail__body--preview {\n position: relative;\n cursor: pointer;\n }\n\n .detail__body--preview::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: var(--nile-detail-preview-fade-height, 40px);\n background: linear-gradient(\n to bottom,\n transparent,\n var(--nile-colors-white-base, var(--ng-colors-bg-primary))\n );\n pointer-events: none;\n }\n\n .detail__body--preview:focus {\n outline: none;\n }\n\n .detail__body--preview:focus-visible {\n outline: solid 3px var(--nile-colors-blue-500, var(--ng-colors-fg-brand-primary-600));\n outline-offset: -3px;\n }\n\n .detail--disabled .detail__body--preview {\n cursor: not-allowed;\n }\n\n /* ── Selection variant ──────────────────────────────────────────────────── */\n\n .detail__selection-label {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n flex: 1;\n min-width: 0;\n }\n\n .detail__select-all {\n flex: 0 0 auto;\n }\n\n .detail__selection-title {\n display: flex;\n flex-direction: column;\n line-height: 1.3;\n min-width: 0;\n }\n\n .detail__selection-count {\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n margin-top: 2px;\n }\n\n .detail__selection-content {\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n }\n\n .detail__selection-toolbar {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n margin-bottom: var(--nile-spacing-lg, var(--ng-spacing-lg));\n }\n\n .detail__selection-search {\n flex: 1;\n min-width: 0;\n }\n\n .detail__selection-search-slot {\n display: flex;\n flex: 1;\n min-width: 0;\n }\n\n .detail__selection-search-slot::slotted(*) {\n flex: 1;\n min-width: 0;\n }\n\n .detail__selected-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n\n .detail__selection-actions {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-xl, var(--ng-spacing-xl));\n flex: 0 0 auto;\n }\n\n .detail__selection-grid {\n display: grid;\n grid-auto-flow: column;\n gap: 8px 24px;\n overflow-x: auto;\n overflow-y: hidden;\n padding: 4px 4px 8px;\n scroll-snap-type: x proximity;\n }\n\n .detail__selection-grid--virtual {\n display: block;\n position: relative;\n width: 100%;\n contain: layout paint;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--vertical {\n overflow-x: hidden;\n overflow-y: auto;\n scroll-snap-type: y proximity;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--vertical::-webkit-scrollbar {\n width: 8px;\n height: 0;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--both {\n overflow: auto;\n scroll-snap-type: none;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--both::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .detail__selection-grid--virtual .detail__selection-track {\n position: relative;\n }\n\n .detail__selection-tooltip--virtual {\n box-sizing: border-box;\n padding-right: 24px;\n }\n\n .detail__selection-grid > nile-checkbox,\n .detail__selection-grid > .detail__selection-tooltip {\n scroll-snap-align: start;\n min-width: 0;\n display: block;\n max-width: 100%;\n overflow: visible;\n padding-left: 4px;\n }\n\n .detail__selection-checkbox {\n display: block;\n width: 100%;\n min-width: 0;\n }\n\n .detail__selection-checkbox::part(base) {\n display: flex;\n width: 100%;\n min-width: 0;\n align-items: center;\n }\n\n .detail__selection-checkbox::part(label) {\n flex: 1 1 auto;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-checkbox--disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .detail__selection-text {\n display: inline-flex;\n flex-direction: column;\n min-width: 0;\n flex: 1 1 auto;\n line-height: 1.25;\n }\n\n .detail__selection-item-label {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-desc {\n display: block;\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-secondary));\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-prefix,\n .detail__selection-suffix {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n margin: 0 6px;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n }\n\n .detail__selection-prefix { margin-left: 0; }\n .detail__selection-suffix { margin-right: 0; }\n\n .detail__selection-placeholder {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 4px 8px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n .detail__selection-placeholder-bar {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n background: linear-gradient(\n 90deg,\n rgba(0,0,0,0.06) 0%,\n rgba(0,0,0,0.12) 50%,\n rgba(0,0,0,0.06) 100%\n );\n background-size: 200% 100%;\n animation: nile-detail-shimmer 1.4s linear infinite;\n flex: 0 0 auto;\n }\n\n .detail__selection-placeholder-label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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-secondary));\n background: linear-gradient(\n 90deg,\n rgba(0,0,0,0.06) 0%,\n rgba(0,0,0,0.12) 50%,\n rgba(0,0,0,0.06) 100%\n );\n background-size: 200% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n animation: nile-detail-shimmer 1.4s linear infinite;\n }\n\n @keyframes nile-detail-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n\n .detail__selection-grid::-webkit-scrollbar {\n height: 8px;\n }\n\n .detail__selection-grid::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 4px;\n }\n\n /* ── Light variant ──────────────────────────────────────────────────────── */\n\n .detail--light .detail__header {\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl))\n var(--nile-spacing-3xl, var(--ng-spacing-3xl));\n }\n\n .detail--light.detail--open .detail__header,\n .detail--light.detail--preview .detail__header {\n border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n }\n\n .detail--light .detail__content,\n .detail--light .detail__selection-content {\n padding: var(--nile-spacing-3xl, var(--ng-spacing-3xl));\n }\n`;\n\nexport default [styles];\n"]}
1
+ {"version":3,"file":"nile-detail.css.js","sourceRoot":"","sources":["../../../src/nile-detail/nile-detail.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n :host {\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 :host {\n display: block;\n width: 100%;\n }\n\n .detail {\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n border-radius: var(--nile-radius-md, var(--ng-radius-xl));\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n box-shadow: var(--nile-box-shadow-3, var(--ng-shadow-xs));\n overflow: hidden;\n width: 100%;\n line-height: var(--nile-line-height-inherit, var(--ng-line-height-text-sm));\n font-family: var(--nile-font-family-sans-serif, var(--ng-font-family-body));\n }\n\n .detail--disabled {\n opacity: var(--nile-opacity-50, var(--ng-opacity-50));\n }\n\n .detail__header {\n display: flex;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n align-items: center;\n border-radius: inherit;\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n background-color: var(--nile-colors-neutral-100, var(--ng-colors-bg-tertiary));\n font-size: var(--nile-type-scale-4, var(--ng-spacing-xl));\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n color: var(--nile-colors-neutral-900, var(--ng-colors-text-primary-900));\n user-select: none;\n cursor: pointer;\n list-style: none;\n }\n\n .detail__header::-webkit-details-marker {\n display: none;\n }\n\n .detail__header::marker {\n content: '';\n }\n\n .detail__header--icon-left {\n flex-direction: row-reverse;\n }\n\n .detail__header:focus {\n outline: none;\n }\n\n .detail__header:focus-visible {\n outline: solid 3px var(--nile-colors-blue-500, var(--ng-colors-fg-brand-primary-600));\n outline-offset: calc(1px + 1px);\n }\n\n .detail--disabled .detail__header {\n cursor: not-allowed;\n }\n\n .detail--disabled .detail__header:focus-visible {\n outline: none;\n box-shadow: none;\n }\n\n .detail__label {\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .detail__header-actions {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__prefix {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__suffix {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-sm));\n }\n\n .detail__heading-text {\n font-weight: var(--nile-font-weight-semibold, var(--ng-font-weight-semibold));\n font-family: var(--nile-font-family-medium, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-4, var(--ng-spacing-xl));\n }\n\n .detail__description {\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n margin-top: 2px;\n }\n\n .detail__summary-icon {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n transition: 250ms transform ease;\n color: var(--nile-colors-neutral-700, var(--ng-colors-text-secondary));\n transform: rotate(90deg);\n }\n\n .detail--open .detail__summary-icon {\n transform: rotate(-90deg);\n }\n\n .detail__body {\n overflow: hidden;\n }\n\n .detail__body[hidden] {\n display: none;\n }\n\n .detail__content {\n display: block;\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n }\n\n .detail__content--empty {\n display: none;\n padding: 0;\n }\n\n /* ── Preview state ──────────────────────────────────────────────────────── */\n\n .detail__body--preview {\n position: relative;\n cursor: pointer;\n }\n\n .detail__body--preview::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: var(--nile-detail-preview-fade-height, 40px);\n background: linear-gradient(\n to bottom,\n transparent,\n var(--nile-colors-white-base, var(--ng-colors-bg-primary))\n );\n pointer-events: none;\n }\n\n .detail__body--preview:focus {\n outline: none;\n }\n\n .detail__body--preview:focus-visible {\n outline: solid 3px var(--nile-colors-blue-500, var(--ng-colors-fg-brand-primary-600));\n outline-offset: -3px;\n }\n\n .detail--disabled .detail__body--preview {\n cursor: not-allowed;\n }\n\n /* ── Selection variant ──────────────────────────────────────────────────── */\n\n .detail__selection-label {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n flex: 1;\n min-width: 0;\n }\n\n .detail__select-all {\n flex: 0 0 auto;\n }\n\n .detail__selection-title {\n display: flex;\n flex-direction: column;\n line-height: 1.3;\n min-width: 0;\n }\n\n .detail__selection-count {\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-xs));\n font-weight: var(--nile-font-weight-regular, var(--ng-font-weight-regular));\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n margin-top: 2px;\n }\n\n .detail__selection-content {\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl));\n }\n\n .detail__selection-toolbar {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-lg, var(--ng-spacing-lg));\n margin-bottom: var(--nile-spacing-lg, var(--ng-spacing-lg));\n }\n\n .detail__selection-search {\n flex: 1;\n min-width: 0;\n }\n\n .detail__selection-search-slot {\n display: flex;\n flex: 1;\n min-width: 0;\n }\n\n .detail__selection-search-slot::slotted(*) {\n flex: 1;\n min-width: 0;\n }\n\n .detail__selected-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n\n .detail__selection-actions {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-xl, var(--ng-spacing-xl));\n flex: 0 0 auto;\n }\n\n .detail__selection-grid {\n display: grid;\n grid-auto-flow: column;\n gap: 8px 24px;\n overflow-x: auto;\n overflow-y: hidden;\n padding: 4px 4px 8px;\n scroll-snap-type: x proximity;\n }\n\n .detail__selection-grid--virtual {\n display: block;\n position: relative;\n width: 100%;\n contain: layout paint;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--vertical {\n overflow-x: hidden;\n overflow-y: auto;\n scroll-snap-type: y proximity;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--vertical::-webkit-scrollbar {\n width: 8px;\n height: 0;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--both {\n overflow: auto;\n scroll-snap-type: none;\n }\n\n .detail__selection-grid--virtual.detail__selection-grid--both::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .detail__selection-grid--virtual .detail__selection-track {\n position: relative;\n }\n\n .detail__selection-tooltip--virtual {\n box-sizing: border-box;\n padding-right: 24px;\n }\n\n .detail__selection-grid > nile-checkbox,\n .detail__selection-grid > .detail__selection-tooltip {\n scroll-snap-align: start;\n min-width: 0;\n display: block;\n max-width: 100%;\n overflow: visible;\n padding-left: 4px;\n }\n\n .detail__selection-checkbox {\n display: block;\n width: 100%;\n min-width: 0;\n }\n\n .detail__selection-checkbox::part(base) {\n display: flex;\n width: 100%;\n min-width: 0;\n align-items: center;\n }\n\n .detail__selection-checkbox::part(label) {\n flex: 1 1 auto;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-checkbox--disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .detail__selection-text {\n display: inline-flex;\n flex-direction: column;\n min-width: 0;\n flex: 1 1 auto;\n line-height: 1.25;\n }\n\n .detail__selection-item-label {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-desc {\n display: block;\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-secondary));\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .detail__selection-prefix,\n .detail__selection-suffix {\n display: inline-flex;\n align-items: center;\n flex: 0 0 auto;\n margin: 0 6px;\n color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary));\n }\n\n .detail__selection-prefix { margin-left: 0; }\n .detail__selection-suffix { margin-right: 0; }\n\n .detail__selection-placeholder {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 4px 8px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n .detail__selection-placeholder-bar {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n background: linear-gradient(\n 90deg,\n rgba(0,0,0,0.06) 0%,\n rgba(0,0,0,0.12) 50%,\n rgba(0,0,0,0.06) 100%\n );\n background-size: 200% 100%;\n animation: nile-detail-shimmer 1.4s linear infinite;\n flex: 0 0 auto;\n }\n\n .detail__selection-placeholder-label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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-secondary));\n background: linear-gradient(\n 90deg,\n rgba(0,0,0,0.06) 0%,\n rgba(0,0,0,0.12) 50%,\n rgba(0,0,0,0.06) 100%\n );\n background-size: 200% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n animation: nile-detail-shimmer 1.4s linear infinite;\n }\n\n @keyframes nile-detail-shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n\n .detail__selection-grid::-webkit-scrollbar {\n height: 8px;\n }\n\n .detail__selection-grid::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 4px;\n }\n\n /* ── Light variant ──────────────────────────────────────────────────────── */\n\n .detail--light .detail__header {\n background-color: var(--nile-colors-white-base, var(--ng-colors-bg-primary));\n padding: var(--nile-spacing-xl, var(--ng-spacing-xl))\n var(--nile-spacing-3xl, var(--ng-spacing-3xl));\n }\n\n .detail--light.detail--open .detail__header,\n .detail--light.detail--preview .detail__header {\n border-bottom: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));\n }\n\n .detail--light .detail__content,\n .detail--light .detail__selection-content {\n padding: var(--nile-spacing-3xl, var(--ng-spacing-3xl));\n }\n`;\n\nexport default [styles];\n"]}
@@ -9,10 +9,10 @@ export const styles = css `
9
9
  padding-bottom: var(--nile-spacing-xl, var(--ng-spacing-3xl));
10
10
  padding-left: var(--nile-spacing-xl, var(--ng-spacing-xl));
11
11
  padding-right: var(--nile-spacing-xl, var(--ng-spacing-xl));
12
- padding-top: var(--nile-spacing-xs);
12
+ padding-top: var(--nile-spacing-xs, var(--ng-spacing-xs));
13
13
  gap: var(--nile-spacing-md, var(--ng-spacing-xl));
14
14
  bottom: 0;
15
- background: var(--nile-colors-neutral-100);
15
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-primary));
16
16
  }
17
17
 
18
18
  .footer {
@@ -29,7 +29,7 @@ export const styles = css `
29
29
  justify-content: center;
30
30
 
31
31
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
32
- color: var(--nile-colors-dark-900, var(--ng-colors-graylightmode-900));
32
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
33
33
  cursor: pointer;
34
34
  border-radius: var(--nile-radius-sm, var(--ng-radius-sm));
35
35
  transition: background 0.2s ease;
@@ -1 +1 @@
1
- {"version":3,"file":"nile-side-bar-footer.css.js","sourceRoot":"","sources":["../../../src/nile-side-bar-footer/nile-side-bar-footer.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\n/**\n * SideBarFooter CSS\n */\nexport const styles = css`\n :host {\n display: block;\n bottom: var(--nile-spacing-md);\n padding-bottom: var(--nile-spacing-xl, var(--ng-spacing-3xl));\n\tpadding-left: var(--nile-spacing-xl, var(--ng-spacing-xl));\n\tpadding-right: var(--nile-spacing-xl, var(--ng-spacing-xl));\n padding-top: var(--nile-spacing-xs);\n gap: var(--nile-spacing-md, var(--ng-spacing-xl));\n bottom: 0;\n background: var(--nile-colors-neutral-100);\n}\n\n.footer {\n display: flex;\n flex-direction: column; \n align-items: stretch; \n gap: var(--nile-spacing-md, var(--ng-spacing-lg)); \n}\n\n::slotted(nile-side-bar-footer-item) {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-xs));\n justify-content: center;\n \n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-graylightmode-900));\n cursor: pointer;\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n transition: background 0.2s ease;\n}\n\n\n\n\n \n`;\n\nexport default [styles];\n"]}
1
+ {"version":3,"file":"nile-side-bar-footer.css.js","sourceRoot":"","sources":["../../../src/nile-side-bar-footer/nile-side-bar-footer.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\n/**\n * SideBarFooter CSS\n */\nexport const styles = css`\n :host {\n display: block;\n bottom: var(--nile-spacing-md);\n padding-bottom: var(--nile-spacing-xl, var(--ng-spacing-3xl));\n\tpadding-left: var(--nile-spacing-xl, var(--ng-spacing-xl));\n\tpadding-right: var(--nile-spacing-xl, var(--ng-spacing-xl));\n padding-top: var(--nile-spacing-xs, var(--ng-spacing-xs));\n gap: var(--nile-spacing-md, var(--ng-spacing-xl));\n bottom: 0;\n background: var(--nile-colors-neutral-100, var(--ng-colors-bg-primary));\n}\n\n.footer {\n display: flex;\n flex-direction: column; \n align-items: stretch; \n gap: var(--nile-spacing-md, var(--ng-spacing-lg)); \n}\n\n::slotted(nile-side-bar-footer-item) {\n display: flex;\n align-items: center;\n gap: var(--nile-spacing-md, var(--ng-spacing-xs));\n justify-content: center;\n \n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n cursor: pointer;\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n transition: background 0.2s ease;\n}\n\n\n\n\n \n`;\n\nexport default [styles];\n"]}
@@ -14,7 +14,7 @@ export const styles = css `
14
14
  padding-left: var(--nile-spacing-lg, var(--ng-spacing-lg));
15
15
  padding-right: var(--nile-spacing-lg, var(--ng-spacing-lg));
16
16
  font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
17
- color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))
17
+ color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));
18
18
  cursor: pointer;
19
19
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
20
20
  border-radius: var(--nile-radius-sm, var(--ng-radius-lg));
@@ -26,7 +26,10 @@ export const styles = css `
26
26
  }
27
27
 
28
28
  .footer-item:hover {
29
- background: var(--nile-side-bar-footer-hover-bg, #f3f4f6);
29
+ background: var(
30
+ --nile-side-bar-footer-hover-bg,
31
+ var(--ng-colors-bg-primary-hover)
32
+ );
30
33
  }
31
34
 
32
35
  /* left: icon */
@@ -49,13 +52,16 @@ export const styles = css `
49
52
  ::slotted([slot='action']) {
50
53
  flex-shrink: 0;
51
54
  font-size: 1.25rem;
52
- color: var(--nile-side-bar-footer-icon-color, #6b7280);
55
+ color: var(
56
+ --nile-side-bar-footer-icon-color,
57
+ var(--ng-colors-fg-quaternary-400)
58
+ );
53
59
  margin-left: auto;
54
60
  }
55
61
 
56
62
 
57
63
  :host([type='support']) .footer-item {
58
- background: var(--nile-colors-neutral-400);
64
+ background: var(--nile-colors-neutral-400, var(--ng-colors-bg-secondary));
59
65
  height: var(--nile-height-38px, var(--ng-spacing-5xl));
60
66
  border-radius: var(--nile-radius-sm, var(--ng-radius-sm));
61
67
 
@@ -71,7 +77,7 @@ border: 1px solid var(--ng-colors-border-secondary);
71
77
  min-height: var(--nile-radius-4xl, var(--ng-spacing-7xl));
72
78
  }
73
79
  :host([type='avatar'][active]) .footer-item {
74
- background: var(--nile-colors-neutral-400);
80
+ background: var(--nile-colors-neutral-400, var(--ng-colors-bg-active));
75
81
  }
76
82
 
77
83
 
@@ -1 +1 @@
1
- {"version":3,"file":"nile-side-bar-footer-item.css.js","sourceRoot":"","sources":["../../../src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .footer-item {\n display: flex;\n align-items: center;\n\t justify-content: flex-start;\n padding-top: var(--nile-spacing-md, var(--ng-spacing-md));\n padding-bottom: var(--nile-spacing-md, var(--ng-spacing-md));\n padding-left: var(--nile-spacing-lg, var(--ng-spacing-lg));\n padding-right: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))\n cursor: pointer;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n border-radius: var(--nile-radius-sm, var(--ng-radius-lg));\n transition: background 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n line-height: 0;\n }\n\n .footer-item:hover {\n background: var(--nile-side-bar-footer-hover-bg, #f3f4f6);\n }\n\n /* left: icon */\n ::slotted([slot='icon']) {\n flex-shrink: 0;\n font-size: 1.25rem;\n margin-right: 0.5rem;\n }\n\n /* middle: text */\n ::slotted([slot='text']) {\n flex-grow: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* right: action */\n ::slotted([slot='action']) {\n flex-shrink: 0;\n font-size: 1.25rem;\n color: var(--nile-side-bar-footer-icon-color, #6b7280);\n margin-left: auto;\n }\n\n \n :host([type='support']) .footer-item {\n background: var(--nile-colors-neutral-400);\n height: var(--nile-height-38px, var(--ng-spacing-5xl));\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n\n }\n \n :host(:hover[type='support']) .footer-item {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-primary-hover));\n height: var(--nile-height-38px, var(--ng-spacing-5xl));\n }\n\n :host([type='avatar']) .footer-item {\nborder: 1px solid var(--ng-colors-border-secondary);\nmin-height: var(--nile-radius-4xl, var(--ng-spacing-7xl));\n}\n:host([type='avatar'][active]) .footer-item {\nbackground: var(--nile-colors-neutral-400);\n}\n\n\n\n:host([collapsed][type='avatar']) .footer-item {\nborder: none;\n}\n :host([collapsed][type='avatar']) .footer-item {\n padding: 4px;\n \n}\n:host([collapsed]) .footer-item{\n height: 38px;\n width: 38px;\n}\n`;\n\nexport default [styles];\n"]}
1
+ {"version":3,"file":"nile-side-bar-footer-item.css.js","sourceRoot":"","sources":["../../../src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n .footer-item {\n display: flex;\n align-items: center;\n\t justify-content: flex-start;\n padding-top: var(--nile-spacing-md, var(--ng-spacing-md));\n padding-bottom: var(--nile-spacing-md, var(--ng-spacing-md));\n padding-left: var(--nile-spacing-lg, var(--ng-spacing-lg));\n padding-right: var(--nile-spacing-lg, var(--ng-spacing-lg));\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));\n color: var(--nile-colors-dark-900, var(--ng-colors-text-primary-900));\n cursor: pointer;\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n border-radius: var(--nile-radius-sm, var(--ng-radius-lg));\n transition: background 0.2s ease;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n line-height: 0;\n }\n\n .footer-item:hover {\n background: var(\n --nile-side-bar-footer-hover-bg,\n var(--ng-colors-bg-primary-hover)\n );\n }\n\n /* left: icon */\n ::slotted([slot='icon']) {\n flex-shrink: 0;\n font-size: 1.25rem;\n margin-right: 0.5rem;\n }\n\n /* middle: text */\n ::slotted([slot='text']) {\n flex-grow: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* right: action */\n ::slotted([slot='action']) {\n flex-shrink: 0;\n font-size: 1.25rem;\n color: var(\n --nile-side-bar-footer-icon-color,\n var(--ng-colors-fg-quaternary-400)\n );\n margin-left: auto;\n }\n\n \n :host([type='support']) .footer-item {\n background: var(--nile-colors-neutral-400, var(--ng-colors-bg-secondary));\n height: var(--nile-height-38px, var(--ng-spacing-5xl));\n border-radius: var(--nile-radius-sm, var(--ng-radius-sm));\n\n }\n \n :host(:hover[type='support']) .footer-item {\n background: var(--nile-colors-neutral-500, var(--ng-colors-bg-primary-hover));\n height: var(--nile-height-38px, var(--ng-spacing-5xl));\n }\n\n :host([type='avatar']) .footer-item {\nborder: 1px solid var(--ng-colors-border-secondary);\nmin-height: var(--nile-radius-4xl, var(--ng-spacing-7xl));\n}\n:host([type='avatar'][active]) .footer-item {\nbackground: var(--nile-colors-neutral-400, var(--ng-colors-bg-active));\n}\n\n\n\n:host([collapsed][type='avatar']) .footer-item {\nborder: none;\n}\n :host([collapsed][type='avatar']) .footer-item {\n padding: 4px;\n \n}\n:host([collapsed]) .footer-item{\n height: 38px;\n width: 38px;\n}\n`;\n\nexport default [styles];\n"]}
@@ -0,0 +1 @@
1
+ export { NileTimestampBuilder } from './nile-timestamp-builder';
@@ -0,0 +1,2 @@
1
+ export { NileTimestampBuilder } from './nile-timestamp-builder';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nile-timestamp-builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { NileTimestampBuilder } from './nile-timestamp-builder';\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Copyright Aquera Inc 2026
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
+ /** The editable wall-clock fields exposed by `nile-timestamp-builder`. */
8
+ export declare enum TimestampField {
9
+ Year = "year",
10
+ Month = "month",
11
+ Day = "day",
12
+ Hour = "hour",
13
+ Minute = "minute",
14
+ Second = "second",
15
+ Millisecond = "millisecond"
16
+ }
17
+ export interface WallClock {
18
+ year: number;
19
+ month: number;
20
+ day: number;
21
+ hour: number;
22
+ minute: number;
23
+ second: number;
24
+ millisecond: number;
25
+ }
26
+ export declare function hasTemporal(): boolean;
27
+ /** Returns the list of supported IANA timezones using Intl or the bundled fallback list. */
28
+ export declare function getTimezoneList(): string[];
29
+ /** Resolves the runtime's local IANA timezone, falling back to `UTC`. */
30
+ export declare function getLocalTimeZone(): string;
31
+ /** Returns true when `tz` is a timezone identifier the runtime can format. */
32
+ export declare function isValidTimeZone(tz: string): boolean;
33
+ export declare function daysInMonth(year: number, month: number): number;
34
+ /** Clamps `value` into `[min, max]`; `NaN` collapses to `min`. */
35
+ export declare function clampField(value: number, min: number, max: number): number;
36
+ export declare function clampWallClock(w: WallClock, minYear: number, maxYear: number): WallClock;
37
+ /** Formats a wall-clock as `YYYY-MM-DD HH:mm:ss.SSS` with zero padding. */
38
+ export declare function formatWallClock(w: WallClock): string;
39
+ /** Converts an epoch (ms) into the wall-clock fields observed in `tz`. Uses Temporal when present, otherwise an `Intl.DateTimeFormat` fallback. */
40
+ export declare function epochToFields(epochMs: number, tz: string): WallClock;
41
+ /** Neutral wall-clock placeholder: the Unix epoch (`1970-01-01T00:00:00.000`) read in UTC.*/
42
+ export declare const EPOCH_WALLCLOCK: WallClock;
43
+ /** Returns the timezone offset (ms) */
44
+ export declare function getTimeZoneOffsetMs(epochMs: number, tz: string): number;
45
+ export declare function parseZonedValue(input: string): {
46
+ date: Date;
47
+ timezone: string;
48
+ } | null;
49
+ /** Normalizes supported `value` inputs into epoch milliseconds, or `null` if invalid. */
50
+ export declare function normalizeValueInput(input: Date | number | string | null | undefined): Date | null;
51
+ /** Serializes a wall-clock into a zone-encoded string preserving its offset and IANA timezone. */
52
+ export declare function formatZonedValue(w: WallClock, tz: string): string;
53
+ /** Converts wall-clock fields in `tz` to epoch milliseconds. */
54
+ export declare function fieldsToEpoch(w: WallClock, tz: string): number;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Copyright Aquera Inc 2026
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
+ /**
8
+ * Timezone-aware wall-clock helpers for `nile-timestamp-builder`.
9
+ * ALL Temporal / Intl branching lives in this module. The component must never
10
+ * call `Intl.DateTimeFormat` or `Temporal` inline — it always goes through here.
11
+ */
12
+ import { TIMEZONES } from './timezones';
13
+ /** The editable wall-clock fields exposed by `nile-timestamp-builder`. */
14
+ export var TimestampField;
15
+ (function (TimestampField) {
16
+ TimestampField["Year"] = "year";
17
+ TimestampField["Month"] = "month";
18
+ TimestampField["Day"] = "day";
19
+ TimestampField["Hour"] = "hour";
20
+ TimestampField["Minute"] = "minute";
21
+ TimestampField["Second"] = "second";
22
+ TimestampField["Millisecond"] = "millisecond";
23
+ })(TimestampField || (TimestampField = {}));
24
+ export function hasTemporal() {
25
+ return typeof globalThis.Temporal !== 'undefined';
26
+ }
27
+ /** Returns the list of supported IANA timezones using Intl or the bundled fallback list. */
28
+ export function getTimezoneList() {
29
+ try {
30
+ const supportedValuesOf = Intl.supportedValuesOf;
31
+ if (typeof supportedValuesOf === 'function') {
32
+ const list = supportedValuesOf('timeZone');
33
+ if (Array.isArray(list) && list.length > 0) {
34
+ return list;
35
+ }
36
+ }
37
+ }
38
+ catch {
39
+ }
40
+ return [...TIMEZONES];
41
+ }
42
+ /** Resolves the runtime's local IANA timezone, falling back to `UTC`. */
43
+ export function getLocalTimeZone() {
44
+ try {
45
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
46
+ if (tz && isValidTimeZone(tz)) {
47
+ return tz;
48
+ }
49
+ }
50
+ catch {
51
+ }
52
+ return 'UTC';
53
+ }
54
+ /** Returns true when `tz` is a timezone identifier the runtime can format. */
55
+ export function isValidTimeZone(tz) {
56
+ if (!tz || typeof tz !== 'string') {
57
+ return false;
58
+ }
59
+ try {
60
+ new Intl.DateTimeFormat('en-US', { timeZone: tz });
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ export function daysInMonth(year, month) {
68
+ return new Date(Date.UTC(year, month, 0)).getUTCDate();
69
+ }
70
+ /** Clamps `value` into `[min, max]`; `NaN` collapses to `min`. */
71
+ export function clampField(value, min, max) {
72
+ if (Number.isNaN(value)) {
73
+ return min;
74
+ }
75
+ return Math.min(max, Math.max(min, value));
76
+ }
77
+ export function clampWallClock(w, minYear, maxYear) {
78
+ const year = clampField(Math.trunc(w.year), minYear, maxYear);
79
+ const month = clampField(Math.trunc(w.month), 1, 12);
80
+ const day = clampField(Math.trunc(w.day), 1, daysInMonth(year, month));
81
+ const hour = clampField(Math.trunc(w.hour), 0, 23);
82
+ const minute = clampField(Math.trunc(w.minute), 0, 59);
83
+ const second = clampField(Math.trunc(w.second), 0, 59);
84
+ const millisecond = clampField(Math.trunc(w.millisecond), 0, 999);
85
+ return { year, month, day, hour, minute, second, millisecond };
86
+ }
87
+ /** Formats a wall-clock as `YYYY-MM-DD HH:mm:ss.SSS` with zero padding. */
88
+ export function formatWallClock(w) {
89
+ const pad = (n, len) => String(Math.abs(n)).padStart(len, '0');
90
+ const y = pad(w.year, 4);
91
+ const mo = pad(w.month, 2);
92
+ const d = pad(w.day, 2);
93
+ const h = pad(w.hour, 2);
94
+ const mi = pad(w.minute, 2);
95
+ const s = pad(w.second, 2);
96
+ const ms = pad(w.millisecond, 3);
97
+ return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;
98
+ }
99
+ /** Converts an epoch (ms) into the wall-clock fields observed in `tz`. Uses Temporal when present, otherwise an `Intl.DateTimeFormat` fallback. */
100
+ export function epochToFields(epochMs, tz) {
101
+ if (hasTemporal()) {
102
+ const Temporal = globalThis.Temporal;
103
+ const zdt = Temporal.Instant.fromEpochMilliseconds(epochMs).toZonedDateTimeISO(tz);
104
+ return {
105
+ year: zdt.year,
106
+ month: zdt.month,
107
+ day: zdt.day,
108
+ hour: zdt.hour,
109
+ minute: zdt.minute,
110
+ second: zdt.second,
111
+ millisecond: zdt.millisecond,
112
+ };
113
+ }
114
+ return intlEpochToFields(epochMs, tz);
115
+ }
116
+ /** Neutral wall-clock placeholder: the Unix epoch (`1970-01-01T00:00:00.000`) read in UTC.*/
117
+ export const EPOCH_WALLCLOCK = epochToFields(0, 'UTC');
118
+ function intlEpochToFields(epochMs, tz) {
119
+ const parts = formatEpochParts(epochMs, tz);
120
+ const millisecond = ((epochMs % 1000) + 1000) % 1000;
121
+ return { ...parts, millisecond };
122
+ }
123
+ /** Extracts numeric y/mo/d/h/mi/s parts of `epochMs` in `tz` (h23, no ms). */
124
+ function formatEpochParts(epochMs, tz) {
125
+ const formatter = new Intl.DateTimeFormat('en-US', {
126
+ timeZone: tz,
127
+ year: 'numeric',
128
+ month: '2-digit',
129
+ day: '2-digit',
130
+ hour: '2-digit',
131
+ minute: '2-digit',
132
+ second: '2-digit',
133
+ hourCycle: 'h23',
134
+ });
135
+ const map = {};
136
+ for (const part of formatter.formatToParts(new Date(epochMs))) {
137
+ if (part.type !== 'literal') {
138
+ map[part.type] = Number(part.value);
139
+ }
140
+ }
141
+ // `hourCycle: 'h23'` can still surface hour 24 for midnight in some engines.
142
+ const hour = map.hour === 24 ? 0 : map.hour;
143
+ return {
144
+ year: map.year,
145
+ month: map.month,
146
+ day: map.day,
147
+ hour,
148
+ minute: map.minute,
149
+ second: map.second,
150
+ };
151
+ }
152
+ /** Returns the timezone offset (ms) */
153
+ export function getTimeZoneOffsetMs(epochMs, tz) {
154
+ const parts = formatEpochParts(epochMs, tz);
155
+ const asIfUTC = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);
156
+ const epochSeconds = Math.floor(epochMs / 1000) * 1000;
157
+ const offset = asIfUTC - epochSeconds;
158
+ return Math.round(offset / 1000) * 1000;
159
+ }
160
+ const ZONED_VALUE_RE = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?)\[GMT([+-]\d{2}:\d{2}) ([^\]]+)\]$/;
161
+ /** Converts a `±HH:MM` offset from {@link ZONED_VALUE_RE} into milliseconds. */
162
+ function offsetStringToMs(offset) {
163
+ const sign = offset[0] === '-' ? -1 : 1;
164
+ return (sign * (Number(offset.slice(1, 3)) * 3600000 + Number(offset.slice(4, 6)) * 60000));
165
+ }
166
+ export function parseZonedValue(input) {
167
+ const match = ZONED_VALUE_RE.exec(input.trim());
168
+ if (!match) {
169
+ return null;
170
+ }
171
+ const [, iso, offset, timezone] = match;
172
+ const date = new Date(`${iso}${offset}`);
173
+ if (Number.isNaN(date.getTime()) || !isValidTimeZone(timezone)) {
174
+ return null;
175
+ }
176
+ if (getTimeZoneOffsetMs(date.getTime(), timezone) !== offsetStringToMs(offset)) {
177
+ return null;
178
+ }
179
+ return { date, timezone };
180
+ }
181
+ /** Normalizes supported `value` inputs into epoch milliseconds, or `null` if invalid. */
182
+ export function normalizeValueInput(input) {
183
+ if (input === null || input === undefined) {
184
+ return null;
185
+ }
186
+ const valid = (d) => (Number.isNaN(d.getTime()) ? null : d);
187
+ if (input instanceof Date) {
188
+ return valid(input);
189
+ }
190
+ if (typeof input === 'number') {
191
+ return Number.isFinite(input) ? valid(new Date(input)) : null;
192
+ }
193
+ const trimmed = input.trim();
194
+ if (trimmed === '') {
195
+ return null;
196
+ }
197
+ const zoned = parseZonedValue(trimmed);
198
+ if (zoned) {
199
+ return zoned.date;
200
+ }
201
+ if (/^-?\d+$/.test(trimmed)) {
202
+ return valid(new Date(Number(trimmed)));
203
+ }
204
+ return valid(new Date(trimmed));
205
+ }
206
+ /** Serializes a wall-clock into a zone-encoded string preserving its offset and IANA timezone. */
207
+ export function formatZonedValue(w, tz) {
208
+ const epoch = fieldsToEpoch(w, tz);
209
+ const offsetMs = Math.round(getTimeZoneOffsetMs(epoch, tz) / 60000) * 60000;
210
+ const pad = (n, len = 2) => String(Math.abs(n)).padStart(len, '0');
211
+ const sign = offsetMs >= 0 ? '+' : '-';
212
+ const abs = Math.abs(offsetMs);
213
+ const offH = Math.floor(abs / 3600000);
214
+ const offM = Math.floor((abs % 3600000) / 60000);
215
+ const off = `${sign}${pad(offH)}:${pad(offM)}`;
216
+ const zone = tz || 'UTC';
217
+ const y = pad(w.year, 4);
218
+ const mo = pad(w.month, 2);
219
+ const d = pad(w.day, 2);
220
+ const h = pad(w.hour, 2);
221
+ const mi = pad(w.minute, 2);
222
+ const s = pad(w.second, 2);
223
+ const ms = pad(w.millisecond, 3);
224
+ return `${y}-${mo}-${d}T${h}:${mi}:${s}.${ms}[GMT${off} ${zone}]`;
225
+ }
226
+ /** Converts wall-clock fields in `tz` to epoch milliseconds. */
227
+ export function fieldsToEpoch(w, tz) {
228
+ if (hasTemporal()) {
229
+ const Temporal = globalThis.Temporal;
230
+ const zdt = Temporal.ZonedDateTime.from({
231
+ year: w.year,
232
+ month: w.month,
233
+ day: w.day,
234
+ hour: w.hour,
235
+ minute: w.minute,
236
+ second: w.second,
237
+ millisecond: w.millisecond,
238
+ timeZone: tz,
239
+ }, { disambiguation: 'compatible' });
240
+ return zdt.epochMilliseconds;
241
+ }
242
+ return intlFieldsToEpoch(w, tz);
243
+ }
244
+ function intlFieldsToEpoch(w, tz) {
245
+ const asUTC = Date.UTC(w.year, w.month - 1, w.day, w.hour, w.minute, w.second, w.millisecond);
246
+ const offset0 = getTimeZoneOffsetMs(asUTC, tz);
247
+ const guess = asUTC - offset0;
248
+ const offset1 = getTimeZoneOffsetMs(guess, tz);
249
+ if (offset0 === offset1) {
250
+ return guess;
251
+ }
252
+ return asUTC - offset1;
253
+ }
254
+ //# sourceMappingURL=nile-timestamp-builder-utils.js.map