@aquera/nile-elements 1.2.4-beta-1.1 → 1.2.5-beta-1.0

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 (277) hide show
  1. package/README.md +3 -0
  2. package/demo/index.html +13 -19
  3. package/dist/{fixture-d1470b58.cjs.js → fixture-5b79f853.cjs.js} +2 -2
  4. package/dist/{fixture-dff65c89.cjs.js.map → fixture-5b79f853.cjs.js.map} +1 -1
  5. package/dist/{fixture-dff65c89.cjs.js → fixture-73855806.cjs.js} +2 -2
  6. package/dist/{fixture-d1470b58.cjs.js.map → fixture-73855806.cjs.js.map} +1 -1
  7. package/dist/fixture-90b199c4.esm.js +569 -0
  8. package/dist/{fixture-985bba12.esm.js → fixture-9871e8a9.esm.js} +1 -1
  9. package/dist/fixture-c1d78368.cjs.js +395 -0
  10. package/dist/fixture-c1d78368.cjs.js.map +1 -0
  11. package/dist/fixture-cf7bfcf5.esm.js +569 -0
  12. package/dist/fixture-dbd66009.cjs.js +395 -0
  13. package/dist/fixture-dbd66009.cjs.js.map +1 -0
  14. package/dist/index.js +2 -2
  15. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  16. package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
  17. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  18. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  19. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  20. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  21. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  22. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  23. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  24. package/dist/nile-button/nile-button.test.esm.js +1 -1
  25. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  26. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
  27. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  28. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  29. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  30. package/dist/nile-card/nile-card.test.esm.js +1 -1
  31. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  32. package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
  33. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  34. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  35. package/dist/nile-code-editor/backup_nile-code-editor copy.cjs.js +2 -0
  36. package/dist/nile-code-editor/backup_nile-code-editor copy.cjs.js.map +1 -0
  37. package/dist/nile-code-editor/backup_nile-code-editor copy.esm.js +1 -0
  38. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  39. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  40. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  41. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  42. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  43. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  44. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  45. package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
  46. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  47. package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
  48. package/dist/nile-file-preview/nile-file-preview.test.cjs.js +1 -1
  49. package/dist/nile-file-preview/nile-file-preview.test.esm.js +1 -1
  50. package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
  51. package/dist/nile-file-upload/nile-file-upload.test.esm.js +1 -1
  52. package/dist/nile-filter-chip/nile-filter-chip.test.cjs.js +1 -1
  53. package/dist/nile-filter-chip/nile-filter-chip.test.esm.js +1 -1
  54. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  55. package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
  56. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  57. package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
  58. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  59. package/dist/nile-hero/nile-hero.test.esm.js +1 -1
  60. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  61. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  62. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  63. package/dist/nile-input/nile-input.test.esm.js +1 -1
  64. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  65. package/dist/nile-link/nile-link.test.esm.js +1 -1
  66. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  67. package/dist/nile-loader/nile-loader.test.esm.js +1 -1
  68. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  69. package/dist/nile-popover/nile-popover.test.esm.js +1 -1
  70. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  71. package/dist/nile-popup/nile-popup.test.esm.js +1 -1
  72. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  73. package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
  74. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  75. package/dist/nile-radio/nile-radio.test.esm.js +1 -1
  76. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  77. package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
  78. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  79. package/dist/nile-select/nile-select.test.esm.js +1 -1
  80. package/dist/nile-sidebar/index.cjs.js +2 -0
  81. package/dist/nile-sidebar/index.cjs.js.map +1 -0
  82. package/dist/nile-sidebar/index.esm.js +75 -0
  83. package/dist/nile-sidebar-menu/index.cjs.js +2 -0
  84. package/dist/nile-sidebar-menu/index.cjs.js.map +1 -0
  85. package/dist/nile-sidebar-menu/index.esm.js +1 -0
  86. package/dist/nile-sidebar-menu/nile-sidebar-menu.cjs.js +2 -0
  87. package/dist/nile-sidebar-menu/nile-sidebar-menu.cjs.js.map +1 -0
  88. package/dist/nile-sidebar-menu/nile-sidebar-menu.css.cjs.js +2 -0
  89. package/dist/nile-sidebar-menu/nile-sidebar-menu.css.cjs.js.map +1 -0
  90. package/dist/nile-sidebar-menu/nile-sidebar-menu.css.esm.js +38 -0
  91. package/dist/nile-sidebar-menu/nile-sidebar-menu.esm.js +10 -0
  92. package/dist/nile-sidebar-menu-items/index.cjs.js +2 -0
  93. package/dist/nile-sidebar-menu-items/index.cjs.js.map +1 -0
  94. package/dist/nile-sidebar-menu-items/index.esm.js +1 -0
  95. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.cjs.js +2 -0
  96. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.cjs.js.map +1 -0
  97. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.cjs.js +2 -0
  98. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.cjs.js.map +1 -0
  99. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.esm.js +36 -0
  100. package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.esm.js +15 -0
  101. package/dist/nile-sidebar-wrapper/index.cjs.js +2 -0
  102. package/dist/nile-sidebar-wrapper/index.cjs.js.map +1 -0
  103. package/dist/nile-sidebar-wrapper/index.esm.js +1 -0
  104. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.cjs.js +2 -0
  105. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.cjs.js.map +1 -0
  106. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.cjs.js +2 -0
  107. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.cjs.js.map +1 -0
  108. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.esm.js +105 -0
  109. package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.esm.js +16 -0
  110. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  111. package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
  112. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  113. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  114. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  115. package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
  116. package/dist/nile-virtual-select/group-manager.cjs.js +2 -0
  117. package/dist/nile-virtual-select/group-manager.cjs.js.map +1 -0
  118. package/dist/nile-virtual-select/group-manager.esm.js +1 -0
  119. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  120. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  121. package/dist/nile-virtual-select/nile-virtual-select.esm.js +1 -1
  122. package/dist/nile-virtual-select/nile-virtual-select.test.cjs.js +1 -1
  123. package/dist/nile-virtual-select/nile-virtual-select.test.esm.js +1 -1
  124. package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js +2 -0
  125. package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js.map +1 -0
  126. package/dist/nile-virtual-select/temp_nile-virtual-select copy.esm.js +231 -0
  127. package/dist/scopedElementsWrapper-4c29be11.esm.js +7 -0
  128. package/dist/scopedElementsWrapper-a112fc73.cjs.js +6 -0
  129. package/dist/scopedElementsWrapper-a112fc73.cjs.js.map +1 -0
  130. package/dist/src/internal/portal-manager.d.ts +53 -0
  131. package/dist/src/internal/portal-manager.js +196 -0
  132. package/dist/src/internal/portal-manager.js.map +1 -0
  133. package/dist/src/internal/portal.d.ts +60 -0
  134. package/dist/src/internal/portal.js +199 -0
  135. package/dist/src/internal/portal.js.map +1 -0
  136. package/dist/src/internal/resizable-helper.d.ts +59 -0
  137. package/dist/src/internal/resizable-helper.js +115 -0
  138. package/dist/src/internal/resizable-helper.js.map +1 -0
  139. package/dist/src/internal/resizable-styles.d.ts +16 -0
  140. package/dist/src/internal/resizable-styles.js +144 -0
  141. package/dist/src/internal/resizable-styles.js.map +1 -0
  142. package/dist/src/internal/virtualizer-error-handler.d.ts +30 -0
  143. package/dist/src/internal/virtualizer-error-handler.js +82 -0
  144. package/dist/src/internal/virtualizer-error-handler.js.map +1 -0
  145. package/dist/src/lib/index.d.ts +7 -0
  146. package/dist/src/lib/index.js +8 -0
  147. package/dist/src/lib/index.js.map +1 -0
  148. package/dist/src/lib/virtualize.d.ts +32 -0
  149. package/dist/src/lib/virtualize.js +105 -0
  150. package/dist/src/lib/virtualize.js.map +1 -0
  151. package/dist/src/lib/virtualize.test.d.ts +7 -0
  152. package/dist/src/lib/virtualize.test.js +57 -0
  153. package/dist/src/lib/virtualize.test.js.map +1 -0
  154. package/dist/src/nile-badge/__snapshots__/nile-badge.test.snap.js +17 -0
  155. package/dist/src/nile-calendar/__snapshots__/nile-calendar.test.snap.js +310 -0
  156. package/dist/src/nile-card/__snapshots__/nile-card.test.snap.js +34 -0
  157. package/dist/src/nile-checkbox/__snapshots__/nile-checkbox.test.snap.js +31 -0
  158. package/dist/src/nile-code-editor/Old_theme copy.d.ts +191 -0
  159. package/dist/src/nile-code-editor/Old_theme copy.js +193 -0
  160. package/dist/src/nile-code-editor/Old_theme copy.js.map +1 -0
  161. package/dist/src/nile-code-editor/backup_nile-code-editor copy.d.ts +0 -0
  162. package/dist/src/nile-code-editor/backup_nile-code-editor copy.js +675 -0
  163. package/dist/src/nile-code-editor/backup_nile-code-editor copy.js.map +1 -0
  164. package/dist/src/nile-code-editor/theme copy.d.ts +191 -0
  165. package/dist/src/nile-code-editor/theme copy.js +193 -0
  166. package/dist/src/nile-code-editor/theme copy.js.map +1 -0
  167. package/dist/src/nile-grid/data-processor.d.ts +37 -0
  168. package/dist/src/nile-grid/data-processor.js +122 -0
  169. package/dist/src/nile-grid/data-processor.js.map +1 -0
  170. package/dist/src/nile-grid/event-handlers.d.ts +35 -0
  171. package/dist/src/nile-grid/event-handlers.js +158 -0
  172. package/dist/src/nile-grid/event-handlers.js.map +1 -0
  173. package/dist/src/nile-grid/renderer.d.ts +8 -0
  174. package/dist/src/nile-grid/renderer.js +78 -0
  175. package/dist/src/nile-grid/renderer.js.map +1 -0
  176. package/dist/src/nile-grid/resize-handler.d.ts +4 -0
  177. package/dist/src/nile-grid/resize-handler.js +36 -0
  178. package/dist/src/nile-grid/resize-handler.js.map +1 -0
  179. package/dist/src/nile-grid/types.d.ts +32 -0
  180. package/dist/src/nile-grid/types.js +2 -0
  181. package/dist/src/nile-grid/types.js.map +1 -0
  182. package/dist/src/nile-grid/utils.d.ts +4 -0
  183. package/dist/src/nile-grid/utils.js +32 -0
  184. package/dist/src/nile-grid/utils.js.map +1 -0
  185. package/dist/src/nile-hero/__snapshots__/nile-hero.test.snap.js +47 -0
  186. package/dist/src/nile-icon/__snapshots__/nile-icon.test.snap.js +16 -0
  187. package/dist/src/nile-input/__snapshots__/nile-input.test.snap.js +75 -0
  188. package/dist/src/nile-popover/__snapshots__/nile-popover.test.snap.js +22 -0
  189. package/dist/src/nile-popover/popover-portal-handler.d.ts +21 -0
  190. package/dist/src/nile-popover/popover-portal-handler.js +106 -0
  191. package/dist/src/nile-popover/popover-portal-handler.js.map +1 -0
  192. package/dist/src/nile-popover/portal-manager.d.ts +51 -0
  193. package/dist/src/nile-popover/portal-manager.js +421 -0
  194. package/dist/src/nile-popover/portal-manager.js.map +1 -0
  195. package/dist/src/nile-popover/portal-utils.d.ts +55 -0
  196. package/dist/src/nile-popover/portal-utils.js +322 -0
  197. package/dist/src/nile-popover/portal-utils.js.map +1 -0
  198. package/dist/src/nile-portal-wrapper/index.d.ts +1 -0
  199. package/dist/src/nile-portal-wrapper/index.js +2 -0
  200. package/dist/src/nile-portal-wrapper/index.js.map +1 -0
  201. package/dist/src/nile-portal-wrapper/nile-portal-wrapper.d.ts +47 -0
  202. package/dist/src/nile-portal-wrapper/nile-portal-wrapper.js +451 -0
  203. package/dist/src/nile-portal-wrapper/nile-portal-wrapper.js.map +1 -0
  204. package/dist/src/nile-rich-text-editor/utils.d.ts +13 -0
  205. package/dist/src/nile-rich-text-editor/utils.js +537 -1
  206. package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
  207. package/dist/src/nile-select/body-append-manager.d.ts +90 -0
  208. package/dist/src/nile-select/body-append-manager.js +298 -0
  209. package/dist/src/nile-select/body-append-manager.js.map +1 -0
  210. package/dist/src/nile-table-body/virtual-scroll-helper.d.ts +9 -0
  211. package/dist/src/nile-table-body/virtual-scroll-helper.js +24 -0
  212. package/dist/src/nile-table-body/virtual-scroll-helper.js.map +1 -0
  213. package/dist/src/nile-virtual-select/body-append-helper.d.ts +16 -0
  214. package/dist/src/nile-virtual-select/body-append-helper.js +95 -0
  215. package/dist/src/nile-virtual-select/body-append-helper.js.map +1 -0
  216. package/dist/src/nile-virtual-select/group-manager.d.ts +32 -0
  217. package/dist/src/nile-virtual-select/group-manager.js +134 -0
  218. package/dist/src/nile-virtual-select/group-manager.js.map +1 -0
  219. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +0 -1
  220. package/dist/src/nile-virtual-select/nile-virtual-select.js +5 -11
  221. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  222. package/dist/src/nile-virtual-select/portal-utils.d.ts +65 -0
  223. package/dist/src/nile-virtual-select/portal-utils.js +376 -0
  224. package/dist/src/nile-virtual-select/portal-utils.js.map +1 -0
  225. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.d.ts +273 -0
  226. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js +1305 -0
  227. package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js.map +1 -0
  228. package/dist/src/nile-virtual-select/virtualizer-error-handler.d.ts +21 -0
  229. package/dist/src/nile-virtual-select/virtualizer-error-handler.js +56 -0
  230. package/dist/src/nile-virtual-select/virtualizer-error-handler.js.map +1 -0
  231. package/dist/src/nile-virtual-select-disabled/index.d.ts +1 -0
  232. package/dist/src/nile-virtual-select-disabled/index.js +2 -0
  233. package/dist/src/nile-virtual-select-disabled/index.js.map +1 -0
  234. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.d.ts +12 -0
  235. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.js +538 -0
  236. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.js.map +1 -0
  237. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.d.ts +299 -0
  238. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.js +1441 -0
  239. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.js.map +1 -0
  240. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.d.ts +7 -0
  241. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.js +631 -0
  242. package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.js.map +1 -0
  243. package/dist/src/nile-virtual-select-disabled/portal-manager.d.ts +45 -0
  244. package/dist/src/nile-virtual-select-disabled/portal-manager.js +333 -0
  245. package/dist/src/nile-virtual-select-disabled/portal-manager.js.map +1 -0
  246. package/dist/src/nile-virtual-select-disabled/renderer.d.ts +16 -0
  247. package/dist/src/nile-virtual-select-disabled/renderer.js +79 -0
  248. package/dist/src/nile-virtual-select-disabled/renderer.js.map +1 -0
  249. package/dist/src/nile-virtual-select-disabled/search-manager.d.ts +12 -0
  250. package/dist/src/nile-virtual-select-disabled/search-manager.js +40 -0
  251. package/dist/src/nile-virtual-select-disabled/search-manager.js.map +1 -0
  252. package/dist/src/nile-virtual-select-disabled/selection-manager.d.ts +12 -0
  253. package/dist/src/nile-virtual-select-disabled/selection-manager.js +64 -0
  254. package/dist/src/nile-virtual-select-disabled/selection-manager.js.map +1 -0
  255. package/dist/src/nile-virtual-select-disabled/types.d.ts +50 -0
  256. package/dist/src/nile-virtual-select-disabled/types.js +8 -0
  257. package/dist/src/nile-virtual-select-disabled/types.js.map +1 -0
  258. package/dist/src/nile-virtual-table-body/index.d.ts +2 -0
  259. package/dist/src/nile-virtual-table-body/index.js +3 -0
  260. package/dist/src/nile-virtual-table-body/index.js.map +1 -0
  261. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.d.ts +1 -0
  262. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js +44 -0
  263. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js.map +1 -0
  264. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.d.ts +50 -0
  265. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js +135 -0
  266. package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js.map +1 -0
  267. package/dist/src/nile-virtual-table-body/renderer.d.ts +16 -0
  268. package/dist/src/nile-virtual-table-body/renderer.js +49 -0
  269. package/dist/src/nile-virtual-table-body/renderer.js.map +1 -0
  270. package/dist/src/utilities/stepper-utils.d.ts +71 -0
  271. package/dist/src/utilities/stepper-utils.js +108 -0
  272. package/dist/src/utilities/stepper-utils.js.map +1 -0
  273. package/dist/src/version.js +1 -1
  274. package/dist/src/version.js.map +1 -1
  275. package/dist/tsconfig.tsbuildinfo +1 -1
  276. package/package.json +1 -1
  277. package/src/nile-virtual-select/nile-virtual-select.ts +5 -13
@@ -0,0 +1,322 @@
1
+ export class PortalUtils {
2
+ static calculateAvailableSpace(referenceElement) {
3
+ const rect = referenceElement.getBoundingClientRect();
4
+ const viewportHeight = window.innerHeight;
5
+ const viewportWidth = window.innerWidth;
6
+ const spaceBelow = viewportHeight - rect.bottom;
7
+ const spaceAbove = rect.top;
8
+ const spaceRight = viewportWidth - rect.right;
9
+ const spaceLeft = rect.left;
10
+ return { spaceAbove, spaceBelow, spaceLeft, spaceRight, viewportHeight, viewportWidth };
11
+ }
12
+ static getOptimalPlacement(referenceElement) {
13
+ const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);
14
+ // Prioritize vertical placement if there's enough space
15
+ if (spaceBelow >= 200 && spaceBelow >= spaceAbove) {
16
+ return 'bottom';
17
+ }
18
+ else if (spaceAbove >= 200 && spaceAbove > spaceBelow) {
19
+ return 'top';
20
+ }
21
+ // Fall back to horizontal placement
22
+ if (spaceRight >= 200 && spaceRight >= spaceLeft) {
23
+ return 'right';
24
+ }
25
+ else if (spaceLeft >= 200) {
26
+ return 'left';
27
+ }
28
+ return 'bottom';
29
+ }
30
+ static findBoundaryElements(component) {
31
+ const boundaryElements = [];
32
+ let currentElement = component.parentElement;
33
+ while (currentElement && currentElement !== document.body) {
34
+ const computedStyle = window.getComputedStyle(currentElement);
35
+ const overflow = computedStyle.overflow;
36
+ const overflowY = computedStyle.overflowY;
37
+ const overflowX = computedStyle.overflowX;
38
+ if (overflow === 'auto' || overflow === 'scroll' ||
39
+ overflowY === 'auto' || overflowY === 'scroll' ||
40
+ overflowX === 'auto' || overflowX === 'scroll') {
41
+ boundaryElements.push(currentElement);
42
+ }
43
+ if (currentElement.hasAttribute('data-floating-boundary') ||
44
+ currentElement.classList.contains('floating-boundary') ||
45
+ currentElement.classList.contains('scroll-container')) {
46
+ boundaryElements.push(currentElement);
47
+ }
48
+ currentElement = currentElement.parentElement;
49
+ }
50
+ return boundaryElements.length > 0 ? boundaryElements : undefined;
51
+ }
52
+ static calculateOptimalHeight(referenceRect, viewportHeight, placement) {
53
+ const spaceBelow = viewportHeight - (referenceRect.y + referenceRect.height);
54
+ const spaceAbove = referenceRect.y;
55
+ if (placement.startsWith('top')) {
56
+ return Math.max(spaceAbove - 20, 100);
57
+ }
58
+ else if (placement.startsWith('bottom')) {
59
+ return Math.max(spaceBelow - 20, 100);
60
+ }
61
+ else if (placement.startsWith('left') || placement.startsWith('right')) {
62
+ return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);
63
+ }
64
+ return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);
65
+ }
66
+ static extractStylesAsCSS(styles) {
67
+ if (typeof styles === 'string') {
68
+ return styles;
69
+ }
70
+ if (Array.isArray(styles)) {
71
+ return styles.map(style => this.extractStylesAsCSS(style)).join('\n');
72
+ }
73
+ if (styles && typeof styles === 'object' && styles.cssText) {
74
+ return styles.cssText;
75
+ }
76
+ return '';
77
+ }
78
+ static generateStyleId() {
79
+ return `nile-popover-styles-${Math.random().toString(36).substring(2, 11)}`;
80
+ }
81
+ static isPositioningOptimal(placement, referenceElement) {
82
+ const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);
83
+ const isAbove = placement.startsWith('top');
84
+ const isBelow = placement.startsWith('bottom');
85
+ const isLeft = placement.startsWith('left');
86
+ const isRight = placement.startsWith('right');
87
+ if (isAbove && spaceBelow > spaceAbove)
88
+ return false;
89
+ if (isBelow && spaceAbove > spaceBelow)
90
+ return false;
91
+ if (isLeft && spaceRight > spaceLeft)
92
+ return false;
93
+ if (isRight && spaceLeft > spaceRight)
94
+ return false;
95
+ return true;
96
+ }
97
+ static applyCollisionData(element, middlewareData, placement) {
98
+ if (middlewareData.flip) {
99
+ const { overflows } = middlewareData.flip;
100
+ element.setAttribute('data-placement', placement);
101
+ if (overflows && overflows.length > 0) {
102
+ const overflowPlacements = overflows.map(overflow => overflow.placement).join(',');
103
+ element.setAttribute('data-overflow', overflowPlacements);
104
+ }
105
+ else {
106
+ element.removeAttribute('data-overflow');
107
+ }
108
+ }
109
+ if (middlewareData.shift) {
110
+ const { x, y } = middlewareData.shift;
111
+ if (x !== undefined && y !== undefined && (x !== 0 || y !== 0)) {
112
+ element.setAttribute('data-shift', `${x},${y}`);
113
+ }
114
+ else {
115
+ element.removeAttribute('data-shift');
116
+ }
117
+ }
118
+ if (middlewareData.size) {
119
+ const { availableWidth, availableHeight } = middlewareData.size;
120
+ if (availableWidth !== undefined) {
121
+ element.setAttribute('data-available-width', availableWidth.toString());
122
+ }
123
+ if (availableHeight !== undefined) {
124
+ element.setAttribute('data-available-height', availableHeight.toString());
125
+ }
126
+ }
127
+ }
128
+ static createFloatingUIMiddleware(boundary, onSizeApply) {
129
+ return [];
130
+ }
131
+ }
132
+ export class PortalContentUtils {
133
+ static createBasePopover(component) {
134
+ const popoverBox = document.createElement('div');
135
+ popoverBox.className = 'popover__box';
136
+ popoverBox.setAttribute('part', 'popover');
137
+ return popoverBox;
138
+ }
139
+ static addTitleSection(popoverBox, component) {
140
+ if (!component.title)
141
+ return;
142
+ const titleDiv = document.createElement('div');
143
+ titleDiv.className = 'popover__title';
144
+ titleDiv.textContent = component.title;
145
+ popoverBox.appendChild(titleDiv);
146
+ }
147
+ static addContentSection(popoverBox, component) {
148
+ const contentDiv = document.createElement('div');
149
+ contentDiv.setAttribute('part', 'base');
150
+ contentDiv.style.display = 'contents';
151
+ // Clone all child elements that are not explicitly slotted
152
+ const allChildren = Array.from(component.children);
153
+ allChildren.forEach((child) => {
154
+ const slot = child.getAttribute('slot');
155
+ // Only clone elements that don't have slot="anchor", "title", or "action"
156
+ if (!slot || (slot !== 'anchor' && slot !== 'title' && slot !== 'action')) {
157
+ const clonedChild = child.cloneNode(true);
158
+ contentDiv.appendChild(clonedChild);
159
+ }
160
+ });
161
+ popoverBox.appendChild(contentDiv);
162
+ }
163
+ static cloneContent(originalContent, targetContent) {
164
+ // Clone all child nodes
165
+ Array.from(originalContent.childNodes).forEach(node => {
166
+ const clonedNode = node.cloneNode(true);
167
+ targetContent.appendChild(clonedNode);
168
+ });
169
+ // Copy attributes
170
+ Array.from(originalContent.attributes).forEach(attr => {
171
+ targetContent.setAttribute(attr.name, attr.value);
172
+ });
173
+ }
174
+ static addActionSection(popoverBox, component) {
175
+ const actionDiv = document.createElement('div');
176
+ actionDiv.className = 'popover__action';
177
+ // Clone action content from component slots
178
+ const actionSlots = component.querySelectorAll('[slot="action"]');
179
+ actionSlots.forEach((slot) => {
180
+ const clonedSlot = slot.cloneNode(true);
181
+ actionDiv.appendChild(clonedSlot);
182
+ });
183
+ popoverBox.appendChild(actionDiv);
184
+ }
185
+ static addArrowElement(popoverBox, component) {
186
+ const arrowDiv = document.createElement('div');
187
+ arrowDiv.className = 'popup__arrow';
188
+ arrowDiv.setAttribute('part', 'arrow');
189
+ arrowDiv.setAttribute('role', 'presentation');
190
+ // Set CSS custom properties for arrow sizing - match nile-popover exactly (18px)
191
+ popoverBox.style.setProperty('--arrow-size', '18px');
192
+ popoverBox.style.setProperty('--arrow-size-diagonal', 'calc(var(--arrow-size) * 0.7071)');
193
+ popoverBox.style.setProperty('--arrow-padding-offset', 'calc(var(--arrow-size-diagonal) - var(--arrow-size))');
194
+ popoverBox.style.setProperty('--arrow-color', 'var(--nile-colors-white-base, #ffffff)');
195
+ // Apply arrow styles similar to nile-popup
196
+ arrowDiv.style.position = 'absolute';
197
+ arrowDiv.style.width = 'calc(var(--arrow-size-diagonal) * 2)';
198
+ arrowDiv.style.height = 'calc(var(--arrow-size-diagonal) * 2)';
199
+ arrowDiv.style.rotate = '45deg';
200
+ arrowDiv.style.background = 'var(--arrow-color)';
201
+ arrowDiv.style.zIndex = '-1';
202
+ arrowDiv.style.border = 'solid 1px var(--nile-colors-dark-200, #e5e7eb)';
203
+ arrowDiv.style.boxShadow = '0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03)';
204
+ popoverBox.appendChild(arrowDiv);
205
+ }
206
+ static createPortalPopover(component) {
207
+ const popoverBox = this.createBasePopover(component);
208
+ this.addTitleSection(popoverBox, component);
209
+ this.addContentSection(popoverBox, component);
210
+ this.addActionSection(popoverBox, component);
211
+ // Add arrow if enabled
212
+ if (component.arrow) {
213
+ this.addArrowElement(popoverBox, component);
214
+ }
215
+ return popoverBox;
216
+ }
217
+ static updatePortalContent(clonedPopover, component) {
218
+ if (!clonedPopover)
219
+ return;
220
+ // Update title
221
+ const titleElement = clonedPopover.querySelector('.popover__title');
222
+ if (titleElement && component.title) {
223
+ titleElement.textContent = component.title;
224
+ }
225
+ // Update content from component children
226
+ const contentElement = clonedPopover.querySelector('[part="base"]');
227
+ if (contentElement) {
228
+ contentElement.innerHTML = '';
229
+ const allChildren = Array.from(component.children);
230
+ allChildren.forEach((child) => {
231
+ const slot = child.getAttribute('slot');
232
+ // Only clone elements that don't have slot="anchor", "title", or "action"
233
+ if (!slot || (slot !== 'anchor' && slot !== 'title' && slot !== 'action')) {
234
+ const clonedChild = child.cloneNode(true);
235
+ contentElement.appendChild(clonedChild);
236
+ }
237
+ });
238
+ }
239
+ // Update action from component slots
240
+ const actionElement = clonedPopover.querySelector('.popover__action');
241
+ if (actionElement) {
242
+ actionElement.innerHTML = '';
243
+ const actionSlots = component.querySelectorAll('[slot="action"]');
244
+ actionSlots.forEach((slot) => {
245
+ const clonedSlot = slot.cloneNode(true);
246
+ actionElement.appendChild(clonedSlot);
247
+ });
248
+ }
249
+ }
250
+ }
251
+ export class PortalEventUtils {
252
+ static setupPortalEventListeners(clonedPopover, component) {
253
+ if (!clonedPopover)
254
+ return;
255
+ this.setupClickListeners(clonedPopover, component);
256
+ this.setupContentListeners(clonedPopover, component);
257
+ this.setupActionListeners(clonedPopover, component);
258
+ }
259
+ static setupClickListeners(clonedPopover, component) {
260
+ if (!clonedPopover)
261
+ return;
262
+ // Prevent clicks from bubbling to document
263
+ clonedPopover.addEventListener('click', (event) => {
264
+ event.stopPropagation();
265
+ });
266
+ }
267
+ static setupContentListeners(clonedPopover, component) {
268
+ if (!clonedPopover)
269
+ return;
270
+ const contentElement = clonedPopover.querySelector('[part="base"]');
271
+ if (contentElement) {
272
+ // Forward any custom events from the content
273
+ contentElement.addEventListener('nile-click', (event) => {
274
+ if (component.handleContentClick) {
275
+ component.handleContentClick(event);
276
+ }
277
+ });
278
+ // Forward form events
279
+ contentElement.addEventListener('nile-input', (event) => {
280
+ if (component.handleContentInput) {
281
+ component.handleContentInput(event);
282
+ }
283
+ });
284
+ contentElement.addEventListener('nile-change', (event) => {
285
+ if (component.handleContentChange) {
286
+ component.handleContentChange(event);
287
+ }
288
+ });
289
+ }
290
+ }
291
+ static setupActionListeners(clonedPopover, component) {
292
+ if (!clonedPopover)
293
+ return;
294
+ const actionElement = clonedPopover.querySelector('.popover__action');
295
+ if (actionElement) {
296
+ // Forward action button clicks
297
+ actionElement.addEventListener('click', (event) => {
298
+ const target = event.target;
299
+ if (target.tagName === 'BUTTON' || target.closest('button')) {
300
+ if (component.handleActionClick) {
301
+ component.handleActionClick(event);
302
+ }
303
+ }
304
+ });
305
+ // Forward custom events from action elements
306
+ actionElement.addEventListener('nile-click', (event) => {
307
+ if (component.handleActionClick) {
308
+ component.handleActionClick(event);
309
+ }
310
+ });
311
+ }
312
+ }
313
+ static forwardEventToOriginal(event, component, eventType) {
314
+ const syntheticEvent = new CustomEvent(eventType, {
315
+ bubbles: true,
316
+ cancelable: true,
317
+ detail: event.detail
318
+ });
319
+ component.dispatchEvent(syntheticEvent);
320
+ }
321
+ }
322
+ //# sourceMappingURL=portal-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-utils.js","sourceRoot":"","sources":["../../../src/nile-popover/portal-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { \n type Placement,\n type MiddlewareData,\n type ComputePositionConfig,\n type Boundary\n} from '@floating-ui/dom';\n\nexport class PortalUtils {\n static calculateAvailableSpace(referenceElement: HTMLElement): {\n spaceAbove: number;\n spaceBelow: number;\n spaceLeft: number;\n spaceRight: number;\n viewportHeight: number;\n viewportWidth: number;\n } {\n const rect = referenceElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = viewportWidth - rect.right;\n const spaceLeft = rect.left;\n \n return { spaceAbove, spaceBelow, spaceLeft, spaceRight, viewportHeight, viewportWidth };\n }\n\n static getOptimalPlacement(referenceElement: HTMLElement): Placement {\n const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);\n \n // Prioritize vertical placement if there's enough space\n if (spaceBelow >= 200 && spaceBelow >= spaceAbove) {\n return 'bottom';\n } else if (spaceAbove >= 200 && spaceAbove > spaceBelow) {\n return 'top';\n }\n \n // Fall back to horizontal placement\n if (spaceRight >= 200 && spaceRight >= spaceLeft) {\n return 'right';\n } else if (spaceLeft >= 200) {\n return 'left';\n }\n \n return 'bottom';\n }\n\n static findBoundaryElements(component: HTMLElement): Element[] | undefined {\n const boundaryElements: Element[] = [];\n \n let currentElement = component.parentElement;\n \n while (currentElement && currentElement !== document.body) {\n const computedStyle = window.getComputedStyle(currentElement);\n const overflow = computedStyle.overflow;\n const overflowY = computedStyle.overflowY;\n const overflowX = computedStyle.overflowX;\n \n if (overflow === 'auto' || overflow === 'scroll' || \n overflowY === 'auto' || overflowY === 'scroll' ||\n overflowX === 'auto' || overflowX === 'scroll') {\n boundaryElements.push(currentElement);\n }\n \n if (currentElement.hasAttribute('data-floating-boundary') ||\n currentElement.classList.contains('floating-boundary') ||\n currentElement.classList.contains('scroll-container')) {\n boundaryElements.push(currentElement);\n }\n \n currentElement = currentElement.parentElement;\n }\n \n return boundaryElements.length > 0 ? boundaryElements : undefined;\n }\n\n static calculateOptimalHeight(\n referenceRect: { x: number; y: number; width: number; height: number },\n viewportHeight: number,\n placement: Placement\n ): number {\n const spaceBelow = viewportHeight - (referenceRect.y + referenceRect.height);\n const spaceAbove = referenceRect.y;\n \n if (placement.startsWith('top')) {\n return Math.max(spaceAbove - 20, 100);\n } else if (placement.startsWith('bottom')) {\n return Math.max(spaceBelow - 20, 100);\n } else if (placement.startsWith('left') || placement.startsWith('right')) {\n return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);\n }\n \n return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);\n }\n\n static extractStylesAsCSS(styles: any): string {\n if (typeof styles === 'string') {\n return styles;\n }\n \n if (Array.isArray(styles)) {\n return styles.map(style => this.extractStylesAsCSS(style)).join('\\n');\n }\n \n if (styles && typeof styles === 'object' && styles.cssText) {\n return styles.cssText;\n }\n \n return '';\n }\n\n static generateStyleId(): string {\n return `nile-popover-styles-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n static isPositioningOptimal(\n placement: Placement,\n referenceElement: HTMLElement\n ): boolean {\n const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);\n \n const isAbove = placement.startsWith('top');\n const isBelow = placement.startsWith('bottom');\n const isLeft = placement.startsWith('left');\n const isRight = placement.startsWith('right');\n \n if (isAbove && spaceBelow > spaceAbove) return false;\n if (isBelow && spaceAbove > spaceBelow) return false;\n if (isLeft && spaceRight > spaceLeft) return false;\n if (isRight && spaceLeft > spaceRight) return false;\n \n return true;\n }\n\n static applyCollisionData(\n element: HTMLElement,\n middlewareData: MiddlewareData,\n placement: Placement\n ): void {\n if (middlewareData.flip) {\n const { overflows } = middlewareData.flip;\n \n element.setAttribute('data-placement', placement);\n \n if (overflows && overflows.length > 0) {\n const overflowPlacements = overflows.map(overflow => overflow.placement).join(',');\n element.setAttribute('data-overflow', overflowPlacements);\n } else {\n element.removeAttribute('data-overflow');\n }\n }\n\n if (middlewareData.shift) {\n const { x, y } = middlewareData.shift;\n \n if (x !== undefined && y !== undefined && (x !== 0 || y !== 0)) {\n element.setAttribute('data-shift', `${x},${y}`);\n } else {\n element.removeAttribute('data-shift');\n }\n }\n\n if (middlewareData.size) {\n const { availableWidth, availableHeight } = middlewareData.size;\n \n if (availableWidth !== undefined) {\n element.setAttribute('data-available-width', availableWidth.toString());\n }\n if (availableHeight !== undefined) {\n element.setAttribute('data-available-height', availableHeight.toString());\n }\n }\n }\n\n static createFloatingUIMiddleware(\n boundary: Boundary,\n onSizeApply: (params: {\n availableWidth: number;\n availableHeight: number;\n elements: { floating: HTMLElement };\n rects: { reference: { x: number; y: number; width: number; height: number } };\n }) => void\n ): ComputePositionConfig['middleware'] {\n return [];\n }\n}\n\nexport class PortalContentUtils {\n static createBasePopover(component: any): HTMLElement {\n const popoverBox = document.createElement('div');\n popoverBox.className = 'popover__box';\n popoverBox.setAttribute('part', 'popover');\n \n return popoverBox;\n }\n\n static addTitleSection(popoverBox: HTMLElement, component: any): void {\n if (!component.title) return;\n\n const titleDiv = document.createElement('div');\n titleDiv.className = 'popover__title';\n titleDiv.textContent = component.title;\n popoverBox.appendChild(titleDiv);\n }\n\n static addContentSection(popoverBox: HTMLElement, component: any): void {\n const contentDiv = document.createElement('div');\n contentDiv.setAttribute('part', 'base');\n contentDiv.style.display = 'contents';\n \n // Clone all child elements that are not explicitly slotted\n const allChildren = Array.from(component.children);\n allChildren.forEach((child: Element) => {\n const slot = child.getAttribute('slot');\n // Only clone elements that don't have slot=\"anchor\", \"title\", or \"action\"\n if (!slot || (slot !== 'anchor' && slot !== 'title' && slot !== 'action')) {\n const clonedChild = child.cloneNode(true) as HTMLElement;\n contentDiv.appendChild(clonedChild);\n }\n });\n \n popoverBox.appendChild(contentDiv);\n }\n\n static cloneContent(originalContent: HTMLElement, targetContent: HTMLElement): void {\n // Clone all child nodes\n Array.from(originalContent.childNodes).forEach(node => {\n const clonedNode = node.cloneNode(true);\n targetContent.appendChild(clonedNode);\n });\n \n // Copy attributes\n Array.from(originalContent.attributes).forEach(attr => {\n targetContent.setAttribute(attr.name, attr.value);\n });\n }\n\n static addActionSection(popoverBox: HTMLElement, component: any): void {\n const actionDiv = document.createElement('div');\n actionDiv.className = 'popover__action';\n \n // Clone action content from component slots\n const actionSlots = component.querySelectorAll('[slot=\"action\"]');\n actionSlots.forEach((slot: Element) => {\n const clonedSlot = slot.cloneNode(true) as HTMLElement;\n actionDiv.appendChild(clonedSlot);\n });\n \n popoverBox.appendChild(actionDiv);\n }\n\n static addArrowElement(popoverBox: HTMLElement, component: any): void {\n const arrowDiv = document.createElement('div');\n arrowDiv.className = 'popup__arrow';\n arrowDiv.setAttribute('part', 'arrow');\n arrowDiv.setAttribute('role', 'presentation');\n \n // Set CSS custom properties for arrow sizing - match nile-popover exactly (18px)\n popoverBox.style.setProperty('--arrow-size', '18px');\n popoverBox.style.setProperty('--arrow-size-diagonal', 'calc(var(--arrow-size) * 0.7071)');\n popoverBox.style.setProperty('--arrow-padding-offset', 'calc(var(--arrow-size-diagonal) - var(--arrow-size))');\n popoverBox.style.setProperty('--arrow-color', 'var(--nile-colors-white-base, #ffffff)');\n \n // Apply arrow styles similar to nile-popup\n arrowDiv.style.position = 'absolute';\n arrowDiv.style.width = 'calc(var(--arrow-size-diagonal) * 2)';\n arrowDiv.style.height = 'calc(var(--arrow-size-diagonal) * 2)';\n arrowDiv.style.rotate = '45deg';\n arrowDiv.style.background = 'var(--arrow-color)';\n arrowDiv.style.zIndex = '-1';\n arrowDiv.style.border = 'solid 1px var(--nile-colors-dark-200, #e5e7eb)';\n arrowDiv.style.boxShadow = '0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03)';\n \n popoverBox.appendChild(arrowDiv);\n }\n\n static createPortalPopover(component: any): HTMLElement {\n const popoverBox = this.createBasePopover(component);\n \n this.addTitleSection(popoverBox, component);\n this.addContentSection(popoverBox, component);\n this.addActionSection(popoverBox, component);\n \n // Add arrow if enabled\n if (component.arrow) {\n this.addArrowElement(popoverBox, component);\n }\n \n return popoverBox;\n }\n\n static updatePortalContent(clonedPopover: HTMLElement, component: any): void {\n if (!clonedPopover) return;\n\n // Update title\n const titleElement = clonedPopover.querySelector('.popover__title');\n if (titleElement && component.title) {\n titleElement.textContent = component.title;\n }\n\n // Update content from component children\n const contentElement = clonedPopover.querySelector('[part=\"base\"]') as HTMLElement;\n if (contentElement) {\n contentElement.innerHTML = '';\n const allChildren = Array.from(component.children);\n allChildren.forEach((child: Element) => {\n const slot = child.getAttribute('slot');\n // Only clone elements that don't have slot=\"anchor\", \"title\", or \"action\"\n if (!slot || (slot !== 'anchor' && slot !== 'title' && slot !== 'action')) {\n const clonedChild = child.cloneNode(true) as HTMLElement;\n contentElement.appendChild(clonedChild);\n }\n });\n }\n\n // Update action from component slots\n const actionElement = clonedPopover.querySelector('.popover__action') as HTMLElement;\n if (actionElement) {\n actionElement.innerHTML = '';\n const actionSlots = component.querySelectorAll('[slot=\"action\"]');\n actionSlots.forEach((slot: Element) => {\n const clonedSlot = slot.cloneNode(true) as HTMLElement;\n actionElement.appendChild(clonedSlot);\n });\n }\n }\n}\n\nexport class PortalEventUtils {\n static setupPortalEventListeners(clonedPopover: HTMLElement, component: any): void {\n if (!clonedPopover) return;\n\n this.setupClickListeners(clonedPopover, component);\n this.setupContentListeners(clonedPopover, component);\n this.setupActionListeners(clonedPopover, component);\n }\n\n static setupClickListeners(clonedPopover: HTMLElement, component: any): void {\n if (!clonedPopover) return;\n\n // Prevent clicks from bubbling to document\n clonedPopover.addEventListener('click', (event) => {\n event.stopPropagation();\n });\n }\n\n static setupContentListeners(clonedPopover: HTMLElement, component: any): void {\n if (!clonedPopover) return;\n\n const contentElement = clonedPopover.querySelector('[part=\"base\"]');\n if (contentElement) {\n // Forward any custom events from the content\n contentElement.addEventListener('nile-click', (event) => {\n if (component.handleContentClick) {\n component.handleContentClick(event);\n }\n });\n\n // Forward form events\n contentElement.addEventListener('nile-input', (event) => {\n if (component.handleContentInput) {\n component.handleContentInput(event);\n }\n });\n\n contentElement.addEventListener('nile-change', (event) => {\n if (component.handleContentChange) {\n component.handleContentChange(event);\n }\n });\n }\n }\n\n static setupActionListeners(clonedPopover: HTMLElement, component: any): void {\n if (!clonedPopover) return;\n\n const actionElement = clonedPopover.querySelector('.popover__action');\n if (actionElement) {\n // Forward action button clicks\n actionElement.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'BUTTON' || target.closest('button')) {\n if (component.handleActionClick) {\n component.handleActionClick(event);\n }\n }\n });\n\n // Forward custom events from action elements\n actionElement.addEventListener('nile-click', (event) => {\n if (component.handleActionClick) {\n component.handleActionClick(event);\n }\n });\n }\n }\n\n static forwardEventToOriginal(event: Event, component: any, eventType: string): void {\n const syntheticEvent = new CustomEvent(eventType, {\n bubbles: true,\n cancelable: true,\n detail: (event as CustomEvent).detail\n });\n \n component.dispatchEvent(syntheticEvent);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export { NilePortalWrapper } from './nile-portal-wrapper.js';
@@ -0,0 +1,2 @@
1
+ export { NilePortalWrapper } from './nile-portal-wrapper.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nile-portal-wrapper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { NilePortalWrapper } from './nile-portal-wrapper.js';\n"]}
@@ -0,0 +1,47 @@
1
+ import { LitElement } from 'lit';
2
+ import { type Placement, type Boundary } from '@floating-ui/dom';
3
+ export declare class NilePortalWrapper extends LitElement {
4
+ enabled: boolean;
5
+ targetElement: HTMLElement | null;
6
+ content: HTMLElement | null;
7
+ placement: Placement;
8
+ offset: number;
9
+ padding: number;
10
+ boundary: Boundary;
11
+ fallbackPlacements: Placement[];
12
+ strategy: 'absolute' | 'fixed';
13
+ className: string;
14
+ zIndex: number;
15
+ preserveStyles: boolean;
16
+ cloneContent: boolean;
17
+ private portalContainer;
18
+ private clonedContent;
19
+ private currentPlacement;
20
+ private currentMiddlewareData;
21
+ private measuredHeight;
22
+ private cleanupAutoUpdate;
23
+ private injectedStyleId;
24
+ private resizeObserver;
25
+ static styles: import("lit").CSSResult;
26
+ connectedCallback(): void;
27
+ disconnectedCallback(): void;
28
+ updated(changedProperties: Map<string | number | symbol, unknown>): void;
29
+ private setupPortal;
30
+ private createPortalContainer;
31
+ private createClonedContent;
32
+ private createPortalListbox;
33
+ private cloneOption;
34
+ private positionPortal;
35
+ private handleSizeMiddleware;
36
+ private applyPosition;
37
+ private fallbackPositioning;
38
+ private setupAutoUpdate;
39
+ private setupEventListeners;
40
+ private handleOptionClick;
41
+ private forwardEvent;
42
+ private findOriginalElement;
43
+ private injectStyles;
44
+ private extractStylesAsCSS;
45
+ private cleanup;
46
+ render(): import("lit-html").TemplateResult<1>;
47
+ }