@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.
- package/README.md +3 -0
- package/demo/index.html +13 -19
- package/dist/{fixture-d1470b58.cjs.js → fixture-5b79f853.cjs.js} +2 -2
- package/dist/{fixture-dff65c89.cjs.js.map → fixture-5b79f853.cjs.js.map} +1 -1
- package/dist/{fixture-dff65c89.cjs.js → fixture-73855806.cjs.js} +2 -2
- package/dist/{fixture-d1470b58.cjs.js.map → fixture-73855806.cjs.js.map} +1 -1
- package/dist/fixture-90b199c4.esm.js +569 -0
- package/dist/{fixture-985bba12.esm.js → fixture-9871e8a9.esm.js} +1 -1
- package/dist/fixture-c1d78368.cjs.js +395 -0
- package/dist/fixture-c1d78368.cjs.js.map +1 -0
- package/dist/fixture-cf7bfcf5.esm.js +569 -0
- package/dist/fixture-dbd66009.cjs.js +395 -0
- package/dist/fixture-dbd66009.cjs.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
- package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.esm.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.esm.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
- package/dist/nile-card/nile-card.test.cjs.js +1 -1
- package/dist/nile-card/nile-card.test.esm.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-code-editor/backup_nile-code-editor copy.cjs.js +2 -0
- package/dist/nile-code-editor/backup_nile-code-editor copy.cjs.js.map +1 -0
- package/dist/nile-code-editor/backup_nile-code-editor copy.esm.js +1 -0
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.test.cjs.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.test.esm.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.test.esm.js +1 -1
- package/dist/nile-filter-chip/nile-filter-chip.test.cjs.js +1 -1
- package/dist/nile-filter-chip/nile-filter-chip.test.esm.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
- package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.test.esm.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.esm.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.esm.js +1 -1
- package/dist/nile-link/nile-link.test.cjs.js +1 -1
- package/dist/nile-link/nile-link.test.esm.js +1 -1
- package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
- package/dist/nile-loader/nile-loader.test.esm.js +1 -1
- package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.test.esm.js +1 -1
- package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
- package/dist/nile-popup/nile-popup.test.esm.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
- package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
- package/dist/nile-radio/nile-radio.test.esm.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.esm.js +1 -1
- package/dist/nile-sidebar/index.cjs.js +2 -0
- package/dist/nile-sidebar/index.cjs.js.map +1 -0
- package/dist/nile-sidebar/index.esm.js +75 -0
- package/dist/nile-sidebar-menu/index.cjs.js +2 -0
- package/dist/nile-sidebar-menu/index.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu/index.esm.js +1 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.cjs.js +2 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.css.cjs.js +2 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.css.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.css.esm.js +38 -0
- package/dist/nile-sidebar-menu/nile-sidebar-menu.esm.js +10 -0
- package/dist/nile-sidebar-menu-items/index.cjs.js +2 -0
- package/dist/nile-sidebar-menu-items/index.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu-items/index.esm.js +1 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.cjs.js +2 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.cjs.js +2 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.cjs.js.map +1 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.css.esm.js +36 -0
- package/dist/nile-sidebar-menu-items/nile-sidebar-menu-items.esm.js +15 -0
- package/dist/nile-sidebar-wrapper/index.cjs.js +2 -0
- package/dist/nile-sidebar-wrapper/index.cjs.js.map +1 -0
- package/dist/nile-sidebar-wrapper/index.esm.js +1 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.cjs.js +2 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.cjs.js.map +1 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.cjs.js +2 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.cjs.js.map +1 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.css.esm.js +105 -0
- package/dist/nile-sidebar-wrapper/nile-sidebar-wrapper.esm.js +16 -0
- package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
- package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
- package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
- package/dist/nile-virtual-select/group-manager.cjs.js +2 -0
- package/dist/nile-virtual-select/group-manager.cjs.js.map +1 -0
- package/dist/nile-virtual-select/group-manager.esm.js +1 -0
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.esm.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.test.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.test.esm.js +1 -1
- package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js +2 -0
- package/dist/nile-virtual-select/temp_nile-virtual-select copy.cjs.js.map +1 -0
- package/dist/nile-virtual-select/temp_nile-virtual-select copy.esm.js +231 -0
- package/dist/scopedElementsWrapper-4c29be11.esm.js +7 -0
- package/dist/scopedElementsWrapper-a112fc73.cjs.js +6 -0
- package/dist/scopedElementsWrapper-a112fc73.cjs.js.map +1 -0
- package/dist/src/internal/portal-manager.d.ts +53 -0
- package/dist/src/internal/portal-manager.js +196 -0
- package/dist/src/internal/portal-manager.js.map +1 -0
- package/dist/src/internal/portal.d.ts +60 -0
- package/dist/src/internal/portal.js +199 -0
- package/dist/src/internal/portal.js.map +1 -0
- package/dist/src/internal/resizable-helper.d.ts +59 -0
- package/dist/src/internal/resizable-helper.js +115 -0
- package/dist/src/internal/resizable-helper.js.map +1 -0
- package/dist/src/internal/resizable-styles.d.ts +16 -0
- package/dist/src/internal/resizable-styles.js +144 -0
- package/dist/src/internal/resizable-styles.js.map +1 -0
- package/dist/src/internal/virtualizer-error-handler.d.ts +30 -0
- package/dist/src/internal/virtualizer-error-handler.js +82 -0
- package/dist/src/internal/virtualizer-error-handler.js.map +1 -0
- package/dist/src/lib/index.d.ts +7 -0
- package/dist/src/lib/index.js +8 -0
- package/dist/src/lib/index.js.map +1 -0
- package/dist/src/lib/virtualize.d.ts +32 -0
- package/dist/src/lib/virtualize.js +105 -0
- package/dist/src/lib/virtualize.js.map +1 -0
- package/dist/src/lib/virtualize.test.d.ts +7 -0
- package/dist/src/lib/virtualize.test.js +57 -0
- package/dist/src/lib/virtualize.test.js.map +1 -0
- package/dist/src/nile-badge/__snapshots__/nile-badge.test.snap.js +17 -0
- package/dist/src/nile-calendar/__snapshots__/nile-calendar.test.snap.js +310 -0
- package/dist/src/nile-card/__snapshots__/nile-card.test.snap.js +34 -0
- package/dist/src/nile-checkbox/__snapshots__/nile-checkbox.test.snap.js +31 -0
- package/dist/src/nile-code-editor/Old_theme copy.d.ts +191 -0
- package/dist/src/nile-code-editor/Old_theme copy.js +193 -0
- package/dist/src/nile-code-editor/Old_theme copy.js.map +1 -0
- package/dist/src/nile-code-editor/backup_nile-code-editor copy.d.ts +0 -0
- package/dist/src/nile-code-editor/backup_nile-code-editor copy.js +675 -0
- package/dist/src/nile-code-editor/backup_nile-code-editor copy.js.map +1 -0
- package/dist/src/nile-code-editor/theme copy.d.ts +191 -0
- package/dist/src/nile-code-editor/theme copy.js +193 -0
- package/dist/src/nile-code-editor/theme copy.js.map +1 -0
- package/dist/src/nile-grid/data-processor.d.ts +37 -0
- package/dist/src/nile-grid/data-processor.js +122 -0
- package/dist/src/nile-grid/data-processor.js.map +1 -0
- package/dist/src/nile-grid/event-handlers.d.ts +35 -0
- package/dist/src/nile-grid/event-handlers.js +158 -0
- package/dist/src/nile-grid/event-handlers.js.map +1 -0
- package/dist/src/nile-grid/renderer.d.ts +8 -0
- package/dist/src/nile-grid/renderer.js +78 -0
- package/dist/src/nile-grid/renderer.js.map +1 -0
- package/dist/src/nile-grid/resize-handler.d.ts +4 -0
- package/dist/src/nile-grid/resize-handler.js +36 -0
- package/dist/src/nile-grid/resize-handler.js.map +1 -0
- package/dist/src/nile-grid/types.d.ts +32 -0
- package/dist/src/nile-grid/types.js +2 -0
- package/dist/src/nile-grid/types.js.map +1 -0
- package/dist/src/nile-grid/utils.d.ts +4 -0
- package/dist/src/nile-grid/utils.js +32 -0
- package/dist/src/nile-grid/utils.js.map +1 -0
- package/dist/src/nile-hero/__snapshots__/nile-hero.test.snap.js +47 -0
- package/dist/src/nile-icon/__snapshots__/nile-icon.test.snap.js +16 -0
- package/dist/src/nile-input/__snapshots__/nile-input.test.snap.js +75 -0
- package/dist/src/nile-popover/__snapshots__/nile-popover.test.snap.js +22 -0
- package/dist/src/nile-popover/popover-portal-handler.d.ts +21 -0
- package/dist/src/nile-popover/popover-portal-handler.js +106 -0
- package/dist/src/nile-popover/popover-portal-handler.js.map +1 -0
- package/dist/src/nile-popover/portal-manager.d.ts +51 -0
- package/dist/src/nile-popover/portal-manager.js +421 -0
- package/dist/src/nile-popover/portal-manager.js.map +1 -0
- package/dist/src/nile-popover/portal-utils.d.ts +55 -0
- package/dist/src/nile-popover/portal-utils.js +322 -0
- package/dist/src/nile-popover/portal-utils.js.map +1 -0
- package/dist/src/nile-portal-wrapper/index.d.ts +1 -0
- package/dist/src/nile-portal-wrapper/index.js +2 -0
- package/dist/src/nile-portal-wrapper/index.js.map +1 -0
- package/dist/src/nile-portal-wrapper/nile-portal-wrapper.d.ts +47 -0
- package/dist/src/nile-portal-wrapper/nile-portal-wrapper.js +451 -0
- package/dist/src/nile-portal-wrapper/nile-portal-wrapper.js.map +1 -0
- package/dist/src/nile-rich-text-editor/utils.d.ts +13 -0
- package/dist/src/nile-rich-text-editor/utils.js +537 -1
- package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
- package/dist/src/nile-select/body-append-manager.d.ts +90 -0
- package/dist/src/nile-select/body-append-manager.js +298 -0
- package/dist/src/nile-select/body-append-manager.js.map +1 -0
- package/dist/src/nile-table-body/virtual-scroll-helper.d.ts +9 -0
- package/dist/src/nile-table-body/virtual-scroll-helper.js +24 -0
- package/dist/src/nile-table-body/virtual-scroll-helper.js.map +1 -0
- package/dist/src/nile-virtual-select/body-append-helper.d.ts +16 -0
- package/dist/src/nile-virtual-select/body-append-helper.js +95 -0
- package/dist/src/nile-virtual-select/body-append-helper.js.map +1 -0
- package/dist/src/nile-virtual-select/group-manager.d.ts +32 -0
- package/dist/src/nile-virtual-select/group-manager.js +134 -0
- package/dist/src/nile-virtual-select/group-manager.js.map +1 -0
- package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +0 -1
- package/dist/src/nile-virtual-select/nile-virtual-select.js +5 -11
- package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
- package/dist/src/nile-virtual-select/portal-utils.d.ts +65 -0
- package/dist/src/nile-virtual-select/portal-utils.js +376 -0
- package/dist/src/nile-virtual-select/portal-utils.js.map +1 -0
- package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.d.ts +273 -0
- package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js +1305 -0
- package/dist/src/nile-virtual-select/temp_nile-virtual-select copy.js.map +1 -0
- package/dist/src/nile-virtual-select/virtualizer-error-handler.d.ts +21 -0
- package/dist/src/nile-virtual-select/virtualizer-error-handler.js +56 -0
- package/dist/src/nile-virtual-select/virtualizer-error-handler.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/index.d.ts +1 -0
- package/dist/src/nile-virtual-select-disabled/index.js +2 -0
- package/dist/src/nile-virtual-select-disabled/index.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.d.ts +12 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.js +538 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.css.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.d.ts +299 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.js +1441 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.d.ts +7 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.js +631 -0
- package/dist/src/nile-virtual-select-disabled/nile-virtual-select.test.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/portal-manager.d.ts +45 -0
- package/dist/src/nile-virtual-select-disabled/portal-manager.js +333 -0
- package/dist/src/nile-virtual-select-disabled/portal-manager.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/renderer.d.ts +16 -0
- package/dist/src/nile-virtual-select-disabled/renderer.js +79 -0
- package/dist/src/nile-virtual-select-disabled/renderer.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/search-manager.d.ts +12 -0
- package/dist/src/nile-virtual-select-disabled/search-manager.js +40 -0
- package/dist/src/nile-virtual-select-disabled/search-manager.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/selection-manager.d.ts +12 -0
- package/dist/src/nile-virtual-select-disabled/selection-manager.js +64 -0
- package/dist/src/nile-virtual-select-disabled/selection-manager.js.map +1 -0
- package/dist/src/nile-virtual-select-disabled/types.d.ts +50 -0
- package/dist/src/nile-virtual-select-disabled/types.js +8 -0
- package/dist/src/nile-virtual-select-disabled/types.js.map +1 -0
- package/dist/src/nile-virtual-table-body/index.d.ts +2 -0
- package/dist/src/nile-virtual-table-body/index.js +3 -0
- package/dist/src/nile-virtual-table-body/index.js.map +1 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.d.ts +1 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js +44 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.css.js.map +1 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.d.ts +50 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js +135 -0
- package/dist/src/nile-virtual-table-body/nile-virtual-table-body.js.map +1 -0
- package/dist/src/nile-virtual-table-body/renderer.d.ts +16 -0
- package/dist/src/nile-virtual-table-body/renderer.js +49 -0
- package/dist/src/nile-virtual-table-body/renderer.js.map +1 -0
- package/dist/src/utilities/stepper-utils.d.ts +71 -0
- package/dist/src/utilities/stepper-utils.js +108 -0
- package/dist/src/utilities/stepper-utils.js.map +1 -0
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- 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 @@
|
|
|
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
|
+
}
|