@pine-ds/core 4.9.0 → 4.10.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/mock-pds-modal.js +1 -1
- package/components/pds-checkbox2.js +1 -1
- package/components/pds-chip2.js +1 -1
- package/components/pds-combobox.js +2 -2
- package/components/pds-datepicker.js +1 -1
- package/components/pds-dropdown-menu.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 +3 -3
- package/dist/cjs/pds-chip.cjs.entry.js +9 -9
- package/dist/cjs/pds-combobox.cjs.entry.js +102 -16
- 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 +59 -47
- 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-Bikp7n9I.js} +43 -3
- package/dist/collection/components/pds-checkbox/pds-checkbox.css +20 -14
- package/dist/collection/components/pds-chip/pds-chip.js +5 -6
- package/dist/collection/components/pds-combobox/grouped-options-panel.js +39 -1
- package/dist/collection/components/pds-combobox/pds-combobox.css +37 -1
- package/dist/collection/components/pds-combobox/pds-combobox.js +62 -14
- package/dist/collection/components/pds-combobox/stories/pds-combobox.stories.js +48 -0
- package/dist/collection/components/pds-datepicker/calendar-portal.js +1 -38
- package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +64 -46
- 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 +9 -3
- 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 +3 -3
- package/dist/esm/pds-chip.entry.js +8 -8
- package/dist/esm/pds-combobox.entry.js +102 -16
- 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 +59 -47
- 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-DBcPipr9.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-DBcPipr9.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-0b7b3fc2.system.entry.js +3 -0
- package/dist/pine-core/p-0d5f0ab5.system.entry.js +1 -0
- package/dist/pine-core/p-124a0a24.entry.js +1 -0
- package/dist/pine-core/p-128c04e7.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-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-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-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-3a1dc752.system.entry.js +1 -0
- package/dist/pine-core/{p-ef4d8fea.entry.js → p-3c229091.entry.js} +1 -1
- 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-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-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-639acef8.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-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-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-97356d4b.entry.js +1 -0
- 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-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-BZVUD2on.js +1 -0
- package/dist/pine-core/p-C6ZWpp3v.js +1 -0
- package/dist/pine-core/p-CKRzRKdO.js +1 -0
- package/dist/pine-core/p-Dj-z_ugg.system.js +1 -0
- package/dist/pine-core/{p-BplEmwUQ.js → p-M31tvpDN.js} +2 -2
- package/dist/pine-core/p-XK45dzWR.system.js +1 -0
- 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-afc2f165.entry.js +1 -0
- 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-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-c6a9e62c.system.entry.js +1 -0
- 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-da8b864a.entry.js +2 -0
- package/dist/pine-core/{p-f2c487e6.entry.js → p-db7fb5a3.entry.js} +1 -1
- package/dist/pine-core/p-dd7ded84.entry.js +1 -0
- package/dist/pine-core/p-de455073.system.entry.js +1 -0
- 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-eb56af4a.system.entry.js +1 -0
- 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-6dad76cb.system.entry.js → p-f11cce27.system.entry.js} +1 -1
- package/dist/pine-core/p-f354dbac.entry.js +1 -0
- 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-f834cb07.system.entry.js +1 -0
- 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-combobox/combobox-interface.d.ts +26 -0
- package/dist/types/components/pds-combobox/grouped-options-panel.d.ts +17 -0
- package/dist/types/components/pds-combobox/pds-combobox.d.ts +12 -2
- package/dist/types/components/pds-datepicker/calendar-portal.d.ts +0 -7
- package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu.d.ts +4 -0
- 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 +422 -146
- package/hydrate/index.mjs +422 -146
- 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-08bbd3e6.system.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-9a8d2985.system.entry.js +0 -3
- 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-DXO1yd32.system.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-b6edfdfe.entry.js +0 -2
- 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-eb93cc6e.entry.js +0 -1
- package/dist/pine-core/p-ebf74c43.system.entry.js +0 -1
- package/dist/pine-core/p-fc743f6e.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
|
@@ -4,7 +4,7 @@ import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/d
|
|
|
4
4
|
import { cancelDebouncedEvent, debounceEvent, flushDebouncedEvent } from "../../utils/utils";
|
|
5
5
|
import { closest } from "../../utils/closest";
|
|
6
6
|
import DOMPurify from "dompurify";
|
|
7
|
-
import { FlyoutController, buildPanelEntries, findGroup, groupIconOf, groupLabelOf, isGroupDisabled, isOptionDisabled, optionIconOf, panelColumn, parentOptgroupOf, } from "./grouped-options-panel";
|
|
7
|
+
import { FlyoutController, buildPanelEntries, findGroup, groupBadgeOf, groupIconOf, groupLabelOf, isGroupDisabled, isOptionDisabled, optionBadgeOf, optionIconOf, panelColumn, parentOptgroupOf, } from "./grouped-options-panel";
|
|
8
8
|
/**
|
|
9
9
|
* @slot option - Option elements for the combobox dropdown
|
|
10
10
|
* @slot trigger-content - Custom content for the button trigger when customTriggerContent is true
|
|
@@ -1133,6 +1133,7 @@ export class PdsCombobox {
|
|
|
1133
1133
|
// Only strings group an option or name an icon; anything else from JS is ignored, not coerced.
|
|
1134
1134
|
if (typeof opt.icon === 'string' && opt.icon !== '')
|
|
1135
1135
|
optionEl.setAttribute('data-icon', opt.icon);
|
|
1136
|
+
this.setBadgeAttributes(optionEl, opt.badge);
|
|
1136
1137
|
if (typeof opt.group !== 'string' || opt.group === '') {
|
|
1137
1138
|
ungrouped.push(optionEl);
|
|
1138
1139
|
this.panelPositions.set(optionEl, position);
|
|
@@ -1149,6 +1150,8 @@ export class PdsCombobox {
|
|
|
1149
1150
|
if (!optgroup.hasAttribute('data-icon') && typeof opt.groupIcon === 'string' && opt.groupIcon !== '') {
|
|
1150
1151
|
optgroup.setAttribute('data-icon', opt.groupIcon);
|
|
1151
1152
|
}
|
|
1153
|
+
if (!optgroup.hasAttribute('data-badge'))
|
|
1154
|
+
this.setBadgeAttributes(optgroup, opt.groupBadge);
|
|
1152
1155
|
optgroup.appendChild(optionEl);
|
|
1153
1156
|
});
|
|
1154
1157
|
[...ungrouped, ...groupEntries].forEach(entry => {
|
|
@@ -1638,7 +1641,10 @@ export class PdsCombobox {
|
|
|
1638
1641
|
};
|
|
1639
1642
|
const reveal = () => {
|
|
1640
1643
|
e.preventDefault();
|
|
1641
|
-
|
|
1644
|
+
// The row's name, badge and all, as the row itself is named.
|
|
1645
|
+
const optgroup = current;
|
|
1646
|
+
const badge = groupBadgeOf(optgroup);
|
|
1647
|
+
this.revealedGroupLabel = badge === null ? optgroup.label : `${optgroup.label}, ${badge.label}`;
|
|
1642
1648
|
return true;
|
|
1643
1649
|
};
|
|
1644
1650
|
switch (e.key) {
|
|
@@ -2187,11 +2193,16 @@ export class PdsCombobox {
|
|
|
2187
2193
|
return;
|
|
2188
2194
|
const { optgroup, key, options, members } = group;
|
|
2189
2195
|
const groupIcon = groupIconOf(optgroup);
|
|
2196
|
+
const badge = groupBadgeOf(optgroup);
|
|
2190
2197
|
// As in the grouped displays: disabled when there's nothing left in it to choose.
|
|
2191
2198
|
const disabled = members.length > 0 && members.every(member => isOptionDisabled(member));
|
|
2192
|
-
rendered.push(h("li", { key: key, class: { 'pds-combobox__group': true, 'pds-combobox__group--disabled': disabled }, role: "group", "aria-label": optgroup.label, "aria-disabled": disabled ? 'true' : undefined }, h("div", { class: {
|
|
2199
|
+
rendered.push(h("li", { key: key, class: { 'pds-combobox__group': true, 'pds-combobox__group--disabled': disabled }, role: "group", "aria-label": badge === null ? optgroup.label : `${optgroup.label}, ${badge.label}`, "aria-disabled": disabled ? 'true' : undefined }, h("div", { class: {
|
|
2200
|
+
'pds-combobox__group-label': true,
|
|
2201
|
+
'pds-combobox__group-label--with-icon': groupIcon !== null,
|
|
2202
|
+
'pds-combobox__group-label--with-badge': badge !== null,
|
|
2203
|
+
}, "aria-hidden": "true" }, groupIcon !== null && (
|
|
2193
2204
|
// `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
|
|
2194
|
-
h("pds-icon", { name: groupIcon, size: "small", "aria-hidden": "true", class: "pds-combobox__group-icon" })), optgroup.label), h("ul", { class: "pds-combobox__group-list", role: "presentation" }, options)));
|
|
2205
|
+
h("pds-icon", { name: groupIcon, size: "small", "aria-hidden": "true", class: "pds-combobox__group-icon" })), badge === null ? optgroup.label : h("span", { class: "pds-combobox__group-label-text" }, optgroup.label), this.renderBadge(badge, 'pds-combobox__group-badge')), h("ul", { class: "pds-combobox__group-list", role: "presentation" }, options)));
|
|
2195
2206
|
group = null;
|
|
2196
2207
|
};
|
|
2197
2208
|
this.filteredItems.forEach((item, itemIdx) => {
|
|
@@ -2317,20 +2328,56 @@ export class PdsCombobox {
|
|
|
2317
2328
|
const isChip = this.isOptionChip(option);
|
|
2318
2329
|
const isDisabled = isOptionDisabled(option);
|
|
2319
2330
|
const tree = level !== undefined;
|
|
2320
|
-
|
|
2331
|
+
const badge = isLayout || isChip ? null : optionBadgeOf(option);
|
|
2332
|
+
return (h("li", { key: option.value, id: this.optionDomId(index), role: tree ? 'treeitem' : 'option', "aria-selected": isSelected ? 'true' : tree ? undefined : 'false', "aria-disabled": isDisabled ? 'true' : undefined, "aria-level": level, "aria-setsize": setsize, "aria-posinset": posinset, "aria-label": isLayout || isChip
|
|
2333
|
+
? option.getAttribute('aria-label') || this.getOptionLabel(option)
|
|
2334
|
+
: badge && `${this.getOptionLabel(option)}, ${badge.label}`, tabindex: this.usesBodyPortal || this.usesPanelSearch || tree ? '-1' : isHighlighted ? '0' : '-1', class: {
|
|
2321
2335
|
'pds-combobox__option': true,
|
|
2322
2336
|
'pds-combobox__option--highlighted': isHighlighted,
|
|
2323
2337
|
'pds-combobox__option--layout': isLayout,
|
|
2324
2338
|
'pds-combobox__option--chip': isChip,
|
|
2325
2339
|
'pds-combobox__option--disabled': isDisabled,
|
|
2326
|
-
|
|
2340
|
+
'pds-combobox__option--with-badge': badge !== null,
|
|
2341
|
+
}, "data-option-index": index, onMouseDown: this.onOptionMouseDown, onClick: this.onOptionClick, onMouseEnter: this.onOptionMouseEnter, onKeyDown: this.onOptionKeyDown }, isLayout ? (h("pds-box", { class: "pds-combobox__option-layout-wrapper", innerHTML: this.getOptionLayoutContent(option) })) : isChip ? (this.renderOptionChip(option)) : ([this.renderOptionLabel(option), this.renderOptionBadge(option)]), isSelected && h("pds-icon", { icon: "check", size: "regular", "aria-hidden": "true", class: "pds-combobox__option-check" })));
|
|
2327
2342
|
}
|
|
2328
|
-
/**
|
|
2343
|
+
/** Copies an `options` badge to an option's or optgroup's `data-badge*` attributes; only strings count. */
|
|
2344
|
+
setBadgeAttributes(element, badge) {
|
|
2345
|
+
if (typeof badge !== 'object' || badge === null)
|
|
2346
|
+
return;
|
|
2347
|
+
const { label, sentiment, icon } = badge;
|
|
2348
|
+
if (typeof label !== 'string' || label.trim() === '')
|
|
2349
|
+
return;
|
|
2350
|
+
element.setAttribute('data-badge', label);
|
|
2351
|
+
if (typeof sentiment === 'string')
|
|
2352
|
+
element.setAttribute('data-badge-sentiment', sentiment);
|
|
2353
|
+
if (typeof icon === 'string')
|
|
2354
|
+
element.setAttribute('data-badge-icon', icon);
|
|
2355
|
+
}
|
|
2356
|
+
/** An option's badge, after its text. */
|
|
2357
|
+
renderOptionBadge(option) {
|
|
2358
|
+
return this.renderBadge(optionBadgeOf(option), 'pds-combobox__option-badge');
|
|
2359
|
+
}
|
|
2360
|
+
/** A badge as a `pds-chip`: after an option's text, or a group's label. */
|
|
2361
|
+
renderBadge(badge, className) {
|
|
2362
|
+
var _a;
|
|
2363
|
+
if (badge === null)
|
|
2364
|
+
return null;
|
|
2365
|
+
return (h("pds-chip", { size: "sm", sentiment: badge.sentiment,
|
|
2366
|
+
// A Pine icon name only, checked by optionBadgeOf; pds-chip's `icon` also loads URLs.
|
|
2367
|
+
icon: (_a = badge.icon) !== null && _a !== void 0 ? _a : undefined,
|
|
2368
|
+
// A long label, often a translated one, truncates rather than squeezing the option's text.
|
|
2369
|
+
maxWidth: "50%", class: className }, badge.label));
|
|
2370
|
+
}
|
|
2371
|
+
/**
|
|
2372
|
+
* An option's text, after its `data-icon` when it has one. Beside a badge the text is always
|
|
2373
|
+
* wrapped, so it can shrink and wrap rather than push the badge out of the row.
|
|
2374
|
+
*/
|
|
2329
2375
|
renderOptionLabel(option) {
|
|
2330
2376
|
const icon = optionIconOf(option);
|
|
2331
2377
|
const label = this.truncate ? (h("span", { key: this.getOptionLabel(option), class: "pds-combobox__option-text" }, this.getOptionLabel(option))) : this.getOptionLabel(option);
|
|
2332
|
-
if (icon === null)
|
|
2333
|
-
return label;
|
|
2378
|
+
if (icon === null) {
|
|
2379
|
+
return optionBadgeOf(option) === null ? label : h("span", { class: "pds-combobox__option-label" }, label);
|
|
2380
|
+
}
|
|
2334
2381
|
return (h("span", { class: "pds-combobox__option-label" }, h("pds-icon", { name: icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__option-icon" }), label));
|
|
2335
2382
|
}
|
|
2336
2383
|
/** The grouped panel's rows, in the order the panel draws them and the keyboard moves through. */
|
|
@@ -2369,7 +2416,8 @@ export class PdsCombobox {
|
|
|
2369
2416
|
}
|
|
2370
2417
|
/**
|
|
2371
2418
|
* Drilled into a group: its treeitem, expanded. Its row reads as a way back ("Back: Tag") and
|
|
2372
|
-
* leads its options.
|
|
2419
|
+
* leads its options. It leaves out the group's badge: the row is a way back, not a group to
|
|
2420
|
+
* choose, and the badge was on the row that opened it. An option's own badge still shows.
|
|
2373
2421
|
*/
|
|
2374
2422
|
renderGroupBackRow(group, { posinset, setsize }) {
|
|
2375
2423
|
const id = this.groupDomId(group.optgroup);
|
|
@@ -2398,9 +2446,9 @@ export class PdsCombobox {
|
|
|
2398
2446
|
'pds-combobox__group-row--highlighted': isCurrent && (flyout || this.keyboardNavigating),
|
|
2399
2447
|
'pds-combobox__group-row--keyboard': isCurrent && this.keyboardNavigating,
|
|
2400
2448
|
'pds-combobox__group-row--disabled': disabled,
|
|
2401
|
-
}, role: "treeitem", "aria-expanded": isOpen ? 'true' : 'false', "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": `${id}-label`, "data-group-index": groupIndex, onMouseEnter: flyout ? this.onGroupRowMouseEnter : undefined, onMouseLeave: flyout ? this.onGroupRowMouseLeave : undefined }, h("div", { class: "pds-combobox__group-row-trigger", "data-group-index": groupIndex, onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupRowTriggerMouseEnter, onClick: this.onGroupRowClick }, h("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, group.icon !== null && (
|
|
2449
|
+
}, role: "treeitem", "aria-expanded": isOpen ? 'true' : 'false', "aria-disabled": disabled ? 'true' : undefined, "aria-level": 1, "aria-posinset": posinset, "aria-setsize": setsize, "aria-labelledby": group.badge === null ? `${id}-label` : undefined, "aria-label": group.badge === null ? undefined : `${group.label}, ${group.badge.label}`, "data-group-index": groupIndex, onMouseEnter: flyout ? this.onGroupRowMouseEnter : undefined, onMouseLeave: flyout ? this.onGroupRowMouseLeave : undefined }, h("div", { class: "pds-combobox__group-row-trigger", "data-group-index": groupIndex, onMouseDown: this.onOptionMouseDown, onMouseEnter: this.onGroupRowTriggerMouseEnter, onClick: this.onGroupRowClick }, h("span", { class: "pds-combobox__group-row-label", id: `${id}-label` }, group.icon !== null && (
|
|
2402
2450
|
// `name`, not `icon`: `icon` also loads URLs and data: SVGs, unsanitized.
|
|
2403
|
-
h("pds-icon", { name: group.icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__group-icon" })), group.label), h("pds-icon", { name: "caret-right", size: "regular", "aria-hidden": "true", class: "pds-combobox__group-row-caret" })), isOpen && (h("ul", { class: "pds-combobox__flyout", role: "group", "aria-label": group.label, style: { minWidth: this.flyoutMinWidth, maxWidth: this.flyoutMaxWidth } }, this.renderGroupOptions(group)))));
|
|
2451
|
+
h("pds-icon", { name: group.icon, size: "regular", "aria-hidden": "true", class: "pds-combobox__group-icon" })), group.label), this.renderBadge(group.badge, 'pds-combobox__group-badge'), h("pds-icon", { name: "caret-right", size: "regular", "aria-hidden": "true", class: "pds-combobox__group-row-caret" })), isOpen && (h("ul", { class: "pds-combobox__flyout", role: "group", "aria-label": group.label, style: { minWidth: this.flyoutMinWidth, maxWidth: this.flyoutMaxWidth } }, this.renderGroupOptions(group)))));
|
|
2404
2452
|
}
|
|
2405
2453
|
// Helper method to render the caret icon
|
|
2406
2454
|
renderCaretIcon() {
|
|
@@ -2557,13 +2605,13 @@ export class PdsCombobox {
|
|
|
2557
2605
|
]
|
|
2558
2606
|
.filter(Boolean)
|
|
2559
2607
|
.join(' ');
|
|
2560
|
-
return (h(Host, { key: '
|
|
2608
|
+
return (h(Host, { key: '104eb1c4cdca4494b10dea660e27a98b0c18bf64', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: '2548ff2b304bb6a5a249b5059a0b60b55cdf2152', class: "pds-combobox", tabIndex: -1, onFocusout: this.onComboboxFocusOut, part: "combobox" }, this.hasVisibleLabel && (h("label", { key: '7a261c72452ca7a278e1067e41c6eed52f29edc8', htmlFor: this.trigger === 'input' ? this.componentId : undefined, id: this.labelId, class: "pds-combobox__label", onClick: this.onLabelClick }, this.label)), this.trigger === 'input' ? (h("div", { class: "pds-combobox__input-wrapper", style: { width: this.triggerWidth } }, h("input", { ref: el => {
|
|
2561
2609
|
this.inputEl = el;
|
|
2562
2610
|
this.triggerEl = el;
|
|
2563
2611
|
}, class: {
|
|
2564
2612
|
'pds-combobox__input': true,
|
|
2565
2613
|
'pds-combobox__input--invalid': this.isInvalid(),
|
|
2566
|
-
}, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), h("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (h("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (h("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, onMouseEnter: this.truncate ? this.onButtonTriggerMouseEnter : undefined, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), h("div", { key: '
|
|
2614
|
+
}, type: "text", role: "combobox", "aria-autocomplete": "list", "aria-haspopup": this.inputPopupRole === 'tree' ? 'tree' : undefined, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.hideLabel ? this.label : undefined, id: this.componentId, value: this.displayText, placeholder: this.placeholder, disabled: this.disabled, onInput: this.handleInput, onClick: this.handleInputClick, onKeyDown: this.handleKeyDown, autocomplete: "off", part: "input" }), h("pds-icon", { icon: "enlarge", "aria-hidden": "true", class: "pds-combobox__input-icon" }))) : this.trigger === 'chip' ? (h("div", { class: this.getChipTriggerClass(), style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, ref: el => (this.triggerEl = el), part: "chip-trigger" }, this.renderChipTriggerContent())) : (h("div", { class: triggerClass, style: { width: this.triggerWidth }, role: this.usesPanelSearch ? 'button' : 'combobox', "aria-haspopup": this.triggerPopupRole, "aria-controls": this.listboxId, "aria-describedby": assignDescription(this.componentId, this.isInvalid(), this.helperMessage, this.errorMessage), "aria-invalid": this.isInvalid() ? 'true' : undefined, "aria-activedescendant": this.usesPanelSearch ? undefined : this.activeDescendantId, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : 'false', "aria-label": this.triggerAriaLabel, "aria-labelledby": this.triggerLabelledBy, id: this.componentId, tabIndex: this.disabled ? -1 : 0, onClick: this.onButtonTriggerClick, "data-layout": this.customTriggerContent, onKeyDown: this.onButtonTriggerKeyDown, onKeyUp: this.onButtonTriggerKeyUp, onMouseEnter: this.truncate ? this.onButtonTriggerMouseEnter : undefined, ref: el => (this.triggerEl = el), part: "button-trigger" }, this.renderButtonTriggerContent())), this.renderMessages(), h("div", { key: 'ffd3bc72b34a7278f3fa706a236017a26b86ea3f', style: { display: 'none' } }, h("slot", { key: 'f47a81191ad7fd8c6bf63cf8ef39934cbf7fd28c', onSlotchange: () => this.updateOptions() })), this.renderDropdown(), this.groupDisplay !== 'inline' && [
|
|
2567
2615
|
h("span", { key: "drill-status", class: "visually-hidden", role: "status", "aria-live": "polite" }, this.isOpen && this.effectiveGroupDisplay === 'drill-in' && this.openGroup !== null ? this.openGroup.label : ''),
|
|
2568
2616
|
// Its own region: sharing one, revealing a row then opening it would leave the text the
|
|
2569
2617
|
// same, and opening the group would go unannounced.
|
|
@@ -598,6 +598,7 @@ OptionIconsWithGroups.args = {
|
|
|
598
598
|
{ id: 'email-activity', text: 'Email activity', group: 'Email' },
|
|
599
599
|
{ id: 'marketing-status', text: 'Email marketing status', group: 'Email' },
|
|
600
600
|
{ id: 'sequence', text: 'Sequence', group: 'Email' },
|
|
601
|
+
{ id: 'responsive', text: 'Responsive marketing emails', group: 'Email', badge: { label: 'New', sentiment: 'accent', icon: 'star' } },
|
|
601
602
|
{ id: 'event', text: 'Event', icon: 'calendar-date' },
|
|
602
603
|
{ id: 'custom-fields', text: 'Custom fields', group: 'Fields', groupIcon: 'columns' },
|
|
603
604
|
{ id: 'default-fields', text: 'Default fields', group: 'Fields' },
|
|
@@ -748,6 +749,53 @@ DisabledOptions.argTypes = {
|
|
|
748
749
|
groupDisplay: { control: 'inline-radio', options: ['inline', 'flyout', 'drill-in'] },
|
|
749
750
|
};
|
|
750
751
|
|
|
752
|
+
// A plan-gated group: listed, disabled, with a Premium badge on its row, before the chevron.
|
|
753
|
+
// The badge comes from the first option in the group that sets groupBadge.
|
|
754
|
+
export const GroupBadges = (args) => html`
|
|
755
|
+
<div style="min-height: 320px;">
|
|
756
|
+
<pds-combobox
|
|
757
|
+
component-id="combobox-group-badges"
|
|
758
|
+
label=${args.label}
|
|
759
|
+
placeholder=${args.placeholder}
|
|
760
|
+
trigger="button"
|
|
761
|
+
mode="select-only"
|
|
762
|
+
group-display=${args.groupDisplay}
|
|
763
|
+
drill-in-back-label="Back"
|
|
764
|
+
trigger-width="300px"
|
|
765
|
+
dropdown-width="300px"
|
|
766
|
+
.options=${args.options}
|
|
767
|
+
></pds-combobox>
|
|
768
|
+
</div>`;
|
|
769
|
+
|
|
770
|
+
GroupBadges.args = {
|
|
771
|
+
label: 'Action',
|
|
772
|
+
placeholder: 'Choose an action',
|
|
773
|
+
groupDisplay: 'drill-in',
|
|
774
|
+
options: [
|
|
775
|
+
{ id: 'email_send', text: 'Send an email', group: 'Email', groupIcon: 'mail' },
|
|
776
|
+
{ id: 'contact_tag_add', text: 'Add a tag', group: 'Contact', groupIcon: 'contact' },
|
|
777
|
+
{
|
|
778
|
+
id: 'facebook_message_send',
|
|
779
|
+
text: 'Send a Facebook message',
|
|
780
|
+
group: 'Facebook',
|
|
781
|
+
groupBadge: { label: 'Premium', sentiment: 'brand', icon: 'premium' },
|
|
782
|
+
disabled: true,
|
|
783
|
+
},
|
|
784
|
+
{ id: 'facebook_comment_reply', text: 'Reply to a comment', group: 'Facebook', disabled: true },
|
|
785
|
+
{
|
|
786
|
+
id: 'instagram_message_send',
|
|
787
|
+
text: 'Send an Instagram message',
|
|
788
|
+
group: 'Instagram',
|
|
789
|
+
groupBadge: { label: 'Premium', sentiment: 'brand', icon: 'premium' },
|
|
790
|
+
disabled: true,
|
|
791
|
+
},
|
|
792
|
+
],
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
GroupBadges.argTypes = {
|
|
796
|
+
groupDisplay: { control: 'inline-radio', options: ['inline', 'flyout', 'drill-in'] },
|
|
797
|
+
};
|
|
798
|
+
|
|
751
799
|
export const OptionGroupsPdsText = (args) => html`
|
|
752
800
|
<pds-combobox
|
|
753
801
|
component-id="combobox-pds-text-groups"
|
|
@@ -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
|
-
}
|
|
@@ -107,7 +107,7 @@ export class PdsDropdownMenu {
|
|
|
107
107
|
this.currentFocusIndex = -1;
|
|
108
108
|
// Return focus to trigger
|
|
109
109
|
if (this.isFocusInMenu()) {
|
|
110
|
-
this.
|
|
110
|
+
this.focusTrigger();
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
113
|
// Handle click on the trigger element
|
|
@@ -158,6 +158,14 @@ export class PdsDropdownMenu {
|
|
|
158
158
|
const focused = this.host.getRootNode().activeElement;
|
|
159
159
|
return focused != null && this.host.contains(focused);
|
|
160
160
|
}
|
|
161
|
+
// A trigger whose host can't take focus itself, such as pds-chip, passes it to the control inside.
|
|
162
|
+
focusTrigger() {
|
|
163
|
+
var _a, _b;
|
|
164
|
+
this.triggerEl.focus();
|
|
165
|
+
if (this.host.getRootNode().activeElement === this.triggerEl)
|
|
166
|
+
return;
|
|
167
|
+
(_b = (_a = this.triggerEl.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('button, [href], [tabindex]:not([tabindex="-1"])')) === null || _b === void 0 ? void 0 : _b.focus();
|
|
168
|
+
}
|
|
161
169
|
// Check if a menu item is disabled (handles both component and raw elements)
|
|
162
170
|
isItemDisabled(item) {
|
|
163
171
|
const tagName = item.tagName.toLowerCase();
|
|
@@ -253,6 +261,23 @@ export class PdsDropdownMenu {
|
|
|
253
261
|
this.focusItemByIndex(prevIndex);
|
|
254
262
|
}
|
|
255
263
|
}
|
|
264
|
+
// Unlike the arrow keys, Tab stops at either end of the menu instead of wrapping.
|
|
265
|
+
adjacentEnabledIndex(fromIndex, step) {
|
|
266
|
+
for (let index = fromIndex + step; index >= 0 && index < this.menuItems.length; index += step) {
|
|
267
|
+
if (!this.isItemDisabled(this.menuItems[index]))
|
|
268
|
+
return index;
|
|
269
|
+
}
|
|
270
|
+
return -1;
|
|
271
|
+
}
|
|
272
|
+
// An enabled item can still refuse focus (hidden, or a link with no href), so each one is tried in turn.
|
|
273
|
+
focusAdjacentItem(fromIndex, step) {
|
|
274
|
+
for (let index = this.adjacentEnabledIndex(fromIndex, step); index !== -1; index = this.adjacentEnabledIndex(index, step)) {
|
|
275
|
+
this.focusItemByIndex(index);
|
|
276
|
+
if (this.getFocusedItemIndex() === index)
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
256
281
|
// Escape is taken in document's capture phase, before a modal around the menu hears it on
|
|
257
282
|
// document and closes too.
|
|
258
283
|
handleEscapeKeyDown(event) {
|
|
@@ -261,6 +286,28 @@ export class PdsDropdownMenu {
|
|
|
261
286
|
event.preventDefault();
|
|
262
287
|
this.closeDropdown();
|
|
263
288
|
}
|
|
289
|
+
// Taken in the capture phase, so a modal or popover around the menu that traps Tab finds the key
|
|
290
|
+
// already handled, or focus back on the trigger with the items hidden.
|
|
291
|
+
handleTabKeyDown(event) {
|
|
292
|
+
if (!this.isOpen || event.key !== 'Tab' || event.defaultPrevented)
|
|
293
|
+
return;
|
|
294
|
+
const currentIndex = this.getFocusedItemIndex();
|
|
295
|
+
if (currentIndex === -1) {
|
|
296
|
+
// The menu sits after the trigger, so Shift+Tab from the trigger leaves it behind. So does Shift+Tab
|
|
297
|
+
// from outside the menu, where focus stays after a mouse open in Safari.
|
|
298
|
+
if (event.shiftKey && (document.activeElement === this.triggerEl || !this.isFocusInMenu()))
|
|
299
|
+
this.closeDropdown();
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (this.focusAdjacentItem(currentIndex, event.shiftKey ? -1 : 1)) {
|
|
303
|
+
event.preventDefault();
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
// Past either end, closing moves focus to the trigger. Shift+Tab stays there; Tab carries on past it.
|
|
307
|
+
if (event.shiftKey)
|
|
308
|
+
event.preventDefault();
|
|
309
|
+
this.closeDropdown();
|
|
310
|
+
}
|
|
264
311
|
// Handle keyboard events for the dropdown
|
|
265
312
|
handleKeyDown(event) {
|
|
266
313
|
if (!this.isOpen)
|
|
@@ -300,54 +347,19 @@ export class PdsDropdownMenu {
|
|
|
300
347
|
}
|
|
301
348
|
}
|
|
302
349
|
break;
|
|
303
|
-
case 'Tab':
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
// If not on first item, prevent default and go to previous item
|
|
310
|
-
event.preventDefault();
|
|
311
|
-
this.focusPreviousItem(); // Use our method that skips disabled items
|
|
312
|
-
}
|
|
313
|
-
// If on first item or no item, let natural tab order move back to trigger
|
|
350
|
+
case 'Tab': {
|
|
351
|
+
// Tab from an item is handled in handleTabKeyDown; from anywhere else it moves into the menu.
|
|
352
|
+
if (event.shiftKey || this.getFocusedItemIndex() !== -1)
|
|
353
|
+
break;
|
|
354
|
+
if (this.focusAdjacentItem(-1, 1)) {
|
|
355
|
+
event.preventDefault();
|
|
314
356
|
}
|
|
315
357
|
else {
|
|
316
|
-
//
|
|
317
|
-
|
|
318
|
-
const isTriggerFocused = activeElement === this.triggerEl;
|
|
319
|
-
const currentIndex = this.getFocusedItemIndex();
|
|
320
|
-
if (isTriggerFocused && this.menuItems.length > 0) {
|
|
321
|
-
// If trigger is focused, move to first non-disabled menu item
|
|
322
|
-
event.preventDefault();
|
|
323
|
-
// Find the first non-disabled item
|
|
324
|
-
let firstFocusableIndex = 0;
|
|
325
|
-
while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
|
|
326
|
-
firstFocusableIndex++;
|
|
327
|
-
}
|
|
328
|
-
if (firstFocusableIndex < this.menuItems.length) {
|
|
329
|
-
this.focusItemByIndex(firstFocusableIndex);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
else if (currentIndex === -1 && this.menuItems.length > 0) {
|
|
333
|
-
// If no menu item is focused, focus the first non-disabled one
|
|
334
|
-
event.preventDefault();
|
|
335
|
-
// Find the first non-disabled item
|
|
336
|
-
let firstFocusableIndex = 0;
|
|
337
|
-
while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
|
|
338
|
-
firstFocusableIndex++;
|
|
339
|
-
}
|
|
340
|
-
if (firstFocusableIndex < this.menuItems.length) {
|
|
341
|
-
this.focusItemByIndex(firstFocusableIndex);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
else if (currentIndex !== -1) {
|
|
345
|
-
// Use our method that skips disabled items
|
|
346
|
-
event.preventDefault();
|
|
347
|
-
this.focusNextItem();
|
|
348
|
-
}
|
|
358
|
+
// With no item to move to, Tab carries on past the menu, as it does past the last item.
|
|
359
|
+
this.closeDropdown();
|
|
349
360
|
}
|
|
350
361
|
break;
|
|
362
|
+
}
|
|
351
363
|
}
|
|
352
364
|
}
|
|
353
365
|
// Handle clicks outside the dropdown to close it
|
|
@@ -357,7 +369,7 @@ export class PdsDropdownMenu {
|
|
|
357
369
|
}
|
|
358
370
|
}
|
|
359
371
|
render() {
|
|
360
|
-
return (h(Host, { key: '
|
|
372
|
+
return (h(Host, { key: 'aa4ce84354cf87638ee46fd7ed69520228b7e656', id: this.componentId }, h("slot", { key: '948800e67d18c8c6cc9e77ef3aeab635c5035453', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), h("pds-box", { key: '3ce2a2879b14aad975cea8ae72fcbf8c3abcf20c', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", part: "menu-panel" }, h("div", { key: 'ad25fbf4f3c7a24653c229e64fe2ce893a92e4c8', class: { 'pds-dropdown-menu__header': true, 'is-hidden': !this.hasHeader } }, h("slot", { key: '35a5903543e08577997b456bcd312bdd009fd8fc', name: "header", onSlotchange: this.handleHeaderSlotChange })), h("div", { key: 'a9593adacf047918c1d87494f8c951a2a4a5f76f', class: "pds-dropdown-menu__items", role: "menu", "aria-orientation": "vertical" }, h("slot", { key: '8d2def1cc7020608220099f4ced0f44e9838cce8', onSlotchange: this.handleSlotChange })))));
|
|
361
373
|
}
|
|
362
374
|
static get is() { return "pds-dropdown-menu"; }
|
|
363
375
|
static get encapsulation() { return "shadow"; }
|
|
@@ -435,6 +447,12 @@ export class PdsDropdownMenu {
|
|
|
435
447
|
"target": "document",
|
|
436
448
|
"capture": true,
|
|
437
449
|
"passive": false
|
|
450
|
+
}, {
|
|
451
|
+
"name": "keydown",
|
|
452
|
+
"method": "handleTabKeyDown",
|
|
453
|
+
"target": "document",
|
|
454
|
+
"capture": true,
|
|
455
|
+
"passive": false
|
|
438
456
|
}, {
|
|
439
457
|
"name": "keydown",
|
|
440
458
|
"method": "handleKeyDown",
|
|
@@ -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"; }
|