@pine-ds/core 4.9.0 → 4.9.1
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/mock-pds-modal.js +1 -1
- package/components/pds-chip2.js +1 -1
- package/components/pds-datepicker.js +1 -1
- package/components/pds-icon2.js +1 -1
- package/components/pds-link2.js +1 -1
- package/components/pds-modal2.js +1 -1
- package/components/pds-multiselect.js +1 -1
- package/components/pds-radio-group.js +1 -1
- package/components/pds-text2.js +1 -1
- package/components/pds-tooltip.js +1 -1
- package/components/portal-target.js +1 -0
- package/components/tabbable.js +1 -1
- package/components/truncation-tooltip.js +1 -1
- package/dist/cjs/{index-Do70atou.js → index-BDnbr0DK.js} +1 -1
- package/dist/cjs/{index-BsWY_xEJ.js → index-D9iJuJCP.js} +12 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/mock-pds-modal.cjs.entry.js +2 -2
- package/dist/cjs/pds-accordion.cjs.entry.js +2 -2
- package/dist/cjs/pds-alert.cjs.entry.js +1 -1
- package/dist/cjs/pds-avatar.cjs.entry.js +2 -2
- package/dist/cjs/pds-box.cjs.entry.js +1 -1
- package/dist/cjs/pds-button.cjs.entry.js +2 -2
- package/dist/cjs/pds-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/pds-chip.cjs.entry.js +6 -8
- package/dist/cjs/pds-combobox.cjs.entry.js +1 -1
- package/dist/cjs/pds-container.cjs.entry.js +1 -1
- package/dist/cjs/pds-copytext.cjs.entry.js +4 -3
- package/dist/cjs/pds-datepicker.cjs.entry.js +4 -41
- package/dist/cjs/pds-divider.cjs.entry.js +1 -1
- package/dist/cjs/pds-drawer-content.cjs.entry.js +1 -1
- package/dist/cjs/pds-drawer-footer.cjs.entry.js +1 -1
- package/dist/cjs/pds-drawer-header.cjs.entry.js +1 -1
- package/dist/cjs/pds-drawer.cjs.entry.js +1 -1
- package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +1 -1
- package/dist/cjs/pds-dropdown-menu-separator.cjs.entry.js +1 -1
- package/dist/cjs/pds-dropdown-menu.cjs.entry.js +1 -1
- package/dist/cjs/pds-filter.cjs.entry.js +2 -2
- package/dist/cjs/pds-filters.cjs.entry.js +1 -1
- package/dist/cjs/pds-icon.cjs.entry.js +54 -21
- package/dist/cjs/pds-image.cjs.entry.js +1 -1
- package/dist/cjs/pds-input.cjs.entry.js +2 -2
- package/dist/cjs/pds-link.cjs.entry.js +3 -3
- package/dist/cjs/pds-loader.cjs.entry.js +1 -1
- package/dist/cjs/pds-modal-content.cjs.entry.js +1 -1
- package/dist/cjs/pds-modal-footer.cjs.entry.js +1 -1
- package/dist/cjs/pds-modal-header.cjs.entry.js +1 -1
- package/dist/cjs/pds-modal.cjs.entry.js +3 -3
- package/dist/cjs/pds-multiselect.cjs.entry.js +11 -5
- package/dist/cjs/pds-popover.cjs.entry.js +2 -2
- package/dist/cjs/pds-progress.cjs.entry.js +1 -1
- package/dist/cjs/pds-property.cjs.entry.js +1 -1
- package/dist/cjs/pds-radio-group.cjs.entry.js +66 -5
- package/dist/cjs/pds-radio.cjs.entry.js +2 -2
- package/dist/cjs/pds-row.cjs.entry.js +1 -1
- package/dist/cjs/pds-select.cjs.entry.js +2 -2
- package/dist/cjs/pds-sortable-item.cjs.entry.js +2 -2
- package/dist/cjs/pds-sortable.cjs.entry.js +1 -1
- package/dist/cjs/pds-switch.cjs.entry.js +2 -2
- package/dist/cjs/pds-tab.cjs.entry.js +1 -1
- package/dist/cjs/pds-table-body.cjs.entry.js +1 -1
- package/dist/cjs/pds-table-cell.cjs.entry.js +3 -2
- package/dist/cjs/pds-table-head-cell.cjs.entry.js +2 -2
- package/dist/cjs/pds-table-head.cjs.entry.js +1 -1
- package/dist/cjs/pds-table-row.cjs.entry.js +1 -1
- package/dist/cjs/pds-table.cjs.entry.js +1 -1
- package/dist/cjs/pds-tabpanel.cjs.entry.js +1 -1
- package/dist/cjs/pds-tabs.cjs.entry.js +1 -1
- package/dist/cjs/pds-text.cjs.entry.js +29 -3
- package/dist/cjs/pds-textarea.cjs.entry.js +2 -2
- package/dist/cjs/pds-toast.cjs.entry.js +1 -1
- package/dist/cjs/pds-tooltip.cjs.entry.js +16 -5
- package/dist/cjs/pine-core.cjs.js +2 -2
- package/dist/cjs/portal-target-e8WQ6dLx.js +70 -0
- package/dist/cjs/{tabbable-CddSt_Hi.js → tabbable-BrrrGvdG.js} +2 -1
- package/dist/cjs/{truncation-tooltip-O5nQmXPw.js → truncation-tooltip-DdB78RIe.js} +43 -3
- package/dist/collection/components/pds-chip/pds-chip.js +2 -5
- package/dist/collection/components/pds-datepicker/calendar-portal.js +1 -38
- package/dist/collection/components/pds-link/pds-link.css +1 -1
- package/dist/collection/components/pds-link/stories/pds-link.stories.js +48 -0
- package/dist/collection/components/pds-modal/pds-modal.css +1 -1
- package/dist/collection/components/pds-multiselect/pds-multiselect.js +9 -3
- package/dist/collection/components/pds-radio-group/pds-radio-group.js +65 -4
- package/dist/collection/components/pds-text/pds-text.js +28 -3
- package/dist/collection/components/pds-text/stories/pds-text.stories.js +16 -0
- package/dist/collection/components/pds-tooltip/pds-tooltip.css +11 -0
- package/dist/collection/components/pds-tooltip/pds-tooltip.js +14 -3
- package/dist/collection/components/pds-tooltip/stories/pds-tooltip.stories.js +30 -0
- package/dist/collection/utils/portal-target.js +64 -0
- package/dist/collection/utils/tabbable.js +2 -1
- package/dist/collection/utils/truncation-tooltip.js +42 -3
- package/dist/docs.json +2 -2
- package/dist/esm/{index-BFSwd-GQ.js → index-4_RRPJTO.js} +12 -1
- package/dist/esm/{index-m3pqpeWg.js → index-DvN3tyZp.js} +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/mock-pds-modal.entry.js +2 -2
- package/dist/esm/pds-accordion.entry.js +2 -2
- package/dist/esm/pds-alert.entry.js +1 -1
- package/dist/esm/pds-avatar.entry.js +2 -2
- package/dist/esm/pds-box.entry.js +1 -1
- package/dist/esm/pds-button.entry.js +2 -2
- package/dist/esm/pds-checkbox.entry.js +2 -2
- package/dist/esm/pds-chip.entry.js +5 -7
- package/dist/esm/pds-combobox.entry.js +1 -1
- package/dist/esm/pds-container.entry.js +1 -1
- package/dist/esm/pds-copytext.entry.js +4 -3
- package/dist/esm/pds-datepicker.entry.js +3 -40
- package/dist/esm/pds-divider.entry.js +1 -1
- package/dist/esm/pds-drawer-content.entry.js +1 -1
- package/dist/esm/pds-drawer-footer.entry.js +1 -1
- package/dist/esm/pds-drawer-header.entry.js +1 -1
- package/dist/esm/pds-drawer.entry.js +1 -1
- package/dist/esm/pds-dropdown-menu-item.entry.js +1 -1
- package/dist/esm/pds-dropdown-menu-separator.entry.js +1 -1
- package/dist/esm/pds-dropdown-menu.entry.js +1 -1
- package/dist/esm/pds-filter.entry.js +2 -2
- package/dist/esm/pds-filters.entry.js +1 -1
- package/dist/esm/pds-icon.entry.js +54 -21
- package/dist/esm/pds-image.entry.js +1 -1
- package/dist/esm/pds-input.entry.js +2 -2
- package/dist/esm/pds-link.entry.js +3 -3
- package/dist/esm/pds-loader.entry.js +1 -1
- package/dist/esm/pds-modal-content.entry.js +1 -1
- package/dist/esm/pds-modal-footer.entry.js +1 -1
- package/dist/esm/pds-modal-header.entry.js +1 -1
- package/dist/esm/pds-modal.entry.js +3 -3
- package/dist/esm/pds-multiselect.entry.js +11 -5
- package/dist/esm/pds-popover.entry.js +2 -2
- package/dist/esm/pds-progress.entry.js +1 -1
- package/dist/esm/pds-property.entry.js +1 -1
- package/dist/esm/pds-radio-group.entry.js +66 -5
- package/dist/esm/pds-radio.entry.js +2 -2
- package/dist/esm/pds-row.entry.js +1 -1
- package/dist/esm/pds-select.entry.js +2 -2
- package/dist/esm/pds-sortable-item.entry.js +2 -2
- package/dist/esm/pds-sortable.entry.js +1 -1
- package/dist/esm/pds-switch.entry.js +2 -2
- package/dist/esm/pds-tab.entry.js +1 -1
- package/dist/esm/pds-table-body.entry.js +1 -1
- package/dist/esm/pds-table-cell.entry.js +3 -2
- package/dist/esm/pds-table-head-cell.entry.js +2 -2
- package/dist/esm/pds-table-head.entry.js +1 -1
- package/dist/esm/pds-table-row.entry.js +1 -1
- package/dist/esm/pds-table.entry.js +1 -1
- package/dist/esm/pds-tabpanel.entry.js +1 -1
- package/dist/esm/pds-tabs.entry.js +1 -1
- package/dist/esm/pds-text.entry.js +29 -3
- package/dist/esm/pds-textarea.entry.js +2 -2
- package/dist/esm/pds-toast.entry.js +1 -1
- package/dist/esm/pds-tooltip.entry.js +16 -5
- package/dist/esm/pine-core.js +3 -3
- package/dist/esm/portal-target-CKRzRKdO.js +66 -0
- package/dist/esm/{tabbable-DCKBKRUy.js → tabbable-C6ZWpp3v.js} +2 -1
- package/dist/esm/{truncation-tooltip-D_gvhB9r.js → truncation-tooltip-CRSdYzpA.js} +43 -4
- package/dist/esm-es5/{index-BFSwd-GQ.js → index-4_RRPJTO.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 +1 -1
- 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/portal-target-CKRzRKdO.js +1 -0
- package/dist/esm-es5/tabbable-C6ZWpp3v.js +1 -0
- package/dist/esm-es5/truncation-tooltip-CRSdYzpA.js +1 -0
- package/dist/pine-core/{p-7a19477e.system.entry.js → p-01f1cdaf.system.entry.js} +1 -1
- package/dist/pine-core/{p-ee449a4b.entry.js → p-07323107.entry.js} +1 -1
- package/dist/pine-core/{p-14d872d3.entry.js → p-08b8e941.entry.js} +1 -1
- package/dist/pine-core/p-0d5f0ab5.system.entry.js +1 -0
- package/dist/pine-core/{p-3cc19ea8.system.entry.js → p-1415c988.system.entry.js} +1 -1
- package/dist/pine-core/{p-de176bd9.entry.js → p-143b33a6.entry.js} +1 -1
- package/dist/pine-core/{p-e9a53a88.system.entry.js → p-14dedf01.system.entry.js} +1 -1
- package/dist/pine-core/{p-60d27247.system.entry.js → p-19cf1d91.system.entry.js} +1 -1
- package/dist/pine-core/{p-bcf57566.entry.js → p-1ca8d183.entry.js} +1 -1
- package/dist/pine-core/p-1cc39908.system.entry.js +1 -0
- package/dist/pine-core/{p-11e7d660.entry.js → p-1e3ef425.entry.js} +1 -1
- package/dist/pine-core/{p-98cc327b.entry.js → p-1f62bb71.entry.js} +2 -2
- package/dist/pine-core/p-20079552.system.entry.js +1 -0
- package/dist/pine-core/{p-6f34ad9c.entry.js → p-2a18852f.entry.js} +1 -1
- package/dist/pine-core/{p-3ce7e72e.system.entry.js → p-2b9622c1.system.entry.js} +1 -1
- package/dist/pine-core/{p-9fbcba0d.entry.js → p-2dd30d12.entry.js} +1 -1
- package/dist/pine-core/{p-8b97dd57.system.entry.js → p-3306dc5a.system.entry.js} +1 -1
- package/dist/pine-core/{p-ce554098.entry.js → p-3610cb3b.entry.js} +1 -1
- package/dist/pine-core/{p-eb93cc6e.entry.js → p-37718637.entry.js} +1 -1
- package/dist/pine-core/{p-b6edfdfe.entry.js → p-383d84f4.entry.js} +2 -2
- package/dist/pine-core/{p-079c39d1.entry.js → p-39276663.entry.js} +1 -1
- package/dist/pine-core/{p-89fefe36.entry.js → p-39e57657.entry.js} +1 -1
- package/dist/pine-core/{p-ef4d8fea.entry.js → p-3c229091.entry.js} +1 -1
- package/dist/pine-core/p-3d34b967.system.entry.js +1 -0
- package/dist/pine-core/p-3e30a761.entry.js +1 -0
- package/dist/pine-core/{p-d8bedb58.system.entry.js → p-3f8bd3fb.system.entry.js} +1 -1
- package/dist/pine-core/{p-6845867f.system.entry.js → p-42d43c3f.system.entry.js} +1 -1
- package/dist/pine-core/{p-4ee44585.system.entry.js → p-42f70f93.system.entry.js} +1 -1
- package/dist/pine-core/{p-0bd61097.system.entry.js → p-4a90b9c8.system.entry.js} +1 -1
- package/dist/pine-core/{p-64283f7b.entry.js → p-4cfe922b.entry.js} +1 -1
- package/dist/pine-core/p-4d1a8803.entry.js +1 -0
- package/dist/pine-core/p-4d47023c.system.entry.js +1 -0
- package/dist/pine-core/{p-b037dcbd.system.entry.js → p-4d98bc0c.system.entry.js} +1 -1
- package/dist/pine-core/{p-3556f6ad.entry.js → p-50ddadbf.entry.js} +1 -1
- package/dist/pine-core/{p-1e5648bf.system.entry.js → p-548bce53.system.entry.js} +1 -1
- package/dist/pine-core/{p-ebf74c43.system.entry.js → p-54f1e86f.system.entry.js} +1 -1
- package/dist/pine-core/{p-92a8cf7d.entry.js → p-590df41a.entry.js} +1 -1
- package/dist/pine-core/{p-f549f2bc.entry.js → p-5946203c.entry.js} +1 -1
- package/dist/pine-core/{p-d7db749a.system.entry.js → p-5f181694.system.entry.js} +1 -1
- package/dist/pine-core/{p-9713d6a5.system.entry.js → p-60a30975.system.entry.js} +1 -1
- package/dist/pine-core/{p-d94ebe84.entry.js → p-61cfdbb2.entry.js} +1 -1
- package/dist/pine-core/p-62aa6a78.system.entry.js +1 -0
- package/dist/pine-core/{p-cb560aab.system.entry.js → p-63f85859.system.entry.js} +1 -1
- package/dist/pine-core/{p-001d4b86.entry.js → p-64bcb378.entry.js} +1 -1
- package/dist/pine-core/{p-bdde1e53.entry.js → p-67999353.entry.js} +1 -1
- package/dist/pine-core/{p-be3b4f12.system.entry.js → p-67f795d5.system.entry.js} +1 -1
- package/dist/pine-core/{p-6b6ae1be.entry.js → p-6a1aa8d3.entry.js} +1 -1
- package/dist/pine-core/p-6f4ab1ea.system.entry.js +1 -0
- package/dist/pine-core/{p-110b4051.system.entry.js → p-724baba3.system.entry.js} +1 -1
- package/dist/pine-core/p-72659a0e.system.entry.js +1 -0
- package/dist/pine-core/{p-08bbd3e6.system.entry.js → p-73efb1ed.system.entry.js} +1 -1
- package/dist/pine-core/p-7a51f15e.entry.js +1 -0
- package/dist/pine-core/p-7b978fff.system.entry.js +1 -0
- package/dist/pine-core/p-8436cbfb.entry.js +1 -0
- package/dist/pine-core/{p-ced6a814.system.entry.js → p-849ec281.system.entry.js} +1 -1
- package/dist/pine-core/p-87a32ded.system.entry.js +1 -0
- package/dist/pine-core/{p-f09f27ab.system.entry.js → p-89d38a82.system.entry.js} +1 -1
- package/dist/pine-core/{p-6602b4d0.entry.js → p-8ade17ce.entry.js} +1 -1
- package/dist/pine-core/{p-ebf0c51b.system.entry.js → p-8afd5f5b.system.entry.js} +1 -1
- package/dist/pine-core/{p-9fe4a64a.entry.js → p-8e7f75e6.entry.js} +1 -1
- package/dist/pine-core/{p-b9d71b76.entry.js → p-8fb520df.entry.js} +1 -1
- package/dist/pine-core/{p-3b5b8f73.entry.js → p-92115e88.entry.js} +1 -1
- package/dist/pine-core/p-93fd7dd8.system.entry.js +1 -0
- package/dist/pine-core/{p-239774c9.entry.js → p-947582e1.entry.js} +1 -1
- package/dist/pine-core/{p-98843402.system.entry.js → p-94c9b7d1.system.entry.js} +1 -1
- package/dist/pine-core/p-973c3ac0.entry.js +1 -0
- package/dist/pine-core/p-97653e60.entry.js +1 -0
- package/dist/pine-core/{p-7073146f.entry.js → p-97b73359.entry.js} +1 -1
- package/dist/pine-core/{p-bfdfbe9f.entry.js → p-99530cb5.entry.js} +1 -1
- package/dist/pine-core/p-9a776443.entry.js +1 -0
- package/dist/pine-core/{p-50af67ea.system.entry.js → p-9b32727a.system.entry.js} +1 -1
- package/dist/pine-core/{p-CjRCtzPD.system.js → p-BK1sLRfg.system.js} +1 -1
- package/dist/pine-core/p-C6ZWpp3v.js +1 -0
- package/dist/pine-core/p-CKRzRKdO.js +1 -0
- package/dist/pine-core/p-DQyF6v9Q.system.js +1 -0
- package/dist/pine-core/p-DwQ5Tjis.js +1 -0
- package/dist/pine-core/{p-BplEmwUQ.js → p-M31tvpDN.js} +2 -2
- package/dist/pine-core/{p-DXO1yd32.system.js → p-XK45dzWR.system.js} +1 -1
- package/dist/pine-core/{p-d9243653.system.entry.js → p-a09c9c5e.system.entry.js} +1 -1
- package/dist/pine-core/{p-55fce29e.entry.js → p-a4ce12ef.entry.js} +1 -1
- package/dist/pine-core/{p-dea2a254.entry.js → p-a594c41f.entry.js} +1 -1
- package/dist/pine-core/{p-2d5b1deb.entry.js → p-a9d96e22.entry.js} +1 -1
- package/dist/pine-core/{p-e1fdd53a.system.entry.js → p-ad5208a4.system.entry.js} +1 -1
- package/dist/pine-core/{p-9a8d2985.system.entry.js → p-b3d4f97a.system.entry.js} +2 -2
- package/dist/pine-core/{p-25bf2f26.system.entry.js → p-bcc378ba.system.entry.js} +2 -2
- package/dist/pine-core/{p-3f62581a.system.entry.js → p-bd7dc317.system.entry.js} +1 -1
- package/dist/pine-core/p-beb7a430.entry.js +1 -0
- package/dist/pine-core/p-bfa34194.entry.js +1 -0
- package/dist/pine-core/{p-5c46553f.system.entry.js → p-c2afe4f3.system.entry.js} +1 -1
- package/dist/pine-core/{p-17fc76e7.system.entry.js → p-c5e1eb3c.system.entry.js} +1 -1
- package/dist/pine-core/{p-7a14473e.entry.js → p-c7a53c4f.entry.js} +1 -1
- package/dist/pine-core/{p-5967d9fa.system.entry.js → p-c8a0b562.system.entry.js} +1 -1
- package/dist/pine-core/{p-735b3631.entry.js → p-c9ae7964.entry.js} +1 -1
- package/dist/pine-core/{p-b243767b.system.entry.js → p-cb9baf78.system.entry.js} +1 -1
- package/dist/pine-core/{p-6d64e6c7.entry.js → p-ce9fa14b.entry.js} +1 -1
- package/dist/pine-core/{p-68fdfb8f.system.entry.js → p-d018dc60.system.entry.js} +1 -1
- package/dist/pine-core/p-d47b2a6a.system.entry.js +1 -0
- package/dist/pine-core/{p-0790dd0d.system.entry.js → p-d48fe5a0.system.entry.js} +1 -1
- package/dist/pine-core/{p-414faecf.entry.js → p-d6f338e0.entry.js} +1 -1
- package/dist/pine-core/{p-b7cbd913.system.entry.js → p-d920d759.system.entry.js} +1 -1
- package/dist/pine-core/{p-87642228.entry.js → p-d9719e37.entry.js} +1 -1
- package/dist/pine-core/{p-f2c487e6.entry.js → p-db7fb5a3.entry.js} +1 -1
- package/dist/pine-core/{p-a7d25143.entry.js → p-e1d1b5d8.entry.js} +1 -1
- package/dist/pine-core/p-e3de6a1d.entry.js +1 -0
- package/dist/pine-core/{p-2c0047cd.entry.js → p-e7002cee.entry.js} +1 -1
- package/dist/pine-core/{p-5133e8be.system.entry.js → p-e82f758f.system.entry.js} +1 -1
- package/dist/pine-core/p-e84fa9ed.entry.js +1 -0
- package/dist/pine-core/{p-9dbc017f.system.entry.js → p-eb4f0daa.system.entry.js} +1 -1
- package/dist/pine-core/p-eeYeEogd.system.js +1 -0
- package/dist/pine-core/{p-b33ad96e.system.entry.js → p-eecd9ad8.system.entry.js} +1 -1
- package/dist/pine-core/{p-06279b93.system.entry.js → p-ef0eba9b.system.entry.js} +1 -1
- package/dist/pine-core/{p-0c60f577.system.entry.js → p-ef3a855f.system.entry.js} +1 -1
- package/dist/pine-core/{p-fc743f6e.entry.js → p-f018af99.entry.js} +1 -1
- package/dist/pine-core/{p-6dad76cb.system.entry.js → p-f11cce27.system.entry.js} +1 -1
- package/dist/pine-core/{p-bda7e3be.entry.js → p-f6f4fd42.entry.js} +1 -1
- package/dist/pine-core/{p-7fcf3d37.entry.js → p-f71d71ca.entry.js} +1 -1
- package/dist/pine-core/p-f9063262.system.entry.js +1 -0
- package/dist/pine-core/p-f99bd77f.entry.js +1 -0
- package/dist/pine-core/p-wB2y8gR7.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-datepicker/calendar-portal.d.ts +0 -7
- package/dist/types/components/pds-radio-group/pds-radio-group.d.ts +8 -0
- package/dist/types/components/pds-text/pds-text.d.ts +4 -0
- package/dist/types/components/pds-tooltip/pds-tooltip.d.ts +1 -0
- package/dist/types/components.d.ts +2 -2
- package/dist/types/utils/portal-target.d.ts +17 -0
- package/dist/types/utils/truncation-tooltip.d.ts +5 -2
- package/dist/vscode.html-data.json +3 -3
- package/hydrate/index.js +258 -82
- package/hydrate/index.mjs +258 -82
- package/package.json +2 -2
- package/dist/esm-es5/tabbable-DCKBKRUy.js +0 -1
- package/dist/esm-es5/truncation-tooltip-D_gvhB9r.js +0 -1
- package/dist/pine-core/p-07b4524e.entry.js +0 -1
- package/dist/pine-core/p-22ae92f7.system.entry.js +0 -1
- package/dist/pine-core/p-272b24ad.system.entry.js +0 -1
- package/dist/pine-core/p-38b87aa2.system.entry.js +0 -1
- package/dist/pine-core/p-3afb1208.entry.js +0 -1
- package/dist/pine-core/p-463a29fa.entry.js +0 -1
- package/dist/pine-core/p-568a9a79.system.entry.js +0 -1
- package/dist/pine-core/p-5ce5836e.system.entry.js +0 -1
- package/dist/pine-core/p-5f3242c8.system.entry.js +0 -1
- package/dist/pine-core/p-60e3b1af.entry.js +0 -1
- package/dist/pine-core/p-7d3a20ba.entry.js +0 -1
- package/dist/pine-core/p-9201b497.system.entry.js +0 -1
- package/dist/pine-core/p-94597b73.entry.js +0 -1
- package/dist/pine-core/p-97be00f4.system.entry.js +0 -1
- package/dist/pine-core/p-9a8971e2.system.entry.js +0 -1
- package/dist/pine-core/p-CirzxZ33.js +0 -1
- package/dist/pine-core/p-D52aRqFx.system.js +0 -1
- package/dist/pine-core/p-DCKBKRUy.js +0 -1
- package/dist/pine-core/p-a2078add.entry.js +0 -1
- package/dist/pine-core/p-a48b025a.system.entry.js +0 -1
- package/dist/pine-core/p-ad3b1ec3.entry.js +0 -1
- package/dist/pine-core/p-b017eb99.system.entry.js +0 -1
- package/dist/pine-core/p-c02a32ec.entry.js +0 -1
- package/dist/pine-core/p-c1da80e5.entry.js +0 -1
- package/dist/pine-core/p-c233866c.system.entry.js +0 -1
- package/dist/pine-core/p-d7930540.entry.js +0 -1
- package/dist/pine-core/p-dfadfcd1.entry.js +0 -1
- package/dist/pine-core/p-e70cb112.system.entry.js +0 -1
- package/dist/pine-core/p-wXfuz0Bd.system.js +0 -1
- /package/dist/esm-es5/{index-m3pqpeWg.js → index-DvN3tyZp.js} +0 -0
- /package/dist/pine-core/{p-m3pqpeWg.js → p-DvN3tyZp.js} +0 -0
- /package/dist/pine-core/{p-DaCT2ssj.system.js → p-vFsJv75D.system.js} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { closest } from "../../utils/closest";
|
|
2
|
+
import { findPortalTarget } from "../../utils/portal-target";
|
|
2
3
|
/**
|
|
3
4
|
* Where the open calendar lives: a `div` in `document.body`, or in the nearest `<dialog>` so it
|
|
4
5
|
* shares a modal's top layer, outside any `overflow: hidden` or transformed ancestor that would
|
|
@@ -96,41 +97,3 @@ export class CalendarPortal {
|
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
CalendarPortal.className = 'pds-datepicker-calendar-portal';
|
|
99
|
-
/**
|
|
100
|
-
* The native `<dialog>` or open `popover` (as pds-filter's) the datepicker sits in, so the
|
|
101
|
-
* calendar shares its top layer and a click in it isn't outside it; otherwise `document.body`.
|
|
102
|
-
* `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
|
|
103
|
-
* walks assigned slots and shadow hosts, as pds-combobox does.
|
|
104
|
-
*/
|
|
105
|
-
export function findPortalTarget(from) {
|
|
106
|
-
const seen = new Set();
|
|
107
|
-
let current = from;
|
|
108
|
-
while (current && !seen.has(current)) {
|
|
109
|
-
seen.add(current);
|
|
110
|
-
if (current.nodeType === Node.ELEMENT_NODE && isTopLayerHost(current)) {
|
|
111
|
-
return current;
|
|
112
|
-
}
|
|
113
|
-
const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
|
|
114
|
-
if (assigned) {
|
|
115
|
-
current = assigned;
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
const parent = current.parentNode;
|
|
119
|
-
current = parent instanceof ShadowRoot ? parent.host : parent;
|
|
120
|
-
}
|
|
121
|
-
return document.body;
|
|
122
|
-
}
|
|
123
|
-
function isTopLayerHost(el) {
|
|
124
|
-
// Only an open dialog: inside a closed one, the calendar would be hidden with it.
|
|
125
|
-
if (el.localName === 'dialog')
|
|
126
|
-
return el.open;
|
|
127
|
-
if (!el.hasAttribute('popover'))
|
|
128
|
-
return false;
|
|
129
|
-
try {
|
|
130
|
-
return el.matches(':popover-open');
|
|
131
|
-
}
|
|
132
|
-
catch (_a) {
|
|
133
|
-
// A browser without the Popover API: no top layer to share.
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
}
|
|
14
14
|
.pds-link:focus-visible {
|
|
15
15
|
border-radius: var(--pine-dimension-2xs);
|
|
16
|
+
isolation: isolate;
|
|
16
17
|
outline: var(--pine-outline-focus);
|
|
17
18
|
outline-offset: var(--pine-border-width-thick);
|
|
18
|
-
position: relative;
|
|
19
19
|
}
|
|
20
20
|
.pds-link:hover {
|
|
21
21
|
color: var(--color, var(--pds-context-link-color-hover, var(--pine-color-text-hover)));
|
|
@@ -73,3 +73,51 @@ export const NavTabs = {
|
|
|
73
73
|
</nav>
|
|
74
74
|
`,
|
|
75
75
|
};
|
|
76
|
+
|
|
77
|
+
// A whole row that is one link. The click area is the link part's ::after stretched over
|
|
78
|
+
// the positioned row, so the row activates the link without nesting anything inside it.
|
|
79
|
+
// Trailing controls sit above that box so they stay separately clickable, and the focus
|
|
80
|
+
// ring is drawn on the stretched box rather than on the text.
|
|
81
|
+
export const WholeRowLink = {
|
|
82
|
+
render: () => html`
|
|
83
|
+
<style>
|
|
84
|
+
.pds-link-row {
|
|
85
|
+
position: relative;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.pds-link-row:hover {
|
|
89
|
+
background-color: var(--pine-color-background-muted);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.pds-link-row pds-link::part(link)::after {
|
|
93
|
+
border-radius: var(--pine-border-radius-md);
|
|
94
|
+
content: "";
|
|
95
|
+
inset: 0;
|
|
96
|
+
position: absolute;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.pds-link-row pds-link::part(link):focus-visible {
|
|
100
|
+
outline: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.pds-link-row pds-link::part(link):focus-visible::after {
|
|
104
|
+
outline: var(--pine-outline-focus);
|
|
105
|
+
outline-offset: var(--pine-border-width-thick);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.pds-link-row__trailing {
|
|
109
|
+
position: relative;
|
|
110
|
+
z-index: 1;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
<pds-box class="pds-link-row" border border-radius="md" padding="sm" align-items="center" justify-content="space-between">
|
|
114
|
+
<pds-box gap="xs" align-items="center">
|
|
115
|
+
<pds-icon name="file" aria-hidden="true"></pds-icon>
|
|
116
|
+
<pds-link href="#row-target" variant="plain">Quarterly report</pds-link>
|
|
117
|
+
</pds-box>
|
|
118
|
+
<pds-box class="pds-link-row__trailing">
|
|
119
|
+
<pds-button variant="secondary" size="small">Download</pds-button>
|
|
120
|
+
</pds-box>
|
|
121
|
+
</pds-box>
|
|
122
|
+
`,
|
|
123
|
+
};
|
|
@@ -302,6 +302,12 @@ export class PdsMultiselect {
|
|
|
302
302
|
}
|
|
303
303
|
else {
|
|
304
304
|
this.closeDropdown();
|
|
305
|
+
// Tab would move on to an option's checkbox, which closing removes, dropping focus to the page.
|
|
306
|
+
// Land on the trigger instead, as Escape does; Shift+Tab already reaches it.
|
|
307
|
+
const trigger = e.shiftKey ? undefined : this.activeTriggerEl;
|
|
308
|
+
trigger === null || trigger === void 0 ? void 0 : trigger.focus();
|
|
309
|
+
if (trigger === null || trigger === void 0 ? void 0 : trigger.matches(':focus'))
|
|
310
|
+
e.preventDefault();
|
|
305
311
|
}
|
|
306
312
|
break;
|
|
307
313
|
}
|
|
@@ -1260,10 +1266,10 @@ export class PdsMultiselect {
|
|
|
1260
1266
|
}
|
|
1261
1267
|
render() {
|
|
1262
1268
|
const hasSelections = this.selectedItems.length > 0;
|
|
1263
|
-
return (h(Host, { key: '
|
|
1269
|
+
return (h(Host, { key: '8f1ce5ef092285ce7c0855643fae76a4ec86ee17', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: 'c14c3d52c1d55fb33a89f1a25055728215a1e4ab', class: "pds-multiselect", onFocusout: this.handleContainerFocusOut }, this.label && (h("label", { key: 'aacd3339b0db2048b31fbc5963f7232bbff78efe', id: `${this.componentId}-label`, htmlFor: this.componentId, class: {
|
|
1264
1270
|
'pds-multiselect__label': true,
|
|
1265
1271
|
'visually-hidden': this.hideLabel,
|
|
1266
|
-
} }, this.label)), h("div", { key: '
|
|
1272
|
+
} }, this.label)), h("div", { key: '5e1ef76aa5d46798519e5ac885bfa1c8d7c7106c', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), style: { width: this.triggerWidth } }, this.slottedTriggerEl ? (h("slot", { name: "trigger" })) : this.selectedDisplay === 'pill' && this.pillPosition === 'inline' ? (h("div", { ref: el => (this.pillInlineTriggerEl = el || undefined), part: "trigger", class: {
|
|
1267
1273
|
'pds-multiselect__trigger': true,
|
|
1268
1274
|
'pds-multiselect__trigger--open': this.isOpen,
|
|
1269
1275
|
'pds-multiselect__trigger--disabled': this.disabled,
|
|
@@ -1279,7 +1285,7 @@ export class PdsMultiselect {
|
|
|
1279
1285
|
}, id: this.componentId, disabled: this.disabled, "aria-required": this.required ? 'true' : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.helperMessage, this.errorMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, h("span", { class: {
|
|
1280
1286
|
'pds-multiselect__trigger-text': true,
|
|
1281
1287
|
'pds-multiselect__trigger-text--placeholder': !hasSelections || (this.selectedDisplay === 'pill' && this.pillPosition === 'below'),
|
|
1282
|
-
} }, this.getTriggerText()), h("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: '
|
|
1288
|
+
} }, this.getTriggerText()), h("pds-icon", { "aria-hidden": "true", class: "pds-multiselect__icon", icon: enlarge }))), this.renderDropdown()), this.selectedDisplay === 'pill' && this.pillPosition === 'below' && this.renderBelowPills(), h("span", { key: '590045e4769812a1a2f7a97580d21d95dbe4e872', class: "visually-hidden", "aria-live": "polite", "aria-atomic": "true" }, this.removalAnnouncement), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: '419f4349b7cb17260f03d2bdcfd777561a62de42', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: 'b922af14c83348607aa9aaaefe9b03b39e71bd42', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'bd08726adf14a42f2ecf0cdfcd390e5639f9fd96', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '42ad7905fb1816ccdd29b6aa438779929804b368', style: { display: 'none' } }, h("slot", { key: '4f3bf380e93d216790efb0a5de85d6479862350e' })))));
|
|
1283
1289
|
}
|
|
1284
1290
|
static get is() { return "pds-multiselect"; }
|
|
1285
1291
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Host, h } from "@stencil/core";
|
|
1
|
+
import { Host, h, forceUpdate } from "@stencil/core";
|
|
2
|
+
import { HostStylingKeeper } from "../../utils/attributes";
|
|
2
3
|
import { messageId } from "../../utils/form";
|
|
3
4
|
import { danger } from "@pine-ds/icons/icons";
|
|
4
5
|
/**
|
|
@@ -32,6 +33,7 @@ export class PdsRadioGroup {
|
|
|
32
33
|
* @defaultValue false
|
|
33
34
|
*/
|
|
34
35
|
this.required = false;
|
|
36
|
+
this.hostKeeper = new HostStylingKeeper();
|
|
35
37
|
}
|
|
36
38
|
handlePropsChange() {
|
|
37
39
|
this.updateChildRadios();
|
|
@@ -83,6 +85,29 @@ export class PdsRadioGroup {
|
|
|
83
85
|
}
|
|
84
86
|
});
|
|
85
87
|
}
|
|
88
|
+
connectedCallback() {
|
|
89
|
+
this.hostKeeper.connect(this.el);
|
|
90
|
+
// A name set while the group was detached never reaches the observer.
|
|
91
|
+
this.syncName();
|
|
92
|
+
if (typeof MutationObserver === 'undefined')
|
|
93
|
+
return;
|
|
94
|
+
// Consumers can name the group after render (a prop change, an i18n swap, a morph); re-render so their name wins.
|
|
95
|
+
this.hostAriaObserver = new MutationObserver(() => this.syncName());
|
|
96
|
+
this.hostAriaObserver.observe(this.el, { attributeFilter: ['aria-label', 'aria-labelledby'] });
|
|
97
|
+
}
|
|
98
|
+
disconnectedCallback() {
|
|
99
|
+
var _a;
|
|
100
|
+
this.hostKeeper.disconnect();
|
|
101
|
+
(_a = this.hostAriaObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
102
|
+
this.hostAriaObserver = undefined;
|
|
103
|
+
}
|
|
104
|
+
// Re-renders only when the group's name would change, so its own aria-labelledby write doesn't loop back.
|
|
105
|
+
syncName() {
|
|
106
|
+
if (this._groupId === undefined)
|
|
107
|
+
return;
|
|
108
|
+
if (this.getAriaLabelledBy() !== this.renderedLabelledBy)
|
|
109
|
+
forceUpdate(this);
|
|
110
|
+
}
|
|
86
111
|
componentWillLoad() {
|
|
87
112
|
// Generate stable group ID once during initialization
|
|
88
113
|
// This ensures DOM stability and accessibility relationships remain consistent across re-renders
|
|
@@ -96,6 +121,18 @@ export class PdsRadioGroup {
|
|
|
96
121
|
: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
97
122
|
this._groupId = `radio-group-${uniqueId}`;
|
|
98
123
|
}
|
|
124
|
+
// A restored or cloned host still carries the id and ARIA references an earlier instance wrote, pointing at
|
|
125
|
+
// that instance's label and messages. Drop them so this render writes its own: on first load, Stencil keeps a
|
|
126
|
+
// host attribute that's already there.
|
|
127
|
+
const previousId = this.el.getAttribute('id');
|
|
128
|
+
if (previousId && previousId !== this._groupId) {
|
|
129
|
+
['aria-labelledby', 'aria-describedby'].forEach((name) => {
|
|
130
|
+
var _a, _b;
|
|
131
|
+
const ids = (_b = (_a = this.el.getAttribute(name)) === null || _a === void 0 ? void 0 : _a.split(/\s+/)) !== null && _b !== void 0 ? _b : [];
|
|
132
|
+
if (ids.some((id) => id.startsWith(`${previousId}__`)))
|
|
133
|
+
this.el.removeAttribute(name);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
99
136
|
}
|
|
100
137
|
componentDidLoad() {
|
|
101
138
|
if (!this.name) {
|
|
@@ -148,6 +185,20 @@ export class PdsRadioGroup {
|
|
|
148
185
|
// Otherwise, assume it's a dimension token like "100", "200", etc.
|
|
149
186
|
return `var(--pine-dimension-${this.gap})`;
|
|
150
187
|
}
|
|
188
|
+
get labelId() {
|
|
189
|
+
return `${this._groupId}__label`;
|
|
190
|
+
}
|
|
191
|
+
// Names the group from its visible label, unless the consumer named it with their own aria-label or aria-labelledby.
|
|
192
|
+
// A blank aria-label (an empty translation, say) names nothing, so it falls back to groupLabel.
|
|
193
|
+
getAriaLabelledBy() {
|
|
194
|
+
var _a;
|
|
195
|
+
const hostLabelledBy = this.el.getAttribute('aria-labelledby');
|
|
196
|
+
if ((hostLabelledBy === null || hostLabelledBy === void 0 ? void 0 : hostLabelledBy.trim()) && hostLabelledBy !== this.labelId)
|
|
197
|
+
return hostLabelledBy;
|
|
198
|
+
if ((_a = this.el.getAttribute('aria-label')) === null || _a === void 0 ? void 0 : _a.trim())
|
|
199
|
+
return undefined;
|
|
200
|
+
return this.groupLabel ? this.labelId : undefined;
|
|
201
|
+
}
|
|
151
202
|
getAriaDescribedBy() {
|
|
152
203
|
const messageIds = [];
|
|
153
204
|
if (this.errorMessage) {
|
|
@@ -161,13 +212,23 @@ export class PdsRadioGroup {
|
|
|
161
212
|
render() {
|
|
162
213
|
const gapValue = this.getGapValue();
|
|
163
214
|
const ariaDescribedBy = this.getAriaDescribedBy();
|
|
164
|
-
|
|
215
|
+
const ariaLabelledBy = this.getAriaLabelledBy();
|
|
216
|
+
const hostClass = this.classNames();
|
|
217
|
+
this.renderedLabelledBy = ariaLabelledBy;
|
|
218
|
+
// A DOM morph strips what the component wrote on its host; put back its role, name and description.
|
|
219
|
+
// Only its own aria-labelledby, so a consumer's that the server dropped stays dropped.
|
|
220
|
+
this.hostKeeper.record(hostClass, { '--pds-radio-group-gap': gapValue }, {
|
|
221
|
+
role: 'radiogroup',
|
|
222
|
+
'aria-describedby': ariaDescribedBy,
|
|
223
|
+
'aria-labelledby': ariaLabelledBy === this.labelId ? ariaLabelledBy : undefined,
|
|
224
|
+
});
|
|
225
|
+
return (h(Host, { key: '0fe381f99dddae0aeb9189a13b0e2195f1c79886', class: hostClass, id: this._groupId, role: "radiogroup", "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, style: {
|
|
165
226
|
'--pds-radio-group-gap': gapValue,
|
|
166
|
-
} }, this.groupLabel && (h("div", { key: '
|
|
227
|
+
} }, this.groupLabel && (h("div", { key: '4967dc22fa0265dbfbabf94a49b182b8c06d0bd5', class: "pds-radio-group__label", id: this.labelId }, this.groupLabel)), h("div", { key: '7a782a6920de7eda76ab0060c7512f093671ad41', class: {
|
|
167
228
|
'pds-radio-group__radios': true,
|
|
168
229
|
'pds-radio-group__radios--row': this.direction === 'row',
|
|
169
230
|
'pds-radio-group__radios--column': this.direction === 'column',
|
|
170
|
-
} }, h("slot", { key: '
|
|
231
|
+
} }, h("slot", { key: '48a8d2d74961a402e3a1b053b2f0314e74b4b289', onSlotchange: () => this.updateChildRadios() })), this.helperMessage && (h("div", { key: '58db96d62b8d89f03ab245990d2d6bbd3b1b5f85', class: "pds-radio-group__message", id: messageId(this._groupId, 'helper') }, this.helperMessage)), this.errorMessage && (h("div", { key: 'ad3aafe5f7ed45853c36b537525a8fff68452f55', class: "pds-radio-group__message pds-radio-group__message--error", id: messageId(this._groupId, 'error'), "aria-live": "assertive" }, h("pds-icon", { key: '80ce92868703c5e01434e7e83a7668e320bcbee1', "aria-hidden": "true", icon: danger, size: "small" }), this.errorMessage))));
|
|
171
232
|
}
|
|
172
233
|
static get is() { return "pds-radio-group"; }
|
|
173
234
|
static get encapsulation() { return "scoped"; }
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { h } from "@stencil/core";
|
|
2
2
|
import { setColor } from "../../utils/utils";
|
|
3
|
-
import { setupTruncationTooltip } from "../../utils/truncation-tooltip";
|
|
3
|
+
import { FOCUSABLE_WRAPPER, setupTruncationTooltip } from "../../utils/truncation-tooltip";
|
|
4
4
|
import { TEXT_SIZES } from "../../utils/types";
|
|
5
|
+
// Re-runs setup for each text bound to its wrapping control, keyed by host, so a truncated
|
|
6
|
+
// text that joins the same control later can take that control's focus away from it.
|
|
7
|
+
const textsUsingWrapper = new WeakMap();
|
|
5
8
|
/**
|
|
6
9
|
* @part content - The text content container
|
|
7
10
|
*/
|
|
@@ -55,17 +58,39 @@ export class PdsText {
|
|
|
55
58
|
this.destroyTruncationTooltip();
|
|
56
59
|
}
|
|
57
60
|
initTruncationTooltip() {
|
|
61
|
+
var _a;
|
|
58
62
|
// Clean up any existing tooltip before setting up a new one
|
|
59
63
|
this.destroyTruncationTooltip();
|
|
60
64
|
if (this.contentEl) {
|
|
65
|
+
const wrapper = this.el.closest(FOCUSABLE_WRAPPER);
|
|
66
|
+
// A pds-chip with a max width binds its tooltip to the wrapper too.
|
|
67
|
+
const others = wrapper === null ? [] : wrapper.querySelectorAll('pds-text, pds-chip');
|
|
68
|
+
// One focus on a shared wrapper would open every clipped text's tooltip at once, so texts sharing one each keep
|
|
69
|
+
// their own stop, and a text bound before this one joined lets go: this one's focus bubbles to the wrapper too.
|
|
70
|
+
let sharesWrapper = false;
|
|
71
|
+
for (let i = 0; i < others.length; i++) {
|
|
72
|
+
const other = others[i];
|
|
73
|
+
// The property counts too: setting `truncate` runs setup before the next render reflects the attribute.
|
|
74
|
+
if (other !== this.el && (other.truncate || other.maxWidth || other.hasAttribute('truncate') || other.hasAttribute('max-width'))) {
|
|
75
|
+
sharesWrapper = true;
|
|
76
|
+
(_a = textsUsingWrapper.get(other)) === null || _a === void 0 ? void 0 : _a();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const usesWrapper = wrapper !== null && !sharesWrapper;
|
|
61
80
|
this.truncationCleanup = setupTruncationTooltip({
|
|
62
81
|
hostEl: this.el,
|
|
63
82
|
contentEl: this.contentEl,
|
|
64
83
|
getTooltipText: () => this.el.textContent || '',
|
|
84
|
+
// A wrapping link or button already takes focus, so its focus reveals the text instead of a nested tab stop.
|
|
85
|
+
manageTabIndex: !usesWrapper,
|
|
86
|
+
focusEl: usesWrapper ? wrapper : this.el,
|
|
65
87
|
});
|
|
88
|
+
if (usesWrapper)
|
|
89
|
+
textsUsingWrapper.set(this.el, () => this.initTruncationTooltip());
|
|
66
90
|
}
|
|
67
91
|
}
|
|
68
92
|
destroyTruncationTooltip() {
|
|
93
|
+
textsUsingWrapper.delete(this.el);
|
|
69
94
|
if (this.truncationCleanup) {
|
|
70
95
|
this.truncationCleanup();
|
|
71
96
|
this.truncationCleanup = null;
|
|
@@ -91,7 +116,7 @@ export class PdsText {
|
|
|
91
116
|
? `pds-text--decoration-${this.decoration}`
|
|
92
117
|
: ''}
|
|
93
118
|
`;
|
|
94
|
-
return (h(Tag, { key: '
|
|
119
|
+
return (h(Tag, { key: '30566c7810d3fd7f76ae281ae6d9a7e66803f0a3', ref: (el) => (this.contentEl = el), style: this.color && setColor(this.color), class: typeClasses, part: "content" }, h("slot", { key: 'f5113458aa9295803fc1c0bc552f9f92602cacba' })));
|
|
95
120
|
}
|
|
96
121
|
static get is() { return "pds-text"; }
|
|
97
122
|
static get encapsulation() { return "shadow"; }
|
|
@@ -279,7 +304,7 @@ export class PdsText {
|
|
|
279
304
|
"optional": true,
|
|
280
305
|
"docs": {
|
|
281
306
|
"tags": [],
|
|
282
|
-
"text": "If set or `true`, the text will be truncated. Must add a `width` to the element.\nWhen text overflows, a tooltip showing the full text will appear on hover/focus.\nNote: While the text is overflowing, the element receives tabindex=\"0\" so the\ntooltip can be reached by keyboard. Text that fits is left out of the tab order."
|
|
307
|
+
"text": "If set or `true`, the text will be truncated. Must add a `width` to the element.\nWhen text overflows, a tooltip showing the full text will appear on hover/focus.\nNote: While the text is overflowing, the element receives tabindex=\"0\" so the\ntooltip can be reached by keyboard. Text that fits is left out of the tab order.\nInside a link or button (including `pds-button`, `pds-link`, `pds-tab`, and\n`pds-dropdown-menu-item`) that holds no other truncated text or `pds-chip` with a\n`max-width`, no tab stop is added; the tooltip appears when that control receives\nkeyboard focus."
|
|
283
308
|
},
|
|
284
309
|
"getter": false,
|
|
285
310
|
"setter": false,
|
|
@@ -123,3 +123,19 @@ Truncate.args = {
|
|
|
123
123
|
truncate: true,
|
|
124
124
|
width: '250px',
|
|
125
125
|
};
|
|
126
|
+
|
|
127
|
+
const TruncateInLinkTemplate = (args) => html`
|
|
128
|
+
<div style="width: ${args.width || '250px'};">
|
|
129
|
+
<a href="#">
|
|
130
|
+
<pds-text tag="${args.tag}" ?truncate="${args.truncate}">${args.slot}</pds-text>
|
|
131
|
+
</a>
|
|
132
|
+
</div>
|
|
133
|
+
<pds-text tag="p" size="xs" color="secondary" gutter="sm">Tab to the link to see the full content in a tooltip. The truncated text adds no tab stop of its own.</pds-text>`;
|
|
134
|
+
|
|
135
|
+
export const TruncateInLink = TruncateInLinkTemplate.bind();
|
|
136
|
+
TruncateInLink.args = {
|
|
137
|
+
slot: 'Id irure id magna ipsum voluptate irure esse eu nulla. Ullamco officia adipisicing qui nulla non sint.',
|
|
138
|
+
tag: 'p',
|
|
139
|
+
truncate: true,
|
|
140
|
+
width: '250px',
|
|
141
|
+
};
|
|
@@ -8,6 +8,17 @@
|
|
|
8
8
|
--tooltip-dimension-max-width: 320px;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
:is(dialog, [popover]) > .pds-tooltip {
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-weight: normal;
|
|
14
|
+
letter-spacing: normal;
|
|
15
|
+
text-align: start;
|
|
16
|
+
text-indent: 0;
|
|
17
|
+
text-transform: none;
|
|
18
|
+
white-space: normal;
|
|
19
|
+
word-spacing: normal;
|
|
20
|
+
}
|
|
21
|
+
|
|
11
22
|
.pds-tooltip__content {
|
|
12
23
|
background-color: var(--pine-color-primary);
|
|
13
24
|
border-radius: calc(var(--pine-dimension-xs) * 1.25);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Host, h } from "@stencil/core";
|
|
2
2
|
import { classNamesOf, isStencilClass } from "../../utils/keep-hydrated";
|
|
3
|
+
import { findPortalTarget, isTopLayerInDocument, onTopLayerClose } from "../../utils/portal-target";
|
|
3
4
|
import { autoUpdate, computePosition, flip, offset, shift, } from "@floating-ui/dom";
|
|
4
5
|
/**
|
|
5
6
|
* @slot (default) - The tooltip's target element
|
|
@@ -23,6 +24,7 @@ export class PdsTooltip {
|
|
|
23
24
|
this.currentPathname = '';
|
|
24
25
|
this.pathnameCheckInterval = null;
|
|
25
26
|
this.stopAutoUpdate = null;
|
|
27
|
+
this.stopWatchingPortalHost = null;
|
|
26
28
|
/**
|
|
27
29
|
* Determines whether or not the tooltip has an arrow
|
|
28
30
|
* @defaultValue true
|
|
@@ -272,7 +274,12 @@ export class PdsTooltip {
|
|
|
272
274
|
this.lastCopiedHtml = this.strippedHtml(initialCopy);
|
|
273
275
|
this.contentDiv.append(...Array.from(initialCopy.childNodes));
|
|
274
276
|
this.portalEl.appendChild(this.contentDiv);
|
|
275
|
-
|
|
277
|
+
// Nothing in the body paints above a modal dialog or open popover, so the portal goes inside one.
|
|
278
|
+
const portalHost = findPortalTarget(this.el, isTopLayerInDocument);
|
|
279
|
+
portalHost.appendChild(this.portalEl);
|
|
280
|
+
// Closing that host moves no pointer, so a tooltip opened by touch would outlive it unseen.
|
|
281
|
+
if (portalHost !== document.body)
|
|
282
|
+
this.stopWatchingPortalHost = onTopLayerClose(portalHost, this.handleHide);
|
|
276
283
|
this.repositionPortal().catch(error => {
|
|
277
284
|
console.warn('Failed to position tooltip on creation:', error);
|
|
278
285
|
});
|
|
@@ -385,6 +392,10 @@ export class PdsTooltip {
|
|
|
385
392
|
this.stopAutoUpdate();
|
|
386
393
|
this.stopAutoUpdate = null;
|
|
387
394
|
}
|
|
395
|
+
if (this.stopWatchingPortalHost !== null) {
|
|
396
|
+
this.stopWatchingPortalHost();
|
|
397
|
+
this.stopWatchingPortalHost = null;
|
|
398
|
+
}
|
|
388
399
|
// Stop pathname change detection
|
|
389
400
|
if (this.pathnameCheckInterval !== null) {
|
|
390
401
|
clearInterval(this.pathnameCheckInterval);
|
|
@@ -415,9 +426,9 @@ export class PdsTooltip {
|
|
|
415
426
|
}
|
|
416
427
|
render() {
|
|
417
428
|
const hostId = this.componentId || undefined;
|
|
418
|
-
return (h(Host, { key: '
|
|
429
|
+
return (h(Host, { key: '475ff12d4be035e3effa894353e7948b42a23489', id: hostId, class: { 'pds-tooltip--is-open': this.opened } }, h("span", { key: '3375dfb5bb86ba373bc5d617f4a53171505631d1', class: "pds-tooltip__trigger", onMouseEnter: this.handleShow, onMouseLeave: this.handleHide,
|
|
419
430
|
/* focusin/out bubble; ensure keyboard users see tooltips */
|
|
420
|
-
onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, h("slot", { key: '
|
|
431
|
+
onFocusin: this.handleShow, onFocusout: this.handleHide, ref: el => this.triggerEl = el }, h("slot", { key: 'a3392ad415f5ac7f3883100bf914484ffcc8e536' })), h("div", { key: '774ac2c4808e96649b1536569aaf8cf8a6e3abc2', class: "pds-tooltip__content-slot-wrapper", hidden: true }, h("slot", { key: '672c64b4acdb365623885ac2105a9b90b1dcfa6b', name: "content" }))));
|
|
421
432
|
}
|
|
422
433
|
static get is() { return "pds-tooltip"; }
|
|
423
434
|
static get originalStyleUrls() {
|
|
@@ -20,6 +20,29 @@ const HTMLContentTemplate = (args) => html`
|
|
|
20
20
|
<pds-button variant="secondary">Hover</pds-button>
|
|
21
21
|
</pds-tooltip>`;
|
|
22
22
|
|
|
23
|
+
const InModalTemplate = (args) => html`
|
|
24
|
+
<pds-button onclick="document.querySelector('#tooltip-modal').open = true">Open modal</pds-button>
|
|
25
|
+
<pds-modal id="tooltip-modal" component-id="tooltip-modal" size="sm">
|
|
26
|
+
<pds-modal-header>
|
|
27
|
+
<pds-box padding="md">
|
|
28
|
+
<pds-text tag="h2" size="h3">Publish changes</pds-text>
|
|
29
|
+
</pds-box>
|
|
30
|
+
</pds-modal-header>
|
|
31
|
+
<pds-modal-content>
|
|
32
|
+
<pds-box padding-inline-start="md" padding-inline-end="md">
|
|
33
|
+
<pds-text tag="p">Hover or focus Publish: its tooltip shows above the open modal.</pds-text>
|
|
34
|
+
</pds-box>
|
|
35
|
+
</pds-modal-content>
|
|
36
|
+
<pds-modal-footer>
|
|
37
|
+
<pds-box fit gap="sm" justify-content="end" padding="md">
|
|
38
|
+
<pds-button variant="secondary" onclick="document.querySelector('#tooltip-modal').open = false">Cancel</pds-button>
|
|
39
|
+
<pds-tooltip content=${args.content} ?has-arrow=${args.hasArrow} placement=${args.placement}>
|
|
40
|
+
<pds-button variant="primary">Publish</pds-button>
|
|
41
|
+
</pds-tooltip>
|
|
42
|
+
</pds-box>
|
|
43
|
+
</pds-modal-footer>
|
|
44
|
+
</pds-modal>`;
|
|
45
|
+
|
|
23
46
|
const PositionTemplate = (args) => html`
|
|
24
47
|
<div class="demo-container" style="min-height: 50vh; width: 100%; display: flex; align-items: center; justify-content: center;">
|
|
25
48
|
<div class="position-demo-grid">
|
|
@@ -99,3 +122,10 @@ NoArrow.args = {
|
|
|
99
122
|
placement: "bottom-start",
|
|
100
123
|
slot: "target text"
|
|
101
124
|
};
|
|
125
|
+
|
|
126
|
+
export const InModal = InModalTemplate.bind({});
|
|
127
|
+
InModal.args = {
|
|
128
|
+
content: "Fix the errors on the page to publish",
|
|
129
|
+
hasArrow: true,
|
|
130
|
+
placement: "top",
|
|
131
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The native `<dialog>` or open `popover` (as pds-filter's) an element sits in, so a popup portaled
|
|
3
|
+
* there shares its top layer and a click in it isn't outside it; otherwise `document.body`.
|
|
4
|
+
* `closest()` stops at shadow boundaries and misses one that only wraps slotted content, so this
|
|
5
|
+
* walks assigned slots and shadow hosts, as pds-combobox does. `isHost` picks which ancestor counts.
|
|
6
|
+
*/
|
|
7
|
+
export function findPortalTarget(from, isHost = isOpenDialogOrPopover) {
|
|
8
|
+
const seen = new Set();
|
|
9
|
+
let current = from;
|
|
10
|
+
while (current && !seen.has(current)) {
|
|
11
|
+
seen.add(current);
|
|
12
|
+
if (current.nodeType === Node.ELEMENT_NODE && isHost(current)) {
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
const assigned = current.nodeType === Node.ELEMENT_NODE ? current.assignedSlot : null;
|
|
16
|
+
if (assigned) {
|
|
17
|
+
current = assigned;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const parent = current.parentNode;
|
|
21
|
+
current = parent instanceof ShadowRoot ? parent.host : parent;
|
|
22
|
+
}
|
|
23
|
+
return document.body;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A modal dialog or open popover, which paints in the top layer above anything in the body, that
|
|
27
|
+
* sits in the document itself: the document's stylesheets don't reach into a shadow root.
|
|
28
|
+
*/
|
|
29
|
+
export function isTopLayerInDocument(el) {
|
|
30
|
+
if (el.getRootNode() !== el.ownerDocument)
|
|
31
|
+
return false;
|
|
32
|
+
return matchesSafely(el, ':modal') || matchesSafely(el, ':popover-open');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calls `onClose` once `host` leaves the top layer (its dialog closes or its popover hides), and
|
|
36
|
+
* returns a function that stops listening.
|
|
37
|
+
*/
|
|
38
|
+
export function onTopLayerClose(host, onClose) {
|
|
39
|
+
const check = () => {
|
|
40
|
+
if (!isTopLayerInDocument(host))
|
|
41
|
+
onClose();
|
|
42
|
+
};
|
|
43
|
+
host.addEventListener('close', check);
|
|
44
|
+
host.addEventListener('toggle', check);
|
|
45
|
+
return () => {
|
|
46
|
+
host.removeEventListener('close', check);
|
|
47
|
+
host.removeEventListener('toggle', check);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function isOpenDialogOrPopover(el) {
|
|
51
|
+
// Only an open dialog: inside a closed one, the popup would be hidden with it.
|
|
52
|
+
if (el.localName === 'dialog')
|
|
53
|
+
return el.open;
|
|
54
|
+
return el.hasAttribute('popover') && matchesSafely(el, ':popover-open');
|
|
55
|
+
}
|
|
56
|
+
function matchesSafely(el, selector) {
|
|
57
|
+
try {
|
|
58
|
+
return el.matches(selector);
|
|
59
|
+
}
|
|
60
|
+
catch (_a) {
|
|
61
|
+
// A browser without the selector (no Popover API, or no :modal): no top layer to share.
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -24,7 +24,8 @@ function collectTabbable(root, found) {
|
|
|
24
24
|
const isTabStop = (el) => { var _a; return el.tabIndex >= 0 || (el.isContentEditable && !el.hasAttribute('tabindex') && !((_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.isContentEditable)); };
|
|
25
25
|
function visitTabbable(el, found) {
|
|
26
26
|
var _a, _b, _c, _d;
|
|
27
|
-
|
|
27
|
+
// A tooltip portaled into a dialog only describes the control that has focus; it's never a stop of its own.
|
|
28
|
+
if (el.hasAttribute('inert') || el.getAttribute('role') === 'tooltip')
|
|
28
29
|
return;
|
|
29
30
|
if (el.localName === 'slot') {
|
|
30
31
|
const slot = el;
|