@pine-ds/core 4.7.2 → 4.9.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/components/attributes.js +1 -1
- package/components/floating-ui.dom.js +1 -1
- package/components/index.js +1 -1
- package/components/index2.js +1 -1
- package/components/keep-hydrated.js +1 -0
- package/components/mock-pds-modal.js +1 -1
- package/components/pds-alert.js +1 -1
- package/components/pds-avatar.js +1 -1
- package/components/pds-box2.js +1 -1
- package/components/pds-button2.js +1 -1
- package/components/pds-checkbox2.js +1 -1
- package/components/pds-chip2.js +1 -1
- package/components/pds-combobox.js +1 -1
- package/components/pds-container.js +1 -1
- package/components/pds-copytext.js +1 -1
- package/components/pds-datepicker.js +1 -1
- package/components/pds-divider.js +1 -1
- package/components/pds-drawer-content.js +1 -1
- package/components/pds-drawer-footer.js +1 -1
- package/components/pds-drawer-header.js +1 -1
- package/components/pds-drawer.js +1 -1
- package/components/pds-dropdown-menu-item.js +1 -1
- package/components/pds-dropdown-menu-separator.js +1 -1
- package/components/pds-dropdown-menu.js +1 -1
- package/components/pds-filter.js +1 -1
- package/components/pds-filters.js +1 -1
- package/components/pds-image.js +1 -1
- package/components/pds-input2.js +1 -1
- package/components/pds-link2.js +1 -1
- package/components/pds-loader2.js +1 -1
- package/components/pds-modal-content.js +1 -1
- package/components/pds-modal-footer.js +1 -1
- package/components/pds-modal-header.js +1 -1
- package/components/pds-modal2.js +1 -1
- package/components/pds-multiselect.js +1 -1
- package/components/pds-popover.js +1 -1
- package/components/pds-progress.js +1 -1
- package/components/pds-property.js +1 -1
- package/components/pds-radio-group.js +1 -1
- package/components/pds-radio.js +1 -1
- package/components/pds-row.js +1 -1
- package/components/pds-select.js +1 -1
- package/components/pds-sortable-item.js +1 -1
- package/components/pds-sortable.js +2 -2
- package/components/pds-switch.js +1 -1
- package/components/pds-table-body.js +1 -1
- package/components/pds-table-cell2.js +1 -1
- package/components/pds-table-head-cell2.js +1 -1
- package/components/pds-table-head.js +1 -1
- package/components/pds-table-row.js +1 -1
- package/components/pds-tabpanel.js +1 -1
- package/components/pds-tabs.js +1 -1
- package/components/pds-text2.js +1 -1
- package/components/pds-textarea.js +1 -1
- package/components/pds-toast.js +1 -1
- package/components/pds-tooltip.js +1 -1
- package/components/tabbable.js +1 -0
- package/components/truncation-tooltip.js +1 -1
- package/dist/cjs/{attributes-BJ7KBHql.js → attributes-CW49XqaL.js} +1 -1
- package/dist/cjs/{floating-ui.dom-Dc8Anyel.js → floating-ui.dom-Dw41zbyY.js} +1 -0
- package/dist/cjs/{index-jl_Q819j.js → index-BsWY_xEJ.js} +1 -1
- package/dist/cjs/{index-5Azb8EQG.js → index-Do70atou.js} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/{keep-hydrated-CiXgkEYd.js → keep-hydrated-AKoh0DG4.js} +1 -0
- package/dist/cjs/loader.cjs.js +3 -3
- package/dist/cjs/mock-pds-modal.cjs.entry.js +3 -3
- package/dist/cjs/pds-accordion.cjs.entry.js +3 -3
- package/dist/cjs/pds-alert.cjs.entry.js +17 -4
- package/dist/cjs/pds-avatar.cjs.entry.js +23 -13
- package/dist/cjs/pds-box.cjs.entry.js +4 -4
- package/dist/cjs/pds-button.cjs.entry.js +80 -45
- package/dist/cjs/pds-checkbox.cjs.entry.js +16 -8
- package/dist/cjs/pds-chip.cjs.entry.js +8 -8
- package/dist/cjs/pds-combobox.cjs.entry.js +43 -13
- package/dist/cjs/pds-container.cjs.entry.js +3 -3
- package/dist/cjs/pds-copytext.cjs.entry.js +7 -7
- package/dist/cjs/pds-datepicker.cjs.entry.js +6 -6
- package/dist/cjs/pds-divider.cjs.entry.js +3 -3
- package/dist/cjs/pds-drawer-content.cjs.entry.js +3 -3
- package/dist/cjs/pds-drawer-footer.cjs.entry.js +3 -3
- package/dist/cjs/pds-drawer-header.cjs.entry.js +3 -3
- package/dist/cjs/pds-drawer.cjs.entry.js +4 -4
- package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +34 -5
- package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +3 -3
- package/dist/cjs/pds-dropdown-menu.cjs.entry.js +8 -8
- package/dist/cjs/pds-filter.cjs.entry.js +4 -4
- package/dist/cjs/pds-filters.cjs.entry.js +3 -3
- package/dist/cjs/pds-icon.cjs.entry.js +2 -2
- package/dist/cjs/pds-image.cjs.entry.js +4 -4
- package/dist/cjs/pds-input.cjs.entry.js +6 -6
- package/dist/cjs/pds-link.cjs.entry.js +15 -6
- package/dist/cjs/pds-loader.cjs.entry.js +4 -4
- package/dist/cjs/pds-modal-content.cjs.entry.js +34 -32
- package/dist/cjs/pds-modal-footer.cjs.entry.js +3 -3
- package/dist/cjs/pds-modal-header.cjs.entry.js +3 -3
- package/dist/cjs/pds-modal.cjs.entry.js +9 -89
- package/dist/cjs/pds-multiselect.cjs.entry.js +9 -9
- package/dist/cjs/pds-popover.cjs.entry.js +416 -163
- package/dist/cjs/pds-progress.cjs.entry.js +4 -4
- package/dist/cjs/pds-property.cjs.entry.js +3 -3
- package/dist/cjs/pds-radio-group.cjs.entry.js +6 -6
- package/dist/cjs/pds-radio.cjs.entry.js +24 -11
- package/dist/cjs/pds-row.cjs.entry.js +4 -4
- package/dist/cjs/pds-select.cjs.entry.js +132 -21
- package/dist/cjs/pds-sortable-item.cjs.entry.js +5 -5
- package/dist/cjs/pds-sortable.cjs.entry.js +4 -4
- package/dist/cjs/pds-switch.cjs.entry.js +7 -7
- package/dist/cjs/pds-tab.cjs.entry.js +3 -3
- package/dist/cjs/pds-table-body.cjs.entry.js +3 -3
- package/dist/cjs/pds-table-cell.cjs.entry.js +6 -6
- package/dist/cjs/pds-table-head-cell.cjs.entry.js +5 -5
- package/dist/cjs/pds-table-head.cjs.entry.js +3 -3
- package/dist/cjs/pds-table-row.cjs.entry.js +3 -3
- package/dist/cjs/pds-table.cjs.entry.js +2 -2
- package/dist/cjs/pds-tabpanel.cjs.entry.js +4 -4
- package/dist/cjs/pds-tabs.cjs.entry.js +4 -4
- package/dist/cjs/pds-text.cjs.entry.js +5 -5
- package/dist/cjs/pds-textarea.cjs.entry.js +8 -8
- package/dist/cjs/pds-toast.cjs.entry.js +14 -8
- package/dist/cjs/pds-tooltip.cjs.entry.js +115 -44
- package/dist/cjs/pine-core.cjs.js +3 -3
- package/dist/cjs/tabbable-CddSt_Hi.js +85 -0
- package/dist/cjs/{truncation-tooltip-DO9xli2e.js → truncation-tooltip-O5nQmXPw.js} +32 -7
- package/dist/collection/components/pds-alert/pds-alert.css +13 -0
- package/dist/collection/components/pds-alert/pds-alert.js +36 -1
- package/dist/collection/components/pds-alert/stories/pds-alert.stories.js +4 -0
- package/dist/collection/components/pds-avatar/pds-avatar.js +42 -10
- package/dist/collection/components/pds-avatar/stories/pds-avatar.stories.js +2 -0
- package/dist/collection/components/pds-box/pds-box.js +1 -1
- package/dist/collection/components/pds-button/pds-button.js +36 -44
- package/dist/collection/components/pds-button/stories/pds-button.stories.js +3 -3
- package/dist/collection/components/pds-checkbox/pds-checkbox.css +79 -0
- package/dist/collection/components/pds-checkbox/pds-checkbox.js +36 -5
- package/dist/collection/components/pds-checkbox/stories/pds-checkbox.stories.js +38 -0
- package/dist/collection/components/pds-chip/pds-chip.js +2 -2
- package/dist/collection/components/pds-combobox/pds-combobox.css +33 -0
- package/dist/collection/components/pds-combobox/pds-combobox.js +62 -9
- package/dist/collection/components/pds-combobox/stories/pds-combobox.stories.js +44 -0
- package/dist/collection/components/pds-container/pds-container.js +1 -1
- package/dist/collection/components/pds-copytext/pds-copytext.js +1 -1
- package/dist/collection/components/pds-datepicker/pds-datepicker.js +2 -2
- package/dist/collection/components/pds-datepicker/stories/pds-datepicker.stories.js +1 -1
- package/dist/collection/components/pds-divider/pds-divider.js +1 -1
- package/dist/collection/components/pds-drawer/pds-drawer-content/pds-drawer-content.js +1 -1
- package/dist/collection/components/pds-drawer/pds-drawer-footer/pds-drawer-footer.js +1 -1
- package/dist/collection/components/pds-drawer/pds-drawer-header/pds-drawer-header.js +1 -1
- package/dist/collection/components/pds-drawer/pds-drawer.js +2 -2
- package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.css +8 -0
- package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.js +81 -7
- package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-separator/pds-dropdown-menu-separator.js +1 -1
- package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +4 -4
- package/dist/collection/components/pds-dropdown-menu/stories/pds-dropdown-menu.stories.js +39 -0
- package/dist/collection/components/pds-filters/pds-filter/pds-filter.js +1 -1
- package/dist/collection/components/pds-filters/pds-filters.js +1 -1
- package/dist/collection/components/pds-image/pds-image.js +2 -2
- package/dist/collection/components/pds-input/pds-input.js +2 -2
- package/dist/collection/components/pds-input/stories/pds-input.stories.js +6 -6
- package/dist/collection/components/pds-link/pds-link.js +34 -3
- package/dist/collection/components/pds-link/stories/pds-link.stories.js +3 -2
- package/dist/collection/components/pds-loader/pds-loader.js +1 -1
- package/dist/collection/components/pds-modal/pds-modal-content/pds-modal-content.js +32 -30
- package/dist/collection/components/pds-modal/pds-modal-footer/pds-modal-footer.js +1 -1
- package/dist/collection/components/pds-modal/pds-modal-header/pds-modal-header.js +1 -1
- package/dist/collection/components/pds-modal/pds-modal.js +5 -85
- package/dist/collection/components/pds-modal/test/mock-pds-modal.js +1 -1
- package/dist/collection/components/pds-multiselect/pds-multiselect.js +5 -5
- package/dist/collection/components/pds-popover/pds-popover.css +6 -0
- package/dist/collection/components/pds-popover/pds-popover.js +465 -159
- package/dist/collection/components/pds-popover/stories/pds-popover.stories.js +31 -0
- package/dist/collection/components/pds-progress/pds-progress.js +1 -1
- package/dist/collection/components/pds-property/pds-property.js +1 -1
- package/dist/collection/components/pds-radio/pds-radio.css +57 -0
- package/dist/collection/components/pds-radio/pds-radio.js +45 -9
- package/dist/collection/components/pds-radio/stories/pds-radio.stories.js +15 -0
- package/dist/collection/components/pds-radio-group/pds-radio-group.js +3 -3
- package/dist/collection/components/pds-radio-group/stories/pds-radio-group.stories.js +45 -0
- package/dist/collection/components/pds-row/pds-row.js +1 -1
- package/dist/collection/components/pds-select/pds-select.js +128 -17
- package/dist/collection/components/pds-select/stories/pds-select.stories.js +2 -2
- package/dist/collection/components/pds-sortable/pds-sortable-item/pds-sortable-item.js +1 -1
- package/dist/collection/components/pds-sortable/pds-sortable.js +1 -1
- package/dist/collection/components/pds-switch/pds-switch.js +3 -3
- package/dist/collection/components/pds-table/pds-table-body/pds-table-body.js +1 -1
- package/dist/collection/components/pds-table/pds-table-cell/pds-table-cell.js +2 -2
- package/dist/collection/components/pds-table/pds-table-head/pds-table-head.js +1 -1
- package/dist/collection/components/pds-table/pds-table-head-cell/pds-table-head-cell.js +2 -2
- package/dist/collection/components/pds-table/pds-table-row/pds-table-row.js +1 -1
- package/dist/collection/components/pds-table/stories/pds-table.stories.js +4 -4
- package/dist/collection/components/pds-tabs/pds-tabpanel/pds-tabpanel.js +1 -1
- package/dist/collection/components/pds-tabs/pds-tabs.js +1 -1
- package/dist/collection/components/pds-text/pds-text.js +1 -1
- package/dist/collection/components/pds-text/stories/pds-text.stories.js +1 -1
- package/dist/collection/components/pds-textarea/pds-textarea.js +4 -4
- package/dist/collection/components/pds-textarea/stories/pds-textarea.stories.js +2 -2
- package/dist/collection/components/pds-toast/pds-toast.css +13 -0
- package/dist/collection/components/pds-toast/pds-toast.js +33 -5
- package/dist/collection/components/pds-toast/stories/pds-toast.stories.js +4 -1
- package/dist/collection/components/pds-tooltip/pds-tooltip.js +113 -41
- package/dist/collection/utils/aria-references.js +42 -0
- package/dist/collection/utils/tabbable.js +81 -0
- package/dist/collection/utils/truncation-tooltip.js +31 -6
- package/dist/docs.json +367 -13
- package/dist/esm/{attributes-WXw_I_uJ.js → attributes-DkeVeN0g.js} +1 -1
- package/dist/esm/{floating-ui.dom-BPqJgIq6.js → floating-ui.dom-Cuc0DYlm.js} +1 -1
- package/dist/esm/{index-Cw9J31qd.js → index-BFSwd-GQ.js} +1 -1
- package/dist/esm/{index-BJXk71tO.js → index-m3pqpeWg.js} +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/{keep-hydrated-BLG6RDBt.js → keep-hydrated-BgNaWLoS.js} +1 -1
- package/dist/esm/loader.js +4 -4
- package/dist/esm/mock-pds-modal.entry.js +3 -3
- package/dist/esm/pds-accordion.entry.js +3 -3
- package/dist/esm/pds-alert.entry.js +17 -4
- package/dist/esm/pds-avatar.entry.js +23 -13
- package/dist/esm/pds-box.entry.js +4 -4
- package/dist/esm/pds-button.entry.js +80 -45
- package/dist/esm/pds-checkbox.entry.js +16 -8
- package/dist/esm/pds-chip.entry.js +8 -8
- package/dist/esm/pds-combobox.entry.js +43 -13
- package/dist/esm/pds-container.entry.js +3 -3
- package/dist/esm/pds-copytext.entry.js +7 -7
- package/dist/esm/pds-datepicker.entry.js +6 -6
- package/dist/esm/pds-divider.entry.js +3 -3
- package/dist/esm/pds-drawer-content.entry.js +3 -3
- package/dist/esm/pds-drawer-footer.entry.js +3 -3
- package/dist/esm/pds-drawer-header.entry.js +3 -3
- package/dist/esm/pds-drawer.entry.js +4 -4
- package/dist/esm/pds-dropdown-menu-item.entry.js +34 -5
- package/dist/esm/pds-dropdown-menu-separator.entry.js +3 -3
- package/dist/esm/pds-dropdown-menu.entry.js +8 -8
- package/dist/esm/pds-filter.entry.js +4 -4
- package/dist/esm/pds-filters.entry.js +3 -3
- package/dist/esm/pds-icon.entry.js +2 -2
- package/dist/esm/pds-image.entry.js +4 -4
- package/dist/esm/pds-input.entry.js +6 -6
- package/dist/esm/pds-link.entry.js +15 -6
- package/dist/esm/pds-loader.entry.js +4 -4
- package/dist/esm/pds-modal-content.entry.js +34 -32
- package/dist/esm/pds-modal-footer.entry.js +3 -3
- package/dist/esm/pds-modal-header.entry.js +3 -3
- package/dist/esm/pds-modal.entry.js +7 -87
- package/dist/esm/pds-multiselect.entry.js +9 -9
- package/dist/esm/pds-popover.entry.js +416 -163
- package/dist/esm/pds-progress.entry.js +4 -4
- package/dist/esm/pds-property.entry.js +3 -3
- package/dist/esm/pds-radio-group.entry.js +6 -6
- package/dist/esm/pds-radio.entry.js +24 -11
- package/dist/esm/pds-row.entry.js +4 -4
- package/dist/esm/pds-select.entry.js +132 -21
- package/dist/esm/pds-sortable-item.entry.js +5 -5
- package/dist/esm/pds-sortable.entry.js +4 -4
- package/dist/esm/pds-switch.entry.js +7 -7
- package/dist/esm/pds-tab.entry.js +3 -3
- package/dist/esm/pds-table-body.entry.js +3 -3
- package/dist/esm/pds-table-cell.entry.js +6 -6
- package/dist/esm/pds-table-head-cell.entry.js +5 -5
- package/dist/esm/pds-table-head.entry.js +3 -3
- package/dist/esm/pds-table-row.entry.js +3 -3
- package/dist/esm/pds-table.entry.js +2 -2
- package/dist/esm/pds-tabpanel.entry.js +4 -4
- package/dist/esm/pds-tabs.entry.js +4 -4
- package/dist/esm/pds-text.entry.js +5 -5
- package/dist/esm/pds-textarea.entry.js +8 -8
- package/dist/esm/pds-toast.entry.js +14 -8
- package/dist/esm/pds-tooltip.entry.js +115 -44
- package/dist/esm/pine-core.js +4 -4
- package/dist/esm/tabbable-DCKBKRUy.js +83 -0
- package/dist/esm/{truncation-tooltip-DRXsdKk1.js → truncation-tooltip-D_gvhB9r.js} +32 -7
- package/dist/esm-es5/{attributes-WXw_I_uJ.js → attributes-DkeVeN0g.js} +1 -1
- package/dist/esm-es5/{floating-ui.dom-BPqJgIq6.js → floating-ui.dom-Cuc0DYlm.js} +1 -1
- package/dist/esm-es5/{index-Cw9J31qd.js → index-BFSwd-GQ.js} +2 -2
- package/dist/esm-es5/{index-BJXk71tO.js → index-m3pqpeWg.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/{keep-hydrated-BLG6RDBt.js → keep-hydrated-BgNaWLoS.js} +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/mock-pds-modal.entry.js +1 -1
- package/dist/esm-es5/pds-accordion.entry.js +1 -1
- package/dist/esm-es5/pds-alert.entry.js +1 -1
- package/dist/esm-es5/pds-avatar.entry.js +1 -1
- package/dist/esm-es5/pds-box.entry.js +1 -1
- package/dist/esm-es5/pds-button.entry.js +1 -1
- package/dist/esm-es5/pds-checkbox.entry.js +1 -1
- package/dist/esm-es5/pds-chip.entry.js +1 -1
- package/dist/esm-es5/pds-combobox.entry.js +2 -2
- package/dist/esm-es5/pds-container.entry.js +1 -1
- package/dist/esm-es5/pds-copytext.entry.js +1 -1
- package/dist/esm-es5/pds-datepicker.entry.js +1 -1
- package/dist/esm-es5/pds-divider.entry.js +1 -1
- package/dist/esm-es5/pds-drawer-content.entry.js +1 -1
- package/dist/esm-es5/pds-drawer-footer.entry.js +1 -1
- package/dist/esm-es5/pds-drawer-header.entry.js +1 -1
- package/dist/esm-es5/pds-drawer.entry.js +1 -1
- package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
- package/dist/esm-es5/pds-dropdown-menu-separator.entry.js +1 -1
- package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
- package/dist/esm-es5/pds-filter.entry.js +1 -1
- package/dist/esm-es5/pds-filters.entry.js +1 -1
- package/dist/esm-es5/pds-icon.entry.js +1 -1
- package/dist/esm-es5/pds-image.entry.js +1 -1
- package/dist/esm-es5/pds-input.entry.js +1 -1
- package/dist/esm-es5/pds-link.entry.js +1 -1
- package/dist/esm-es5/pds-loader.entry.js +1 -1
- package/dist/esm-es5/pds-modal-content.entry.js +1 -1
- package/dist/esm-es5/pds-modal-footer.entry.js +1 -1
- package/dist/esm-es5/pds-modal-header.entry.js +1 -1
- package/dist/esm-es5/pds-modal.entry.js +1 -1
- package/dist/esm-es5/pds-multiselect.entry.js +1 -1
- package/dist/esm-es5/pds-popover.entry.js +1 -1
- package/dist/esm-es5/pds-progress.entry.js +1 -1
- package/dist/esm-es5/pds-property.entry.js +1 -1
- package/dist/esm-es5/pds-radio-group.entry.js +1 -1
- package/dist/esm-es5/pds-radio.entry.js +1 -1
- package/dist/esm-es5/pds-row.entry.js +1 -1
- package/dist/esm-es5/pds-select.entry.js +1 -1
- package/dist/esm-es5/pds-sortable-item.entry.js +1 -1
- package/dist/esm-es5/pds-sortable.entry.js +2 -2
- package/dist/esm-es5/pds-switch.entry.js +1 -1
- package/dist/esm-es5/pds-tab.entry.js +1 -1
- package/dist/esm-es5/pds-table-body.entry.js +1 -1
- package/dist/esm-es5/pds-table-cell.entry.js +1 -1
- package/dist/esm-es5/pds-table-head-cell.entry.js +1 -1
- package/dist/esm-es5/pds-table-head.entry.js +1 -1
- package/dist/esm-es5/pds-table-row.entry.js +1 -1
- package/dist/esm-es5/pds-table.entry.js +1 -1
- package/dist/esm-es5/pds-tabpanel.entry.js +1 -1
- package/dist/esm-es5/pds-tabs.entry.js +1 -1
- package/dist/esm-es5/pds-text.entry.js +1 -1
- package/dist/esm-es5/pds-textarea.entry.js +1 -1
- package/dist/esm-es5/pds-toast.entry.js +1 -1
- package/dist/esm-es5/pds-tooltip.entry.js +1 -1
- package/dist/esm-es5/pine-core.js +1 -1
- package/dist/esm-es5/tabbable-DCKBKRUy.js +1 -0
- package/dist/esm-es5/truncation-tooltip-D_gvhB9r.js +1 -0
- package/dist/pine-core/index.esm.js +1 -1
- package/dist/pine-core/p-001d4b86.entry.js +1 -0
- package/dist/pine-core/p-06279b93.system.entry.js +1 -0
- package/dist/pine-core/{p-b75b0d09.system.entry.js → p-0790dd0d.system.entry.js} +1 -1
- package/dist/pine-core/p-079c39d1.entry.js +1 -0
- package/dist/pine-core/p-07b4524e.entry.js +1 -0
- package/dist/pine-core/{p-b60ac7eb.system.entry.js → p-08bbd3e6.system.entry.js} +1 -1
- package/dist/pine-core/{p-c5c9ed36.system.entry.js → p-0bd61097.system.entry.js} +1 -1
- package/dist/pine-core/p-0c60f577.system.entry.js +1 -0
- package/dist/pine-core/{p-6d603d16.system.entry.js → p-110b4051.system.entry.js} +1 -1
- package/dist/pine-core/p-11e7d660.entry.js +1 -0
- package/dist/pine-core/p-14d872d3.entry.js +1 -0
- package/dist/pine-core/p-17fc76e7.system.entry.js +1 -0
- package/dist/pine-core/{p-0913f696.system.entry.js → p-1e5648bf.system.entry.js} +1 -1
- package/dist/pine-core/{p-e803f629.system.entry.js → p-22ae92f7.system.entry.js} +1 -1
- package/dist/pine-core/p-239774c9.entry.js +1 -0
- package/dist/pine-core/{p-0b71ecb6.system.entry.js → p-25bf2f26.system.entry.js} +2 -2
- package/dist/pine-core/{p-e7a95a49.system.entry.js → p-272b24ad.system.entry.js} +1 -1
- package/dist/pine-core/{p-d2c91e7a.entry.js → p-2c0047cd.entry.js} +1 -1
- package/dist/pine-core/p-2d5b1deb.entry.js +1 -0
- package/dist/pine-core/{p-e8cb76e8.entry.js → p-3556f6ad.entry.js} +1 -1
- package/dist/pine-core/{p-BGLP3keB.js → p-35s7h-dk.js} +1 -1
- package/dist/pine-core/{p-080cb087.system.entry.js → p-38b87aa2.system.entry.js} +1 -1
- package/dist/pine-core/{p-355e4cf9.entry.js → p-3afb1208.entry.js} +1 -1
- package/dist/pine-core/p-3b5b8f73.entry.js +1 -0
- package/dist/pine-core/{p-8c8cc079.system.entry.js → p-3cc19ea8.system.entry.js} +1 -1
- package/dist/pine-core/{p-bd67156b.system.entry.js → p-3ce7e72e.system.entry.js} +1 -1
- package/dist/pine-core/p-3f62581a.system.entry.js +1 -0
- package/dist/pine-core/p-414faecf.entry.js +1 -0
- package/dist/pine-core/p-463a29fa.entry.js +1 -0
- package/dist/pine-core/{p-f029b7da.system.entry.js → p-4ee44585.system.entry.js} +1 -1
- package/dist/pine-core/p-50af67ea.system.entry.js +1 -0
- package/dist/pine-core/p-5133e8be.system.entry.js +1 -0
- package/dist/pine-core/p-55fce29e.entry.js +1 -0
- package/dist/pine-core/{p-77395d62.system.entry.js → p-568a9a79.system.entry.js} +1 -1
- package/dist/pine-core/p-5967d9fa.system.entry.js +1 -0
- package/dist/pine-core/{p-5870b092.system.entry.js → p-5c46553f.system.entry.js} +1 -1
- package/dist/pine-core/{p-f0d24298.system.entry.js → p-5ce5836e.system.entry.js} +1 -1
- package/dist/pine-core/p-5f3242c8.system.entry.js +1 -0
- package/dist/pine-core/{p-80e6f3a0.system.entry.js → p-60d27247.system.entry.js} +1 -1
- package/dist/pine-core/{p-bd26a5e8.entry.js → p-60e3b1af.entry.js} +1 -1
- package/dist/pine-core/{p-ca0a8f5c.entry.js → p-64283f7b.entry.js} +1 -1
- package/dist/pine-core/p-6602b4d0.entry.js +1 -0
- package/dist/pine-core/p-6845867f.system.entry.js +1 -0
- package/dist/pine-core/{p-1ee86d87.system.entry.js → p-68fdfb8f.system.entry.js} +1 -1
- package/dist/pine-core/p-6b6ae1be.entry.js +1 -0
- package/dist/pine-core/{p-e5420660.entry.js → p-6d64e6c7.entry.js} +1 -1
- package/dist/pine-core/{p-3a959459.system.entry.js → p-6dad76cb.system.entry.js} +1 -1
- package/dist/pine-core/p-6f34ad9c.entry.js +1 -0
- package/dist/pine-core/{p-55224683.entry.js → p-7073146f.entry.js} +1 -1
- package/dist/pine-core/{p-f1702281.entry.js → p-735b3631.entry.js} +1 -1
- package/dist/pine-core/p-7a14473e.entry.js +1 -0
- package/dist/pine-core/{p-9880d251.system.entry.js → p-7a19477e.system.entry.js} +1 -1
- package/dist/pine-core/{p-88ff1604.entry.js → p-7d3a20ba.entry.js} +1 -1
- package/dist/pine-core/{p-a939b471.entry.js → p-7fcf3d37.entry.js} +1 -1
- package/dist/pine-core/{p-26642718.entry.js → p-87642228.entry.js} +1 -1
- package/dist/pine-core/p-89fefe36.entry.js +1 -0
- package/dist/pine-core/p-8b97dd57.system.entry.js +1 -0
- package/dist/pine-core/{p-0092444c.system.entry.js → p-9201b497.system.entry.js} +1 -1
- package/dist/pine-core/{p-ebd0bff2.entry.js → p-92a8cf7d.entry.js} +1 -1
- package/dist/pine-core/{p-e836a041.entry.js → p-94597b73.entry.js} +1 -1
- package/dist/pine-core/p-9713d6a5.system.entry.js +1 -0
- package/dist/pine-core/p-97be00f4.system.entry.js +1 -0
- package/dist/pine-core/{p-2ac2457b.system.entry.js → p-98843402.system.entry.js} +1 -1
- package/dist/pine-core/{p-b914dde8.entry.js → p-98cc327b.entry.js} +2 -2
- package/dist/pine-core/p-9a8971e2.system.entry.js +1 -0
- package/dist/pine-core/p-9a8d2985.system.entry.js +3 -0
- package/dist/pine-core/{p-cfc52b95.system.entry.js → p-9dbc017f.system.entry.js} +1 -1
- package/dist/pine-core/p-9fbcba0d.entry.js +1 -0
- package/dist/pine-core/p-9fe4a64a.entry.js +1 -0
- package/dist/pine-core/{p-COtCa1Md.system.js → p-BNTlHhoO.system.js} +1 -1
- package/dist/pine-core/p-BZ1l3LGl.system.js +1 -0
- package/dist/pine-core/p-BgNaWLoS.js +1 -0
- package/dist/pine-core/{p-CmSJytt1.js → p-BplEmwUQ.js} +2 -2
- package/dist/pine-core/{p-Cy8cvR7I.system.js → p-CANeE7Ss.system.js} +1 -1
- package/dist/pine-core/{p-XW4H0W6i.system.js → p-CNXspDYs.system.js} +1 -1
- package/dist/pine-core/{p-JtdHT_W5.js → p-CirzxZ33.js} +1 -1
- package/dist/pine-core/{p-CGRdQc49.system.js → p-CjRCtzPD.system.js} +2 -2
- package/dist/pine-core/{p-BPqJgIq6.js → p-Cuc0DYlm.js} +1 -1
- package/dist/pine-core/p-D52aRqFx.system.js +1 -0
- package/dist/pine-core/p-DCKBKRUy.js +1 -0
- package/dist/pine-core/p-DXO1yd32.system.js +1 -0
- package/dist/pine-core/{p-n3_ytl_p.system.js → p-DaCT2ssj.system.js} +1 -1
- package/dist/pine-core/p-a2078add.entry.js +1 -0
- package/dist/pine-core/{p-97d0b89e.system.entry.js → p-a48b025a.system.entry.js} +1 -1
- package/dist/pine-core/{p-9713fb36.entry.js → p-a7d25143.entry.js} +1 -1
- package/dist/pine-core/{p-9dcd2cdb.entry.js → p-ad3b1ec3.entry.js} +1 -1
- package/dist/pine-core/p-b017eb99.system.entry.js +1 -0
- package/dist/pine-core/p-b037dcbd.system.entry.js +1 -0
- package/dist/pine-core/{p-db17c626.system.entry.js → p-b243767b.system.entry.js} +1 -1
- package/dist/pine-core/{p-341c38f1.system.entry.js → p-b33ad96e.system.entry.js} +1 -1
- package/dist/pine-core/p-b6edfdfe.entry.js +2 -0
- package/dist/pine-core/{p-8191498f.system.entry.js → p-b7cbd913.system.entry.js} +1 -1
- package/dist/pine-core/{p-8f531063.entry.js → p-b9d71b76.entry.js} +1 -1
- package/dist/pine-core/p-bcf57566.entry.js +1 -0
- package/dist/pine-core/{p-4fd454f6.entry.js → p-bda7e3be.entry.js} +1 -1
- package/dist/pine-core/p-bdde1e53.entry.js +1 -0
- package/dist/pine-core/{p-cb6a3e4c.system.entry.js → p-be3b4f12.system.entry.js} +1 -1
- package/dist/pine-core/{p-b1548a20.entry.js → p-bfdfbe9f.entry.js} +1 -1
- package/dist/pine-core/p-c02a32ec.entry.js +1 -0
- package/dist/pine-core/p-c1da80e5.entry.js +1 -0
- package/dist/pine-core/{p-d8570b4b.system.entry.js → p-c233866c.system.entry.js} +1 -1
- package/dist/pine-core/{p-fc25b956.system.entry.js → p-cb560aab.system.entry.js} +1 -1
- package/dist/pine-core/{p-02088776.entry.js → p-ce554098.entry.js} +1 -1
- package/dist/pine-core/p-ced6a814.system.entry.js +1 -0
- package/dist/pine-core/{p-0a84d220.entry.js → p-d7930540.entry.js} +1 -1
- package/dist/pine-core/{p-11d98408.system.entry.js → p-d7db749a.system.entry.js} +1 -1
- package/dist/pine-core/{p-7a5b21d2.system.entry.js → p-d8bedb58.system.entry.js} +1 -1
- package/dist/pine-core/{p-1dc5a7e0.system.entry.js → p-d9243653.system.entry.js} +1 -1
- package/dist/pine-core/{p-9ab95438.entry.js → p-d94ebe84.entry.js} +1 -1
- package/dist/pine-core/{p-9109b90a.entry.js → p-de176bd9.entry.js} +1 -1
- package/dist/pine-core/{p-57a2f927.entry.js → p-dea2a254.entry.js} +1 -1
- package/dist/pine-core/p-dfadfcd1.entry.js +1 -0
- package/dist/pine-core/{p-1437585e.system.entry.js → p-e1fdd53a.system.entry.js} +1 -1
- package/dist/pine-core/{p-4435fff6.system.entry.js → p-e70cb112.system.entry.js} +1 -1
- package/dist/pine-core/{p-01aa382c.system.entry.js → p-e9a53a88.system.entry.js} +1 -1
- package/dist/pine-core/p-eb93cc6e.entry.js +1 -0
- package/dist/pine-core/{p-4d03d1e2.system.entry.js → p-ebf0c51b.system.entry.js} +1 -1
- package/dist/pine-core/p-ebf74c43.system.entry.js +1 -0
- package/dist/pine-core/{p-cde8eb81.entry.js → p-ee449a4b.entry.js} +1 -1
- package/dist/pine-core/p-ef4d8fea.entry.js +1 -0
- package/dist/pine-core/p-f09f27ab.system.entry.js +1 -0
- package/dist/pine-core/{p-ff3de72e.entry.js → p-f2c487e6.entry.js} +1 -1
- package/dist/pine-core/p-f549f2bc.entry.js +1 -0
- package/dist/pine-core/p-fc743f6e.entry.js +1 -0
- package/dist/pine-core/{p-BJXk71tO.js → p-m3pqpeWg.js} +1 -1
- package/dist/pine-core/p-wXfuz0Bd.system.js +1 -0
- package/dist/pine-core/pine-core.esm.js +1 -1
- package/dist/pine-core/pine-core.js +1 -1
- package/dist/types/components/pds-alert/pds-alert.d.ts +10 -0
- package/dist/types/components/pds-avatar/pds-avatar.d.ts +8 -0
- package/dist/types/components/pds-button/pds-button.d.ts +5 -6
- package/dist/types/components/pds-checkbox/pds-checkbox.d.ts +7 -1
- package/dist/types/components/pds-combobox/pds-combobox.d.ts +9 -0
- package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.d.ts +20 -3
- package/dist/types/components/pds-link/pds-link.d.ts +8 -0
- package/dist/types/components/pds-modal/pds-modal-content/pds-modal-content.d.ts +2 -0
- package/dist/types/components/pds-popover/pds-popover.d.ts +87 -21
- package/dist/types/components/pds-radio/pds-radio.d.ts +9 -3
- package/dist/types/components/pds-select/pds-select.d.ts +32 -4
- package/dist/types/components/pds-toast/pds-toast.d.ts +9 -0
- package/dist/types/components/pds-tooltip/pds-tooltip.d.ts +31 -0
- package/dist/types/components.d.ts +139 -18
- package/dist/types/utils/aria-references.d.ts +24 -0
- package/dist/types/utils/tabbable.d.ts +2 -0
- package/dist/types/utils/truncation-tooltip.d.ts +4 -4
- package/dist/types/utils/types.d.ts +1 -0
- package/dist/vscode.html-data.json +129 -14
- package/hydrate/index.js +1040 -416
- package/hydrate/index.mjs +1040 -416
- package/package.json +2 -2
- package/dist/esm-es5/truncation-tooltip-DRXsdKk1.js +0 -1
- package/dist/pine-core/p-049f126a.entry.js +0 -1
- package/dist/pine-core/p-153ba77b.entry.js +0 -1
- package/dist/pine-core/p-208c7dbf.entry.js +0 -1
- package/dist/pine-core/p-258770cf.system.entry.js +0 -1
- package/dist/pine-core/p-2cb5483a.system.entry.js +0 -1
- package/dist/pine-core/p-432d5ec7.entry.js +0 -1
- package/dist/pine-core/p-5442d983.system.entry.js +0 -1
- package/dist/pine-core/p-576cf904.system.entry.js +0 -1
- package/dist/pine-core/p-5c90091e.system.entry.js +0 -1
- package/dist/pine-core/p-602c197f.entry.js +0 -1
- package/dist/pine-core/p-645a482b.system.entry.js +0 -1
- package/dist/pine-core/p-72865997.entry.js +0 -1
- package/dist/pine-core/p-75ee0403.entry.js +0 -1
- package/dist/pine-core/p-7a287635.system.entry.js +0 -1
- package/dist/pine-core/p-7bf6563a.system.entry.js +0 -1
- package/dist/pine-core/p-7fa66cad.entry.js +0 -1
- package/dist/pine-core/p-80a698ae.entry.js +0 -1
- package/dist/pine-core/p-82cf4ec6.entry.js +0 -1
- package/dist/pine-core/p-86040cac.system.entry.js +0 -1
- package/dist/pine-core/p-875b0436.system.entry.js +0 -1
- package/dist/pine-core/p-8cc302aa.system.entry.js +0 -1
- package/dist/pine-core/p-8d292b48.entry.js +0 -1
- package/dist/pine-core/p-92ae6082.entry.js +0 -1
- package/dist/pine-core/p-94593f20.system.entry.js +0 -1
- package/dist/pine-core/p-993d1043.entry.js +0 -1
- package/dist/pine-core/p-99459e27.entry.js +0 -1
- package/dist/pine-core/p-BLG6RDBt.js +0 -1
- package/dist/pine-core/p-BR5nujVX.system.js +0 -1
- package/dist/pine-core/p-CuSNnuFu.system.js +0 -1
- package/dist/pine-core/p-a0960b3d.system.entry.js +0 -1
- package/dist/pine-core/p-a1230a74.system.entry.js +0 -1
- package/dist/pine-core/p-a19cd59c.entry.js +0 -1
- package/dist/pine-core/p-a787b34a.system.entry.js +0 -1
- package/dist/pine-core/p-a826f290.entry.js +0 -1
- package/dist/pine-core/p-aa032a5e.system.entry.js +0 -1
- package/dist/pine-core/p-acce8eb2.entry.js +0 -1
- package/dist/pine-core/p-b69f04b7.entry.js +0 -1
- package/dist/pine-core/p-bb68431a.entry.js +0 -1
- package/dist/pine-core/p-bb73ad66.entry.js +0 -2
- package/dist/pine-core/p-beb23781.entry.js +0 -1
- package/dist/pine-core/p-bf30dec0.entry.js +0 -1
- package/dist/pine-core/p-c36b490e.entry.js +0 -1
- package/dist/pine-core/p-c81d8ac8.entry.js +0 -1
- package/dist/pine-core/p-ca0d48e8.entry.js +0 -1
- package/dist/pine-core/p-cfd012d4.entry.js +0 -1
- package/dist/pine-core/p-e0917a26.entry.js +0 -1
- package/dist/pine-core/p-e836f3ec.system.entry.js +0 -3
- package/dist/pine-core/p-ea4d4741.system.entry.js +0 -1
- package/dist/pine-core/p-f2c253d8.entry.js +0 -1
- package/dist/pine-core/p-f474d7de.entry.js +0 -1
- package/dist/pine-core/p-f77905aa.system.entry.js +0 -1
- package/dist/pine-core/p-qhdoK1Jp.system.js +0 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-BsWY_xEJ.js');
|
|
4
|
+
var floatingUi_dom = require('./floating-ui.dom-Dw41zbyY.js');
|
|
4
5
|
var closest = require('./closest-D0qyYtJ3.js');
|
|
5
6
|
var reflectedAttributeDefault = require('./reflected-attribute-default-DVYHG6O1.js');
|
|
6
|
-
var attributes = require('./attributes-
|
|
7
|
-
var keepHydrated = require('./keep-hydrated-
|
|
7
|
+
var attributes = require('./attributes-CW49XqaL.js');
|
|
8
|
+
var keepHydrated = require('./keep-hydrated-AKoh0DG4.js');
|
|
9
|
+
var tabbable = require('./tabbable-CddSt_Hi.js');
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Escapes a string so it's safe to interpolate into a CSS identifier (an id selector like `#${id}`)
|
|
@@ -48,10 +50,32 @@ const cssEscape = (value) => {
|
|
|
48
50
|
return result;
|
|
49
51
|
};
|
|
50
52
|
|
|
51
|
-
const pdsPopoverCss = () => `:host{--sizing-max-width-default:352px;display:inline-block}:host .pds-popover__trigger-wrapper{display:inline-block}:host .pds-popover__content-slot-wrapper{display:none}`;
|
|
53
|
+
const pdsPopoverCss = () => `:host{--sizing-max-width-default:352px;display:inline-block}:host .pds-popover__trigger-wrapper{display:inline-block}:host .pds-popover__tab-guard{opacity:0;outline:none;pointer-events:none;position:fixed}:host .pds-popover__content-slot-wrapper{display:none}`;
|
|
52
54
|
|
|
53
|
-
/** Open
|
|
54
|
-
const
|
|
55
|
+
/** Open popovers that close on Escape, in the order they opened: Escape goes to the last one it applies to. */
|
|
56
|
+
const popoversTakingEscape = [];
|
|
57
|
+
/** Hovering the trigger waits this long before opening, so a pointer passing over it doesn't open it. */
|
|
58
|
+
const HOVER_OPEN_DELAY_MS = 120;
|
|
59
|
+
/** Leaving the trigger and panel waits this long before closing, which covers the gap between them. */
|
|
60
|
+
const HOVER_CLOSE_DELAY_MS = 200;
|
|
61
|
+
/**
|
|
62
|
+
* floating-ui reporting viewport coordinates, as `position: fixed` uses without a containing block. Its own
|
|
63
|
+
* containing-block check misses a backdrop filter in WebKit, so handlePopoverPositioning corrects for one itself.
|
|
64
|
+
*/
|
|
65
|
+
const viewportPlatform = Object.assign(Object.assign({}, floatingUi_dom.platform), { getOffsetParent: () => window });
|
|
66
|
+
/**
|
|
67
|
+
* Where `top: 0; left: 0` puts a fixed element beside the given one. An empty probe is measured instead of the
|
|
68
|
+
* element, whose own transforms, such as an entrance animation, would otherwise read as part of the offset.
|
|
69
|
+
*/
|
|
70
|
+
const containingBlockOrigin = (element) => {
|
|
71
|
+
var _a;
|
|
72
|
+
const probe = document.createElement('div');
|
|
73
|
+
probe.style.cssText = 'all: initial; position: fixed; top: 0; left: 0;';
|
|
74
|
+
(_a = element.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(probe, element);
|
|
75
|
+
const { top, left } = probe.getBoundingClientRect();
|
|
76
|
+
probe.remove();
|
|
77
|
+
return { top, left };
|
|
78
|
+
};
|
|
55
79
|
/** The focused element, followed down through shadow roots to the control that has focus. */
|
|
56
80
|
function deepActiveElement() {
|
|
57
81
|
var _a;
|
|
@@ -60,6 +84,27 @@ function deepActiveElement() {
|
|
|
60
84
|
active = active.shadowRoot.activeElement;
|
|
61
85
|
return active;
|
|
62
86
|
}
|
|
87
|
+
/** `node`, or the shadow host it sits in, lifted until it shares a tree with `other` or reaches the document. */
|
|
88
|
+
function liftToTreeOf(node, other) {
|
|
89
|
+
let current = node;
|
|
90
|
+
while (current.getRootNode() !== other.getRootNode() && current.getRootNode() instanceof ShadowRoot) {
|
|
91
|
+
current = current.getRootNode().host;
|
|
92
|
+
}
|
|
93
|
+
return current;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Where `node` sits relative to `ref`, as `compareDocumentPosition` reports it. Whichever of the two
|
|
97
|
+
* is inside a shadow root is lifted to its host first, so a control inside a component compares too.
|
|
98
|
+
*/
|
|
99
|
+
function positionAcrossTrees(ref, node) {
|
|
100
|
+
const lifted = liftToTreeOf(node, ref);
|
|
101
|
+
return liftToTreeOf(ref, lifted).compareDocumentPosition(lifted);
|
|
102
|
+
}
|
|
103
|
+
const isPosition = (position, flag) => (position & Node.DOCUMENT_POSITION_DISCONNECTED) === 0 && (position & flag) !== 0;
|
|
104
|
+
/** The popover each panel belongs to, so a popover inside another one's panel can find it. */
|
|
105
|
+
const panelOwners = new WeakMap();
|
|
106
|
+
/** Floating layers Pine components put at the end of the page or of a dialog, as a popover does its panel. */
|
|
107
|
+
const FLOATING_LAYERS = '.pds-popover, .pds-datepicker-calendar-portal, .pds-combobox-dropdown-portal';
|
|
63
108
|
const PdsPopover = class {
|
|
64
109
|
constructor(hostRef) {
|
|
65
110
|
index.registerInstance(this, hostRef);
|
|
@@ -95,14 +140,21 @@ const PdsPopover = class {
|
|
|
95
140
|
*/
|
|
96
141
|
this.portalEl = null;
|
|
97
142
|
/**
|
|
98
|
-
*
|
|
143
|
+
* Stops floating-ui's autoUpdate, which repositions the open panel as its trigger or the page moves or resizes
|
|
144
|
+
*/
|
|
145
|
+
this.stopAutoUpdate = null;
|
|
146
|
+
/**
|
|
147
|
+
* Counts positioning runs, so a run that resolves after a newer one started is dropped
|
|
99
148
|
*/
|
|
100
|
-
this.
|
|
149
|
+
this.positioningRun = 0;
|
|
101
150
|
/**
|
|
102
|
-
*
|
|
151
|
+
* The latest positioning run, which pdsPopoverOpen waits for so the panel's side is set when it fires
|
|
103
152
|
*/
|
|
104
|
-
this.
|
|
105
|
-
|
|
153
|
+
this.positioning = Promise.resolve();
|
|
154
|
+
/**
|
|
155
|
+
* Set while show() waits to emit pdsPopoverOpen, so a hide() in the meantime emits it first
|
|
156
|
+
*/
|
|
157
|
+
this.openEventPending = false;
|
|
106
158
|
/**
|
|
107
159
|
* Track moved nodes and their placeholders for restoration
|
|
108
160
|
*/
|
|
@@ -111,11 +163,41 @@ const PdsPopover = class {
|
|
|
111
163
|
* Timestamp when popover was opened (for preventing immediate close)
|
|
112
164
|
*/
|
|
113
165
|
this.openTimestamp = 0;
|
|
166
|
+
/**
|
|
167
|
+
* Set while hover holds the popover open, until a click pins it or it closes
|
|
168
|
+
*/
|
|
169
|
+
this.hoverOpened = false;
|
|
170
|
+
/**
|
|
171
|
+
* Set when the pointer left while focus was in the panel, so focus leaving it closes it instead
|
|
172
|
+
*/
|
|
173
|
+
this.closeWhenFocusLeaves = false;
|
|
174
|
+
/**
|
|
175
|
+
* How far the pointer was from the panel at its last move after leaving the trigger
|
|
176
|
+
*/
|
|
177
|
+
this.panelDistance = Infinity;
|
|
178
|
+
/**
|
|
179
|
+
* Stands in for the panel in the Tab order, right after the trigger, while the popover is open
|
|
180
|
+
*/
|
|
181
|
+
this.tabGuardEl = null;
|
|
182
|
+
/**
|
|
183
|
+
* Set while focus passes through the guard on its way out of the panel
|
|
184
|
+
*/
|
|
185
|
+
this.leavingPanel = false;
|
|
186
|
+
/**
|
|
187
|
+
* The direction of the Tab key being handled, until its default action has run
|
|
188
|
+
*/
|
|
189
|
+
this.tabDirection = null;
|
|
114
190
|
/**
|
|
115
191
|
* Determines the action that triggers the popover. For manual popovers, the consumer is responsible for toggling this value.
|
|
116
192
|
* @defaultValue "show"
|
|
117
193
|
*/
|
|
118
194
|
this.popoverTargetAction = 'show';
|
|
195
|
+
/**
|
|
196
|
+
* Determines how the popover opens. With `hover`, it also opens when the pointer rests on the trigger and closes
|
|
197
|
+
* when the pointer leaves, until a click on the trigger keeps it open. Enter or Space on the trigger opens it either way.
|
|
198
|
+
* @defaultValue "click"
|
|
199
|
+
*/
|
|
200
|
+
this.openOn = 'click';
|
|
119
201
|
/**
|
|
120
202
|
* Determines the type of popover. Auto popovers can be "light dismissed" by clicking outside of the popover.
|
|
121
203
|
* Manual popovers require the consumer to handle the visibility of the popover.
|
|
@@ -126,6 +208,11 @@ const PdsPopover = class {
|
|
|
126
208
|
* @defaultValue 352
|
|
127
209
|
*/
|
|
128
210
|
this.maxWidth = 352;
|
|
211
|
+
/**
|
|
212
|
+
* Sets the padding of the popover content
|
|
213
|
+
* @defaultValue "md"
|
|
214
|
+
*/
|
|
215
|
+
this.padding = 'md';
|
|
129
216
|
/**
|
|
130
217
|
* Determines the preferred position of the popover
|
|
131
218
|
* @defaultValue "right"
|
|
@@ -140,6 +227,7 @@ const PdsPopover = class {
|
|
|
140
227
|
// Clean up previous trigger's event listener if it exists
|
|
141
228
|
if (this.triggerEl != null) {
|
|
142
229
|
this.triggerEl.removeEventListener('click', this.handleTriggerClick);
|
|
230
|
+
this.stopListeningForHover(this.triggerEl);
|
|
143
231
|
}
|
|
144
232
|
if (assignedElements.length > 0) {
|
|
145
233
|
// Use the first assigned element as the trigger
|
|
@@ -147,10 +235,14 @@ const PdsPopover = class {
|
|
|
147
235
|
this.linkTriggerToPortal();
|
|
148
236
|
// Attach click listener to handle popover visibility
|
|
149
237
|
this.triggerEl.addEventListener('click', this.handleTriggerClick);
|
|
238
|
+
this.listenForHover(this.triggerEl);
|
|
150
239
|
}
|
|
151
240
|
else {
|
|
152
241
|
this.triggerEl = null;
|
|
153
242
|
}
|
|
243
|
+
// autoUpdate watches the trigger it started with, so an open popover starts it again on the new one.
|
|
244
|
+
if (this.active)
|
|
245
|
+
this.addScrollAndResizeListeners();
|
|
154
246
|
this.observeTrigger();
|
|
155
247
|
};
|
|
156
248
|
/**
|
|
@@ -173,6 +265,13 @@ const PdsPopover = class {
|
|
|
173
265
|
if (!anchorWithHref) {
|
|
174
266
|
event.preventDefault();
|
|
175
267
|
}
|
|
268
|
+
if (this.openOn === 'hover' && this.popoverTargetAction !== 'hide') {
|
|
269
|
+
const heldByHover = this.hoverOpened;
|
|
270
|
+
this.pin();
|
|
271
|
+
// Pinning, not toggling: the hover before a click has already opened it.
|
|
272
|
+
if (heldByHover)
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
176
275
|
// Execute the appropriate action based on popoverTargetAction prop
|
|
177
276
|
switch (this.popoverTargetAction) {
|
|
178
277
|
case 'show':
|
|
@@ -187,6 +286,60 @@ const PdsPopover = class {
|
|
|
187
286
|
break;
|
|
188
287
|
}
|
|
189
288
|
};
|
|
289
|
+
// A tap sends touch pointer events and then a click, so touch takes the click path alone.
|
|
290
|
+
this.handleHoverEnter = (event) => {
|
|
291
|
+
if (event.pointerType === 'touch')
|
|
292
|
+
return;
|
|
293
|
+
this.clearHoverTimers();
|
|
294
|
+
if (this.active)
|
|
295
|
+
return;
|
|
296
|
+
this.hoverOpenTimer = setTimeout(() => {
|
|
297
|
+
this.hoverOpenTimer = undefined;
|
|
298
|
+
if (this.active || this.portalEl == null)
|
|
299
|
+
return;
|
|
300
|
+
this.hoverOpened = true;
|
|
301
|
+
this.show();
|
|
302
|
+
}, HOVER_OPEN_DELAY_MS);
|
|
303
|
+
};
|
|
304
|
+
this.handleHoverLeave = (event) => {
|
|
305
|
+
if (event.pointerType === 'touch')
|
|
306
|
+
return;
|
|
307
|
+
this.clearHoverTimers();
|
|
308
|
+
if (!this.hoverOpened)
|
|
309
|
+
return;
|
|
310
|
+
this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
|
|
311
|
+
if (event.currentTarget !== this.triggerEl)
|
|
312
|
+
return;
|
|
313
|
+
this.panelDistance = this.distanceToPanel(event);
|
|
314
|
+
document.addEventListener('pointermove', this.handleMoveTowardPanel);
|
|
315
|
+
};
|
|
316
|
+
// A slow diagonal from the trigger to a panel shorter than it runs beside the panel for longer
|
|
317
|
+
// than the close delay, so each move that brings the pointer closer starts the delay again.
|
|
318
|
+
this.handleMoveTowardPanel = (event) => {
|
|
319
|
+
const distance = this.distanceToPanel(event);
|
|
320
|
+
if (distance < this.panelDistance) {
|
|
321
|
+
clearTimeout(this.hoverCloseTimer);
|
|
322
|
+
this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
|
|
323
|
+
}
|
|
324
|
+
this.panelDistance = distance;
|
|
325
|
+
};
|
|
326
|
+
this.handleHoverFocusOut = (event) => {
|
|
327
|
+
if (!this.closeWhenFocusLeaves || closest.containsComposed(this.portalEl, event.relatedTarget))
|
|
328
|
+
return;
|
|
329
|
+
this.closeWhenFocusLeaves = false;
|
|
330
|
+
this.hoverCloseTimer = setTimeout(this.closeFromHover, HOVER_CLOSE_DELAY_MS);
|
|
331
|
+
};
|
|
332
|
+
this.closeFromHover = () => {
|
|
333
|
+
this.clearHoverTimers();
|
|
334
|
+
if (!this.hoverOpened)
|
|
335
|
+
return;
|
|
336
|
+
// Content shown on hover stays while focus is in it (WCAG 1.4.13).
|
|
337
|
+
if (closest.containsComposed(this.portalEl, deepActiveElement())) {
|
|
338
|
+
this.closeWhenFocusLeaves = true;
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
this.hide();
|
|
342
|
+
};
|
|
190
343
|
/** The focus style copied into a shadow root the panel opened in, which `document.head` can't reach. */
|
|
191
344
|
this.shadowFocusStyle = null;
|
|
192
345
|
/** The dialog the panel was opened in, closed along with it. */
|
|
@@ -207,6 +360,85 @@ const PdsPopover = class {
|
|
|
207
360
|
event.stopPropagation();
|
|
208
361
|
}
|
|
209
362
|
};
|
|
363
|
+
// At the end of the body or of a dialog, the panel would come last in the Tab order. The guard
|
|
364
|
+
// after the trigger takes its place there, while the panel has a control for it to lead to.
|
|
365
|
+
this.syncTabGuard = (event) => {
|
|
366
|
+
if (event.key !== 'Tab')
|
|
367
|
+
return;
|
|
368
|
+
this.releasePanel();
|
|
369
|
+
this.tabDirection = event.shiftKey ? 'backward' : 'forward';
|
|
370
|
+
setTimeout(this.endTabKey);
|
|
371
|
+
// Read on each Tab, as the panel's content can arrive after it opens.
|
|
372
|
+
const guarding = this.guardedTabbables().length > 0;
|
|
373
|
+
if (this.tabGuardEl != null)
|
|
374
|
+
this.tabGuardEl.tabIndex = guarding ? 0 : -1;
|
|
375
|
+
// Inert for this key press, the panel is reached only through the guard, either way round. A
|
|
376
|
+
// control in another floating layer, such as a nested popover's panel, may move focus back into it.
|
|
377
|
+
const focused = deepActiveElement();
|
|
378
|
+
if (guarding && !closest.containsComposed(this.portalEl, focused) && !closest.closest(FLOATING_LAYERS, focused !== null && focused !== void 0 ? focused : document)) {
|
|
379
|
+
this.portalEl.inert = true;
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
this.endTabKey = () => {
|
|
383
|
+
this.tabDirection = null;
|
|
384
|
+
this.releasePanel();
|
|
385
|
+
};
|
|
386
|
+
this.handleTabGuardFocus = (event) => {
|
|
387
|
+
if (this.leavingPanel)
|
|
388
|
+
return;
|
|
389
|
+
// An inert panel's controls aren't tabbable, so the guard would find none to send focus to.
|
|
390
|
+
this.releasePanel();
|
|
391
|
+
const tabbables = this.guardedTabbables();
|
|
392
|
+
// A Tab press says which end of the panel focus comes in at; without one, where it came from does.
|
|
393
|
+
const from = event.relatedTarget;
|
|
394
|
+
const backward = this.tabDirection != null ? this.tabDirection === 'backward' : from != null && this.isAfterPopover(from);
|
|
395
|
+
const target = backward ? tabbables[tabbables.length - 1] : tabbables[0];
|
|
396
|
+
// Focus can reach the guard without a Tab keydown here (from a frame, or assistive tech) after
|
|
397
|
+
// the panel's controls are gone. The trigger is the nearest visible place for it.
|
|
398
|
+
if (target == null)
|
|
399
|
+
this.returnFocusToTrigger();
|
|
400
|
+
else
|
|
401
|
+
target.focus();
|
|
402
|
+
};
|
|
403
|
+
this.handleTabFromPanel = (event) => {
|
|
404
|
+
if (event.key !== 'Tab' || event.defaultPrevented || this.tabGuardEl == null)
|
|
405
|
+
return;
|
|
406
|
+
const tabbables = this.guardedTabbables();
|
|
407
|
+
const edge = event.shiftKey ? tabbables[0] : tabbables[tabbables.length - 1];
|
|
408
|
+
if (edge == null || deepActiveElement() !== edge)
|
|
409
|
+
return;
|
|
410
|
+
this.leavePanel(edge, event.shiftKey);
|
|
411
|
+
};
|
|
412
|
+
this.releasePanel = () => {
|
|
413
|
+
if (this.portalEl != null)
|
|
414
|
+
this.portalEl.inert = false;
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
openOnChanged() {
|
|
418
|
+
this.pin();
|
|
419
|
+
this.stopListeningForHover(this.triggerEl);
|
|
420
|
+
this.stopListeningForHover(this.portalEl);
|
|
421
|
+
// Out of the page, connectedCallback binds them when it comes back.
|
|
422
|
+
if (!this.isComponentMounted)
|
|
423
|
+
return;
|
|
424
|
+
this.listenForHover(this.triggerEl);
|
|
425
|
+
this.listenForHover(this.portalEl);
|
|
426
|
+
}
|
|
427
|
+
applyPadding() {
|
|
428
|
+
if (this.portalEl != null)
|
|
429
|
+
this.portalEl.style.padding = this.paddingToken();
|
|
430
|
+
}
|
|
431
|
+
paddingToken() {
|
|
432
|
+
switch (this.padding) {
|
|
433
|
+
case 'none':
|
|
434
|
+
return 'var(--pine-dimension-none)';
|
|
435
|
+
case 'xs':
|
|
436
|
+
return 'var(--pine-dimension-xs)';
|
|
437
|
+
case 'sm':
|
|
438
|
+
return 'var(--pine-dimension-sm)';
|
|
439
|
+
default:
|
|
440
|
+
return 'var(--pine-dimension-md)';
|
|
441
|
+
}
|
|
210
442
|
}
|
|
211
443
|
restorePlacementDefault(newValue) {
|
|
212
444
|
this.placement = reflectedAttributeDefault.restoreReflectedDefault(this.el, 'placement', newValue, 'right');
|
|
@@ -216,8 +448,6 @@ const PdsPopover = class {
|
|
|
216
448
|
// Bind event handlers for cleanup
|
|
217
449
|
this.boundClickOutsideHandler = this.handleClickOutside.bind(this);
|
|
218
450
|
this.boundEscapeKeyHandler = this.handleEscapeKey.bind(this);
|
|
219
|
-
this.boundScrollHandler = this.handleScroll.bind(this);
|
|
220
|
-
this.boundResizeHandler = this.handleResize.bind(this);
|
|
221
451
|
// Create portal element
|
|
222
452
|
this.createPortal();
|
|
223
453
|
this.hasLoaded = true;
|
|
@@ -258,6 +488,48 @@ const PdsPopover = class {
|
|
|
258
488
|
// Skips values already in place, so the trigger observer's own callback doesn't loop.
|
|
259
489
|
return attributes.setAttributesIfChanged(this.triggerEl, { 'aria-expanded': String(this.active), 'aria-controls': this.portalEl.id });
|
|
260
490
|
}
|
|
491
|
+
listenForHover(el) {
|
|
492
|
+
if (this.openOn !== 'hover' || el == null)
|
|
493
|
+
return;
|
|
494
|
+
el.addEventListener('pointerenter', this.handleHoverEnter);
|
|
495
|
+
el.addEventListener('pointerleave', this.handleHoverLeave);
|
|
496
|
+
el.addEventListener('focusout', this.handleHoverFocusOut);
|
|
497
|
+
}
|
|
498
|
+
stopListeningForHover(el) {
|
|
499
|
+
if (el == null)
|
|
500
|
+
return;
|
|
501
|
+
el.removeEventListener('pointerenter', this.handleHoverEnter);
|
|
502
|
+
el.removeEventListener('pointerleave', this.handleHoverLeave);
|
|
503
|
+
el.removeEventListener('focusout', this.handleHoverFocusOut);
|
|
504
|
+
}
|
|
505
|
+
distanceToPanel({ clientX, clientY }) {
|
|
506
|
+
const panel = this.portalEl.getBoundingClientRect();
|
|
507
|
+
return Math.hypot(Math.max(panel.left - clientX, 0, clientX - panel.right), Math.max(panel.top - clientY, 0, clientY - panel.bottom));
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Keeps a popover that hover opened open, closing from then on as one opened by a click does. A
|
|
511
|
+
* manual one gives up Escape again, which it took only while hover held it.
|
|
512
|
+
*/
|
|
513
|
+
pin() {
|
|
514
|
+
var _a;
|
|
515
|
+
this.clearHoverTimers();
|
|
516
|
+
if (!this.hoverOpened)
|
|
517
|
+
return;
|
|
518
|
+
this.hoverOpened = false;
|
|
519
|
+
if (this.popoverType === 'auto')
|
|
520
|
+
return;
|
|
521
|
+
this.forgetOpen();
|
|
522
|
+
(_a = this.portalEl) === null || _a === void 0 ? void 0 : _a.removeAttribute('data-pds-popover-open');
|
|
523
|
+
document.removeEventListener('keydown', this.boundEscapeKeyHandler);
|
|
524
|
+
}
|
|
525
|
+
clearHoverTimers() {
|
|
526
|
+
clearTimeout(this.hoverOpenTimer);
|
|
527
|
+
clearTimeout(this.hoverCloseTimer);
|
|
528
|
+
this.hoverOpenTimer = undefined;
|
|
529
|
+
this.hoverCloseTimer = undefined;
|
|
530
|
+
this.closeWhenFocusLeaves = false;
|
|
531
|
+
document.removeEventListener('pointermove', this.handleMoveTowardPanel);
|
|
532
|
+
}
|
|
261
533
|
// componentDidLoad doesn't run again when a popover comes back, so rebuild whatever
|
|
262
534
|
// disconnectedCallback tore down. Each step is a no-op when nothing was.
|
|
263
535
|
connectedCallback() {
|
|
@@ -267,17 +539,19 @@ const PdsPopover = class {
|
|
|
267
539
|
this.isComponentMounted = true;
|
|
268
540
|
this.createPortal();
|
|
269
541
|
(_a = this.triggerEl) === null || _a === void 0 ? void 0 : _a.addEventListener('click', this.handleTriggerClick);
|
|
542
|
+
this.listenForHover(this.triggerEl);
|
|
270
543
|
this.observeTrigger();
|
|
271
544
|
this.linkTriggerToPortal();
|
|
272
545
|
// Still open after a move: the trigger moved, so the portal follows it, into the dialog it
|
|
273
546
|
// is in now, if any.
|
|
274
547
|
if (this.active) {
|
|
275
548
|
this.placePortal();
|
|
276
|
-
|
|
549
|
+
// autoUpdate listens to the scroll containers around where the trigger was, so it starts again.
|
|
550
|
+
this.addScrollAndResizeListeners();
|
|
277
551
|
}
|
|
278
552
|
}
|
|
279
553
|
disconnectedCallback() {
|
|
280
|
-
var _a;
|
|
554
|
+
var _a, _b;
|
|
281
555
|
// Moved in one operation (a DOM morph, or a framework reparenting it), the popover is
|
|
282
556
|
// already back in the page. Its portal is outside the popover, so it stays open, with focus
|
|
283
557
|
// where it was; connectedCallback moves it to follow the popover.
|
|
@@ -292,6 +566,7 @@ const PdsPopover = class {
|
|
|
292
566
|
this.restorePortalContent();
|
|
293
567
|
this.active = false;
|
|
294
568
|
this.linkTriggerToPortal();
|
|
569
|
+
this.emitOpenEvent();
|
|
295
570
|
this.pdsPopoverClose.emit({
|
|
296
571
|
componentId: this.componentId,
|
|
297
572
|
popoverType: this.popoverType,
|
|
@@ -301,36 +576,27 @@ const PdsPopover = class {
|
|
|
301
576
|
if (this.triggerEl != null) {
|
|
302
577
|
this.triggerEl.removeEventListener('click', this.handleTriggerClick);
|
|
303
578
|
}
|
|
579
|
+
this.stopListeningForHover(this.triggerEl);
|
|
304
580
|
(_a = this.triggerObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
305
581
|
this.triggerObserver = null;
|
|
306
582
|
// Clean up all event listeners
|
|
307
583
|
this.removeLightDismissListeners();
|
|
308
584
|
this.removeScrollAndResizeListeners();
|
|
309
585
|
document.removeEventListener('submit', this.handleSubmitFromPanel, true);
|
|
310
|
-
|
|
311
|
-
this.
|
|
586
|
+
document.removeEventListener('keydown', this.syncTabGuard, true);
|
|
587
|
+
(_b = this.tabGuardEl) === null || _b === void 0 ? void 0 : _b.removeAttribute('tabindex');
|
|
588
|
+
this.clearHoverTimers();
|
|
589
|
+
this.hoverOpened = false;
|
|
312
590
|
// Remove portal from DOM
|
|
313
591
|
this.removePortal();
|
|
314
592
|
}
|
|
315
|
-
/**
|
|
316
|
-
* Clears any pending debounce timers
|
|
317
|
-
*/
|
|
318
|
-
clearDebounceTimers() {
|
|
319
|
-
if (this.scrollDebounceTimer !== null) {
|
|
320
|
-
clearTimeout(this.scrollDebounceTimer);
|
|
321
|
-
this.scrollDebounceTimer = null;
|
|
322
|
-
}
|
|
323
|
-
if (this.resizeDebounceTimer !== null) {
|
|
324
|
-
clearTimeout(this.resizeDebounceTimer);
|
|
325
|
-
this.resizeDebounceTimer = null;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
593
|
createPortal() {
|
|
329
594
|
var _a;
|
|
330
595
|
if (this.portalEl !== null)
|
|
331
596
|
return;
|
|
332
597
|
this.portalEl = document.createElement('div');
|
|
333
598
|
this.portalEl.className = 'pds-popover';
|
|
599
|
+
panelOwners.set(this.portalEl, this);
|
|
334
600
|
// Apply all styles inline since portal is outside shadow DOM
|
|
335
601
|
this.portalEl.style.position = 'fixed';
|
|
336
602
|
this.portalEl.style.zIndex = 'var(--pine-z-index-raised)';
|
|
@@ -342,7 +608,7 @@ const PdsPopover = class {
|
|
|
342
608
|
this.portalEl.style.borderRadius = 'var(--pine-dimension-125)';
|
|
343
609
|
this.portalEl.style.boxShadow = 'var(--pine-box-shadow-200)';
|
|
344
610
|
this.portalEl.style.margin = 'var(--pine-dimension-none)';
|
|
345
|
-
this.portalEl.style.padding =
|
|
611
|
+
this.portalEl.style.padding = this.paddingToken();
|
|
346
612
|
// Generate unique ID
|
|
347
613
|
if (!this.componentId) {
|
|
348
614
|
(_a = this.generatedPortalId) !== null && _a !== void 0 ? _a : (this.generatedPortalId = `pds-popover-portal-${PdsPopover.instanceCounter++}`);
|
|
@@ -356,6 +622,8 @@ const PdsPopover = class {
|
|
|
356
622
|
// Add global focus styles to match Pine design system
|
|
357
623
|
// This is done after appending to ensure it's part of the document and can access CSS variables
|
|
358
624
|
this.addPortalFocusStyles();
|
|
625
|
+
this.listenForHover(this.portalEl);
|
|
626
|
+
this.portalEl.addEventListener('keydown', this.handleTabFromPanel);
|
|
359
627
|
}
|
|
360
628
|
/**
|
|
361
629
|
* Adds Pine design system focus styles and dark mode border to the portal element
|
|
@@ -483,27 +751,40 @@ const PdsPopover = class {
|
|
|
483
751
|
// Update portal content with latest slot content
|
|
484
752
|
this.updatePortalContent();
|
|
485
753
|
// Show portal. The attribute tells a modal around it that this popover takes Escape first; only
|
|
486
|
-
// an auto popover listens for Escape.
|
|
487
|
-
if (this.popoverType === 'auto')
|
|
754
|
+
// an auto popover, or one hover opened, listens for Escape.
|
|
755
|
+
if (this.popoverType === 'auto' || this.hoverOpened)
|
|
488
756
|
this.portalEl.setAttribute('data-pds-popover-open', '');
|
|
489
757
|
this.portalEl.style.display = 'block';
|
|
490
758
|
this.portalEl.style.opacity = '1';
|
|
491
759
|
this.portalEl.style.visibility = 'visible';
|
|
492
|
-
// Position the popover
|
|
493
|
-
requestAnimationFrame(() => {
|
|
494
|
-
if (!this.isComponentMounted)
|
|
495
|
-
return;
|
|
496
|
-
this.handlePopoverPositioning();
|
|
497
|
-
});
|
|
498
|
-
// Add scroll and resize listeners for repositioning (always)
|
|
760
|
+
// Position the popover now, and again whenever its trigger or the page moves or resizes
|
|
499
761
|
this.addScrollAndResizeListeners();
|
|
500
762
|
document.addEventListener('submit', this.handleSubmitFromPanel, true);
|
|
501
|
-
|
|
763
|
+
document.addEventListener('keydown', this.syncTabGuard, true);
|
|
764
|
+
// Add document listeners for light dismiss and escape key (auto type only), or for the escape
|
|
765
|
+
// key alone while hover holds a manual popover open
|
|
502
766
|
if (this.popoverType === 'auto') {
|
|
503
|
-
|
|
767
|
+
popoversTakingEscape.push(this);
|
|
504
768
|
this.addLightDismissListeners();
|
|
505
769
|
}
|
|
506
|
-
|
|
770
|
+
else if (this.hoverOpened) {
|
|
771
|
+
popoversTakingEscape.push(this);
|
|
772
|
+
document.addEventListener('keydown', this.boundEscapeKeyHandler);
|
|
773
|
+
}
|
|
774
|
+
// Emit open event once the panel is positioned, with the side it took already on it. A reconnect, a
|
|
775
|
+
// trigger swap or another show() can start a newer run meanwhile, which drops this one, so wait for the latest.
|
|
776
|
+
this.openEventPending = true;
|
|
777
|
+
let positioning;
|
|
778
|
+
do {
|
|
779
|
+
positioning = this.positioning;
|
|
780
|
+
await positioning;
|
|
781
|
+
} while (positioning !== this.positioning);
|
|
782
|
+
this.emitOpenEvent();
|
|
783
|
+
}
|
|
784
|
+
emitOpenEvent() {
|
|
785
|
+
if (!this.openEventPending)
|
|
786
|
+
return;
|
|
787
|
+
this.openEventPending = false;
|
|
507
788
|
this.pdsPopoverOpen.emit({
|
|
508
789
|
componentId: this.componentId,
|
|
509
790
|
popoverType: this.popoverType,
|
|
@@ -513,9 +794,12 @@ const PdsPopover = class {
|
|
|
513
794
|
* Closes the popover programmatically
|
|
514
795
|
*/
|
|
515
796
|
async hide() {
|
|
797
|
+
var _a;
|
|
798
|
+
this.clearHoverTimers();
|
|
516
799
|
if (!this.active || !this.portalEl)
|
|
517
800
|
return;
|
|
518
801
|
this.active = false;
|
|
802
|
+
this.hoverOpened = false;
|
|
519
803
|
this.unwatchDialogClose();
|
|
520
804
|
// Restoring the content drops its focus to the body, so check where focus is first. In a
|
|
521
805
|
// shadow root, document.activeElement is only its host.
|
|
@@ -526,6 +810,7 @@ const PdsPopover = class {
|
|
|
526
810
|
// Hide portal. The dark-mode border set in a shadow root is worked out again on the next open.
|
|
527
811
|
this.portalEl.style.border = '';
|
|
528
812
|
this.portalEl.removeAttribute('data-pds-popover-open');
|
|
813
|
+
this.portalEl.removeAttribute('data-pds-popover-placement');
|
|
529
814
|
this.portalEl.style.display = 'none';
|
|
530
815
|
this.portalEl.style.opacity = '0';
|
|
531
816
|
this.portalEl.style.visibility = 'hidden';
|
|
@@ -539,8 +824,11 @@ const PdsPopover = class {
|
|
|
539
824
|
this.removeLightDismissListeners();
|
|
540
825
|
this.removeScrollAndResizeListeners();
|
|
541
826
|
document.removeEventListener('submit', this.handleSubmitFromPanel, true);
|
|
542
|
-
|
|
543
|
-
this.
|
|
827
|
+
document.removeEventListener('keydown', this.syncTabGuard, true);
|
|
828
|
+
(_a = this.tabGuardEl) === null || _a === void 0 ? void 0 : _a.removeAttribute('tabindex');
|
|
829
|
+
this.releasePanel();
|
|
830
|
+
// Closed before its first position resolved, it still announces the open before the close.
|
|
831
|
+
this.emitOpenEvent();
|
|
544
832
|
// Emit close event
|
|
545
833
|
this.pdsPopoverClose.emit({
|
|
546
834
|
componentId: this.componentId,
|
|
@@ -552,10 +840,10 @@ const PdsPopover = class {
|
|
|
552
840
|
*/
|
|
553
841
|
async toggle() {
|
|
554
842
|
if (this.active) {
|
|
555
|
-
this.hide();
|
|
843
|
+
await this.hide();
|
|
556
844
|
}
|
|
557
845
|
else {
|
|
558
|
-
this.show();
|
|
846
|
+
await this.show();
|
|
559
847
|
}
|
|
560
848
|
}
|
|
561
849
|
/**
|
|
@@ -594,9 +882,9 @@ const PdsPopover = class {
|
|
|
594
882
|
this.portalEl.style.border = root instanceof ShadowRoot && closest.closest('[data-theme="dark"]', this.el) ? 'var(--pine-border)' : '';
|
|
595
883
|
}
|
|
596
884
|
forgetOpen() {
|
|
597
|
-
const index =
|
|
885
|
+
const index = popoversTakingEscape.indexOf(this);
|
|
598
886
|
if (index >= 0)
|
|
599
|
-
|
|
887
|
+
popoversTakingEscape.splice(index, 1);
|
|
600
888
|
}
|
|
601
889
|
/**
|
|
602
890
|
* Whether an Escape is this popover's. One from a dialog the popover isn't in belongs to that
|
|
@@ -639,19 +927,62 @@ const PdsPopover = class {
|
|
|
639
927
|
document.removeEventListener('click', this.boundClickOutsideHandler, true);
|
|
640
928
|
document.removeEventListener('keydown', this.boundEscapeKeyHandler);
|
|
641
929
|
}
|
|
930
|
+
/**
|
|
931
|
+
* The panel's controls that Tab reaches through the guard. None when the panel sits right after
|
|
932
|
+
* the popover, in a dialog, where it's already next in the Tab order.
|
|
933
|
+
*/
|
|
934
|
+
guardedTabbables() {
|
|
935
|
+
if (this.portalEl == null || this.el.nextElementSibling === this.portalEl)
|
|
936
|
+
return [];
|
|
937
|
+
return tabbable.tabbableIn(this.portalEl);
|
|
938
|
+
}
|
|
939
|
+
isAfterPopover(node) {
|
|
940
|
+
if (closest.containsComposed(this.el, node))
|
|
941
|
+
return false;
|
|
942
|
+
return isPosition(positionAcrossTrees(this.el, node), Node.DOCUMENT_POSITION_FOLLOWING);
|
|
943
|
+
}
|
|
944
|
+
/**
|
|
945
|
+
* Moves focus to the guard without preventing the Tab, so the browser's Tab carries on from there.
|
|
946
|
+
* Inert until then, the panel can't be where it lands.
|
|
947
|
+
*/
|
|
948
|
+
leavePanel(edge, backward) {
|
|
949
|
+
var _a, _b;
|
|
950
|
+
this.leavingPanel = true;
|
|
951
|
+
(_a = this.tabGuardEl) === null || _a === void 0 ? void 0 : _a.focus();
|
|
952
|
+
this.leavingPanel = false;
|
|
953
|
+
this.portalEl.inert = true;
|
|
954
|
+
setTimeout(() => this.finishLeavingPanel(edge));
|
|
955
|
+
// Last in another popover's panel, the guard hands the Tab on to that popover's own guard.
|
|
956
|
+
const outer = panelOwners.get(closest.closest('.pds-popover', this.el));
|
|
957
|
+
const outerTabbables = (_b = outer === null || outer === void 0 ? void 0 : outer.guardedTabbables()) !== null && _b !== void 0 ? _b : [];
|
|
958
|
+
if (!backward && outerTabbables[outerTabbables.length - 1] === this.tabGuardEl)
|
|
959
|
+
outer.leavePanel(edge, false);
|
|
960
|
+
}
|
|
961
|
+
// With nowhere for the browser's Tab to go, focus would stay on the invisible guard.
|
|
962
|
+
finishLeavingPanel(edge) {
|
|
963
|
+
var _a;
|
|
964
|
+
this.releasePanel();
|
|
965
|
+
if (this.active && ((_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) === this.tabGuardEl)
|
|
966
|
+
edge.focus();
|
|
967
|
+
}
|
|
642
968
|
/**
|
|
643
969
|
* Adds scroll and resize listeners for repositioning
|
|
644
970
|
*/
|
|
645
971
|
addScrollAndResizeListeners() {
|
|
646
|
-
|
|
647
|
-
|
|
972
|
+
this.removeScrollAndResizeListeners();
|
|
973
|
+
if (this.triggerEl == null || this.portalEl == null)
|
|
974
|
+
return;
|
|
975
|
+
this.stopAutoUpdate = floatingUi_dom.autoUpdate(this.triggerEl, this.portalEl, () => {
|
|
976
|
+
this.positioning = this.handlePopoverPositioning().catch(error => console.warn('pds-popover: failed to position the panel', error));
|
|
977
|
+
});
|
|
648
978
|
}
|
|
649
979
|
/**
|
|
650
980
|
* Removes scroll and resize listeners
|
|
651
981
|
*/
|
|
652
982
|
removeScrollAndResizeListeners() {
|
|
653
|
-
|
|
654
|
-
|
|
983
|
+
var _a;
|
|
984
|
+
(_a = this.stopAutoUpdate) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
985
|
+
this.stopAutoUpdate = null;
|
|
655
986
|
}
|
|
656
987
|
/**
|
|
657
988
|
* Handles clicks outside the popover for light dismiss (auto type only)
|
|
@@ -705,7 +1036,7 @@ const PdsPopover = class {
|
|
|
705
1036
|
return;
|
|
706
1037
|
// Like the native Popover API, Escape closes only the top popover: the last one opened that
|
|
707
1038
|
// it applies to. Every open popover hears it, so each checks whether it's that one.
|
|
708
|
-
const top = [...
|
|
1039
|
+
const top = [...popoversTakingEscape].reverse().find(popover => popover.takesEscapeFrom(event));
|
|
709
1040
|
if (top !== this)
|
|
710
1041
|
return;
|
|
711
1042
|
// Take the key, so the dialog or modal around it doesn't close too.
|
|
@@ -715,125 +1046,47 @@ const PdsPopover = class {
|
|
|
715
1046
|
this.hide();
|
|
716
1047
|
}
|
|
717
1048
|
/**
|
|
718
|
-
*
|
|
719
|
-
|
|
720
|
-
handleScroll() {
|
|
721
|
-
if (!this.active)
|
|
722
|
-
return;
|
|
723
|
-
if (this.scrollDebounceTimer !== null) {
|
|
724
|
-
clearTimeout(this.scrollDebounceTimer);
|
|
725
|
-
}
|
|
726
|
-
this.scrollDebounceTimer = setTimeout(() => {
|
|
727
|
-
this.handlePopoverPositioning();
|
|
728
|
-
this.scrollDebounceTimer = null;
|
|
729
|
-
}, 10); // 10ms debounce for smooth repositioning
|
|
730
|
-
}
|
|
731
|
-
/**
|
|
732
|
-
* Handles resize events to reposition the popover (debounced for performance)
|
|
1049
|
+
* Positions the popover relative to its trigger element, flipping to the opposite side when only that side has
|
|
1050
|
+
* room and shifting to stay 8px inside the viewport. The side it takes goes on the panel's `data-pds-popover-placement`.
|
|
733
1051
|
*/
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
if (this.
|
|
738
|
-
clearTimeout(this.resizeDebounceTimer);
|
|
739
|
-
}
|
|
740
|
-
this.resizeDebounceTimer = setTimeout(() => {
|
|
741
|
-
this.handlePopoverPositioning();
|
|
742
|
-
this.resizeDebounceTimer = null;
|
|
743
|
-
}, 100); // 100ms debounce for resize
|
|
744
|
-
}
|
|
745
|
-
/**
|
|
746
|
-
* Positions the popover relative to its trigger element
|
|
747
|
-
*/
|
|
748
|
-
handlePopoverPositioning() {
|
|
749
|
-
// Prevent repositioning loops
|
|
750
|
-
if (this.isRepositioning) {
|
|
751
|
-
return;
|
|
752
|
-
}
|
|
753
|
-
this.isRepositioning = true;
|
|
754
|
-
if (this.triggerEl == null || this.portalEl == null) {
|
|
755
|
-
this.isRepositioning = false;
|
|
1052
|
+
async handlePopoverPositioning() {
|
|
1053
|
+
// Counted before the guards, so a run still in flight is dropped even when this one can't position.
|
|
1054
|
+
const run = ++this.positioningRun;
|
|
1055
|
+
if (this.triggerEl == null || this.portalEl == null)
|
|
756
1056
|
return;
|
|
757
|
-
}
|
|
758
|
-
const triggerRect = this.triggerEl.getBoundingClientRect();
|
|
759
|
-
const popoverRect = this.portalEl.getBoundingClientRect();
|
|
760
1057
|
// Safety check: ensure trigger has valid dimensions (is rendered and visible)
|
|
761
|
-
|
|
762
|
-
|
|
1058
|
+
const triggerRect = this.triggerEl.getBoundingClientRect();
|
|
1059
|
+
if (triggerRect.width === 0 || triggerRect.height === 0)
|
|
763
1060
|
return;
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
break;
|
|
777
|
-
case 'top-end':
|
|
778
|
-
top = triggerRect.top - popoverRect.height - offset;
|
|
779
|
-
left = triggerRect.right - popoverRect.width;
|
|
780
|
-
break;
|
|
781
|
-
case 'right':
|
|
782
|
-
top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;
|
|
783
|
-
left = triggerRect.right + offset;
|
|
784
|
-
break;
|
|
785
|
-
case 'right-start':
|
|
786
|
-
top = triggerRect.top;
|
|
787
|
-
left = triggerRect.right + offset;
|
|
788
|
-
break;
|
|
789
|
-
case 'right-end':
|
|
790
|
-
top = triggerRect.bottom - popoverRect.height;
|
|
791
|
-
left = triggerRect.right + offset;
|
|
792
|
-
break;
|
|
793
|
-
case 'bottom':
|
|
794
|
-
top = triggerRect.bottom + offset;
|
|
795
|
-
left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;
|
|
796
|
-
break;
|
|
797
|
-
case 'bottom-start':
|
|
798
|
-
top = triggerRect.bottom + offset;
|
|
799
|
-
left = triggerRect.left;
|
|
800
|
-
break;
|
|
801
|
-
case 'bottom-end':
|
|
802
|
-
top = triggerRect.bottom + offset;
|
|
803
|
-
left = triggerRect.right - popoverRect.width;
|
|
804
|
-
break;
|
|
805
|
-
case 'left':
|
|
806
|
-
top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;
|
|
807
|
-
left = triggerRect.left - popoverRect.width - offset;
|
|
808
|
-
break;
|
|
809
|
-
case 'left-start':
|
|
810
|
-
top = triggerRect.top;
|
|
811
|
-
left = triggerRect.left - popoverRect.width - offset;
|
|
812
|
-
break;
|
|
813
|
-
case 'left-end':
|
|
814
|
-
top = triggerRect.bottom - popoverRect.height;
|
|
815
|
-
left = triggerRect.left - popoverRect.width - offset;
|
|
816
|
-
break;
|
|
817
|
-
}
|
|
818
|
-
this.portalEl.style.top = `${top}px`;
|
|
819
|
-
this.portalEl.style.left = `${left}px`;
|
|
1061
|
+
const portal = this.portalEl;
|
|
1062
|
+
const { x: left, y: top, placement } = await floatingUi_dom.computePosition(this.triggerEl, portal, {
|
|
1063
|
+
placement: this.placement,
|
|
1064
|
+
strategy: 'fixed',
|
|
1065
|
+
// With no room on either side, stay on the preferred side: the side that overflows less can still push
|
|
1066
|
+
// a tall panel's start above the viewport.
|
|
1067
|
+
middleware: [floatingUi_dom.offset(8), floatingUi_dom.flip({ fallbackStrategy: 'initialPlacement' }), floatingUi_dom.shift({ padding: 8 })],
|
|
1068
|
+
platform: viewportPlatform,
|
|
1069
|
+
});
|
|
1070
|
+
if (!this.active || run !== this.positioningRun || portal !== this.portalEl)
|
|
1071
|
+
return;
|
|
1072
|
+
portal.setAttribute('data-pds-popover-placement', placement);
|
|
820
1073
|
// `position: fixed` measures from the viewport unless an ancestor becomes its containing block,
|
|
821
|
-
// as a modal dialog does with its backdrop filter.
|
|
822
|
-
const
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
this.portalEl.style.left = `${2 * left - placed.left}px`;
|
|
826
|
-
}
|
|
827
|
-
// Reset the repositioning guard after a short delay
|
|
828
|
-
setTimeout(() => {
|
|
829
|
-
this.isRepositioning = false;
|
|
830
|
-
}, 16); // ~1 frame at 60fps
|
|
1074
|
+
// as a modal dialog does with its backdrop filter. Offset by however far that block's corner is from the viewport's.
|
|
1075
|
+
const origin = containingBlockOrigin(portal);
|
|
1076
|
+
portal.style.top = `${top - origin.top}px`;
|
|
1077
|
+
portal.style.left = `${left - origin.left}px`;
|
|
831
1078
|
}
|
|
832
1079
|
render() {
|
|
833
|
-
return (index.h(index.Host, { key: '
|
|
1080
|
+
return (index.h(index.Host, { key: '85422eb7544a4795ce78b51684b7224a5d856a4e', id: this.componentId }, index.h("span", { key: '6fe9c827ed4d46ca723d6013f296faf80ba31366', class: "pds-popover__trigger-wrapper" }, index.h("slot", { key: '970d1974d2be1451e670a36e7d2ccdc5979595bb', name: "trigger", onSlotchange: this.handleTriggerSlotChange })), index.h("span", { key: '0c76f76286a30d8e6e948bd0abab3317b3673aa6', class: "pds-popover__tab-guard", ref: (el) => (this.tabGuardEl = el !== null && el !== void 0 ? el : null), onFocus: this.handleTabGuardFocus }), index.h("div", { key: '692c45e93899e74a3d5970f3a3625f6115ab63b0', class: "pds-popover__content-slot-wrapper" }, index.h("slot", { key: 'f1566e0eb1eb08626f2a8285447702ce96b09f4d', onSlotchange: this.handleContentSlotChange }))));
|
|
834
1081
|
}
|
|
835
1082
|
get el() { return index.getElement(this); }
|
|
836
1083
|
static get watchers() { return {
|
|
1084
|
+
"openOn": [{
|
|
1085
|
+
"openOnChanged": 0
|
|
1086
|
+
}],
|
|
1087
|
+
"padding": [{
|
|
1088
|
+
"applyPadding": 0
|
|
1089
|
+
}],
|
|
837
1090
|
"placement": [{
|
|
838
1091
|
"restorePlacementDefault": 0
|
|
839
1092
|
}]
|