@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,421 @@
1
+ import { autoUpdate, computePosition, flip, offset, shift, platform } from '@floating-ui/dom';
2
+ import { PortalUtils, PortalContentUtils, PortalEventUtils } from './portal-utils';
3
+ export class PopoverPortalManager {
4
+ constructor(component) {
5
+ this.portalContainer = null;
6
+ this.originalPopoverParent = null;
7
+ this.measuredPopoverHeight = null;
8
+ this.clonedPopover = null;
9
+ this.cleanupAutoUpdate = null;
10
+ this.currentPlacement = 'top';
11
+ this.currentMiddlewareData = null;
12
+ this.component = component;
13
+ }
14
+ createPortalAppendContainer() {
15
+ const container = document.createElement('div');
16
+ container.style.position = 'absolute';
17
+ container.style.zIndex = '9999';
18
+ container.style.pointerEvents = 'none';
19
+ container.style.width = 'auto';
20
+ container.style.maxWidth = 'none';
21
+ container.style.minWidth = '200px';
22
+ container.className = 'nile-popover-portal-append';
23
+ return container;
24
+ }
25
+ positionPortalAppend() {
26
+ if (!this.portalContainer || !this.component.isShow)
27
+ return;
28
+ this.measurePopoverHeight();
29
+ this.computeFloatingUIPosition();
30
+ }
31
+ measurePopoverHeight() {
32
+ if (this.measuredPopoverHeight || !this.portalContainer)
33
+ return;
34
+ this.portalContainer.style.position = 'absolute';
35
+ this.portalContainer.style.visibility = 'hidden';
36
+ this.portalContainer.style.top = '0px';
37
+ this.portalContainer.style.left = '0px';
38
+ this.portalContainer.offsetHeight;
39
+ this.measuredPopoverHeight = this.portalContainer.offsetHeight;
40
+ this.portalContainer.style.visibility = '';
41
+ }
42
+ async computeFloatingUIPosition() {
43
+ if (!this.portalContainer)
44
+ return;
45
+ const referenceElement = this.component.querySelector('[slot="anchor"]') || this.component;
46
+ const floatingElement = this.portalContainer;
47
+ try {
48
+ const { x, y, placement, middlewareData } = await this.calculateFloatingUIPosition(referenceElement, floatingElement);
49
+ this.applyFloatingUIPosition(floatingElement, referenceElement, x, y, placement, middlewareData);
50
+ }
51
+ catch (error) {
52
+ console.warn('Floating UI positioning failed, falling back to simple positioning:', error);
53
+ this.fallbackPositioning();
54
+ }
55
+ }
56
+ async calculateFloatingUIPosition(referenceElement, floatingElement) {
57
+ const boundary = PortalUtils.findBoundaryElements(referenceElement);
58
+ const initialPlacement = this.getInitialPlacement();
59
+ const middleware = this.createFloatingUIMiddleware(boundary);
60
+ return await computePosition(referenceElement, floatingElement, {
61
+ placement: initialPlacement,
62
+ strategy: 'fixed',
63
+ middleware,
64
+ platform: this.createCustomPlatform()
65
+ });
66
+ }
67
+ getInitialPlacement() {
68
+ return this.component.placement || 'top';
69
+ }
70
+ createFloatingUIMiddleware(boundary) {
71
+ return [
72
+ offset(this.component.distance || 18),
73
+ flip({
74
+ fallbackPlacements: this.getFallbackPlacements(),
75
+ fallbackStrategy: 'bestFit',
76
+ padding: 10,
77
+ boundary: boundary
78
+ }),
79
+ shift({
80
+ padding: 10,
81
+ crossAxis: true,
82
+ boundary: boundary
83
+ })
84
+ ];
85
+ }
86
+ getFallbackPlacements() {
87
+ const basePlacement = this.component.placement || 'top';
88
+ const placements = [];
89
+ // Generate fallback placements based on the base placement
90
+ if (basePlacement.startsWith('top')) {
91
+ placements.push('bottom', 'right', 'left', 'top-start', 'top-end', 'bottom-start', 'bottom-end');
92
+ }
93
+ else if (basePlacement.startsWith('bottom')) {
94
+ placements.push('top', 'right', 'left', 'bottom-start', 'bottom-end', 'top-start', 'top-end');
95
+ }
96
+ else if (basePlacement.startsWith('left')) {
97
+ placements.push('right', 'top', 'bottom', 'left-start', 'left-end', 'right-start', 'right-end');
98
+ }
99
+ else if (basePlacement.startsWith('right')) {
100
+ placements.push('left', 'top', 'bottom', 'right-start', 'right-end', 'left-start', 'left-end');
101
+ }
102
+ return placements;
103
+ }
104
+ createCustomPlatform() {
105
+ return platform;
106
+ }
107
+ positionArrow(floatingElement, referenceElement, placement) {
108
+ if (!this.component.arrow)
109
+ return;
110
+ const arrowElement = floatingElement.querySelector('.popup__arrow');
111
+ if (!arrowElement)
112
+ return;
113
+ const referenceRect = referenceElement.getBoundingClientRect();
114
+ const floatingRect = floatingElement.getBoundingClientRect();
115
+ // Calculate arrow position based on placement
116
+ const arrowSize = 18; // Default arrow size
117
+ const arrowPadding = 8; // Padding from edge
118
+ let top = '';
119
+ let right = '';
120
+ let bottom = '';
121
+ let left = '';
122
+ const basePlacement = placement.split('-')[0];
123
+ switch (basePlacement) {
124
+ case 'top':
125
+ bottom = `calc(var(--arrow-size-diagonal) * -1)`;
126
+ left = this.calculateArrowXPosition(referenceRect, floatingRect, placement, arrowSize);
127
+ break;
128
+ case 'bottom':
129
+ top = `calc(var(--arrow-size-diagonal) * -1)`;
130
+ left = this.calculateArrowXPosition(referenceRect, floatingRect, placement, arrowSize);
131
+ break;
132
+ case 'left':
133
+ right = `calc(var(--arrow-size-diagonal) * -1)`;
134
+ top = this.calculateArrowYPosition(referenceRect, floatingRect, placement, arrowSize);
135
+ break;
136
+ case 'right':
137
+ left = `calc(var(--arrow-size-diagonal) * -1)`;
138
+ top = this.calculateArrowYPosition(referenceRect, floatingRect, placement, arrowSize);
139
+ break;
140
+ }
141
+ Object.assign(arrowElement.style, {
142
+ top,
143
+ right,
144
+ bottom,
145
+ left
146
+ });
147
+ }
148
+ calculateArrowXPosition(referenceRect, floatingRect, placement, arrowSize) {
149
+ const referenceCenter = referenceRect.left + referenceRect.width / 2;
150
+ const floatingLeft = floatingRect.left;
151
+ const arrowOffset = referenceCenter - floatingLeft - arrowSize;
152
+ if (placement.includes('start')) {
153
+ return `${arrowSize}px`;
154
+ }
155
+ else if (placement.includes('end')) {
156
+ return `calc(100% - ${arrowSize * 2}px)`;
157
+ }
158
+ else {
159
+ return `${Math.max(arrowSize, Math.min(arrowOffset, floatingRect.width - arrowSize * 2))}px`;
160
+ }
161
+ }
162
+ calculateArrowYPosition(referenceRect, floatingRect, placement, arrowSize) {
163
+ const referenceCenter = referenceRect.top + referenceRect.height / 2;
164
+ const floatingTop = floatingRect.top;
165
+ const arrowOffset = referenceCenter - floatingTop - arrowSize;
166
+ if (placement.includes('start')) {
167
+ return `${arrowSize}px`;
168
+ }
169
+ else if (placement.includes('end')) {
170
+ return `calc(100% - ${arrowSize * 2}px)`;
171
+ }
172
+ else {
173
+ return `${Math.max(arrowSize, Math.min(arrowOffset, floatingRect.height - arrowSize * 2))}px`;
174
+ }
175
+ }
176
+ applyFloatingUIPosition(floatingElement, referenceElement, x, y, placement, middlewareData) {
177
+ Object.assign(floatingElement.style, {
178
+ left: `${x}px`,
179
+ top: `${y}px`,
180
+ position: 'fixed',
181
+ pointerEvents: 'auto',
182
+ width: 'auto',
183
+ maxWidth: 'none',
184
+ minWidth: '200px'
185
+ });
186
+ this.currentPlacement = placement;
187
+ this.currentMiddlewareData = middlewareData;
188
+ PortalUtils.applyCollisionData(floatingElement, middlewareData, placement);
189
+ const placementClass = placement.split('-')[0];
190
+ floatingElement.className = `nile-popover-portal-append`;
191
+ // Set minimum width based on reference element, but allow natural expansion
192
+ const referenceRect = referenceElement.getBoundingClientRect();
193
+ floatingElement.style.minWidth = `${Math.max(referenceRect.width, 200)}px`;
194
+ // Position the arrow if it exists
195
+ this.positionArrow(floatingElement, referenceElement, placement);
196
+ }
197
+ fallbackPositioning() {
198
+ if (!this.portalContainer)
199
+ return;
200
+ const referenceElement = this.component.querySelector('[slot="anchor"]') || this.component;
201
+ const rect = referenceElement.getBoundingClientRect();
202
+ const viewportHeight = window.innerHeight;
203
+ const viewportWidth = window.innerWidth;
204
+ const popoverHeight = this.measuredPopoverHeight || 200;
205
+ const spaceBelow = viewportHeight - rect.bottom;
206
+ const spaceAbove = rect.top;
207
+ const spaceRight = viewportWidth - rect.right;
208
+ const spaceLeft = rect.left;
209
+ let topPosition;
210
+ let leftPosition = rect.left;
211
+ let placementClass;
212
+ let maxHeight;
213
+ // Determine optimal placement based on available space
214
+ if (spaceBelow > spaceAbove && spaceBelow > 200) {
215
+ maxHeight = Math.max(spaceBelow - 20, 100);
216
+ topPosition = rect.bottom + (this.component.distance || 18);
217
+ placementClass = 'bottom';
218
+ }
219
+ else if (spaceAbove > spaceBelow && spaceAbove > 200) {
220
+ maxHeight = Math.max(spaceAbove - 20, 100);
221
+ topPosition = Math.max(rect.top - maxHeight - (this.component.distance || 18), 10);
222
+ placementClass = 'top';
223
+ }
224
+ else if (spaceRight > spaceLeft && spaceRight > 200) {
225
+ maxHeight = Math.max(Math.min(spaceRight, spaceBelow, spaceAbove) - 20, 100);
226
+ topPosition = rect.top;
227
+ leftPosition = rect.right + (this.component.distance || 18);
228
+ placementClass = 'right';
229
+ }
230
+ else {
231
+ maxHeight = Math.max(Math.min(spaceLeft, spaceBelow, spaceAbove) - 20, 100);
232
+ topPosition = rect.top;
233
+ leftPosition = Math.max(rect.left - 200 - (this.component.distance || 18), 10);
234
+ placementClass = 'left';
235
+ }
236
+ if (placementClass === 'left' || placementClass === 'right') {
237
+ this.portalContainer.style.left = `${leftPosition}px`;
238
+ this.portalContainer.style.top = `${topPosition}px`;
239
+ }
240
+ else {
241
+ this.portalContainer.style.left = `${rect.left}px`;
242
+ this.portalContainer.style.top = `${topPosition}px`;
243
+ }
244
+ this.portalContainer.style.maxHeight = `${maxHeight}px`;
245
+ this.portalContainer.style.pointerEvents = 'auto';
246
+ this.portalContainer.style.width = 'auto';
247
+ this.portalContainer.style.maxWidth = 'none';
248
+ this.portalContainer.style.minWidth = '200px';
249
+ this.portalContainer.className = `nile-popover-portal-append popover__box popover__box--${placementClass}`;
250
+ this.calculateAndSetAutoSizeProperties(rect, topPosition, placementClass);
251
+ // Position the arrow if it exists
252
+ this.positionArrow(this.portalContainer, referenceElement, placementClass);
253
+ }
254
+ calculateAndSetAutoSizeProperties(rect, topPosition, placementClass) {
255
+ if (!this.portalContainer)
256
+ return;
257
+ const viewportHeight = window.innerHeight;
258
+ const viewportWidth = window.innerWidth;
259
+ let availableHeight;
260
+ let availableWidth = viewportWidth - rect.left - 10;
261
+ if (placementClass === 'top') {
262
+ availableHeight = rect.top - 10;
263
+ }
264
+ else if (placementClass === 'bottom') {
265
+ availableHeight = viewportHeight - rect.bottom - 10;
266
+ }
267
+ else if (placementClass === 'left') {
268
+ availableHeight = Math.min(viewportHeight - rect.top, rect.bottom);
269
+ availableWidth = rect.left - 10;
270
+ }
271
+ else {
272
+ availableHeight = Math.min(viewportHeight - rect.top, rect.bottom);
273
+ availableWidth = viewportWidth - rect.right - 10;
274
+ }
275
+ this.portalContainer.style.setProperty('--auto-size-available-height', `${Math.max(availableHeight, 100)}px`);
276
+ this.portalContainer.style.setProperty('--auto-size-available-width', `${Math.max(availableWidth, 200)}px`);
277
+ }
278
+ updatePortalAppendPosition() {
279
+ if (this.component.portal && this.portalContainer) {
280
+ this.positionPortalAppend();
281
+ }
282
+ }
283
+ handleWindowResize() {
284
+ if (this.component.portal && this.portalContainer) {
285
+ this.positionPortalAppend();
286
+ }
287
+ }
288
+ setupAutoUpdatePositioning() {
289
+ if (!this.portalContainer || !this.component)
290
+ return;
291
+ this.cleanupAutoUpdatePositioning();
292
+ this.cleanupAutoUpdate = autoUpdate(this.component, this.portalContainer, () => {
293
+ this.computeFloatingUIPosition();
294
+ }, {
295
+ ancestorScroll: true,
296
+ ancestorResize: true,
297
+ elementResize: true,
298
+ layoutShift: true,
299
+ animationFrame: true
300
+ });
301
+ }
302
+ cleanupAutoUpdatePositioning() {
303
+ if (this.cleanupAutoUpdate) {
304
+ this.cleanupAutoUpdate();
305
+ this.cleanupAutoUpdate = null;
306
+ }
307
+ }
308
+ injectStylesToDocument() {
309
+ if (!this.portalContainer)
310
+ return;
311
+ const styleId = PortalUtils.generateStyleId();
312
+ if (document.getElementById(styleId))
313
+ return;
314
+ const componentStyles = this.component.constructor.styles;
315
+ if (!componentStyles)
316
+ return;
317
+ const styleElement = document.createElement('style');
318
+ styleElement.id = styleId;
319
+ styleElement.textContent = PortalUtils.extractStylesAsCSS(componentStyles);
320
+ document.head.appendChild(styleElement);
321
+ this.portalContainer.__injectedStyleId = styleId;
322
+ }
323
+ adoptStylesToPortalAppend() {
324
+ if (!this.portalContainer)
325
+ return;
326
+ this.injectStylesToDocument();
327
+ }
328
+ setupPortalAppend() {
329
+ if (!this.component.portal)
330
+ return;
331
+ this.component.updateComplete.then(() => {
332
+ setTimeout(() => {
333
+ if (this.component.isShow) {
334
+ // Create the portal popover directly from component slots
335
+ this.clonedPopover = this.createPortalPopover();
336
+ this.portalContainer = this.createPortalAppendContainer();
337
+ this.portalContainer.appendChild(this.clonedPopover);
338
+ document.body.appendChild(this.portalContainer);
339
+ this.adoptStylesToPortalAppend();
340
+ this.clonedPopover.style.display = '';
341
+ this.positionPortalAppend();
342
+ this.setupPortalEventListeners();
343
+ this.setupAutoUpdatePositioning();
344
+ window.addEventListener('resize', this.handleWindowResize.bind(this));
345
+ }
346
+ }, 10);
347
+ });
348
+ }
349
+ createPortalPopover() {
350
+ return PortalContentUtils.createPortalPopover(this.component);
351
+ }
352
+ setupPortalEventListeners() {
353
+ PortalEventUtils.setupPortalEventListeners(this.clonedPopover, this.component);
354
+ }
355
+ cleanupPortalAppend() {
356
+ this.cleanupAutoUpdatePositioning();
357
+ if (this.portalContainer && this.portalContainer.parentNode) {
358
+ const injectedStyleId = this.portalContainer.__injectedStyleId;
359
+ if (injectedStyleId) {
360
+ const styleElement = document.getElementById(injectedStyleId);
361
+ if (styleElement) {
362
+ styleElement.remove();
363
+ }
364
+ }
365
+ this.portalContainer.parentNode.removeChild(this.portalContainer);
366
+ }
367
+ window.removeEventListener('resize', this.handleWindowResize.bind(this));
368
+ this.portalContainer = null;
369
+ this.originalPopoverParent = null;
370
+ this.clonedPopover = null;
371
+ this.measuredPopoverHeight = null;
372
+ this.currentPlacement = 'top';
373
+ this.currentMiddlewareData = null;
374
+ }
375
+ get portalContainerElement() {
376
+ return this.portalContainer;
377
+ }
378
+ resetMeasuredHeight() {
379
+ this.measuredPopoverHeight = null;
380
+ }
381
+ forceReposition() {
382
+ if (this.portalContainer) {
383
+ this.computeFloatingUIPosition();
384
+ }
385
+ }
386
+ getCurrentPlacement() {
387
+ return this.currentPlacement;
388
+ }
389
+ getCurrentMiddlewareData() {
390
+ return this.currentMiddlewareData;
391
+ }
392
+ isUsingFloatingUI() {
393
+ return this.cleanupAutoUpdate !== null;
394
+ }
395
+ updatePositioningConfig(config) {
396
+ this.forceReposition();
397
+ }
398
+ handleViewportChange() {
399
+ if (this.portalContainer) {
400
+ this.resetMeasuredHeight();
401
+ this.forceReposition();
402
+ }
403
+ }
404
+ isPositioningOptimal() {
405
+ if (!this.portalContainer || !this.currentMiddlewareData)
406
+ return true;
407
+ const referenceElement = this.component.querySelector('[slot="anchor"]') || this.component;
408
+ const rect = referenceElement.getBoundingClientRect();
409
+ const viewportHeight = window.innerHeight;
410
+ const spaceBelow = viewportHeight - rect.bottom;
411
+ const spaceAbove = rect.top;
412
+ const isAbove = this.currentPlacement.startsWith('top');
413
+ const isBelow = this.currentPlacement.startsWith('bottom');
414
+ if (isAbove && spaceBelow > spaceAbove)
415
+ return false;
416
+ if (isBelow && spaceAbove > spaceBelow)
417
+ return false;
418
+ return true;
419
+ }
420
+ }
421
+ //# sourceMappingURL=portal-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-manager.js","sourceRoot":"","sources":["../../../src/nile-popover/portal-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { \n autoUpdate, \n computePosition, \n flip, \n offset, \n shift, \n size, \n platform,\n type Placement,\n type MiddlewareData,\n type ComputePositionConfig,\n type Boundary\n} from '@floating-ui/dom';\nimport { PortalUtils, PortalContentUtils, PortalEventUtils } from './portal-utils';\n\nexport class PopoverPortalManager {\n private portalContainer: HTMLElement | null = null;\n private originalPopoverParent: HTMLElement | null = null;\n private measuredPopoverHeight: number | null = null;\n private component: any;\n private clonedPopover: HTMLElement | null = null;\n private cleanupAutoUpdate: (() => void) | null = null;\n private currentPlacement: Placement = 'top';\n private currentMiddlewareData: MiddlewareData | null = null;\n\n constructor(component: any) {\n this.component = component;\n }\n\n private createPortalAppendContainer(): HTMLElement {\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.zIndex = '9999';\n container.style.pointerEvents = 'none';\n container.style.width = 'auto';\n container.style.maxWidth = 'none';\n container.style.minWidth = '200px';\n container.className = 'nile-popover-portal-append';\n return container;\n }\n\n positionPortalAppend(): void {\n if (!this.portalContainer || !this.component.isShow) return;\n\n this.measurePopoverHeight();\n this.computeFloatingUIPosition();\n }\n\n private measurePopoverHeight(): void {\n if (this.measuredPopoverHeight || !this.portalContainer) return;\n\n this.portalContainer.style.position = 'absolute';\n this.portalContainer.style.visibility = 'hidden';\n this.portalContainer.style.top = '0px';\n this.portalContainer.style.left = '0px';\n \n this.portalContainer.offsetHeight;\n \n this.measuredPopoverHeight = this.portalContainer.offsetHeight;\n \n this.portalContainer.style.visibility = '';\n }\n\n private async computeFloatingUIPosition(): Promise<void> {\n if (!this.portalContainer) return;\n\n const referenceElement = this.component.querySelector('[slot=\"anchor\"]') || this.component;\n const floatingElement = this.portalContainer;\n\n try {\n const { x, y, placement, middlewareData } = await this.calculateFloatingUIPosition(\n referenceElement,\n floatingElement\n );\n\n this.applyFloatingUIPosition(floatingElement, referenceElement, x, y, placement, middlewareData);\n\n } catch (error) {\n console.warn('Floating UI positioning failed, falling back to simple positioning:', error);\n this.fallbackPositioning();\n }\n }\n\n private async calculateFloatingUIPosition(\n referenceElement: HTMLElement,\n floatingElement: HTMLElement\n ): Promise<{ x: number; y: number; placement: Placement; middlewareData: MiddlewareData }> {\n const boundary = PortalUtils.findBoundaryElements(referenceElement);\n const initialPlacement = this.getInitialPlacement();\n const middleware = this.createFloatingUIMiddleware(boundary);\n\n return await computePosition(referenceElement, floatingElement, {\n placement: initialPlacement,\n strategy: 'fixed',\n middleware,\n platform: this.createCustomPlatform()\n });\n }\n\n private getInitialPlacement(): Placement {\n return this.component.placement || 'top';\n }\n\n private createFloatingUIMiddleware(boundary: Element[] | undefined): ComputePositionConfig['middleware'] {\n return [\n offset(this.component.distance || 18),\n flip({\n fallbackPlacements: this.getFallbackPlacements(),\n fallbackStrategy: 'bestFit',\n padding: 10,\n boundary: boundary\n }),\n shift({\n padding: 10,\n crossAxis: true,\n boundary: boundary\n })\n ];\n }\n\n private getFallbackPlacements(): Placement[] {\n const basePlacement = this.component.placement || 'top';\n const placements: Placement[] = [];\n \n // Generate fallback placements based on the base placement\n if (basePlacement.startsWith('top')) {\n placements.push('bottom', 'right', 'left', 'top-start', 'top-end', 'bottom-start', 'bottom-end');\n } else if (basePlacement.startsWith('bottom')) {\n placements.push('top', 'right', 'left', 'bottom-start', 'bottom-end', 'top-start', 'top-end');\n } else if (basePlacement.startsWith('left')) {\n placements.push('right', 'top', 'bottom', 'left-start', 'left-end', 'right-start', 'right-end');\n } else if (basePlacement.startsWith('right')) {\n placements.push('left', 'top', 'bottom', 'right-start', 'right-end', 'left-start', 'left-end');\n }\n \n return placements;\n }\n\n\n private createCustomPlatform() {\n return platform;\n }\n\n private positionArrow(floatingElement: HTMLElement, referenceElement: HTMLElement, placement: Placement): void {\n if (!this.component.arrow) return;\n \n const arrowElement = floatingElement.querySelector('.popup__arrow') as HTMLElement;\n if (!arrowElement) return;\n \n const referenceRect = referenceElement.getBoundingClientRect();\n const floatingRect = floatingElement.getBoundingClientRect();\n \n // Calculate arrow position based on placement\n const arrowSize = 18; // Default arrow size\n const arrowPadding = 8; // Padding from edge\n \n let top = '';\n let right = '';\n let bottom = '';\n let left = '';\n \n const basePlacement = placement.split('-')[0];\n \n switch (basePlacement) {\n case 'top':\n bottom = `calc(var(--arrow-size-diagonal) * -1)`;\n left = this.calculateArrowXPosition(referenceRect, floatingRect, placement, arrowSize);\n break;\n case 'bottom':\n top = `calc(var(--arrow-size-diagonal) * -1)`;\n left = this.calculateArrowXPosition(referenceRect, floatingRect, placement, arrowSize);\n break;\n case 'left':\n right = `calc(var(--arrow-size-diagonal) * -1)`;\n top = this.calculateArrowYPosition(referenceRect, floatingRect, placement, arrowSize);\n break;\n case 'right':\n left = `calc(var(--arrow-size-diagonal) * -1)`;\n top = this.calculateArrowYPosition(referenceRect, floatingRect, placement, arrowSize);\n break;\n }\n \n Object.assign(arrowElement.style, {\n top,\n right,\n bottom,\n left\n });\n }\n\n private calculateArrowXPosition(referenceRect: DOMRect, floatingRect: DOMRect, placement: Placement, arrowSize: number): string {\n const referenceCenter = referenceRect.left + referenceRect.width / 2;\n const floatingLeft = floatingRect.left;\n const arrowOffset = referenceCenter - floatingLeft - arrowSize;\n \n if (placement.includes('start')) {\n return `${arrowSize}px`;\n } else if (placement.includes('end')) {\n return `calc(100% - ${arrowSize * 2}px)`;\n } else {\n return `${Math.max(arrowSize, Math.min(arrowOffset, floatingRect.width - arrowSize * 2))}px`;\n }\n }\n\n private calculateArrowYPosition(referenceRect: DOMRect, floatingRect: DOMRect, placement: Placement, arrowSize: number): string {\n const referenceCenter = referenceRect.top + referenceRect.height / 2;\n const floatingTop = floatingRect.top;\n const arrowOffset = referenceCenter - floatingTop - arrowSize;\n \n if (placement.includes('start')) {\n return `${arrowSize}px`;\n } else if (placement.includes('end')) {\n return `calc(100% - ${arrowSize * 2}px)`;\n } else {\n return `${Math.max(arrowSize, Math.min(arrowOffset, floatingRect.height - arrowSize * 2))}px`;\n }\n }\n\n private applyFloatingUIPosition(\n floatingElement: HTMLElement,\n referenceElement: HTMLElement,\n x: number,\n y: number,\n placement: Placement,\n middlewareData: MiddlewareData\n ): void {\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: 'fixed',\n pointerEvents: 'auto',\n width: 'auto',\n maxWidth: 'none',\n minWidth: '200px'\n });\n\n this.currentPlacement = placement;\n this.currentMiddlewareData = middlewareData;\n \n PortalUtils.applyCollisionData(floatingElement, middlewareData, placement);\n \n const placementClass = placement.split('-')[0];\n floatingElement.className = `nile-popover-portal-append`;\n\n // Set minimum width based on reference element, but allow natural expansion\n const referenceRect = (referenceElement as HTMLElement).getBoundingClientRect();\n floatingElement.style.minWidth = `${Math.max(referenceRect.width, 200)}px`;\n \n // Position the arrow if it exists\n this.positionArrow(floatingElement, referenceElement, placement);\n }\n\n private fallbackPositioning(): void {\n if (!this.portalContainer) return;\n\n const referenceElement = this.component.querySelector('[slot=\"anchor\"]') || this.component;\n const rect = referenceElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const popoverHeight = this.measuredPopoverHeight || 200;\n \n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = viewportWidth - rect.right;\n const spaceLeft = rect.left;\n \n let topPosition: number;\n let leftPosition: number = rect.left;\n let placementClass: string;\n let maxHeight: number;\n \n // Determine optimal placement based on available space\n if (spaceBelow > spaceAbove && spaceBelow > 200) {\n maxHeight = Math.max(spaceBelow - 20, 100);\n topPosition = rect.bottom + (this.component.distance || 18);\n placementClass = 'bottom';\n } else if (spaceAbove > spaceBelow && spaceAbove > 200) {\n maxHeight = Math.max(spaceAbove - 20, 100);\n topPosition = Math.max(rect.top - maxHeight - (this.component.distance || 18), 10);\n placementClass = 'top';\n } else if (spaceRight > spaceLeft && spaceRight > 200) {\n maxHeight = Math.max(Math.min(spaceRight, spaceBelow, spaceAbove) - 20, 100);\n topPosition = rect.top;\n leftPosition = rect.right + (this.component.distance || 18);\n placementClass = 'right';\n } else {\n maxHeight = Math.max(Math.min(spaceLeft, spaceBelow, spaceAbove) - 20, 100);\n topPosition = rect.top;\n leftPosition = Math.max(rect.left - 200 - (this.component.distance || 18), 10);\n placementClass = 'left';\n }\n\n if (placementClass === 'left' || placementClass === 'right') {\n this.portalContainer.style.left = `${leftPosition}px`;\n this.portalContainer.style.top = `${topPosition}px`;\n } else {\n this.portalContainer.style.left = `${rect.left}px`;\n this.portalContainer.style.top = `${topPosition}px`;\n }\n \n this.portalContainer.style.maxHeight = `${maxHeight}px`;\n this.portalContainer.style.pointerEvents = 'auto';\n this.portalContainer.style.width = 'auto';\n this.portalContainer.style.maxWidth = 'none';\n this.portalContainer.style.minWidth = '200px';\n this.portalContainer.className = `nile-popover-portal-append popover__box popover__box--${placementClass}`;\n \n this.calculateAndSetAutoSizeProperties(rect, topPosition, placementClass);\n \n // Position the arrow if it exists\n this.positionArrow(this.portalContainer, referenceElement, placementClass as Placement);\n }\n\n private calculateAndSetAutoSizeProperties(rect: DOMRect, topPosition: number, placementClass: string): void {\n if (!this.portalContainer) return;\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n \n let availableHeight: number;\n let availableWidth: number = viewportWidth - rect.left - 10;\n \n if (placementClass === 'top') {\n availableHeight = rect.top - 10;\n } else if (placementClass === 'bottom') {\n availableHeight = viewportHeight - rect.bottom - 10;\n } else if (placementClass === 'left') {\n availableHeight = Math.min(viewportHeight - rect.top, rect.bottom);\n availableWidth = rect.left - 10;\n } else {\n availableHeight = Math.min(viewportHeight - rect.top, rect.bottom);\n availableWidth = viewportWidth - rect.right - 10;\n }\n \n this.portalContainer.style.setProperty('--auto-size-available-height', `${Math.max(availableHeight, 100)}px`);\n this.portalContainer.style.setProperty('--auto-size-available-width', `${Math.max(availableWidth, 200)}px`);\n }\n\n updatePortalAppendPosition(): void {\n if (this.component.portal && this.portalContainer) {\n this.positionPortalAppend();\n }\n }\n\n handleWindowResize(): void {\n if (this.component.portal && this.portalContainer) {\n this.positionPortalAppend();\n }\n }\n\n private setupAutoUpdatePositioning(): void {\n if (!this.portalContainer || !this.component) return;\n\n this.cleanupAutoUpdatePositioning();\n\n this.cleanupAutoUpdate = autoUpdate(\n this.component,\n this.portalContainer,\n () => {\n this.computeFloatingUIPosition();\n },\n {\n ancestorScroll: true,\n ancestorResize: true,\n elementResize: true,\n layoutShift: true,\n animationFrame: true\n }\n );\n }\n\n private cleanupAutoUpdatePositioning(): void {\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = null;\n }\n }\n\n private injectStylesToDocument(): void {\n if (!this.portalContainer) return;\n\n const styleId = PortalUtils.generateStyleId();\n \n if (document.getElementById(styleId)) return;\n\n const componentStyles = (this.component.constructor as any).styles;\n if (!componentStyles) return;\n\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = PortalUtils.extractStylesAsCSS(componentStyles);\n \n document.head.appendChild(styleElement);\n \n (this.portalContainer as any).__injectedStyleId = styleId;\n }\n\n private adoptStylesToPortalAppend(): void {\n if (!this.portalContainer) return;\n this.injectStylesToDocument();\n }\n\n setupPortalAppend(): void {\n if (!this.component.portal) return;\n\n this.component.updateComplete.then(() => {\n setTimeout(() => {\n if (this.component.isShow) {\n // Create the portal popover directly from component slots\n this.clonedPopover = this.createPortalPopover();\n \n this.portalContainer = this.createPortalAppendContainer();\n this.portalContainer.appendChild(this.clonedPopover);\n document.body.appendChild(this.portalContainer);\n \n this.adoptStylesToPortalAppend();\n \n this.clonedPopover.style.display = '';\n this.positionPortalAppend();\n \n this.setupPortalEventListeners();\n \n this.setupAutoUpdatePositioning();\n \n window.addEventListener('resize', this.handleWindowResize.bind(this));\n \n }\n }, 10);\n });\n }\n\n private createPortalPopover(): HTMLElement {\n return PortalContentUtils.createPortalPopover(this.component);\n }\n\n private setupPortalEventListeners(): void {\n PortalEventUtils.setupPortalEventListeners(this.clonedPopover!, this.component);\n }\n\n cleanupPortalAppend(): void {\n this.cleanupAutoUpdatePositioning();\n \n if (this.portalContainer && this.portalContainer.parentNode) {\n const injectedStyleId = (this.portalContainer as any).__injectedStyleId;\n if (injectedStyleId) {\n const styleElement = document.getElementById(injectedStyleId);\n if (styleElement) {\n styleElement.remove();\n }\n }\n \n this.portalContainer.parentNode.removeChild(this.portalContainer);\n }\n \n window.removeEventListener('resize', this.handleWindowResize.bind(this));\n \n this.portalContainer = null;\n this.originalPopoverParent = null;\n this.clonedPopover = null;\n this.measuredPopoverHeight = null;\n this.currentPlacement = 'top';\n this.currentMiddlewareData = null;\n }\n\n get portalContainerElement(): HTMLElement | null {\n return this.portalContainer;\n }\n\n resetMeasuredHeight(): void {\n this.measuredPopoverHeight = null;\n }\n\n forceReposition(): void {\n if (this.portalContainer) {\n this.computeFloatingUIPosition();\n }\n }\n\n getCurrentPlacement(): Placement {\n return this.currentPlacement;\n }\n\n getCurrentMiddlewareData(): MiddlewareData | null {\n return this.currentMiddlewareData;\n }\n\n isUsingFloatingUI(): boolean {\n return this.cleanupAutoUpdate !== null;\n }\n\n updatePositioningConfig(config: {\n offset?: number;\n padding?: number;\n boundary?: Element[] | 'viewport';\n fallbackPlacements?: Placement[];\n }): void {\n this.forceReposition();\n }\n\n handleViewportChange(): void {\n if (this.portalContainer) {\n this.resetMeasuredHeight();\n this.forceReposition();\n }\n }\n\n isPositioningOptimal(): boolean {\n if (!this.portalContainer || !this.currentMiddlewareData) return true;\n\n const referenceElement = this.component.querySelector('[slot=\"anchor\"]') || this.component;\n const rect = referenceElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n \n const isAbove = this.currentPlacement.startsWith('top');\n const isBelow = this.currentPlacement.startsWith('bottom');\n \n if (isAbove && spaceBelow > spaceAbove) return false;\n if (isBelow && spaceAbove > spaceBelow) return false;\n \n return true;\n }\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import { type Placement, type MiddlewareData, type ComputePositionConfig, type Boundary } from '@floating-ui/dom';
2
+ export declare class PortalUtils {
3
+ static calculateAvailableSpace(referenceElement: HTMLElement): {
4
+ spaceAbove: number;
5
+ spaceBelow: number;
6
+ spaceLeft: number;
7
+ spaceRight: number;
8
+ viewportHeight: number;
9
+ viewportWidth: number;
10
+ };
11
+ static getOptimalPlacement(referenceElement: HTMLElement): Placement;
12
+ static findBoundaryElements(component: HTMLElement): Element[] | undefined;
13
+ static calculateOptimalHeight(referenceRect: {
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ }, viewportHeight: number, placement: Placement): number;
19
+ static extractStylesAsCSS(styles: any): string;
20
+ static generateStyleId(): string;
21
+ static isPositioningOptimal(placement: Placement, referenceElement: HTMLElement): boolean;
22
+ static applyCollisionData(element: HTMLElement, middlewareData: MiddlewareData, placement: Placement): void;
23
+ static createFloatingUIMiddleware(boundary: Boundary, onSizeApply: (params: {
24
+ availableWidth: number;
25
+ availableHeight: number;
26
+ elements: {
27
+ floating: HTMLElement;
28
+ };
29
+ rects: {
30
+ reference: {
31
+ x: number;
32
+ y: number;
33
+ width: number;
34
+ height: number;
35
+ };
36
+ };
37
+ }) => void): ComputePositionConfig['middleware'];
38
+ }
39
+ export declare class PortalContentUtils {
40
+ static createBasePopover(component: any): HTMLElement;
41
+ static addTitleSection(popoverBox: HTMLElement, component: any): void;
42
+ static addContentSection(popoverBox: HTMLElement, component: any): void;
43
+ static cloneContent(originalContent: HTMLElement, targetContent: HTMLElement): void;
44
+ static addActionSection(popoverBox: HTMLElement, component: any): void;
45
+ static addArrowElement(popoverBox: HTMLElement, component: any): void;
46
+ static createPortalPopover(component: any): HTMLElement;
47
+ static updatePortalContent(clonedPopover: HTMLElement, component: any): void;
48
+ }
49
+ export declare class PortalEventUtils {
50
+ static setupPortalEventListeners(clonedPopover: HTMLElement, component: any): void;
51
+ static setupClickListeners(clonedPopover: HTMLElement, component: any): void;
52
+ static setupContentListeners(clonedPopover: HTMLElement, component: any): void;
53
+ static setupActionListeners(clonedPopover: HTMLElement, component: any): void;
54
+ static forwardEventToOriginal(event: Event, component: any, eventType: string): void;
55
+ }