@verbb/plugin-kit-web 2.0.15 → 2.0.17
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/CHANGELOG.md +80 -0
- package/README.md +3 -3
- package/custom-elements.json +39781 -0
- package/dist/base/pk-form-associated-element.d.ts +17 -1
- package/dist/base/pk-form-associated-element.d.ts.map +1 -1
- package/dist/chunks/{animate-with-class-ZJeCOKB3.js → animate-with-class-CsDwYnXL.js} +1 -1
- package/dist/chunks/{animate-with-class-ZJeCOKB3.js.map → animate-with-class-CsDwYnXL.js.map} +1 -1
- package/dist/chunks/{autoloader-DPX9YYZs.js → autoloader-dJO3tYOX.js} +2 -2
- package/dist/chunks/{autoloader-DPX9YYZs.js.map → autoloader-dJO3tYOX.js.map} +1 -1
- package/dist/chunks/{component-registry-CNB8PbP_.js → component-registry-D34fm8xW.js} +5 -1
- package/dist/chunks/component-registry-D34fm8xW.js.map +1 -0
- package/dist/chunks/{field-labels-CoU9dnNq.js → field-labels-CmuAW8Cl.js} +1 -1
- package/dist/chunks/{field-labels-CoU9dnNq.js.map → field-labels-CmuAW8Cl.js.map} +1 -1
- package/dist/chunks/option-filter-BQqr8Z21.js +121 -0
- package/dist/chunks/option-filter-BQqr8Z21.js.map +1 -0
- package/dist/chunks/pk-autocomplete-IFL-u-RF.js +992 -0
- package/dist/chunks/pk-autocomplete-IFL-u-RF.js.map +1 -0
- package/dist/chunks/{pk-button-BWGDkuzc.js → pk-button-BrH4u4Qr.js} +8 -4
- package/dist/chunks/{pk-button-BWGDkuzc.js.map → pk-button-BrH4u4Qr.js.map} +1 -1
- package/dist/chunks/{pk-calendar-enTOUCRD.js → pk-calendar-Z7Y0PjeY.js} +1 -1
- package/dist/chunks/{pk-calendar-enTOUCRD.js.map → pk-calendar-Z7Y0PjeY.js.map} +1 -1
- package/dist/chunks/{pk-checkbox-CvZwJZn_.js → pk-checkbox-CfV1uDdC.js} +2 -2
- package/dist/chunks/{pk-checkbox-CvZwJZn_.js.map → pk-checkbox-CfV1uDdC.js.map} +1 -1
- package/dist/chunks/{pk-checkbox-select-DclPoyDM.js → pk-checkbox-select-DeCaI3a0.js} +2 -2
- package/dist/chunks/{pk-checkbox-select-DclPoyDM.js.map → pk-checkbox-select-DeCaI3a0.js.map} +1 -1
- package/dist/chunks/{pk-code-editor-CrKnJUyi.js → pk-code-editor-BG9sG_Fy.js} +2 -2
- package/dist/chunks/{pk-code-editor-CrKnJUyi.js.map → pk-code-editor-BG9sG_Fy.js.map} +1 -1
- package/dist/chunks/{pk-color-input-DXdqNCK7.js → pk-color-input-CncNce1C.js} +2 -2
- package/dist/chunks/{pk-color-input-DXdqNCK7.js.map → pk-color-input-CncNce1C.js.map} +1 -1
- package/dist/chunks/{pk-combobox-BLft8AXy.js → pk-combobox-CL9En0J-.js} +49 -92
- package/dist/chunks/pk-combobox-CL9En0J-.js.map +1 -0
- package/dist/chunks/{pk-connect.styles-DshgIW2n.js → pk-connect.styles-BhW406jt.js} +1 -1
- package/dist/chunks/{pk-connect.styles-DshgIW2n.js.map → pk-connect.styles-BhW406jt.js.map} +1 -1
- package/dist/chunks/{pk-copy-button-asOLQkqk.js → pk-copy-button-BVaOLtYG.js} +46 -5
- package/dist/chunks/pk-copy-button-BVaOLtYG.js.map +1 -0
- package/dist/chunks/{pk-date-picker-Bri3kZ6x.js → pk-date-picker-BEAd4Ngl.js} +6 -6
- package/dist/chunks/{pk-date-picker-Bri3kZ6x.js.map → pk-date-picker-BEAd4Ngl.js.map} +1 -1
- package/dist/chunks/{pk-dialog-BbEfvb0g.js → pk-dialog-VMQqLW1f.js} +2 -2
- package/dist/chunks/{pk-dialog-BbEfvb0g.js.map → pk-dialog-VMQqLW1f.js.map} +1 -1
- package/dist/chunks/{pk-dropdown-item-BoZTGWMU.js → pk-dropdown-item-D9OaG5o-.js} +9 -5
- package/dist/chunks/pk-dropdown-item-D9OaG5o-.js.map +1 -0
- package/dist/chunks/{pk-dropdown-label-Da28F917.js → pk-dropdown-label-CRNWMWQd.js} +1 -1
- package/dist/chunks/{pk-dropdown-label-Da28F917.js.map → pk-dropdown-label-CRNWMWQd.js.map} +1 -1
- package/dist/chunks/{pk-dropdown-menu-CfZc7dIz.js → pk-dropdown-menu-DW1wI8xQ.js} +6 -4
- package/dist/chunks/pk-dropdown-menu-DW1wI8xQ.js.map +1 -0
- package/dist/chunks/{pk-editable-table-Cn4WXqAo.js → pk-editable-table-BoqfveXO.js} +17 -19
- package/dist/chunks/pk-editable-table-BoqfveXO.js.map +1 -0
- package/dist/chunks/{pk-field-NL4KdFZC.js → pk-field-UAlMq6mQ.js} +2 -2
- package/dist/chunks/{pk-field-NL4KdFZC.js.map → pk-field-UAlMq6mQ.js.map} +1 -1
- package/dist/chunks/{pk-form-associated-element-9M2NzOE2.js → pk-form-associated-element-CCQALRGB.js} +14 -2
- package/dist/chunks/pk-form-associated-element-CCQALRGB.js.map +1 -0
- package/dist/chunks/pk-image-browser-DwiCFOIG.js +1364 -0
- package/dist/chunks/pk-image-browser-DwiCFOIG.js.map +1 -0
- package/dist/chunks/{pk-input-DDkIXOkt.js → pk-input-CF_icEtR.js} +76 -30
- package/dist/chunks/pk-input-CF_icEtR.js.map +1 -0
- package/dist/chunks/{pk-input-group-CRPSBFhX.js → pk-input-group-BLqKPnfc.js} +2 -2
- package/dist/chunks/{pk-input-group-CRPSBFhX.js.map → pk-input-group-BLqKPnfc.js.map} +1 -1
- package/dist/chunks/{pk-input-group-addon-B0StOmTJ.js → pk-input-group-addon-ClBkGmAw.js} +1 -1
- package/dist/chunks/{pk-input-group-addon-B0StOmTJ.js.map → pk-input-group-addon-ClBkGmAw.js.map} +1 -1
- package/dist/chunks/{pk-input-group-button-CnKajvsP.js → pk-input-group-button-CHQHsWd4.js} +1 -1
- package/dist/chunks/{pk-input-group-button-CnKajvsP.js.map → pk-input-group-button-CHQHsWd4.js.map} +1 -1
- package/dist/chunks/{pk-input-group-input-mllffsjQ.js → pk-input-group-input-oNnqMBGU.js} +1 -1
- package/dist/chunks/{pk-input-group-input-mllffsjQ.js.map → pk-input-group-input-oNnqMBGU.js.map} +1 -1
- package/dist/chunks/{pk-input-group-text-DvaPJvh2.js → pk-input-group-text-HUxlXROB.js} +1 -1
- package/dist/chunks/{pk-input-group-text-DvaPJvh2.js.map → pk-input-group-text-HUxlXROB.js.map} +1 -1
- package/dist/chunks/{pk-input-group-textarea-CqYv8tUQ.js → pk-input-group-textarea-Cl2FNuw-.js} +1 -1
- package/dist/chunks/{pk-input-group-textarea-CqYv8tUQ.js.map → pk-input-group-textarea-Cl2FNuw-.js.map} +1 -1
- package/dist/chunks/{pk-lightswitch-DI1BeCmA.js → pk-lightswitch-D1qEFRxK.js} +3 -3
- package/dist/chunks/{pk-lightswitch-DI1BeCmA.js.map → pk-lightswitch-D1qEFRxK.js.map} +1 -1
- package/dist/chunks/{pk-option-MGj9SKOK.js → pk-option-DQZHV9jL.js} +3 -2
- package/dist/chunks/pk-option-DQZHV9jL.js.map +1 -0
- package/dist/chunks/{pk-option-group-Cs6N7mlP.js → pk-option-group-CCzJkBFp.js} +1 -1
- package/dist/chunks/{pk-option-group-Cs6N7mlP.js.map → pk-option-group-CCzJkBFp.js.map} +1 -1
- package/dist/chunks/{pk-popover-duyNosk2.js → pk-popover-D3jkHfwB.js} +4 -4
- package/dist/chunks/pk-popover-D3jkHfwB.js.map +1 -0
- package/dist/chunks/{pk-popup-B9AgBC2V.js → pk-popup-B65tZMQH.js} +23 -1
- package/dist/chunks/pk-popup-B65tZMQH.js.map +1 -0
- package/dist/chunks/{pk-radio-BK4D2Htu.js → pk-radio-B5XkMHy3.js} +1 -1
- package/dist/chunks/{pk-radio-BK4D2Htu.js.map → pk-radio-B5XkMHy3.js.map} +1 -1
- package/dist/chunks/{pk-radio-group-BRJIjOsR.js → pk-radio-group-ByrxGLdX.js} +3 -3
- package/dist/chunks/{pk-radio-group-BRJIjOsR.js.map → pk-radio-group-ByrxGLdX.js.map} +1 -1
- package/dist/chunks/{pk-scroll-area-BR6ckorh.js → pk-scroll-area-CdfNxYz8.js} +1 -1
- package/dist/chunks/{pk-scroll-area-BR6ckorh.js.map → pk-scroll-area-CdfNxYz8.js.map} +1 -1
- package/dist/chunks/{pk-select-C1s0OJr0.js → pk-select-CdQdhnZN.js} +7 -5
- package/dist/chunks/pk-select-CdQdhnZN.js.map +1 -0
- package/dist/chunks/{pk-separator-CHij3vEG.js → pk-separator-N-VyjYE6.js} +1 -1
- package/dist/chunks/{pk-separator-CHij3vEG.js.map → pk-separator-N-VyjYE6.js.map} +1 -1
- package/dist/chunks/{pk-status-D1IzTSI2.js → pk-status-BehQARDv.js} +1 -1
- package/dist/chunks/{pk-status-D1IzTSI2.js.map → pk-status-BehQARDv.js.map} +1 -1
- package/dist/chunks/{pk-tab-2MHunhlF.js → pk-tab-CTloD18e.js} +1 -1
- package/dist/chunks/{pk-tab-2MHunhlF.js.map → pk-tab-CTloD18e.js.map} +1 -1
- package/dist/chunks/{pk-tab-heading-BV6m_sT-.js → pk-tab-heading-Cjcgebxn.js} +1 -1
- package/dist/chunks/{pk-tab-heading-BV6m_sT-.js.map → pk-tab-heading-Cjcgebxn.js.map} +1 -1
- package/dist/chunks/{pk-tab-panel-C6FxQw9q.js → pk-tab-panel-CkKU5-Ah.js} +1 -1
- package/dist/chunks/{pk-tab-panel-C6FxQw9q.js.map → pk-tab-panel-CkKU5-Ah.js.map} +1 -1
- package/dist/chunks/{pk-tabs-BTE63uK9.js → pk-tabs-BgEBki1q.js} +1 -1
- package/dist/chunks/{pk-tabs-BTE63uK9.js.map → pk-tabs-BgEBki1q.js.map} +1 -1
- package/dist/chunks/{pk-textarea-BcAyZYC-.js → pk-textarea-CYM2tK88.js} +3 -3
- package/dist/chunks/{pk-textarea-BcAyZYC-.js.map → pk-textarea-CYM2tK88.js.map} +1 -1
- package/dist/chunks/{pk-time-picker-5D4nmig2.js → pk-time-picker-CebRqydV.js} +3 -3
- package/dist/chunks/{pk-time-picker-5D4nmig2.js.map → pk-time-picker-CebRqydV.js.map} +1 -1
- package/dist/chunks/{pk-tiptap-content-BPd4GO6c.js → pk-tiptap-content-CL8smjGi.js} +6 -3
- package/dist/chunks/{pk-tiptap-content-BPd4GO6c.js.map → pk-tiptap-content-CL8smjGi.js.map} +1 -1
- package/dist/chunks/{pk-tiptap-editor-tG67Vegc.js → pk-tiptap-editor-CTz-yfHL.js} +335 -19
- package/dist/chunks/pk-tiptap-editor-CTz-yfHL.js.map +1 -0
- package/dist/chunks/{pk-tiptap-input-CtefNnaK.js → pk-tiptap-input-Y9eog9Zn.js} +3 -3
- package/dist/chunks/{pk-tiptap-input-CtefNnaK.js.map → pk-tiptap-input-Y9eog9Zn.js.map} +1 -1
- package/dist/chunks/{pk-toggle-CW-lflrh.js → pk-toggle-BthhH7vl.js} +1 -1
- package/dist/chunks/{pk-toggle-CW-lflrh.js.map → pk-toggle-BthhH7vl.js.map} +1 -1
- package/dist/chunks/{pk-toggle-group-BKymefo3.js → pk-toggle-group-D2Quux8D.js} +1 -1
- package/dist/chunks/{pk-toggle-group-BKymefo3.js.map → pk-toggle-group-D2Quux8D.js.map} +1 -1
- package/dist/chunks/{pk-tooltip-BoDq8YVe.js → pk-tooltip--QBV6puX.js} +2 -2
- package/dist/chunks/{pk-tooltip-BoDq8YVe.js.map → pk-tooltip--QBV6puX.js.map} +1 -1
- package/dist/chunks/{popup-content-animation.styles-Dc6d9quJ.js → popup-content-animation.styles-BnNiguJo.js} +1 -1
- package/dist/chunks/{popup-content-animation.styles-Dc6d9quJ.js.map → popup-content-animation.styles-BnNiguJo.js.map} +1 -1
- package/dist/chunks/{popup-pointer-DMnuZDQl.js → popup-pointer-CuLjk1th.js} +1 -1
- package/dist/chunks/{popup-pointer-DMnuZDQl.js.map → popup-pointer-CuLjk1th.js.map} +1 -1
- package/dist/chunks/{register-CQodpTWT.js → register-aJw-9RWi.js} +46 -46
- package/dist/chunks/{register-CQodpTWT.js.map → register-aJw-9RWi.js.map} +1 -1
- package/dist/chunks/{register-components-B-qCPFFh.js → register-components-BT9THgdh.js} +1 -1
- package/dist/chunks/{register-components-B-qCPFFh.js.map → register-components-BT9THgdh.js.map} +1 -1
- package/dist/chunks/{tiptap.styles-ChAfyVi9.js → tiptap.styles-CPRows--.js} +4 -3
- package/dist/chunks/tiptap.styles-CPRows--.js.map +1 -0
- package/dist/component-registry.d.ts.map +1 -1
- package/dist/components/autocomplete/index.d.ts +2 -0
- package/dist/components/autocomplete/index.d.ts.map +1 -0
- package/dist/components/autocomplete/pk-autocomplete.d.ts +150 -0
- package/dist/components/autocomplete/pk-autocomplete.d.ts.map +1 -0
- package/dist/components/autocomplete/pk-autocomplete.js +2 -0
- package/dist/components/autocomplete/pk-autocomplete.styles.d.ts +7 -0
- package/dist/components/autocomplete/pk-autocomplete.styles.d.ts.map +1 -0
- package/dist/components/autocomplete.d.ts +2 -0
- package/dist/components/autocomplete.js +2 -0
- package/dist/components/button/pk-button.d.ts +37 -1
- package/dist/components/button/pk-button.d.ts.map +1 -1
- package/dist/components/button/pk-button.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar/pk-calendar.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/checkbox/pk-checkbox.js +1 -1
- package/dist/components/checkbox-select/pk-checkbox-select.js +1 -1
- package/dist/components/checkbox-select.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/code-editor/pk-code-editor.js +1 -1
- package/dist/components/code-editor.js +1 -1
- package/dist/components/color-input/pk-color-input.js +1 -1
- package/dist/components/color-input.js +1 -1
- package/dist/components/combobox/pk-combobox.d.ts +8 -14
- package/dist/components/combobox/pk-combobox.d.ts.map +1 -1
- package/dist/components/combobox/pk-combobox.js +1 -1
- package/dist/components/combobox/pk-combobox.styles.d.ts.map +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/connect/pk-connect-oauth.d.ts +1 -1
- package/dist/components/connect/pk-connect-oauth.js +3 -3
- package/dist/components/connect/pk-connect-oauth.js.map +1 -1
- package/dist/components/connect/pk-connect.js +4 -4
- package/dist/components/copy-button/pk-copy-button.d.ts +3 -0
- package/dist/components/copy-button/pk-copy-button.d.ts.map +1 -1
- package/dist/components/copy-button/pk-copy-button.js +1 -1
- package/dist/components/copy-button/pk-copy-button.styles.d.ts.map +1 -1
- package/dist/components/copy-button.js +1 -1
- package/dist/components/date-picker/pk-date-picker.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/dialog/pk-dialog.d.ts +1 -1
- package/dist/components/dialog/pk-dialog.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.d.ts +3 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-item.styles.d.ts.map +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-label.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
- package/dist/components/dropdown-menu/pk-dropdown-menu.styles.d.ts.map +1 -1
- package/dist/components/dropdown-menu.js +3 -3
- package/dist/components/editable-table/editable-table-model.d.ts +4 -1
- package/dist/components/editable-table/editable-table-model.d.ts.map +1 -1
- package/dist/components/editable-table/pk-editable-table.d.ts +1 -1
- package/dist/components/editable-table/pk-editable-table.d.ts.map +1 -1
- package/dist/components/editable-table/pk-editable-table.js +1 -1
- package/dist/components/editable-table.js +1 -1
- package/dist/components/field/pk-field.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/icon/pk-icon.d.ts +3 -2
- package/dist/components/icon/pk-icon.d.ts.map +1 -1
- package/dist/components/icon/pk-icon.js.map +1 -1
- package/dist/components/image-browser/index.d.ts +2 -0
- package/dist/components/image-browser/index.d.ts.map +1 -0
- package/dist/components/image-browser/pk-image-browser.d.ts +190 -0
- package/dist/components/image-browser/pk-image-browser.d.ts.map +1 -0
- package/dist/components/image-browser/pk-image-browser.js +2 -0
- package/dist/components/image-browser/pk-image-browser.styles.d.ts +6 -0
- package/dist/components/image-browser/pk-image-browser.styles.d.ts.map +1 -0
- package/dist/components/image-browser.d.ts +2 -0
- package/dist/components/image-browser.js +2 -0
- package/dist/components/input/pk-input.d.ts +3 -2
- package/dist/components/input/pk-input.d.ts.map +1 -1
- package/dist/components/input/pk-input.js +1 -1
- package/dist/components/input/pk-input.styles.d.ts.map +1 -1
- package/dist/components/input-group/pk-input-group-addon.js +1 -1
- package/dist/components/input-group/pk-input-group-button.js +1 -1
- package/dist/components/input-group/pk-input-group-input.js +1 -1
- package/dist/components/input-group/pk-input-group-text.js +1 -1
- package/dist/components/input-group/pk-input-group-textarea.js +1 -1
- package/dist/components/input-group/pk-input-group.d.ts +2 -2
- package/dist/components/input-group/pk-input-group.d.ts.map +1 -1
- package/dist/components/input-group/pk-input-group.js +1 -1
- package/dist/components/input-group.js +6 -6
- package/dist/components/input.js +1 -1
- package/dist/components/lightswitch/pk-lightswitch.js +1 -1
- package/dist/components/lightswitch.js +1 -1
- package/dist/components/popover/pk-popover.d.ts +2 -2
- package/dist/components/popover/pk-popover.js +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/popup/pk-popup.d.ts +4 -0
- package/dist/components/popup/pk-popup.d.ts.map +1 -1
- package/dist/components/popup/pk-popup.js +1 -1
- package/dist/components/popup.js +1 -1
- package/dist/components/radio-group/pk-radio-group.js +1 -1
- package/dist/components/radio-group/pk-radio.js +1 -1
- package/dist/components/radio-group.js +2 -2
- package/dist/components/scroll-area/pk-scroll-area.js +1 -1
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/select/pk-option-group.d.ts +3 -1
- package/dist/components/select/pk-option-group.d.ts.map +1 -1
- package/dist/components/select/pk-option-group.js +1 -1
- package/dist/components/select/pk-option.d.ts +10 -1
- package/dist/components/select/pk-option.d.ts.map +1 -1
- package/dist/components/select/pk-option.js +1 -1
- package/dist/components/select/pk-select.d.ts +42 -3
- package/dist/components/select/pk-select.d.ts.map +1 -1
- package/dist/components/select/pk-select.js +1 -1
- package/dist/components/select.js +3 -3
- package/dist/components/separator/pk-separator.js +1 -1
- package/dist/components/separator.js +1 -1
- package/dist/components/status/pk-status.js +1 -1
- package/dist/components/status.js +1 -1
- package/dist/components/tabs/pk-tab-heading.js +1 -1
- package/dist/components/tabs/pk-tab-panel.js +1 -1
- package/dist/components/tabs/pk-tab.js +1 -1
- package/dist/components/tabs/pk-tabs.js +1 -1
- package/dist/components/tabs.js +4 -4
- package/dist/components/textarea/pk-textarea.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/time-picker/pk-time-picker.js +1 -1
- package/dist/components/time-picker.js +1 -1
- package/dist/components/tiptap/pk-tiptap-content.d.ts.map +1 -1
- package/dist/components/tiptap/pk-tiptap-content.js +1 -1
- package/dist/components/tiptap/pk-tiptap-editor.d.ts +11 -1
- package/dist/components/tiptap/pk-tiptap-editor.d.ts.map +1 -1
- package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
- package/dist/components/tiptap/pk-tiptap-editor.styles.d.ts.map +1 -1
- package/dist/components/tiptap/pk-tiptap-input.js +1 -1
- package/dist/components/tiptap/tiptap-toolbar.d.ts +1 -0
- package/dist/components/tiptap/tiptap-toolbar.d.ts.map +1 -1
- package/dist/components/tiptap/variable-tag-node-view.d.ts.map +1 -1
- package/dist/components/tiptap-content.js +1 -1
- package/dist/components/tiptap-editor.js +1 -1
- package/dist/components/tiptap-input.js +1 -1
- package/dist/components/toggle/pk-toggle.js +1 -1
- package/dist/components/toggle-group/pk-toggle-group.js +1 -1
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/tooltip/pk-tooltip.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/connect/register-cp-connect.js +3 -3
- package/dist/index.js +50 -50
- package/dist/internal/sync-filtered-options.d.ts +23 -0
- package/dist/internal/sync-filtered-options.d.ts.map +1 -0
- package/dist/plugin-kit.css +2 -0
- package/dist/plugin-kit.js +2 -2
- package/dist/register-components.js +1 -1
- package/dist/register-pk.generated.d.ts +4 -0
- package/dist/register-pk.generated.d.ts.map +1 -1
- package/dist/register.js +48 -48
- package/dist/utilities/fouce.css +2 -0
- package/dist/utils/async-option-fetch.d.ts +38 -0
- package/dist/utils/async-option-fetch.d.ts.map +1 -0
- package/dist/utils/option-filter.d.ts +11 -0
- package/dist/utils/option-filter.d.ts.map +1 -0
- package/dist/utils/popup-content-exit.d.ts +6 -0
- package/dist/utils/popup-content-exit.d.ts.map +1 -0
- package/dist-loader/chunks/option-filter-Bc5aNNT0.js +119 -0
- package/dist-loader/chunks/{pk-base-B21zXxSo.js → pk-base-CyzwylQ7.js} +13 -1
- package/dist-loader/chunks/{pk-button-Dh4gjLHw.js → pk-button-saBDszJV.js} +10 -6
- package/dist-loader/chunks/{pk-calendar-n1bwSO7X.js → pk-calendar-BrF8i3dW.js} +3 -3
- package/dist-loader/chunks/{pk-checkbox-BrZQB816.js → pk-checkbox-B3d4nkBx.js} +1 -1
- package/dist-loader/chunks/{pk-color-input-sS05YOwT.js → pk-color-input-CD-r_sfG.js} +1 -1
- package/dist-loader/chunks/{pk-combobox-B7q6alzE.js → pk-combobox-Cpx0w1KV.js} +49 -92
- package/dist-loader/chunks/{pk-date-picker-Dni5ty79.js → pk-date-picker-DEoiTOxN.js} +6 -6
- package/dist-loader/chunks/{pk-dialog-BpPRqFMm.js → pk-dialog-C6aaPokv.js} +3 -3
- package/dist-loader/chunks/{pk-dropdown-item-CHkFNlA9.js → pk-dropdown-item-D8RrwjxL.js} +10 -6
- package/dist-loader/chunks/pk-dropdown-label-Cg32UgRe.js +51 -0
- package/dist-loader/chunks/{pk-dropdown-menu-BHVOMNV1.js → pk-dropdown-menu-CAHCltlX.js} +5 -3
- package/dist-loader/chunks/{pk-field-CJ09ll1S.js → pk-field-V7JOy26T.js} +4 -4
- package/dist-loader/chunks/{pk-icon-WHUu7wxk.js → pk-icon-Bph-EBqp.js} +2 -2
- package/dist-loader/chunks/{pk-input-CEw3AdYt.js → pk-input-BhU0PiCk.js} +74 -28
- package/dist-loader/chunks/{pk-lightswitch-DJEUScgo.js → pk-lightswitch-m23Cy3_D.js} +1 -1
- package/dist-loader/chunks/{pk-option-CunPIei0.js → pk-option-BrDMERSl.js} +5 -4
- package/dist-loader/chunks/{pk-popup-FDdBxb4k.js → pk-popup-CrxxR-Hb.js} +24 -2
- package/dist-loader/chunks/{pk-select-CbAaQ7uE.js → pk-select-Dok-JdSe.js} +8 -6
- package/dist-loader/chunks/{pk-spinner-CIbXjDnp.js → pk-spinner-BKU9Rf2R.js} +1 -1
- package/dist-loader/chunks/{pk-status-BRIVW7EH.js → pk-status-D2g_77m_.js} +1 -1
- package/dist-loader/chunks/{pk-textarea-C_rOUtFS.js → pk-textarea-CC7rA5A7.js} +1 -1
- package/dist-loader/chunks/{pk-time-picker-Dr3uvbvc.js → pk-time-picker-h5Wgd4a_.js} +5 -5
- package/dist-loader/chunks/{pk-tooltip-HwZ0zRd2.js → pk-tooltip-Dd_Q0Bn5.js} +2 -2
- package/dist-loader/chunks/{render-Niz5wYRa.js → render-Bnzcxfss.js} +1 -1
- package/dist-loader/chunks/{svg-_Mtb7CHx.js → svg-Bz-bXZn7.js} +12 -4
- package/dist-loader/chunks/{tiptap-Db7MTUH1.js → tiptap-CgXkiK8d.js} +283 -13
- package/dist-loader/chunks/{tiptap.styles-BIRIMP7I.js → tiptap.styles-C0E1NpSx.js} +225 -5
- package/dist-loader/components/autocomplete/autocomplete.js +984 -0
- package/dist-loader/components/button/button.js +1 -1
- package/dist-loader/components/button-group/button-group-separator.js +1 -1
- package/dist-loader/components/button-group/button-group-text.js +1 -1
- package/dist-loader/components/button-group/button-group.js +1 -1
- package/dist-loader/components/calendar/calendar.js +1 -1
- package/dist-loader/components/checkbox/checkbox.js +1 -1
- package/dist-loader/components/checkbox-select/checkbox-select.js +2 -2
- package/dist-loader/components/code-editor/code-editor.js +6 -6
- package/dist-loader/components/color-input/color-input.js +1 -1
- package/dist-loader/components/combobox/combobox.js +1 -1
- package/dist-loader/components/connect/connect-oauth.js +4 -4
- package/dist-loader/components/connect/connect.js +6 -6
- package/dist-loader/components/copy-button/copy-button.js +48 -7
- package/dist-loader/components/date-picker/date-picker.js +1 -1
- package/dist-loader/components/dialog/dialog.js +1 -1
- package/dist-loader/components/dropdown-menu/dropdown-item.js +1 -1
- package/dist-loader/components/dropdown-menu/dropdown-label.js +1 -50
- package/dist-loader/components/dropdown-menu/dropdown-menu.js +1 -1
- package/dist-loader/components/dropdown-menu/dropdown-separator.js +1 -1
- package/dist-loader/components/editable-table/editable-table.js +18 -20
- package/dist-loader/components/field/field.js +1 -1
- package/dist-loader/components/icon/icon.js +2 -2
- package/dist-loader/components/image-browser/image-browser.js +1356 -0
- package/dist-loader/components/input/input.js +1 -1
- package/dist-loader/components/input-group/input-group-addon.js +1 -1
- package/dist-loader/components/input-group/input-group-button.js +1 -1
- package/dist-loader/components/input-group/input-group-input.js +1 -1
- package/dist-loader/components/input-group/input-group-text.js +1 -1
- package/dist-loader/components/input-group/input-group-textarea.js +1 -1
- package/dist-loader/components/input-group/input-group.js +2 -2
- package/dist-loader/components/lightswitch/lightswitch.js +1 -1
- package/dist-loader/components/popover/popover.js +3 -3
- package/dist-loader/components/popup/popup.js +1 -1
- package/dist-loader/components/radio-group/radio-group.js +1 -1
- package/dist-loader/components/radio-group/radio.js +1 -1
- package/dist-loader/components/scroll-area/scroll-area.js +1 -1
- package/dist-loader/components/select/option-group.js +1 -1
- package/dist-loader/components/select/option.js +1 -1
- package/dist-loader/components/select/select.js +1 -1
- package/dist-loader/components/separator/separator.js +1 -1
- package/dist-loader/components/spinner/spinner.js +1 -1
- package/dist-loader/components/status/status.js +1 -1
- package/dist-loader/components/tabs/tab-heading.js +1 -1
- package/dist-loader/components/tabs/tab-panel.js +1 -1
- package/dist-loader/components/tabs/tab.js +1 -1
- package/dist-loader/components/tabs/tabs.js +1 -1
- package/dist-loader/components/textarea/textarea.js +1 -1
- package/dist-loader/components/time-picker/time-picker.js +1 -1
- package/dist-loader/components/tiptap/tiptap-content.js +7 -4
- package/dist-loader/components/tiptap/tiptap-editor.js +336 -20
- package/dist-loader/components/tiptap/tiptap-input.js +3 -3
- package/dist-loader/components/toggle/toggle.js +1 -1
- package/dist-loader/components/toggle-group/toggle-group.js +1 -1
- package/dist-loader/components/tooltip/tooltip.js +1 -1
- package/dist-loader/plugin-kit.css +2 -0
- package/dist-loader/plugin-kit.loader.js +4 -0
- package/dist-loader/utilities/fouce.css +2 -0
- package/package.json +57 -10
- package/dist/chunks/component-registry-CNB8PbP_.js.map +0 -1
- package/dist/chunks/pk-combobox-BLft8AXy.js.map +0 -1
- package/dist/chunks/pk-copy-button-asOLQkqk.js.map +0 -1
- package/dist/chunks/pk-dropdown-item-BoZTGWMU.js.map +0 -1
- package/dist/chunks/pk-dropdown-menu-CfZc7dIz.js.map +0 -1
- package/dist/chunks/pk-editable-table-Cn4WXqAo.js.map +0 -1
- package/dist/chunks/pk-form-associated-element-9M2NzOE2.js.map +0 -1
- package/dist/chunks/pk-input-DDkIXOkt.js.map +0 -1
- package/dist/chunks/pk-option-MGj9SKOK.js.map +0 -1
- package/dist/chunks/pk-popover-duyNosk2.js.map +0 -1
- package/dist/chunks/pk-popup-B9AgBC2V.js.map +0 -1
- package/dist/chunks/pk-select-C1s0OJr0.js.map +0 -1
- package/dist/chunks/pk-tiptap-editor-tG67Vegc.js.map +0 -1
- package/dist/chunks/tiptap.styles-ChAfyVi9.js.map +0 -1
- /package/dist-loader/chunks/{floating-ui-DU6GNott.js → floating-ui-Cj0imr6d.js} +0 -0
- /package/dist-loader/chunks/{pk-connect.styles-Bfgwu0VH.js → pk-connect.styles-k61snd3X.js} +0 -0
- /package/dist-loader/chunks/{popup-pointer-caPc8kwB.js → popup-pointer-Ck28WdVP.js} +0 -0
- /package/dist-loader/chunks/{sync-listbox-separators-Dk_E_IVa.js → sync-listbox-separators-Ch5krDUs.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pk-option-MGj9SKOK.js","names":[],"sources":["../../src/utils/highlight-text.ts","../../src/components/select/pk-option.styles.ts","../../src/components/select/pk-option.ts"],"sourcesContent":["export type HighlightPart = {\n text: string;\n match: boolean;\n};\n\n/** Split label text into matched/unmatched segments for typeahead highlighting. */\nexport function splitHighlightParts(text: string, search: string): HighlightPart[] {\n const label = String(text ?? '');\n const query = String(search ?? '').trim();\n\n if (!query) {\n return [{ text: label, match: false }];\n }\n\n const lowerLabel = label.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const parts: HighlightPart[] = [];\n let cursor = 0;\n let matchIndex = lowerLabel.indexOf(lowerQuery);\n\n while (matchIndex !== -1) {\n if (matchIndex > cursor) {\n parts.push({\n text: label.slice(cursor, matchIndex),\n match: false,\n });\n }\n\n parts.push({\n text: label.slice(matchIndex, matchIndex + query.length),\n match: true,\n });\n\n cursor = matchIndex + query.length;\n matchIndex = lowerLabel.indexOf(lowerQuery, cursor);\n }\n\n if (cursor < label.length) {\n parts.push({\n text: label.slice(cursor),\n match: false,\n });\n }\n\n return parts.length > 0 ? parts : [{ text: label, match: false }];\n}\n","import { css } from 'lit';\n\nexport const pkOptionStyles = css`\n @layer pk-component {\n :host {\n display: block;\n /*\n * Slotted option labels inherit type metrics from this host (same\n * Craft-vs-Tailwind trap as pk-dropdown-item). Size tokens arrive via\n * pk-select ::slotted(pk-option) custom properties.\n */\n font-family: var(--pk-font-family);\n font-size: var(--pk-select-item-font-size, var(--pk-font-size-base));\n line-height: var(--pk-select-item-line-height, 1.4);\n color: var(--pk-color-gray-700);\n }\n\n .option {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n margin: 0;\n min-height: var(--pk-select-item-min-height, var(--pk-input-height));\n padding-block: var(--pk-select-item-padding-block, 6px);\n padding-inline-start: var(--pk-select-item-padding-inline, 10px);\n padding-inline-end: var(--pk-select-item-padding-inline-end, 2rem);\n border: var(--pk-select-trigger-border-width, 1px) solid transparent;\n background: transparent;\n color: inherit;\n font: inherit;\n font-family: var(--pk-font-family);\n font-size: var(--pk-select-item-font-size, var(--pk-font-size-base));\n line-height: var(--pk-select-item-line-height, 1.4);\n text-align: left;\n white-space: nowrap;\n cursor: default;\n user-select: none;\n outline: none;\n box-sizing: border-box;\n }\n\n .start {\n display: none;\n flex: 0 0 auto;\n align-items: center;\n }\n\n :host([data-has-start]) .start {\n display: inline-flex;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n .option:focus-visible,\n :host([highlighted]) .option {\n background: var(--pk-color-slate-100);\n }\n\n :host([disabled]) .option,\n .option[aria-disabled='true'] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n .check {\n position: absolute;\n inset-inline-end: var(--pk-select-item-indicator-inset, 0.5rem);\n top: 50%;\n display: none;\n align-items: center;\n justify-content: center;\n width: var(--pk-select-item-indicator-size, 0.75rem);\n height: var(--pk-select-item-indicator-size, 0.75rem);\n color: var(--pk-color-gray-700);\n pointer-events: none;\n transform: translateY(-50%);\n line-height: 0;\n }\n\n :host([selected]) .check {\n display: inline-flex;\n }\n\n .check svg {\n display: block;\n width: var(--pk-select-item-indicator-size, 0.75rem);\n height: var(--pk-select-item-indicator-size, 0.75rem);\n flex-shrink: 0;\n pointer-events: none;\n }\n\n .label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n /* Allow custom multi-line option layouts (title + subtitle) to stack. */\n white-space: normal;\n }\n\n .match {\n padding: 0;\n border-radius: 2px;\n background: var(--pk-color-blue-100);\n color: inherit;\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property } from '../../decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\n\nimport { check, renderIconHtml } from '../../icons/index.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport { splitHighlightParts } from '../../utils/highlight-text.js';\nimport { pkOptionStyles } from './pk-option.styles.js';\n\nconst CHECK_ICON = renderIconHtml(check);\n\n/**\n * Select option — use inside `pk-select` or `pk-combobox`.\n *\n * @slot start - Presentational decoration before the label (e.g. `pk-status`).\n * @slot - Option label\n *\n * @csspart start - Start decoration container\n * @csspart option - Option button\n * @csspart label - Option label\n * @csspart check - Selected-state check indicator\n */\n@customElement('pk-option')\nexport class PkOption extends PkElement {\n static override styles = pkOptionStyles;\n\n @property()\n value = '';\n\n /**\n * Optional short label for the closed trigger / filter identity (v1 itemToStringLabel).\n * When set, preferred over concatenating rich default-slot text (title + subtitle).\n */\n @property()\n label = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: Boolean, reflect: true })\n highlighted = false;\n\n @property({ type: Boolean, reflect: true })\n hidden = false;\n\n @property({ type: Number, attribute: 'focus-index' })\n focusIndex = -1;\n\n @property()\n optionId = '';\n\n /** When set, the label renders with matching query text highlighted (combobox filter). */\n @property({ attribute: false })\n matchQuery = '';\n\n focusControl(preventScroll = true): void {\n this.shadowRoot?.querySelector<HTMLButtonElement>('.option')?.focus({ preventScroll });\n }\n\n /**\n * Label for the closed combobox/select value.\n * Prefers the `label` attribute when set; otherwise default-slot text\n * (excluding `slot=\"start\"`), joined with spaces for multi-node layouts.\n */\n getLabel(): string {\n if (this.label.trim()) {\n return this.label.trim();\n }\n\n const labelSlot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n\n if (!labelSlot) {\n return this.textContent?.trim() ?? this.value;\n }\n\n // Join with spaces so multi-line custom labels (\"Link\" + \"Craft CMS\") do not\n // concatenate into \"LinkCraft CMS\" when no explicit `label` is set.\n return labelSlot.assignedNodes()\n .map((node) => (node.textContent ?? '').trim())\n .filter(Boolean)\n .join(' ')\n .trim();\n }\n\n /** Full default-slot text for typeahead matching (includes subtitle lines). */\n getSearchText(): string {\n const labelSlot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n\n if (!labelSlot) {\n return this.getLabel();\n }\n\n const fromSlot = labelSlot.assignedNodes()\n .map((node) => (node.textContent ?? '').trim())\n .filter(Boolean)\n .join(' ')\n .trim();\n\n return fromSlot || this.getLabel();\n }\n\n /** True when the default slot has element children (custom multi-line / rich layouts). */\n private hasRichLabelContent(): boolean {\n return [...this.children].some((node) => {\n if (!(node instanceof HTMLElement)) {\n return false;\n }\n\n // Named slots (e.g. start) are not part of the label.\n return !node.slot || node.slot === '';\n });\n }\n\n /** Light-DOM elements assigned to the start decoration slot. */\n getStartElements(): HTMLElement[] {\n return [...this.querySelectorAll(':scope > [slot=\"start\"]')].filter(\n (node): node is HTMLElement => node instanceof HTMLElement,\n );\n }\n\n override firstUpdated(): void {\n const startSlot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"start\"]');\n\n startSlot?.addEventListener('slotchange', () => this.syncStartDecoration());\n this.syncStartDecoration();\n }\n\n private syncStartDecoration(): void {\n this.toggleAttribute('data-has-start', this.getStartElements().length > 0);\n }\n\n private handleClick(): void {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent('pk-option-select', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n private handleMouseEnter(): void {\n if (this.disabled || this.hidden) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent('pk-option-highlight', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const navKeys = new Set([\n 'ArrowDown',\n 'ArrowUp',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n 'Enter',\n ' ',\n 'Escape',\n ]);\n\n if (!navKeys.has(event.key)) {\n return;\n }\n\n const owner = this.closest('pk-select, pk-combobox');\n const panel = owner ? null : this.closest('[role=\"listbox\"]');\n\n if (!owner && !panel) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const keydownEvent = new CustomEvent('pk-listbox-keydown', {\n detail: { keyboardEvent: event },\n bubbles: true,\n });\n\n if (owner) {\n owner.dispatchEvent(keydownEvent);\n return;\n }\n\n panel!.dispatchEvent(keydownEvent);\n }\n\n private renderLabel() {\n const query = this.matchQuery.trim();\n // Flat highlight replaces the default slot — that collapses custom layouts\n // (title + subtitle) into one run when filtering. Keep the slot for rich content.\n if (!query || this.hasRichLabelContent()) {\n return html`\n <span part=\"label\" class=\"label\">\n <slot></slot>\n </span>\n `;\n }\n\n const label = this.getLabel();\n const parts = splitHighlightParts(label, query);\n\n return html`\n <span part=\"label\" class=\"label\">\n ${parts.map((part) => part.match\n ? html`<mark class=\"match\">${part.text}</mark>`\n : html`<span>${part.text}</span>`)}\n </span>\n `;\n }\n\n override render() {\n return html`\n <button\n part=\"option\"\n type=\"button\"\n class=\"option\"\n role=\"option\"\n id=${this.optionId || nothing}\n ?disabled=${this.disabled}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-selected=${this.selected ? 'true' : 'false'}\n tabindex=${this.focusIndex}\n @click=${this.handleClick}\n @mouseenter=${this.handleMouseEnter}\n @keydown=${this.handleKeyDown}\n >\n <span part=\"start\" class=\"start\">\n <slot name=\"start\"></slot>\n </span>\n ${this.renderLabel()}\n <span part=\"check\" class=\"check\" aria-hidden=\"true\">${unsafeSVG(CHECK_ICON)}</span>\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-option': PkOption;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pk-popover-duyNosk2.js","names":[],"sources":["../../src/components/popover/pk-popover.styles.ts","../../src/components/popover/pk-popover.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport { buttonGroupCornerRoleStyles } from '../button-group/button-group-item.styles.js';\nimport { popupContentAnimationStyles } from '../../styles/popup-content-animation.styles.js';\n\nexport const pkPopoverStyles = [\n buttonGroupCornerRoleStyles(),\n popupContentAnimationStyles,\n css`\n @layer pk-component {\n :host {\n /* Flex column parents stretch cross-axis size — pin to content.\n (inline-block + align-self; same class of fix as dialog / dropdown.) */\n display: inline-block;\n max-width: 100%;\n align-self: flex-start;\n flex: none;\n vertical-align: middle;\n }\n\n :host([data-pk-group-orientation]) {\n display: inline-flex;\n vertical-align: middle;\n flex: 0 0 auto;\n align-self: auto;\n }\n\n :host([data-pk-group-orientation]) ::slotted([slot='trigger']) {\n --pk-bg-start-start-radius: inherit;\n --pk-bg-start-end-radius: inherit;\n --pk-bg-end-start-radius: inherit;\n --pk-bg-end-end-radius: inherit;\n }\n\n :host([data-pk-group-orientation='horizontal'][data-pk-group-join]) {\n margin-inline-start: var(--pk-bg-horizontal-indent, 0);\n }\n\n :host([data-pk-group-orientation='vertical'][data-pk-group-join]) {\n margin-block-start: var(--pk-bg-vertical-indent, 0);\n }\n\n :host([data-pk-group-orientation='horizontal'][data-pk-group-join]:has([slot='trigger'][variant='outline'], [slot='trigger'][variant='dashed'])) {\n margin-inline-start: var(--pk-bg-horizontal-indent-outlined, 0);\n }\n\n :host([data-pk-group-orientation='vertical'][data-pk-group-join]:has([slot='trigger'][variant='outline'], [slot='trigger'][variant='dashed'])) {\n margin-block-start: var(--pk-bg-vertical-indent-outlined, 0);\n }\n\n /* Match pk-popup's arrow fill to the panel surface when with-arrow is on. */\n :host([with-arrow]) {\n --pk-popup-arrow-color: var(--pk-color-white);\n --pk-popup-arrow-size: 8px;\n }\n\n .panel {\n box-sizing: border-box;\n width: 18rem;\n padding: 1rem;\n border-radius: var(--pk-radius-md);\n background: var(--pk-color-white);\n box-shadow: var(--pk-shadow-popover);\n /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\n }\n\n /* Flush panels for command/menu chrome that owns its own inset (variable picker, etc.).\n Match kit v1 PopoverContent min-w 260px / max-w 360px: without min-width,\n width max-content shrinks to short labels and looks narrower than the old picker. */\n :host([flush]) .panel {\n width: max-content;\n min-width: var(--pk-popover-flush-min-width, 16.25rem);\n max-width: min(var(--pk-popover-flush-max-width, 22.5rem), 100vw - 1rem);\n padding: 0;\n }\n\n .panel[hidden] {\n display: none !important;\n }\n }\n `,\n];\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { isTopDismissible, registerDismissible, unregisterDismissible } from '../../a11y/dismissible-stack.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport { resolveElementById } from '../../internal/resolve-element-by-id.js';\nimport {\n PkAfterHideEvent,\n PkAfterShowEvent,\n PkHideEvent,\n PkShowEvent,\n type PkOverlaySource,\n} from '../../events/overlay-lifecycle.js';\n// Keep the internal element registered when production builds erase type-only imports.\nimport '../popup/pk-popup.js';\nimport type { PkPopup, PkPopupPlacement } from '../popup/pk-popup.js';\nimport {\n syncPopupPlacementAnimation,\n waitForPopupReposition,\n} from '../../utils/popup-placement-animation.js';\nimport { isPointerInsideOverlay } from '../../utils/popup-pointer.js';\nimport { pkPopoverStyles } from './pk-popover.styles.js';\n\n/**\n * Popover — pattern: trigger toggles a floating panel.\n *\n * @slot trigger - Popover trigger\n * @slot - Popover content\n *\n * @csspart panel - Floating content panel\n *\n * @attr with-arrow - Show a pointing arrow toward the trigger (default: off)\n */\n@customElement('pk-popover')\nexport class PkPopover extends PkElement {\n static override styles = pkPopoverStyles;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom';\n\n @property({ attribute: 'side-offset', type: Number })\n sideOffset = 4;\n\n /**\n * Drop default panel padding/fixed width so slotted chrome (command lists, etc.)\n * can control its own inset. Consumer outer `p-0` alone cannot reach `.panel`.\n */\n @property({ type: Boolean, reflect: true })\n flush = false;\n\n /**\n * Show a floating-ui arrow on the panel (off by default).\n * Named like other optional chrome (`with-clear`, `with-caret`) — tooltip always\n * paints its own arrow and has no toggle.\n */\n @property({ attribute: 'with-arrow', type: Boolean, reflect: true })\n withArrow = false;\n\n /** Anchor element id — alternative to the trigger slot. */\n @property({ reflect: true })\n for = '';\n\n /**\n * Live element anchor — use when the target lives in another shadow tree\n * (e.g. TipTap chips). Preferred over `for` / trigger slot when set.\n * Stays in the consumer tree so modal `showModal()` inert does not apply\n * (unlike portaling the panel to a root outside the dialog).\n */\n @property({ attribute: false })\n anchor: Element | null = null;\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n private get panelElement(): HTMLDivElement | null {\n return this.popupElement?.getContentElement() as HTMLDivElement | null ?? null;\n }\n\n @state()\n private triggerElement: HTMLElement | null = null;\n\n /** True while the shared popup-content exit animation is running. */\n @state()\n private closing = false;\n\n /** Gates `data-open` so enter motion starts after Floating UI places the panel. */\n @state()\n private panelAnimated = false;\n\n private readonly triggerId = uniqueId('pk-popover-trigger');\n private dismissRegistered = false;\n /** Guard re-entry while openPopover/closePopover mutate `open`. */\n private syncingOpenSideEffects = false;\n /** Coalesce overlapping close calls (updated + light-dismiss) onto one exit. */\n private exitAnimationPromise: Promise<void> | null = null;\n\n override disconnectedCallback(): void {\n // Skip exit motion on teardown — demote immediately.\n void this.closePopover('api', true);\n super.disconnectedCallback();\n }\n\n /**\n * When controlled/toggle `open` flips false, arm `closing` in the same update so the\n * panel is not `hidden` for a frame before the exit animation starts.\n */\n override willUpdate(changed: PropertyValues): void {\n if (\n changed.has('open')\n && this.open === false\n && changed.get('open') === true\n && !this.syncingOpenSideEffects\n && !this.closing\n ) {\n this.closing = true;\n this.panelAnimated = false;\n }\n }\n\n /**\n * Controlled `open` (e.g. React) must arm/disarm light-dismiss the same way as\n * trigger toggles. Without this, programmatic open shows the panel but click-away\n * never fires.\n */\n override async updated(changed: PropertyValues): Promise<void> {\n super.updated(changed);\n\n if (!changed.has('open') || this.syncingOpenSideEffects) {\n return;\n }\n\n const previousOpen = changed.get('open');\n\n if (previousOpen === this.open) {\n return;\n }\n\n // Initial connect with open=false — nothing to tear down.\n if (previousOpen === undefined && this.open === false) {\n return;\n }\n\n if (this.open) {\n await this.openPopover();\n } else {\n await this.closePopover('api');\n }\n }\n\n private onTriggerSlotChange(event: Event): void {\n const slot = event.target as HTMLSlotElement;\n const [trigger] = slot.assignedElements({ flatten: true }) as HTMLElement[];\n\n this.unbindTrigger(this.triggerElement);\n this.triggerElement = trigger ?? null;\n this.bindTrigger(this.triggerElement);\n }\n\n private bindTrigger(trigger: HTMLElement | null): void {\n if (!trigger) {\n return;\n }\n\n if (!trigger.id) {\n trigger.id = this.triggerId;\n }\n\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.addEventListener('click', this.handleToggleClick);\n this.syncExpanded();\n }\n\n private unbindTrigger(trigger: HTMLElement | null): void {\n trigger?.removeEventListener('click', this.handleToggleClick);\n }\n\n private handleToggleClick = (event: Event): void => {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.closing) {\n return;\n }\n\n // Flip `open` only — side effects run from `updated()` (same as dropdown-menu).\n this.open = !this.open;\n };\n\n private async openPopover(): Promise<void> {\n if (!this.getAnchor()) {\n return;\n }\n\n // Finish any in-flight exit before arming a new open.\n if (this.exitAnimationPromise) {\n await this.exitAnimationPromise;\n }\n\n // Already armed from a prior controlled/toggle open.\n if (this.dismissRegistered && this.open) {\n if (this.panelElement) {\n this.panelElement.hidden = false;\n }\n this.syncExpanded();\n return;\n }\n\n if (!this.dispatchEvent(new PkShowEvent())) {\n this.syncingOpenSideEffects = true;\n this.open = false;\n this.syncingOpenSideEffects = false;\n return;\n }\n\n this.syncingOpenSideEffects = true;\n this.open = true;\n this.syncingOpenSideEffects = false;\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = false;\n // Seed side before first paint so enter keyframes pick a direction.\n syncPopupPlacementAnimation(this.panelElement, this.placement);\n }\n\n this.syncExpanded();\n this.registerDismissHandlers();\n\n await this.updateComplete;\n const placement = await waitForPopupReposition(this.popupElement, this.placement);\n\n if (this.panelElement) {\n syncPopupPlacementAnimation(this.panelElement, placement);\n }\n\n // Flip data-open after placement so the shared enter animation can run.\n this.panelAnimated = true;\n\n this.dispatchEvent(new PkAfterShowEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: true },\n bubbles: true,\n composed: true,\n }));\n }\n\n /**\n * @param immediate Skip exit animation (disconnect / forced teardown).\n */\n async closePopover(source: PkOverlaySource = 'unknown', immediate = false): Promise<void> {\n if (this.exitAnimationPromise) {\n return this.exitAnimationPromise;\n }\n\n if (!this.dismissRegistered && !this.closing && !this.open) {\n return;\n }\n\n const hideEvent = new PkHideEvent(source);\n\n if (!this.dispatchEvent(hideEvent)) {\n // Controlled close was cancelled — restore open and cancel exit arming.\n this.syncingOpenSideEffects = true;\n this.open = true;\n this.syncingOpenSideEffects = false;\n this.closing = false;\n this.panelAnimated = true;\n return;\n }\n\n this.unregisterDismissHandlers();\n this.closing = true;\n this.panelAnimated = false;\n\n if (this.open) {\n this.syncingOpenSideEffects = true;\n this.open = false;\n this.syncingOpenSideEffects = false;\n }\n\n const finishClose = async (): Promise<void> => {\n if (!immediate) {\n await this.updateComplete;\n await this.waitForExitAnimation();\n }\n\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = true;\n this.panelElement.removeAttribute('data-side');\n }\n\n this.syncExpanded();\n\n this.dispatchEvent(new PkAfterHideEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: false },\n bubbles: true,\n composed: true,\n }));\n };\n\n this.exitAnimationPromise = finishClose().finally(() => {\n this.exitAnimationPromise = null;\n });\n\n return this.exitAnimationPromise;\n }\n\n private waitForExitAnimation(): Promise<void> {\n const panel = this.panelElement;\n\n if (!panel) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n panel.removeEventListener('animationend', onAnimationEnd);\n window.clearTimeout(fallback);\n panel.classList.remove('closing');\n resolve();\n };\n\n const onAnimationEnd = (event: AnimationEvent): void => {\n if (event.target === panel && event.animationName.startsWith('pk-popup-content-out')) {\n finish();\n }\n };\n\n panel.classList.add('closing');\n panel.addEventListener('animationend', onAnimationEnd);\n const fallback = window.setTimeout(finish, 150);\n });\n }\n\n private getAnchor(): Element | string | null {\n if (this.anchor) {\n return this.anchor;\n }\n\n if (this.for) {\n return resolveElementById(this, this.for);\n }\n\n if (this.triggerElement) {\n return this.triggerElement;\n }\n\n return null;\n }\n\n private registerDismissHandlers(): void {\n if (this.dismissRegistered) {\n return;\n }\n\n registerDismissible(this);\n this.dismissRegistered = true;\n document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private unregisterDismissHandlers(): void {\n if (this.dismissRegistered) {\n unregisterDismissible(this);\n this.dismissRegistered = false;\n }\n\n document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private onDocumentPointerDown = (event: PointerEvent): void => {\n if (this.isPointerInside(event) || this.closing) {\n return;\n }\n\n void this.closePopover('light-dismiss');\n };\n\n private isPointerInside(event: PointerEvent): boolean {\n return isPointerInsideOverlay(event, {\n host: this,\n anchor: this.getAnchorElement(),\n panel: this.panelElement,\n });\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !isTopDismissible(this) || this.closing) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n void this.closePopover('escape');\n };\n\n private getAnchorElement(): HTMLElement | null {\n if (this.anchor instanceof HTMLElement) {\n return this.anchor;\n }\n\n if (this.triggerElement) {\n return this.triggerElement;\n }\n\n if (this.for) {\n return resolveElementById(this, this.for);\n }\n\n return null;\n }\n\n private syncExpanded(): void {\n this.triggerElement?.setAttribute('aria-expanded', this.open ? 'true' : 'false');\n }\n\n override render() {\n const anchor = this.getAnchor();\n\n return html`\n <slot name=\"trigger\" @slotchange=${this.onTriggerSlotChange}></slot>\n <pk-popup\n .active=${this.open || this.closing}\n .anchor=${anchor ?? ''}\n .placement=${this.placement}\n .distance=${this.sideOffset}\n .arrow=${this.withArrow}\n flip\n shift\n >\n <div\n part=\"panel\"\n class=${classMap({\n panel: true,\n 'pk-popup-content': true,\n closing: this.closing,\n })}\n ?hidden=${!this.open && !this.closing}\n data-open=${this.panelAnimated && !this.closing ? '' : nothing}\n tabindex=${this.open ? '-1' : nothing}\n >\n <slot></slot>\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-popover': PkPopover;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pk-popup-B9AgBC2V.js","names":[],"sources":["../../src/internal/resolve-element-by-id.ts","../../src/events/pk-reposition.ts","../../src/components/popup/pk-popup.styles.ts","../../src/components/popup/pk-popup.ts"],"sourcesContent":["/** Resolve an element id from the same root as the host (shadow or document), then the document. */\nexport function resolveElementById(host: HTMLElement, id: string): HTMLElement | null {\n if (!id) {\n return null;\n }\n\n const root = host.getRootNode();\n\n if (root instanceof Document || root instanceof ShadowRoot) {\n const match = root.getElementById(id);\n\n if (match) {\n return match;\n }\n }\n\n return host.ownerDocument.getElementById(id);\n}\n","/** Emitted when a popup repositions — mirrors reposition semantics with pk naming. */\nexport class PkRepositionEvent extends Event {\n constructor() {\n super('pk-reposition', { bubbles: true, cancelable: false, composed: true });\n }\n}\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'pk-reposition': PkRepositionEvent;\n }\n}\n","import { css } from 'lit';\n\nexport const pkPopupStyles = css`\n @layer pk-component {\n :host {\n display: contents;\n }\n\n .popup {\n position: absolute;\n isolation: isolate;\n width: max-content;\n z-index: var(--pk-popup-z-index, 1000);\n /* Never transition coordinates — flip would animate the jump. */\n transition: none;\n\n /* Reset UA styles for [popover] — see pk-popup. */\n inset: unset;\n padding: unset;\n margin: unset;\n height: unset;\n color: unset;\n background: unset;\n border: unset;\n overflow: unset;\n }\n\n .popup-fixed {\n position: fixed;\n }\n\n .popup:not(.active) {\n display: none;\n }\n\n /* Prefer visibility over opacity so enter animations are not fighting a\n * 0→1 fade. Matches base-ui isPositioned / hide-until-placed.\n */\n .popup.active:not(.positioned) {\n visibility: hidden;\n pointer-events: none;\n }\n\n .popup.show {\n animation: pk-popup-surface-in 100ms ease-out;\n }\n\n .popup.hide {\n animation: pk-popup-surface-out 100ms ease-in forwards;\n }\n\n @keyframes pk-popup-surface-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes pk-popup-surface-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n .arrow {\n position: absolute;\n width: var(--pk-popup-arrow-size, 6px);\n height: var(--pk-popup-arrow-size, 6px);\n rotate: 45deg;\n background: var(--pk-popup-arrow-color, var(--pk-color-white));\n z-index: 1;\n }\n\n .hover-bridge {\n position: fixed;\n z-index: calc(var(--pk-popup-z-index, 1000) - 1);\n inset: 0;\n clip-path: polygon(\n var(--pk-hover-bridge-top-left-x, 0) var(--pk-hover-bridge-top-left-y, 0),\n var(--pk-hover-bridge-top-right-x, 0) var(--pk-hover-bridge-top-right-y, 0),\n var(--pk-hover-bridge-bottom-right-x, 0) var(--pk-hover-bridge-bottom-right-y, 0),\n var(--pk-hover-bridge-bottom-left-x, 0) var(--pk-hover-bridge-bottom-left-y, 0)\n );\n pointer-events: auto;\n }\n\n .hover-bridge:not(.hover-bridge-visible) {\n display: none;\n }\n }\n`;\n","import {\n arrow,\n autoUpdate,\n computePosition,\n flip,\n getOverflowAncestors,\n offset,\n platform,\n shift,\n size,\n type Placement,\n} from '@floating-ui/dom';\nimport { offsetParent } from 'composed-offset-position';\nimport { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { resolveElementById } from '../../internal/resolve-element-by-id.js';\nimport { PkRepositionEvent } from '../../events/pk-reposition.js';\nimport { computePopupTransformOrigin } from '../../utils/popup-placement-animation.js';\nimport { SUPPORTS_POPOVER } from '../../utils/supports-popover.js';\nimport { pkPopupStyles } from './pk-popup.styles.js';\n\nexport type PkPopupPlacement = Placement;\n\nexport type PkPopupVirtualElement = {\n getBoundingClientRect: () => DOMRect;\n contextElement?: Element;\n};\n\nfunction isVirtualElement(value: unknown): value is PkPopupVirtualElement {\n return (\n value !== null\n && typeof value === 'object'\n && 'getBoundingClientRect' in value\n );\n}\n\nfunction resolvePositionStrategy(\n positionMethod: 'fixed' | 'absolute' | undefined,\n): 'fixed' | 'absolute' {\n if (positionMethod) {\n return positionMethod;\n }\n\n // Top-layer popovers use absolute coords; legacy fallback uses fixed viewport coords.\n return SUPPORTS_POPOVER ? 'absolute' : 'fixed';\n}\n\nfunction resolveScrollBoundary(\n anchorElement: Element | PkPopupVirtualElement,\n boundary: 'viewport' | 'scroll',\n): Element[] | undefined {\n if (!SUPPORTS_POPOVER || isVirtualElement(anchorElement) || boundary !== 'scroll') {\n return undefined;\n }\n\n // Popover content leaves the anchor's overflow chain — pass ancestor bounds explicitly.\n return getOverflowAncestors(anchorElement).filter((node): node is Element => node instanceof Element);\n}\n\n/**\n * Anchors floating content to a reference element — popup pattern with pk naming.\n * When the Popover API is available, content stays in the component tree and is promoted to\n * the top layer via `popover=\"manual\"` + `showPopover()` (no DOM reparenting).\n *\n * @event pk-reposition - Emitted when the popup is repositioned.\n *\n * @slot - Popup content.\n * @slot anchor - Anchor element when it lives inside the popup host.\n *\n * @csspart popup - Floating container.\n * @csspart arrow - Arrow element.\n * @csspart hover-bridge - Invisible bridge between anchor and popup.\n */\n@customElement('pk-popup')\nexport class PkPopup extends PkElement {\n static override styles = pkPopupStyles;\n\n /** Element id, DOM reference, or virtual element to anchor against. */\n @property()\n anchor: Element | string | PkPopupVirtualElement = '';\n\n /** When true, positioning runs and the popup is shown. */\n @property({ type: Boolean, reflect: true })\n active = false;\n\n /**\n * Floating UI positioning strategy.\n * Defaults to `absolute` when the Popover API is supported, otherwise `fixed`.\n */\n @property({ attribute: 'position-method' })\n positionMethod?: 'fixed' | 'absolute';\n\n /** Bounding box for flip/shift collision — `scroll` uses overflow ancestors when popover is active. */\n @property({ reflect: true })\n boundary: 'viewport' | 'scroll' = 'viewport';\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom-start';\n\n @property({ type: Number })\n distance = 4;\n\n @property({ type: Number })\n skidding = 0;\n\n @property({ type: Boolean })\n flip = true;\n\n @property({ attribute: 'flip-fallback-placements' })\n flipFallbackPlacements = '';\n\n @property({ attribute: 'flip-fallback-strategy' })\n flipFallbackStrategy: 'best-fit' | 'initial' = 'best-fit';\n\n @property({ attribute: 'flip-padding', type: Number })\n flipPadding = 8;\n\n @property({ type: Boolean })\n shift = true;\n\n @property({ attribute: 'shift-padding', type: Number })\n shiftPadding = 8;\n\n @property({ type: Boolean })\n arrow = false;\n\n @property({ attribute: 'arrow-placement' })\n arrowPlacement: 'start' | 'end' | 'center' | 'anchor' = 'anchor';\n\n @property({ attribute: 'arrow-padding', type: Number })\n arrowPadding = 10;\n\n @property()\n sync?: 'width' | 'height' | 'both';\n\n /** When false, the popup is positioned once and not tracked on scroll/resize. */\n @property({ attribute: 'anchor-tracking', type: Boolean })\n anchorTracking = true;\n\n @property({ attribute: 'hover-bridge', type: Boolean })\n hoverBridge = false;\n\n @query('.popup')\n private popupElement?: HTMLElement;\n\n @query('.arrow')\n private arrowElement?: HTMLElement;\n\n private anchorElement: Element | PkPopupVirtualElement | null = null;\n private cleanup?: () => void;\n /** True while waiting for layout-stable coords before first paint. */\n private settlingInitialPosition = false;\n private settleGeneration = 0;\n\n override disconnectedCallback(): void {\n void this.stop();\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n if (changed.has('active')) {\n if (this.active) {\n this.resolveAnchor();\n this.start();\n } else {\n this.stop();\n }\n }\n\n if (changed.has('anchor')) {\n void this.handleAnchorChange();\n }\n\n if (this.active && !changed.has('active')) {\n this.reposition();\n }\n }\n\n /** Forces the popup to recalculate and reposition itself. */\n reposition(): void {\n if (this.settlingInitialPosition) {\n return;\n }\n\n void this.repositionAsync();\n }\n\n /**\n * Runs Floating UI once and applies coords. Does not reveal an unpositioned\n * popup — `settleInitialPosition()` owns the first paint.\n */\n private async repositionAsync(emitEvent = true): Promise<boolean> {\n const floatingElement = this.popupElement;\n const arrowTarget = this.arrow ? this.arrowElement : null;\n\n if (!this.active || !this.anchorElement || !floatingElement) {\n return false;\n }\n\n const scrollBoundary = resolveScrollBoundary(this.anchorElement, this.boundary);\n\n const middleware = [\n offset({ mainAxis: this.distance, crossAxis: this.skidding }),\n ];\n\n if (this.sync) {\n middleware.push(\n size({\n apply: ({ rects }) => {\n const syncWidth = this.sync === 'width' || this.sync === 'both';\n const syncHeight = this.sync === 'height' || this.sync === 'both';\n floatingElement.style.width = syncWidth ? `${rects.reference.width}px` : '';\n floatingElement.style.height = syncHeight ? `${rects.reference.height}px` : '';\n },\n }),\n );\n } else {\n floatingElement.style.width = '';\n floatingElement.style.height = '';\n }\n\n if (this.flip) {\n middleware.push(\n flip({\n boundary: scrollBoundary,\n fallbackPlacements: this.flipFallbackPlacements\n ? this.flipFallbackPlacements.split(' ').map((value) => value.trim()).filter(Boolean) as Placement[]\n : undefined,\n fallbackStrategy: this.flipFallbackStrategy === 'best-fit' ? 'bestFit' : 'initialPlacement',\n padding: this.flipPadding,\n }),\n );\n }\n\n if (this.shift) {\n middleware.push(\n shift({\n boundary: scrollBoundary,\n padding: this.shiftPadding,\n }),\n );\n }\n\n if (this.arrow && arrowTarget) {\n middleware.push(\n arrow({\n element: arrowTarget,\n padding: this.arrowPadding,\n }),\n );\n }\n\n const strategy = resolvePositionStrategy(this.positionMethod);\n const useFixedFallback = strategy === 'fixed';\n\n floatingElement.classList.toggle('popup-fixed', useFixedFallback);\n\n const getOffsetParentFn = SUPPORTS_POPOVER\n ? (element: Element) => platform.getOffsetParent(element, offsetParent)\n : platform.getOffsetParent;\n\n const { x, y, middlewareData, placement } = await computePosition(this.anchorElement, floatingElement, {\n placement: this.placement,\n middleware,\n strategy,\n platform: {\n ...platform,\n getOffsetParent: getOffsetParentFn,\n },\n });\n\n if (!this.active || !floatingElement.isConnected) {\n return false;\n }\n\n const staticSide = { top: 'bottom', right: 'left', bottom: 'top', left: 'right' }[\n placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left'\n ]!;\n\n this.setAttribute('data-current-placement', placement);\n\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`,\n ...(useFixedFallback ? { position: 'fixed' } : { position: '' }),\n });\n\n if (this.anchorElement) {\n // Use viewport rects for both sides — computePosition x/y can be offset-parent\n // relative, and mixing that with getBoundingClientRect shifts transform-origin\n // sideways (menu appears to slide in from the right).\n const referenceRect = this.anchorElement.getBoundingClientRect();\n const floatingRect = floatingElement.getBoundingClientRect();\n\n floatingElement.style.setProperty('--pk-anchor-width', `${referenceRect.width}px`);\n floatingElement.style.setProperty('--pk-anchor-height', `${referenceRect.height}px`);\n\n const transformOrigin = computePopupTransformOrigin(\n placement,\n referenceRect,\n floatingRect,\n this.distance,\n middlewareData.shift,\n );\n\n floatingElement.style.setProperty('--pk-transform-origin', transformOrigin);\n }\n\n if (this.arrow && arrowTarget) {\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n let top = '';\n let right = '';\n let bottom = '';\n let left = '';\n\n if (this.arrowPlacement === 'start') {\n const value = typeof arrowX === 'number' ? `${this.arrowPadding}px` : '';\n top = typeof arrowY === 'number' ? `${this.arrowPadding}px` : '';\n left = value;\n } else if (this.arrowPlacement === 'end') {\n right = typeof arrowX === 'number' ? `${this.arrowPadding}px` : '';\n bottom = typeof arrowY === 'number' ? `${this.arrowPadding}px` : '';\n } else if (this.arrowPlacement === 'center') {\n left = typeof arrowX === 'number' ? '50%' : '';\n top = typeof arrowY === 'number' ? '50%' : '';\n } else {\n left = typeof arrowX === 'number' ? `${arrowX}px` : '';\n top = typeof arrowY === 'number' ? `${arrowY}px` : '';\n }\n\n Object.assign(arrowTarget.style, {\n top,\n right,\n bottom,\n left,\n transform: '',\n [staticSide]: 'calc(-1 * var(--pk-popup-arrow-size, 6px) / 2)',\n });\n }\n\n requestAnimationFrame(() => this.updateHoverBridge());\n\n if (emitEvent) {\n this.dispatchEvent(new PkRepositionEvent());\n }\n\n return true;\n }\n\n private frames(count: number): Promise<void> {\n return new Promise((resolve) => {\n const step = (remaining: number): void => {\n if (remaining <= 0) {\n resolve();\n return;\n }\n\n requestAnimationFrame(() => step(remaining - 1));\n };\n\n step(count);\n });\n }\n\n /**\n * Hide → layout → measure → confirm flip → reveal.\n * A single computePosition often runs before slotted content has height, so flip\n * picks the preferred side; autoUpdate then jumps — that was the visible flash.\n */\n private async settleInitialPosition(): Promise<void> {\n const generation = ++this.settleGeneration;\n const floatingElement = this.popupElement;\n\n if (!floatingElement) {\n this.settlingInitialPosition = false;\n return;\n }\n\n // Two frames: display:none→block + slotted panel unhide need a layout pass.\n await this.frames(2);\n\n if (!this.active || generation !== this.settleGeneration) {\n return;\n }\n\n // Quiet passes — consumers waiting on pk-reposition should see the settled place.\n await this.repositionAsync(false);\n\n // Confirm after the first coords are applied (size middleware / content height).\n void floatingElement.offsetHeight;\n await this.frames(1);\n\n if (!this.active || generation !== this.settleGeneration) {\n return;\n }\n\n await this.repositionAsync(false);\n\n if (!this.active || generation !== this.settleGeneration) {\n return;\n }\n\n floatingElement.classList.add('positioned');\n this.settlingInitialPosition = false;\n requestAnimationFrame(() => this.updateHoverBridge());\n this.dispatchEvent(new PkRepositionEvent());\n }\n\n private resolveAnchor(): void {\n if (typeof this.anchor === 'string' && this.anchor) {\n this.anchorElement = resolveElementById(this, this.anchor);\n return;\n }\n\n if (this.anchor instanceof Element || isVirtualElement(this.anchor)) {\n this.anchorElement = this.anchor;\n return;\n }\n\n let slotted = this.querySelector('[slot=\"anchor\"]');\n\n if (slotted instanceof HTMLSlotElement) {\n slotted = slotted.assignedElements({ flatten: true })[0] ?? null;\n }\n\n this.anchorElement = slotted;\n }\n\n private async handleAnchorChange(): Promise<void> {\n await this.stop();\n this.resolveAnchor();\n\n if (this.anchorElement && this.active) {\n this.start();\n }\n }\n\n /** When false, skip popover top layer (e.g. menu/select use fixed coords to simplify modal handoff). */\n private usesPopoverTopLayer(): boolean {\n return SUPPORTS_POPOVER && this.positionMethod !== 'fixed';\n }\n\n /** `stop()` — sync hidePopover + cleanup autoUpdate. */\n stop(): Promise<void> {\n return new Promise((resolve) => {\n const popup = this.popupElement;\n this.settleGeneration += 1;\n this.settlingInitialPosition = false;\n popup?.classList.remove('positioned');\n\n if (this.usesPopoverTopLayer()) {\n popup?.hidePopover?.();\n }\n\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n popup?.style.removeProperty('--pk-transform-origin');\n requestAnimationFrame(() => resolve());\n } else {\n resolve();\n }\n\n // Always clear — even when autoUpdate never started — so the next open\n // cannot short-circuit waitForPopupReposition on a stale placement.\n this.removeAttribute('data-current-placement');\n });\n }\n\n /** @deprecated Prefer `stop()` — kept for select/combobox handoff call sites. */\n releasePositioning(): void {\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n }\n\n /** @deprecated Prefer `stop()`. */\n async awaitHidden(): Promise<void> {\n await this.stop();\n }\n\n private start(): void {\n if (!this.anchorElement || !this.active || !this.isConnected || !this.popupElement) {\n return;\n }\n\n // Stay invisible until settleInitialPosition confirms flip with real content size.\n this.popupElement.classList.remove('positioned');\n this.settlingInitialPosition = true;\n\n if (this.usesPopoverTopLayer()) {\n this.popupElement.showPopover?.();\n }\n\n if (this.anchorTracking) {\n this.cleanup = autoUpdate(this.anchorElement, this.popupElement, () => {\n // Ignore the sync autoUpdate kick during settle — it races layout.\n if (this.settlingInitialPosition) {\n return;\n }\n\n this.reposition();\n });\n }\n\n void this.settleInitialPosition();\n }\n\n /** Slotted popup content root (e.g. `.panel`) — keeps content in-tree. */\n getContentElement(): HTMLElement | null {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n const assigned = slot?.assignedElements({ flatten: true }) ?? [];\n const slotted = assigned.find((node): node is HTMLElement => node instanceof HTMLElement);\n\n if (slotted) {\n return slotted;\n }\n\n for (const node of this.childNodes) {\n if (node instanceof HTMLElement && node.getAttribute('slot') !== 'anchor') {\n return node;\n }\n }\n\n return null;\n }\n\n private updateHoverBridge(): void {\n const floatingElement = this.popupElement;\n\n if (!this.hoverBridge || !this.anchorElement || !floatingElement) {\n return;\n }\n\n const anchorRect = this.anchorElement.getBoundingClientRect();\n const popupRect = floatingElement.getBoundingClientRect();\n const isVertical = this.placement.includes('top') || this.placement.includes('bottom');\n\n let topLeftX = 0;\n let topLeftY = 0;\n let topRightX = 0;\n let topRightY = 0;\n let bottomLeftX = 0;\n let bottomLeftY = 0;\n let bottomRightX = 0;\n let bottomRightY = 0;\n\n if (isVertical) {\n if (anchorRect.top < popupRect.top) {\n topLeftX = anchorRect.left;\n topLeftY = anchorRect.bottom;\n topRightX = anchorRect.right;\n topRightY = anchorRect.bottom;\n bottomLeftX = popupRect.left;\n bottomLeftY = popupRect.top;\n bottomRightX = popupRect.right;\n bottomRightY = popupRect.top;\n } else {\n topLeftX = popupRect.left;\n topLeftY = popupRect.bottom;\n topRightX = popupRect.right;\n topRightY = popupRect.bottom;\n bottomLeftX = anchorRect.left;\n bottomLeftY = anchorRect.top;\n bottomRightX = anchorRect.right;\n bottomRightY = anchorRect.top;\n }\n } else if (anchorRect.left < popupRect.left) {\n topLeftX = anchorRect.right;\n topLeftY = anchorRect.top;\n topRightX = popupRect.left;\n topRightY = popupRect.top;\n bottomLeftX = anchorRect.right;\n bottomLeftY = anchorRect.bottom;\n bottomRightX = popupRect.left;\n bottomRightY = popupRect.bottom;\n } else {\n topLeftX = popupRect.right;\n topLeftY = popupRect.top;\n topRightX = anchorRect.left;\n topRightY = anchorRect.top;\n bottomLeftX = popupRect.right;\n bottomLeftY = popupRect.bottom;\n bottomRightX = anchorRect.left;\n bottomRightY = anchorRect.bottom;\n }\n\n this.style.setProperty('--pk-hover-bridge-top-left-x', `${topLeftX}px`);\n this.style.setProperty('--pk-hover-bridge-top-left-y', `${topLeftY}px`);\n this.style.setProperty('--pk-hover-bridge-top-right-x', `${topRightX}px`);\n this.style.setProperty('--pk-hover-bridge-top-right-y', `${topRightY}px`);\n this.style.setProperty('--pk-hover-bridge-bottom-left-x', `${bottomLeftX}px`);\n this.style.setProperty('--pk-hover-bridge-bottom-left-y', `${bottomLeftY}px`);\n this.style.setProperty('--pk-hover-bridge-bottom-right-x', `${bottomRightX}px`);\n this.style.setProperty('--pk-hover-bridge-bottom-right-y', `${bottomRightY}px`);\n }\n\n override render() {\n const useFixedFallback = !SUPPORTS_POPOVER || this.positionMethod === 'fixed';\n const usePopoverTopLayer = this.usesPopoverTopLayer();\n\n return html`\n <slot name=\"anchor\" @slotchange=${() => { void this.handleAnchorChange(); }}></slot>\n ${this.hoverBridge ? html`\n <div\n part=\"hover-bridge\"\n class=${classMap({\n 'hover-bridge': true,\n 'hover-bridge-visible': this.active,\n })}\n aria-hidden=\"true\"\n ></div>\n ` : nothing}\n <div\n popover=${usePopoverTopLayer ? 'manual' : nothing}\n part=\"popup\"\n class=${classMap({\n popup: true,\n active: this.active,\n 'popup-fixed': useFixedFallback,\n })}\n >\n ${this.arrow ? html`<div part=\"arrow\" class=\"arrow\"></div>` : nothing}\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-popup': PkPopup;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pk-select-C1s0OJr0.js","names":[],"sources":["../../src/components/select/pk-select.styles.ts","../../src/components/select/pk-select.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport { iconStyles } from '../../base/icon.styles.js';\nimport { popupContentAnimationStyles } from '../../styles/popup-content-animation.styles.js';\n\nexport const pkSelectStyles = [\n popupContentAnimationStyles,\n css`\n ${iconStyles}\n @layer pk-component {\n :host {\n display: inline-block;\n position: relative;\n width: fit-content;\n max-width: 100%;\n align-self: flex-start;\n flex: none;\n color: var(--pk-color-gray-700);\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n --pk-select-trigger-border-width: 1px;\n --pk-select-item-min-height: var(--pk-input-height);\n --pk-select-item-padding-block: 6px;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-padding-inline-end: 2rem;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-line-height: var(--pk-input-control-line-height, 1.25rem);\n --pk-select-item-indicator-size: 0.75rem;\n --pk-select-item-indicator-inset: 0.5rem;\n /* v1 SelectLabel default: text-xs → 12px */\n --pk-select-group-label-font-size: 12px;\n --pk-select-decoration-size: 0.875rem;\n }\n\n :host([width='full']) {\n display: block;\n width: 100%;\n }\n\n :host([width='full']) .control {\n width: 100%;\n }\n\n :host([width='full']) button.control .icon {\n margin-inline-start: auto;\n }\n\n .control {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n /* Fill the host when consumers set min-width/width on :host. */\n width: 100%;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: var(--pk-select-item-padding-block) var(--pk-select-item-padding-inline);\n border: var(--pk-select-trigger-border-width) solid transparent;\n border-radius: var(--pk-radius-lg);\n --pk-select-fill: var(--pk-color-slate-250);\n --pk-select-fill-hover: var(--pk-color-slate-300);\n background: var(--pk-select-fill);\n color: var(--pk-color-gray-700);\n font: inherit;\n font-size: var(--pk-select-item-font-size);\n line-height: var(--pk-input-control-line-height, 1.25rem);\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;\n }\n\n button.control {\n appearance: none;\n -webkit-appearance: none;\n text-align: left;\n background-color: var(--pk-select-fill);\n border: var(--pk-select-trigger-border-width) solid transparent;\n }\n\n :host(:not([disabled])) .control:hover:not(.is-disabled):not(:disabled),\n :host(:not([disabled])) button.control:hover:not(.is-disabled):not(:disabled) {\n background: var(--pk-select-fill-hover);\n }\n\n :host(:not([disabled])) button.control:hover:not(.is-disabled):not(:disabled) {\n background-color: var(--pk-select-fill-hover);\n }\n\n :host(:not([invalid]):not(:state(user-invalid))) button.control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) button.control {\n border-color: var(--pk-color-sky-600);\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n .control.is-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n min-width: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: inherit;\n outline: none;\n }\n\n .control > .trigger:not(.trigger--icon) {\n flex: 0 1 auto;\n justify-content: flex-start;\n }\n\n .trigger--icon {\n width: 1.25rem;\n }\n\n .trigger-start {\n display: none;\n flex: 0 0 auto;\n align-items: center;\n }\n\n .trigger-start.has-decoration {\n display: inline-flex;\n }\n\n .control-start,\n .control-end {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 0;\n color: var(--pk-color-gray-600);\n }\n\n slot[name='start']::slotted(svg),\n slot[name='end']::slotted(svg) {\n width: var(--pk-select-decoration-size);\n height: var(--pk-select-decoration-size);\n }\n\n .value {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n }\n\n .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n line-height: 0;\n pointer-events: none;\n color: var(--pk-color-gray-600);\n }\n\n /* Extra space before the expand chevron (control gap stays for start icon ↔ label). */\n .control > .icon,\n .control > .trigger--icon {\n margin-inline-start: 0.25rem;\n }\n\n .icon svg {\n display: block;\n width: 0.75rem;\n height: 0.75rem;\n }\n\n .tags {\n display: flex;\n flex: 0 1 auto;\n flex-wrap: wrap;\n gap: 0.25rem;\n min-width: 0;\n }\n\n .tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n max-width: 10ch;\n padding: 0.125rem 0.375rem;\n border-radius: var(--pk-radius-sm);\n background: var(--pk-color-gray-200);\n color: var(--pk-color-gray-800);\n font-size: 12px;\n line-height: 1.3;\n }\n\n .tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tag-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 0.875rem;\n height: 0.875rem;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-600);\n cursor: pointer;\n }\n\n .tag-remove:hover {\n background: rgb(0 0 0 / 8%);\n }\n\n .clear-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-600);\n cursor: pointer;\n flex-shrink: 0;\n }\n\n .clear-button:hover {\n background: rgb(0 0 0 / 6%);\n color: var(--pk-color-gray-800);\n }\n\n .value-input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .panel ::slotted(pk-separator) {\n margin: 4px 0;\n }\n\n .panel {\n width: max-content;\n min-width: var(--pk-select-anchor-width, 8rem);\n max-height: 16rem;\n overflow: auto;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: var(--pk-color-white);\n box-shadow: var(--pk-shadow-popup);\n color: var(--pk-color-gray-700);\n outline: none;\n }\n\n .panel[hidden] {\n display: none !important;\n }\n\n :host([invalid]) .control,\n :host(:state(user-invalid)) .control {\n border-color: var(--pk-color-rose-600);\n }\n\n :host([invalid]) button.control:focus-visible,\n :host([invalid][data-state='focus-visible']) button.control,\n :host(:state(user-invalid)) button.control:focus-visible,\n :host(:state(user-invalid)[data-state='focus-visible']) button.control {\n border-color: var(--pk-color-rose-600);\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n :host([size='xs']) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 4px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.25;\n /* v1 SelectLabel xs: text-[11px] */\n --pk-select-group-label-font-size: 11px;\n --pk-select-decoration-size: 0.625rem;\n }\n\n :host([size='xs']) .control {\n border-radius: var(--pk-radius-sm);\n /* Match trigger line-height to the compact item token (default is 1.25rem). */\n line-height: var(--pk-select-item-line-height, 1.25);\n }\n\n :host([size='xs']) .icon svg {\n width: 0.625rem;\n height: 0.625rem;\n }\n\n /* Options live in light DOM; ::slotted pushes size tokens onto each pk-option\n * host so the open listbox matches the trigger (inheritance alone is flaky when\n * the panel is promoted to the popover top layer). */\n :host([size='xs']) ::slotted(pk-option) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 4px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.25;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host([size='xs']) .panel {\n max-height: 12rem;\n }\n\n /* Editable-table cells only (class set by pk-editable-table) — compact chip + menu. */\n :host(.cell-pk-control) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 5px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.5rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.2;\n /* Compact table chip — match xs label size. */\n --pk-select-group-label-font-size: 11px;\n --pk-select-decoration-size: 0.625rem;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host(.cell-pk-control) .control {\n border-radius: var(--pk-radius-sm);\n line-height: var(--pk-select-item-line-height, 1.2);\n }\n\n :host(.cell-pk-control) ::slotted(pk-option) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 5px;\n --pk-select-item-padding-inline: 8px;\n --pk-select-item-padding-inline-end: 1.5rem;\n --pk-select-item-font-size: 11px;\n --pk-select-item-line-height: 1.2;\n --pk-select-item-indicator-size: 0.625rem;\n }\n\n :host(.cell-pk-control) .panel {\n max-height: 11rem;\n }\n\n :host([size='sm']) {\n --pk-select-item-min-height: 0;\n --pk-select-item-padding-block: 6px;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-padding-inline-end: 1.75rem;\n --pk-select-item-font-size: 12px;\n --pk-select-item-indicator-inset: 0.625rem;\n /* v1 SelectLabel sm: text-[12px] */\n --pk-select-group-label-font-size: 12px;\n --pk-select-decoration-size: 0.6875rem;\n }\n\n :host([size='sm']) .control {\n border-radius: var(--pk-radius-md);\n }\n\n :host([size='sm']) .icon svg {\n width: 0.6875rem;\n height: 0.6875rem;\n }\n\n :host([size='lg']) {\n --pk-select-item-padding-block: 8px;\n --pk-select-item-padding-inline: 12px;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-indicator-inset: 0.75rem;\n /* v1 SelectLabel lg: text-sm → 14px */\n --pk-select-group-label-font-size: 14px;\n --pk-select-decoration-size: 1rem;\n }\n\n :host([size='xl']) {\n --pk-select-item-padding-block: 10px;\n --pk-select-item-padding-inline: 14px;\n --pk-select-item-padding-inline-end: 2.25rem;\n --pk-select-item-font-size: var(--pk-font-size-base);\n --pk-select-item-indicator-inset: 0.875rem;\n /* v1 SelectLabel xl: text-base → 16px */\n --pk-select-group-label-font-size: 16px;\n --pk-select-decoration-size: 1.125rem;\n }\n\n :host([size='xl']) .icon svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n }\n`,\n];\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport type { PropertyValues } from 'lit';\n\nimport { chevronDown, renderIconHtml } from '../../icons/index.js';\n\nimport { isTopDismissible, registerDismissible, unregisterDismissible } from '../../a11y/dismissible-stack.js';\nimport { scrollIntoView } from '../../a11y/scroll-lock.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { HasSlotController } from '../../internal/has-slot.js';\nimport { PkClearEvent } from '../../events/pk-clear.js';\nimport {\n PkAfterHideEvent,\n PkAfterShowEvent,\n PkHideEvent,\n PkShowEvent,\n type PkOverlaySource,\n} from '../../events/overlay-lifecycle.js';\nimport type { PkValidator } from '../../validators/types.js';\nimport { MirrorValidator } from '../../validators/mirror-validator.js';\n// Keep the internal element registered when production builds erase type-only imports.\nimport '../popup/pk-popup.js';\nimport type { PkPopup, PkPopupPlacement } from '../popup/pk-popup.js';\nimport {\n createTypeToSelectHandler,\n handleListboxKeyDown,\n isListboxTypeToSelectKey,\n LISTBOX_NAVIGATION_KEYS,\n} from '../../utils/listbox-keyboard.js';\nimport {\n syncPopupPlacementAnimation,\n waitForPopupReposition,\n} from '../../utils/popup-placement-animation.js';\nimport { isEventInsideOverlay, isPointerInsideOverlay } from '../../utils/popup-pointer.js';\nimport { syncListboxSeparators } from '../../internal/sync-listbox-separators.js';\nimport type { PkOption } from './pk-option.js';\nimport type { PkOptionGroup } from './pk-option-group.js';\nimport { pkSelectStyles } from './pk-select.styles.js';\n\nexport type PkSelectSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl';\n\nconst CHEVRON_ICON = renderIconHtml(chevronDown);\n\n/**\n * Select — pattern: slotted `pk-option` children, form-associated, clearable, multiselect tags.\n *\n * @slot start - Presentational decoration before the trigger label (e.g. icons)\n * @slot end - Presentational decoration before the expand chevron\n * @slot - `pk-option` and `pk-option-group` items\n *\n * @csspart control - Trigger control wrapper\n * @csspart start - Host start decoration container\n * @csspart end - Host end decoration container\n * @csspart trigger-start - Mirrored start decoration from the selected option\n * @csspart trigger - Select trigger button\n * @csspart panel - Listbox panel\n */\n@customElement('pk-select')\nexport class PkSelect extends PkFormAssociatedElement {\n static override styles = pkSelectStyles;\n\n static override get validators(): PkValidator[] {\n return [\n ...super.validators,\n MirrorValidator(),\n {\n observedAttributes: ['required'],\n checkValidity: (element) => {\n const select = element as PkSelect;\n const result = {\n message: 'Please select an item in the list.',\n isValid: true,\n invalidKeys: [] as ReturnType<PkValidator['checkValidity']>['invalidKeys'],\n };\n\n if (!select.required) {\n return result;\n }\n\n const missing = select.multiple ? select.values.length === 0 : !select.value;\n\n if (!missing) {\n return result;\n }\n\n result.isValid = false;\n result.invalidKeys.push('valueMissing');\n return result;\n },\n },\n ];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom-start';\n\n /** Gap between the trigger and listbox panel in px (default: 4). */\n @property({ attribute: 'side-offset', type: Number })\n sideOffset = 4;\n\n @property({ type: Boolean, reflect: true })\n clearable = false;\n\n @property({ attribute: 'with-clear', type: Boolean })\n withClear = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n @property({ reflect: true })\n size: PkSelectSize = 'default';\n\n /** When `full`, the trigger stretches to the host width. */\n @property({ reflect: true })\n width?: 'full';\n\n /** Empty by default — consumers opt in when a prompt is useful. */\n @property()\n placeholder = '';\n\n @property()\n value = '';\n\n @property({ attribute: 'default-value' })\n defaultValue = '';\n\n @property({ type: Array, attribute: false })\n values: string[] = [];\n\n @property({ attribute: false })\n defaultValues: string[] = [];\n\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n /**\n * Whether arrow-key focus loops from the last option back to the first (and vice versa).\n * Base UI `Select` has no equivalent; default: `false`.\n */\n @property({ attribute: 'loop-focus', type: Boolean })\n loopFocus = false;\n\n private readonly hasSlotController = new HasSlotController(this, 'start', 'end');\n\n private readonly listboxId = uniqueId('pk-select-listbox');\n private readonly triggerId = uniqueId('pk-select-trigger');\n\n @query('.trigger-start')\n private triggerStartElement?: HTMLSpanElement;\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n @query('.control')\n private controlElement!: HTMLElement;\n\n @query('button.control, .control > button.trigger')\n private triggerButton?: HTMLButtonElement;\n\n @query('.value-input')\n override input!: HTMLInputElement;\n\n private get panelElement(): HTMLDivElement | null {\n return this.popupElement?.getContentElement() as HTMLDivElement | null ?? null;\n }\n\n private options: PkOption[] = [];\n\n @state()\n private highlightedIndex = 0;\n\n private dismissRegistered = false;\n private panelEventTarget: HTMLElement | null = null;\n private typeToSelect = createTypeToSelectHandler([], () => {});\n private optionsObserver?: MutationObserver;\n\n /** True while the shared popup-content exit animation is running. */\n @state()\n private closing = false;\n\n /** Gates `data-open` so enter motion starts after Floating UI places the panel. */\n @state()\n private panelAnimated = false;\n\n override connectedCallback(): void {\n this.refreshOptions();\n super.connectedCallback();\n this.addEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.addEventListener('keydown', this.onKeyDown);\n this.optionsObserver = new MutationObserver(() => {\n this.handleOptionsMutation({ render: true });\n });\n this.optionsObserver.observe(this, { childList: true, subtree: true });\n }\n\n override disconnectedCallback(): void {\n this.unbindPanelEvents();\n this.removeEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.removeEventListener('keydown', this.onKeyDown);\n this.optionsObserver?.disconnect();\n void this.closePanel('api');\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') || changed.has('values') || changed.has('multiple')) {\n this.applySelection();\n }\n\n super.updated(changed);\n }\n\n private getOptionElements(): PkOption[] {\n const portaled = this.popupElement?.getContentElement()?.querySelectorAll('pk-option');\n\n if (portaled && portaled.length > 0) {\n return [...portaled];\n }\n\n return [...this.querySelectorAll('pk-option')];\n }\n\n private handleOptionsMutation = (options: { render?: boolean } = {}): void => {\n const next = this.getOptionElements();\n const changed = next.length !== this.options.length\n || next.some((option, index) => option !== this.options[index]);\n\n this.options = next;\n this.applySelection();\n this.updateTypeToSelect();\n\n if (options.render !== false && changed) {\n this.requestUpdate();\n }\n };\n\n private refreshOptions(): void {\n this.handleOptionsMutation({ render: false });\n }\n\n private syncOptions = (): void => {\n this.handleOptionsMutation({ render: true });\n };\n\n /** Portaled listbox options are outside the host tree — listen on the panel instead. */\n private bindPanelEvents(): void {\n const panel = this.panelElement;\n\n if (!panel || panel === this.panelEventTarget) {\n return;\n }\n\n this.unbindPanelEvents();\n this.panelEventTarget = panel;\n panel.addEventListener('pk-option-select', this.handleOptionSelect as EventListener);\n panel.addEventListener('pk-option-highlight', this.handleOptionHighlight as EventListener);\n panel.addEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n }\n\n private unbindPanelEvents(): void {\n if (!this.panelEventTarget) {\n return;\n }\n\n this.panelEventTarget.removeEventListener('pk-option-select', this.handleOptionSelect as EventListener);\n this.panelEventTarget.removeEventListener('pk-option-highlight', this.handleOptionHighlight as EventListener);\n this.panelEventTarget.removeEventListener('pk-listbox-keydown', this.handleListboxKeyDownEvent as EventListener);\n this.panelEventTarget = null;\n }\n\n protected override get validationTarget(): HTMLElement | undefined {\n return this.input ?? this.triggerButton ?? this.controlElement;\n }\n\n protected override getAriaMirrorTarget(): HTMLElement | null {\n return this.triggerButton ?? this.controlElement ?? null;\n }\n\n protected override syncFormValue(): void {\n if (!this.name) {\n this.setFormValue(null);\n return;\n }\n\n if (this.multiple) {\n const formData = new FormData();\n\n for (const item of this.values) {\n formData.append(this.name, item);\n }\n\n this.setFormValue(formData);\n return;\n }\n\n this.setFormValue(this.value || '');\n }\n\n protected override resetToDefaultValue(): void {\n if (this.multiple) {\n this.values = [...this.defaultValues];\n } else {\n this.value = this.defaultValue;\n }\n\n this.applySelection();\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (state instanceof FormData && this.name) {\n this.values = state.getAll(this.name).map(String);\n return;\n }\n\n if (typeof state === 'string') {\n this.value = state;\n }\n }\n\n private isOptionInHiddenGroup(option: PkOption): boolean {\n const group = option.closest('pk-option-group') as PkOptionGroup | null;\n\n return Boolean(group?.hidden);\n }\n\n private getVisibleOptions(): PkOption[] {\n return this.options.filter((option) => !this.isOptionInHiddenGroup(option));\n }\n\n private getEnabledVisibleOptions(): PkOption[] {\n return this.getVisibleOptions().filter((option) => !option.disabled);\n }\n\n private isSelected(value: string): boolean {\n if (this.multiple) {\n return this.values.includes(value);\n }\n\n return this.value === value;\n }\n\n private applySelection(): void {\n const visible = this.getVisibleOptions();\n\n for (const option of this.options) {\n option.selected = this.isSelected(option.value);\n option.hidden = !visible.includes(option);\n option.optionId = `${this.listboxId}-option-${option.value}`;\n }\n\n for (const group of this.querySelectorAll('pk-option-group')) {\n const groupOptions = [...group.querySelectorAll('pk-option')];\n group.hidden = groupOptions.length > 0 && groupOptions.every((option) => option.hidden);\n }\n\n syncListboxSeparators(this);\n\n this.syncValueInput();\n this.syncTriggerDecorations();\n\n if (this.open) {\n this.syncHighlight();\n }\n }\n\n private syncValueInput(): void {\n if (!this.input) {\n return;\n }\n\n if (this.multiple) {\n this.input.value = this.values.join(',');\n this.input.required = this.required;\n return;\n }\n\n this.input.value = this.value;\n this.input.required = this.required;\n }\n\n private getDisplayValue(): string {\n if (this.multiple) {\n const labels = this.getSelectedOptions()\n .map((option) => option.getLabel());\n\n return labels.length > 0 ? labels.join(', ') : this.placeholder;\n }\n\n const selected = this.options.find((option) => option.value === this.value);\n\n return selected?.getLabel() || this.placeholder;\n }\n\n private getSelectedOptions(): PkOption[] {\n return this.options.filter((option) => this.isSelected(option.value));\n }\n\n /**\n * Mirror the selected option's `slot=\"start\"` decorations into the trigger —\n * `pk-select` start/end decoration pattern.\n */\n private syncTriggerDecorations(): void {\n const container = this.triggerStartElement;\n\n if (!container || this.multiple) {\n return;\n }\n\n container.replaceChildren();\n container.classList.remove('has-decoration');\n\n const selected = this.options.find((option) => option.value === this.value);\n\n if (!selected) {\n return;\n }\n\n for (const element of selected.getStartElements()) {\n container.append(element.cloneNode(true));\n }\n\n container.classList.toggle('has-decoration', container.childElementCount > 0);\n }\n\n private hasSelection(): boolean {\n if (this.multiple) {\n return this.values.length > 0;\n }\n\n // Empty-string values are valid when an option declares them (e.g. \"Default\").\n return this.options.some((option) => option.value === this.value) || Boolean(this.value);\n }\n\n private syncHighlightedIndexToSelection(): void {\n if (this.multiple) {\n return;\n }\n\n const enabled = this.getEnabledVisibleOptions();\n\n if (enabled.length === 0) {\n return;\n }\n\n const selectedIndex = enabled.findIndex((option) => option.value === this.value);\n\n if (selectedIndex >= 0) {\n this.highlightedIndex = selectedIndex;\n }\n }\n\n private syncHighlight(): void {\n const enabled = this.getEnabledVisibleOptions();\n\n for (const option of this.options) {\n option.highlighted = false;\n option.focusIndex = -1;\n }\n\n if (enabled.length === 0) {\n this.highlightedIndex = 0;\n return;\n }\n\n if (this.highlightedIndex >= enabled.length) {\n this.highlightedIndex = 0;\n }\n\n const highlighted = enabled[this.highlightedIndex];\n\n if (highlighted && this.panelElement) {\n highlighted.highlighted = true;\n highlighted.focusIndex = 0;\n scrollIntoView(highlighted, this.panelElement, 'vertical', 'auto');\n }\n }\n\n private updateTypeToSelect(): void {\n this.typeToSelect = createTypeToSelectHandler(\n this.getEnabledVisibleOptions() as unknown as HTMLElement[],\n (index) => {\n this.highlightedIndex = index;\n this.syncHighlight();\n this.getEnabledVisibleOptions()[index]?.focusControl();\n },\n );\n }\n\n private togglePanel = (event?: Event): void => {\n event?.preventDefault();\n event?.stopPropagation();\n\n if (this.disabled || this.closing) {\n return;\n }\n\n if (this.open) {\n void this.closePanel('api');\n } else {\n void this.openPanel();\n }\n };\n\n private getPopupAnchor(): HTMLElement | null {\n return this.controlElement ?? null;\n }\n\n private getActiveDescendantId(): string | null {\n const enabled = this.getEnabledVisibleOptions();\n const highlighted = enabled[this.highlightedIndex];\n return highlighted?.optionId || null;\n }\n\n async show(): Promise<void> {\n if (this.open || this.closing || this.disabled) {\n return;\n }\n\n await this.openPanel();\n }\n\n async hide(source: PkOverlaySource = 'api'): Promise<void> {\n if (!this.open || this.closing) {\n return;\n }\n\n await this.closePanel(source);\n }\n\n private openPanel(): Promise<void> {\n const anchor = this.getPopupAnchor();\n\n if (!anchor || this.closing) {\n return Promise.resolve();\n }\n\n this.dispatchEvent(new PkShowEvent());\n this.closing = false;\n this.panelAnimated = false;\n this.open = true;\n this.popupElement.active = true;\n this.applySelection();\n this.syncHighlightedIndexToSelection();\n\n if (this.panelElement) {\n this.panelElement.hidden = false;\n // Seed side before first paint so enter keyframes pick a direction.\n syncPopupPlacementAnimation(this.panelElement, this.placement);\n }\n\n const anchorWidth = anchor.getBoundingClientRect().width;\n this.style.setProperty('--pk-select-anchor-width', `${anchorWidth}px`);\n this.registerDismissHandlers();\n this.syncHighlight();\n this.updateTypeToSelect();\n\n return this.updateComplete.then(async () => {\n const placement = await waitForPopupReposition(this.popupElement, this.placement, 300, {\n requireEvent: true,\n });\n\n if (this.panelElement) {\n syncPopupPlacementAnimation(this.panelElement, placement);\n }\n\n // Flip data-open after placement so the shared enter animation can run.\n this.panelAnimated = true;\n this.bindPanelEvents();\n this.refreshOptions();\n this.getEnabledVisibleOptions()[this.highlightedIndex]?.focusControl();\n\n this.dispatchEvent(new PkAfterShowEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: true },\n bubbles: true,\n composed: true,\n }));\n });\n }\n\n private async closePanel(source: PkOverlaySource = 'unknown'): Promise<void> {\n if (!this.open || this.closing) {\n return;\n }\n\n const hideEvent = new PkHideEvent(source);\n\n if (!this.dispatchEvent(hideEvent)) {\n return;\n }\n\n this.typeToSelect.reset();\n this.unbindPanelEvents();\n this.unregisterDismissHandlers();\n\n this.closing = true;\n this.panelAnimated = false;\n await this.waitForExitAnimation();\n\n this.open = false;\n this.closing = false;\n this.panelAnimated = false;\n\n if (this.panelElement) {\n this.panelElement.hidden = true;\n this.panelElement.removeAttribute('data-side');\n }\n\n this.popupElement.active = false;\n\n this.dispatchEvent(new PkAfterHideEvent());\n this.dispatchEvent(new CustomEvent('pk-open-change', {\n detail: { open: false },\n bubbles: true,\n composed: true,\n }));\n\n if (this.shouldReturnFocusToTrigger(source)) {\n this.triggerButton?.focus({ preventScroll: true });\n } else {\n this.triggerButton?.blur();\n }\n }\n\n private waitForExitAnimation(): Promise<void> {\n const panel = this.panelElement;\n\n if (!panel) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n panel.removeEventListener('animationend', onAnimationEnd);\n window.clearTimeout(fallback);\n panel.classList.remove('closing');\n resolve();\n };\n\n const onAnimationEnd = (event: AnimationEvent): void => {\n if (event.target === panel && event.animationName.startsWith('pk-popup-content-out')) {\n finish();\n }\n };\n\n panel.classList.add('closing');\n panel.addEventListener('animationend', onAnimationEnd);\n const fallback = window.setTimeout(finish, 150);\n });\n }\n\n /** Base UI skips return focus on outside press — avoids an unwanted focus ring after light dismiss. */\n private shouldReturnFocusToTrigger(source: PkOverlaySource): boolean {\n return source !== 'light-dismiss' && source !== 'pointer-dismiss';\n }\n\n private registerDismissHandlers(): void {\n registerDismissible(this);\n this.dismissRegistered = true;\n document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private unregisterDismissHandlers(): void {\n if (this.dismissRegistered) {\n unregisterDismissible(this);\n this.dismissRegistered = false;\n }\n\n document.removeEventListener('pointerdown', this.onDocumentPointerDown, true);\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n\n private onDocumentPointerDown = (event: PointerEvent): void => {\n if (this.isPointerInside(event)) {\n return;\n }\n\n void this.closePanel('light-dismiss');\n };\n\n private isPointerInside(event: PointerEvent): boolean {\n return isPointerInsideOverlay(event, {\n anchor: this.getPopupAnchor(),\n panel: this.panelElement,\n });\n };\n\n private onDocumentKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n return;\n }\n\n if (event.key === 'Escape') {\n if (!isTopDismissible(this)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n void this.closePanel('escape');\n return;\n }\n\n const isListboxKey = LISTBOX_NAVIGATION_KEYS.has(event.key) || isListboxTypeToSelectKey(event);\n\n if (!isListboxKey) {\n return;\n }\n\n if (!isEventInsideOverlay(event, {\n anchor: this.getPopupAnchor(),\n panel: this.panelElement,\n })) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.onListboxKeyDown(event);\n };\n\n private handleOptionSelect = (event: CustomEvent<{ value: string }>): void => {\n const { value } = event.detail;\n\n if (this.multiple) {\n this.values = this.values.includes(value)\n ? this.values.filter((v) => v !== value)\n : [...this.values, value];\n } else {\n this.value = value;\n void this.closePanel('api');\n }\n\n this.applySelection();\n this.emitValueChange();\n };\n\n private handleOptionHighlight = (event: CustomEvent<{ value: string }>): void => {\n if (!this.open) {\n return;\n }\n\n const enabled = this.getEnabledVisibleOptions();\n const index = enabled.findIndex((option) => option.value === event.detail.value);\n\n if (index === -1 || index === this.highlightedIndex) {\n return;\n }\n\n this.highlightedIndex = index;\n this.syncHighlight();\n };\n\n private removeTag(value: string, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.values = this.values.filter((item) => item !== value);\n this.applySelection();\n this.emitValueChange();\n }\n\n private handleClear(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.multiple) {\n this.values = [];\n } else {\n this.value = '';\n }\n\n this.applySelection();\n this.dispatchEvent(new PkClearEvent());\n this.emitValueChange();\n this.triggerButton?.focus();\n }\n\n private emitValueChange(): void {\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: {\n value: this.multiple ? [...this.values] : this.value,\n },\n bubbles: true,\n composed: true,\n }));\n\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private onKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void this.openPanel();\n }\n\n return;\n }\n\n this.onListboxKeyDown(event);\n };\n\n private onListboxKeyDown(event: KeyboardEvent): void {\n const enabled = this.getEnabledVisibleOptions();\n\n this.highlightedIndex = handleListboxKeyDown(event, {\n items: enabled as unknown as HTMLElement[],\n currentIndex: this.highlightedIndex,\n multiselect: this.multiple,\n loop: this.loopFocus,\n onSelect: (index) => {\n this.highlightedIndex = index;\n this.syncHighlight();\n },\n focusItem: (index) => {\n enabled[index]?.focusControl();\n },\n onClose: () => { void this.closePanel('escape'); },\n });\n\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n this.typeToSelect.handleKey(event);\n }\n }\n\n private handleListboxKeyDownEvent = (event: CustomEvent<{ keyboardEvent: KeyboardEvent }>): void => {\n if (!this.open) {\n return;\n }\n\n this.onListboxKeyDown(event.detail.keyboardEvent);\n };\n\n private renderTags() {\n return this.getSelectedOptions().map((option) => html`\n <span class=\"tag\" part=\"tag\">\n <span class=\"tag-label\">${option.getLabel()}</span>\n <button\n type=\"button\"\n class=\"tag-remove\"\n part=\"tag-remove\"\n aria-label=${`Remove ${option.getLabel()}`}\n @click=${(event: Event) => this.removeTag(option.value, event)}\n >\n ×\n </button>\n </span>\n `);\n }\n\n private renderChevronIcon() {\n return html`\n <span class=\"icon\" aria-hidden=\"true\">${unsafeSVG(CHEVRON_ICON)}</span>\n `;\n }\n\n private renderHostDecorationSlot(name: 'start' | 'end') {\n if (!this.hasSlotController.test(name)) {\n return html`<slot name=${name} hidden></slot>`;\n }\n\n const className = name === 'start' ? 'control-start' : 'control-end';\n\n return html`\n <span part=${name} class=${className}>\n <slot name=${name}></slot>\n </span>\n `;\n }\n\n override render() {\n const displayValue = this.getDisplayValue();\n const isPlaceholder = !this.hasSelection();\n const showClear = (this.clearable || this.withClear) && this.hasSelection() && !this.disabled;\n\n return html`\n <input\n class=\"value-input\"\n part=\"value-input\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n .value=${this.multiple ? this.values.join(',') : this.value}\n ?required=${this.required}\n @input=${() => this.updateValidity()}\n />\n ${this.multiple\n ? html`\n <div\n part=\"control\"\n class=${classMap({\n control: true,\n 'is-disabled': this.disabled,\n })}\n >\n ${this.renderHostDecorationSlot('start')}\n ${this.hasSelection()\n ? html`\n <div class=\"tags\" part=\"tags\">${this.renderTags()}</div>\n ${showClear\n ? html`\n <button\n type=\"button\"\n class=\"clear-button\"\n part=\"clear-button\"\n aria-label=\"Clear selection\"\n @click=${this.handleClear}\n >\n ×\n </button>\n `\n : nothing}\n `\n : html`\n <button\n part=\"trigger\"\n type=\"button\"\n class=\"trigger\"\n id=${this.triggerId}\n ?disabled=${this.disabled}\n aria-label=${this.ariaLabel ?? nothing}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listboxId}\n @click=${this.togglePanel}\n >\n <span class=\"value is-placeholder\">${this.placeholder}</span>\n </button>\n `}\n ${this.renderHostDecorationSlot('end')}\n <button\n type=\"button\"\n class=\"trigger trigger--icon\"\n part=\"trigger expand-button\"\n aria-label=\"Toggle options\"\n ?disabled=${this.disabled}\n @click=${this.togglePanel}\n >\n ${this.renderChevronIcon()}\n </button>\n </div>\n `\n : html`\n <button\n part=\"control\"\n type=\"button\"\n class=${classMap({\n control: true,\n 'is-disabled': this.disabled,\n })}\n id=${this.triggerId}\n ?disabled=${this.disabled}\n aria-label=${this.ariaLabel ?? nothing}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=${this.listboxId}\n @click=${this.togglePanel}\n >\n ${this.renderHostDecorationSlot('start')}\n <span part=\"trigger-start\" class=\"trigger-start\"></span>\n <span\n class=${classMap({\n value: true,\n 'is-placeholder': isPlaceholder,\n })}\n >${displayValue}</span>\n ${showClear\n ? html`\n <span\n class=\"clear-button\"\n part=\"clear-button\"\n role=\"button\"\n tabindex=\"-1\"\n aria-label=\"Clear selection\"\n @click=${this.handleClear}\n >\n ×\n </span>\n `\n : nothing}\n ${this.renderHostDecorationSlot('end')}\n ${this.renderChevronIcon()}\n </button>\n `}\n <pk-popup\n .anchor=${this.getPopupAnchor() ?? ''}\n .placement=${this.placement}\n .distance=${this.sideOffset}\n .sync=${'width'}\n flip\n shift\n >\n <div\n part=\"panel\"\n class=${classMap({\n panel: true,\n 'pk-popup-content': true,\n closing: this.closing,\n })}\n id=${this.listboxId}\n role=\"listbox\"\n aria-multiselectable=${this.multiple ? 'true' : 'false'}\n tabindex=\"-1\"\n ?hidden=${!this.open && !this.closing}\n data-open=${this.panelAnimated && !this.closing ? '' : nothing}\n @slotchange=${this.syncOptions}\n >\n <slot></slot>\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-select': PkSelect;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pk-tiptap-editor-tG67Vegc.js","names":[],"sources":["../../src/components/tiptap/tiptap-editor-host.ts","../../src/components/tiptap/tiptap-utils.ts","../../src/components/tiptap/tiptap-toolbar.ts","../../src/components/tiptap/pk-tiptap-editor.styles.ts","../../src/components/tiptap/pk-tiptap-editor.ts"],"sourcesContent":["import { Editor, type Extensions } from '@tiptap/core';\nimport {\n createTiptapExtensions,\n normalizeContentArray,\n valueToContent,\n} from '@verbb/plugin-kit-tiptap-core';\n\nexport function serializeTiptapDocumentContent(content: unknown): string {\n return JSON.stringify(normalizeContentArray(content));\n}\n\n/** Normalize React/HTML `value` into the JSON string the editor stores and emits. */\nexport function serializeTiptapDocumentValue(raw: string | unknown[] | null | undefined): string {\n if (raw == null) {\n return '[]';\n }\n\n if (typeof raw === 'string') {\n return raw;\n }\n\n if (Array.isArray(raw)) {\n return JSON.stringify(raw);\n }\n\n return '[]';\n}\n\nexport function parseTiptapDocumentValue(raw: string | unknown[] | null | undefined): unknown[] {\n if (raw == null || raw === '') {\n return [];\n }\n\n // React often passes a document array prop — accept it without JSON.parse.\n if (Array.isArray(raw)) {\n return raw;\n }\n\n if (typeof raw !== 'string') {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport type TiptapEditorHostOptions = {\n element: HTMLElement;\n extensions?: Extensions;\n content: unknown;\n editable: boolean;\n trailingCursorText?: string;\n minHeight?: string;\n onUpdate?: (content: unknown[]) => void;\n};\n\nexport class TiptapEditorHost {\n editor: Editor | null = null;\n\n private lastEmitted: string | null = null;\n\n /** Skip TipTap `onUpdate` while applying controlled prop content — otherwise setContent\n * re-emits pk-change → React setValue → value prop → setContent … forever. */\n private suppressUpdateEmission = false;\n\n mount({\n element,\n extensions,\n content,\n editable,\n trailingCursorText = '\\u2060',\n minHeight,\n onUpdate,\n }: TiptapEditorHostOptions): void {\n const doc = valueToContent(content, { trailingCursorText });\n\n this.editor = new Editor({\n element,\n extensions: extensions ?? createTiptapExtensions({ trailingCursorText }),\n content: doc,\n editable,\n onUpdate: ({ editor }) => {\n const normalized = normalizeContentArray(editor.getJSON().content);\n const serialized = JSON.stringify(normalized);\n this.lastEmitted = serialized;\n\n if (this.suppressUpdateEmission) {\n return;\n }\n\n onUpdate?.(normalized);\n },\n });\n\n if (minHeight) {\n this.editor.view.dom.style.minHeight = minHeight;\n }\n }\n\n setContent(content: unknown, options: { trailingCursorText?: string; respectFocus?: boolean } = {}): void {\n if (!this.editor) {\n return;\n }\n\n const { trailingCursorText = '\\u2060', respectFocus = true } = options;\n\n if (respectFocus && this.editor.isFocused) {\n return;\n }\n\n const doc = valueToContent(content, { trailingCursorText });\n const incoming = JSON.stringify(doc?.content ?? []);\n const current = JSON.stringify(this.editor.getJSON().content ?? []);\n\n if (incoming === current || incoming === this.lastEmitted) {\n return;\n }\n\n this.suppressUpdateEmission = true;\n try {\n this.editor.commands.setContent(doc ?? { type: 'doc', content: [] });\n } finally {\n this.suppressUpdateEmission = false;\n }\n }\n\n destroy(): void {\n this.editor?.destroy();\n this.editor = null;\n this.lastEmitted = null;\n this.suppressUpdateEmission = false;\n }\n}\n","import type {\n ElementSelectorHost,\n LinkOptionsInput,\n ToolbarNode,\n} from '@verbb/plugin-kit-tiptap-core';\nimport { parseToolbarConfig } from '@verbb/plugin-kit-tiptap-core';\n\ndeclare global {\n interface Window {\n Craft?: {\n createElementSelectorModal?: ElementSelectorHost['openElementSelector'];\n };\n }\n}\n\nexport function createCraftElementSelectorHost(): ElementSelectorHost {\n return {\n openElementSelector: (elementType, options) => {\n const open = window.Craft?.createElementSelectorModal;\n\n if (!open) {\n throw new Error('Craft element selector is not available in this environment.');\n }\n\n open(elementType, options);\n },\n };\n}\n\nexport function parseLinkOptionsAttribute(raw: string | null): LinkOptionsInput | undefined {\n if (!raw) {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as LinkOptionsInput;\n } catch {\n return undefined;\n }\n}\n\nexport function parseButtonsAttribute(raw: string | null | undefined): string[] {\n if (!raw) {\n return ['bold', 'italic'];\n }\n\n return raw\n .split(',')\n .map((button) => button.trim())\n .filter(Boolean);\n}\n\nexport function parseToolbarAttribute(\n toolbarRaw: string | ToolbarNode[] | null | undefined,\n buttonsRaw: string | string[] | null | undefined,\n): ToolbarNode[] {\n if (Array.isArray(toolbarRaw)) {\n return parseToolbarConfig(toolbarRaw);\n }\n\n if (typeof toolbarRaw === 'string' && toolbarRaw.trim()) {\n return parseToolbarConfig(toolbarRaw);\n }\n\n if (Array.isArray(buttonsRaw)) {\n return parseToolbarConfig(buttonsRaw.join(','));\n }\n\n return parseToolbarConfig(buttonsRaw ?? 'bold,italic');\n}\n","import {\n alignCenter,\n alignJustify,\n alignLeft,\n alignRight,\n arrowRotateLeft,\n arrowRotateRight,\n bold,\n bracketsCurly,\n chevronDown,\n code,\n fileDashedLine,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heading,\n highlighter,\n italic,\n link,\n listOl,\n listUl,\n minus,\n paragraph,\n quoteRight,\n strikethrough,\n subscript,\n superscript,\n table,\n textSlash,\n underline,\n renderIconHtml,\n} from '../../icons/index.js';\n\nexport const TOOLBAR_CHEVRON_HTML = renderIconHtml(chevronDown);\n\nexport const TOOLBAR_ICONS: Record<string, string> = {\n bold: renderIconHtml(bold),\n italic: renderIconHtml(italic),\n underline: renderIconHtml(underline),\n strikethrough: renderIconHtml(strikethrough),\n subscript: renderIconHtml(subscript),\n superscript: renderIconHtml(superscript),\n code: renderIconHtml(bracketsCurly),\n 'code-block': renderIconHtml(code),\n highlight: renderIconHtml(highlighter),\n h1: renderIconHtml(h1),\n h2: renderIconHtml(h2),\n h3: renderIconHtml(h3),\n h4: renderIconHtml(h4),\n h5: renderIconHtml(h5),\n h6: renderIconHtml(h6),\n heading: renderIconHtml(heading),\n paragraph: renderIconHtml(paragraph),\n 'unordered-list': renderIconHtml(listUl),\n 'ordered-list': renderIconHtml(listOl),\n blockquote: renderIconHtml(quoteRight),\n 'align-left': renderIconHtml(alignLeft),\n 'align-center': renderIconHtml(alignCenter),\n 'align-right': renderIconHtml(alignRight),\n 'align-justify': renderIconHtml(alignJustify),\n 'clear-format': renderIconHtml(textSlash),\n hr: renderIconHtml(minus),\n 'line-break': renderIconHtml(fileDashedLine),\n link: renderIconHtml(link),\n table: renderIconHtml(table),\n undo: renderIconHtml(arrowRotateLeft),\n redo: renderIconHtml(arrowRotateRight),\n};\n\nexport const TOOLBAR_LABELS: Record<string, string> = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n code: 'Inline code',\n 'code-block': 'Code block',\n highlight: 'Highlight',\n h1: 'Heading 1',\n h2: 'Heading 2',\n h3: 'Heading 3',\n h4: 'Heading 4',\n h5: 'Heading 5',\n h6: 'Heading 6',\n paragraph: 'Paragraph',\n 'unordered-list': 'Bullet list',\n 'ordered-list': 'Numbered list',\n blockquote: 'Blockquote',\n 'align-left': 'Align left',\n 'align-center': 'Align center',\n 'align-right': 'Align right',\n 'align-justify': 'Justify',\n 'clear-format': 'Clear format',\n hr: 'Horizontal rule',\n 'line-break': 'Line break',\n link: 'Link',\n table: 'Table',\n undo: 'Undo',\n redo: 'Redo',\n};\n\nexport function getToolbarMenuItemLabel(buttonName: string): string {\n return TOOLBAR_LABELS[buttonName] ?? buttonName;\n}\n\n/** Prefix icon for `pk-dropdown-item` — SVG must carry `slot=\"prefix\"` directly. */\nexport function createToolbarPrefixIcon(buttonName: string): SVGSVGElement | null {\n const iconHtml = TOOLBAR_ICONS[buttonName];\n\n if (!iconHtml) {\n return null;\n }\n\n const template = document.createElement('template');\n template.innerHTML = iconHtml.trim();\n const icon = template.content.firstElementChild;\n\n if (!(icon instanceof SVGSVGElement)) {\n return null;\n }\n\n icon.setAttribute('slot', 'prefix');\n icon.setAttribute('aria-hidden', 'true');\n icon.setAttribute('width', '12');\n icon.setAttribute('height', '12');\n icon.classList.add('pk-dropdown-item__prefix-icon');\n\n return icon;\n}\n","import { css } from 'lit';\n\nexport const pkTiptapEditorStyles = css`\n @layer pk-component {\n :host {\n display: block;\n width: 100%;\n font-family: var(--pk-font-family);\n }\n\n .shell {\n overflow: hidden;\n border: var(--pk-input-border);\n border-radius: var(--pk-radius-md);\n background: #fff;\n }\n\n :host([invalid]) .shell,\n :host(:state(user-invalid)) .shell {\n border-color: var(--pk-color-rose-600);\n }\n\n .toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid rgba(96, 125, 159, 0.4);\n background: #fff;\n box-shadow: 0 2px 3px rgba(49, 49, 93, 0.07);\n }\n\n .toolbar-item {\n display: inline-flex;\n }\n\n .toolbar-item pk-tooltip {\n display: contents;\n }\n\n .toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: transparent;\n color: #1c2e36;\n cursor: pointer;\n }\n\n .toolbar-btn:hover:not(:disabled) {\n background: rgb(241, 245, 249);\n }\n\n .toolbar-btn[data-state='active'] {\n background: rgb(226, 232, 240);\n }\n\n .toolbar-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .toolbar-btn svg {\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n }\n\n .toolbar-btn--menu {\n width: auto;\n min-width: 2rem;\n gap: 0.125rem;\n padding: 0 0.375rem;\n }\n\n .toolbar-btn__trigger-label {\n font-size: 0.625rem;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n }\n\n .toolbar-btn__chevron {\n display: inline-flex;\n flex-shrink: 0;\n opacity: 0.7;\n }\n\n .toolbar-btn__chevron svg {\n width: 0.5rem;\n height: 0.5rem;\n }\n\n .toolbar-separator {\n align-self: center;\n flex-shrink: 0;\n width: 1px;\n height: 1.25rem;\n margin: 0 0.125rem;\n background: rgba(96, 125, 159, 0.35);\n }\n\n .toolbar-btn__label {\n font-size: 0.625rem;\n font-weight: 600;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n }\n\n /* Full toolbar replace (slot=toolbar on host when hasCustomToolbar). */\n .toolbar ::slotted([slot='toolbar']) {\n display: contents;\n }\n\n /* Append lane inside the stock toolbar — one flex item per slotted root (same gap). */\n .toolbar ::slotted([slot='toolbar-end']) {\n display: inline-flex;\n align-items: center;\n }\n\n .editor-mount {\n position: relative;\n }\n\n .content-error {\n display: flex;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--pk-color-rose-200);\n background: var(--pk-color-rose-50);\n color: var(--pk-color-rose-800);\n font-size: var(--pk-font-size-sm);\n }\n\n .mirror-input {\n display: none;\n }\n\n /* No trigger slot — collapse the host so it does not reserve shell space.\n Toolbar refresh while open is still gated by linkDialogBusy / open. */\n .link-dialog {\n display: contents;\n }\n\n .link-dialog__fields {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .link-bubble {\n position: absolute;\n z-index: 250;\n display: flex;\n align-items: center;\n gap: 0;\n width: max-content;\n max-width: calc(100% - 1rem);\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: #1c2e36;\n color: #fff;\n font-size: 12px;\n line-height: 1.5;\n overflow: visible;\n pointer-events: auto;\n white-space: nowrap;\n }\n\n .link-bubble__arrow {\n position: absolute;\n left: 50%;\n bottom: -0.25rem;\n width: 0.5rem;\n height: 0.5rem;\n background: #1c2e36;\n transform: translateX(-50%) rotate(45deg);\n pointer-events: none;\n }\n\n .link-bubble__url,\n .link-bubble__action {\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n line-height: 1.5;\n }\n\n .link-bubble__url {\n display: inline-flex;\n align-items: center;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .link-bubble__divider {\n flex-shrink: 0;\n align-self: center;\n width: 1px;\n height: 12px;\n background: #616d73;\n }\n\n .link-bubble__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: #fff;\n font-family: inherit;\n font-weight: inherit;\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n appearance: none;\n -webkit-appearance: none;\n min-height: 0;\n transition: color 0.15s ease;\n }\n\n .link-bubble__action:hover {\n color: rgb(255 255 255 / 0.7);\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport {\n applyLinkToEditor,\n createTiptapExtensions,\n getCraftLinkOptions,\n getFatalTiptapContentError,\n getLinkEditState,\n getLinkOptionsElementSiteId,\n getLinkOpenInNewTab,\n getSelectedText,\n getToolbarGroupDefaultIcon,\n getToolbarGroupMenuItems,\n getToolbarGroupTriggerState,\n isFormattingToolbarPreset,\n isHeadingsOnlyToolbarPreset,\n isTiptapButtonActive,\n isToolbarButtonActive,\n openCraftElementLinkSelector,\n runToolbarButton,\n toolbarIncludesButton,\n unsetLinkFromEditor,\n type LinkElementConfig,\n type LinkOptionsInput,\n type ToolbarGroup,\n type ToolbarNode,\n} from '@verbb/plugin-kit-tiptap-core';\nimport { getMarkRange, posToDOMRect } from '@tiptap/core';\n\nimport { formControlStyles } from '../../base/form-control.styles.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { MirrorValidator } from '../../validators/index.js';\nimport {\n link,\n triangleExclamation,\n renderIconHtml,\n} from '../../icons/index.js';\n\nimport '../button/pk-button.js';\nimport '../checkbox/pk-checkbox.js';\nimport '../dialog/pk-dialog.js';\nimport '../dropdown-menu/pk-dropdown-item.js';\nimport '../field/pk-field.js';\nimport '../input/pk-input.js';\nimport '../dropdown-menu/pk-dropdown-menu.js';\nimport '../dropdown-menu/pk-dropdown-separator.js';\nimport '../tooltip/pk-tooltip.js';\nimport type { PkButton } from '../button/pk-button.js';\nimport type { PkCheckbox } from '../checkbox/pk-checkbox.js';\nimport type { PkDialog } from '../dialog/pk-dialog.js';\nimport type { PkDropdownMenu } from '../dropdown-menu/pk-dropdown-menu.js';\nimport type { PkInput } from '../input/pk-input.js';\nimport { TiptapEditorHost, parseTiptapDocumentValue, serializeTiptapDocumentContent, serializeTiptapDocumentValue } from './tiptap-editor-host.js';\nimport { createCraftElementSelectorHost, parseLinkOptionsAttribute, parseToolbarAttribute } from './tiptap-utils.js';\nimport {\n TOOLBAR_CHEVRON_HTML,\n TOOLBAR_ICONS,\n TOOLBAR_LABELS,\n createToolbarPrefixIcon,\n getToolbarMenuItemLabel,\n} from './tiptap-toolbar.js';\nimport { createVariableTagDomNodeView } from './variable-tag-node-view.js';\nimport { pkTiptapEditorStyles } from './pk-tiptap-editor.styles.js';\nimport { tiptapProseMirrorStyles } from './tiptap.styles.js';\n\ntype LinkDialogSeed = {\n url?: string;\n text?: string;\n openInNewTab?: boolean;\n from?: number;\n to?: number;\n};\n\n/**\n * TipTap document editor with a Craft-styled toolbar.\n *\n * @slot toolbar - Replace the entire default toolbar (opt-in via light-DOM presence).\n * @slot toolbar-end - Append controls after stock toolbar buttons (same flex gap).\n */\n@customElement('pk-tiptap-editor')\nexport class PkTiptapEditor extends PkFormAssociatedElement {\n static override styles = [formControlStyles, pkTiptapEditorStyles, tiptapProseMirrorStyles];\n\n static override get validators() {\n return [...super.validators, MirrorValidator()];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n @query('.editor-mount')\n private editorMount!: HTMLDivElement;\n\n @query('.mirror-input')\n override input!: HTMLInputElement;\n\n @query('.link-dialog')\n private linkDialog?: PkDialog;\n\n @query('pk-input.link-dialog__url-input')\n private linkUrlInput?: PkInput;\n\n @query('pk-input.link-dialog__text-input')\n private linkTextInput?: PkInput;\n\n @query('pk-checkbox')\n private linkNewTabCheckbox?: PkCheckbox;\n\n @query('pk-button.link-dialog__submit')\n private linkSubmitButton?: PkButton;\n\n private readonly linkUrlInputId = uniqueId('pk-tiptap-link-url');\n\n private readonly linkTextInputId = uniqueId('pk-tiptap-link-text');\n\n private readonly host = new TiptapEditorHost();\n\n private _value: string | null = null;\n\n /**\n * Flat toolbar button list. HTML uses a comma-separated attribute; React may\n * pass a `string[]`. Named `buttons` (not `buttonsAttr`) so React can set the\n * property — a getter-only `buttons` previously threw on assign.\n */\n @property({\n attribute: 'buttons',\n converter: {\n fromAttribute: (value: string | null) => value ?? 'bold,italic',\n toAttribute: (value: string | string[] | null | undefined) => {\n if (value == null) {\n return 'bold,italic';\n }\n\n return Array.isArray(value) ? value.join(',') : value;\n },\n },\n })\n buttons: string | string[] = 'bold,italic';\n\n /** Structured toolbar config — JSON string attribute, or a node array from React. */\n @property({\n attribute: 'toolbar',\n converter: {\n fromAttribute: (value: string | null) => value,\n toAttribute: (value: string | ToolbarNode[] | null | undefined) => {\n if (value == null) {\n return null;\n }\n\n return typeof value === 'string' ? value : JSON.stringify(value);\n },\n },\n })\n toolbar: string | ToolbarNode[] | null = null;\n\n @property({ attribute: 'link-options' })\n linkOptions: string | null = null;\n\n @property({ attribute: 'link-selector-storage-key-prefix' })\n linkSelectorStorageKeyPrefix?: string;\n\n @property({ type: Number })\n rows = 4;\n\n @property()\n placeholder = '';\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n /**\n * Formie / React configure bridge — called when a chip is activated for editing.\n * Prefer this over listening for `pk-variable-tag-configure` from React.\n */\n @property({ attribute: false })\n variableTagConfigure: ((detail: import('./variable-tag-node-view.js').PkVariableTagConfigureDetail) => void) | null = null;\n\n @property({ attribute: 'invalid-content-message' })\n invalidContentMessage = '';\n\n /** Show `pk-tooltip` hints on toolbar buttons (default: on). */\n @property({ type: Boolean, attribute: 'toolbar-tooltips' })\n toolbarTooltips = true;\n\n private linkDialogBusy = false;\n\n private linkDialogSeed: LinkDialogSeed = {};\n\n @state()\n private linkDialogTitle = 'Insert Link';\n\n @state()\n private linkDialogSubmitLabel = 'Insert';\n\n @state()\n private linkDialogMounted = false;\n\n @state()\n private linkBubbleVisible = false;\n\n @state()\n private linkBubbleHref = '';\n\n @state()\n private linkBubbleTop = 0;\n\n @state()\n private linkBubbleLeft = 0;\n\n private hasCustomToolbar = false;\n\n private readonly linkButtonId = uniqueId('pk-tiptap-link-btn');\n\n private readonly toolbarButtonIds = new Map<string, string>();\n\n private readonly toolbarGroupIds = new Map<string, string>();\n\n private selectionListenerAttached = false;\n\n get value(): string {\n if (this.valueHasChanged) {\n return this._value ?? '[]';\n }\n\n return this._value ?? this.defaultValue ?? '[]';\n }\n\n /**\n * Document JSON string. Also accepts a TipTap node array (common from React)\n * and serializes it — arrays previously bypassed JSON.parse and mounted empty.\n */\n @state()\n set value(val: string | unknown[] | null) {\n const next = serializeTiptapDocumentValue(val);\n\n if (this._value === next) {\n return;\n }\n\n this.valueHasChanged = true;\n this._value = next;\n }\n\n @property({ attribute: 'value', reflect: true })\n defaultValue: string | null = '[]';\n\n get editor() {\n return this.host.editor;\n }\n\n get toolbarNodes(): ToolbarNode[] {\n const buttonsRaw = Array.isArray(this.buttons) ? this.buttons.join(',') : this.buttons;\n\n return parseToolbarAttribute(this.toolbar, buttonsRaw)\n .filter((node) => node.type !== 'button' || node.name !== 'variableTag');\n }\n\n /** Resolved flat button names from the active toolbar config. */\n get buttonNames(): string[] {\n return this.toolbarNodes\n .filter((node): node is Extract<ToolbarNode, { type: 'button' }> => node.type === 'button')\n .map((node) => node.name);\n }\n\n private toolbarHasLink(): boolean {\n return toolbarIncludesButton(this.toolbarNodes, 'link');\n }\n\n private resolveLinkOptions(): LinkOptionsInput | undefined {\n return parseLinkOptionsAttribute(this.linkOptions);\n }\n\n private get contentError(): string {\n return this.resolveContentError();\n }\n\n protected override syncFormValue(): void {\n this.setValue(this.value || '[]');\n\n if (this.input) {\n this.input.value = this.value || '[]';\n }\n }\n\n protected override resetToDefaultValue(): void {\n this.valueHasChanged = false;\n this._value = null;\n this.syncEditorContent();\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.value = state;\n this.syncEditorContent();\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.hasCustomToolbar = Boolean(this.querySelector('[slot=\"toolbar\"]'));\n }\n\n override disconnectedCallback(): void {\n this.linkDialog?.forceOverlayReset();\n this.linkDialogBusy = false;\n this.host.destroy();\n this.selectionListenerAttached = false;\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') && !changed.has('defaultValue')) {\n this.syncEditorContent();\n }\n\n if (changed.has('defaultValue') && !this.valueHasChanged) {\n this.syncEditorContent();\n }\n\n if (changed.has('disabled') || changed.has('readonly')) {\n this.host.editor?.setEditable(!this.disabled && !this.readonly);\n }\n\n super.updated(changed);\n }\n\n override firstUpdated(): void {\n queueMicrotask(() => {\n this.mountEditor();\n this.syncFormValue();\n });\n }\n\n private resolveContentError(): string {\n const detected = getFatalTiptapContentError(this.value);\n return detected ? (this.invalidContentMessage || detected) : '';\n }\n\n private mountEditor(): void {\n const content = this.contentError ? null : parseTiptapDocumentValue(this.value);\n const normalizedRows = Math.max(1, Number(this.rows || 0));\n const minHeight = `${(normalizedRows * 24) + 32}px`;\n\n this.host.mount({\n element: this.editorMount,\n extensions: createTiptapExtensions({\n trailingCursorText: '\\u2060',\n variableTagNodeView: createVariableTagDomNodeView(),\n }),\n content,\n editable: !this.disabled && !this.readonly && !this.contentError,\n trailingCursorText: '\\u2060',\n minHeight,\n onUpdate: (nextContent) => {\n const serialized = serializeTiptapDocumentContent(nextContent);\n this.value = serialized;\n\n if (this.input) {\n this.input.value = serialized;\n }\n\n this.syncFormValue();\n // Emit JSON string (matches `value` prop) — arrays caused Formie controlled\n // fields to write mismatched types and re-enter sync forever.\n this.emitValueChange(serialized);\n },\n });\n\n queueMicrotask(() => {\n this.attachSelectionListeners();\n });\n }\n\n private attachSelectionListeners(): void {\n const editor = this.host.editor;\n\n if (!editor || this.selectionListenerAttached) {\n return;\n }\n\n const refreshToolbar = () => {\n if (this.linkDialogBusy || this.linkDialog?.open) {\n this.linkBubbleVisible = false;\n return;\n }\n\n this.updateLinkBubble();\n\n queueMicrotask(() => {\n if (this.isConnected && !this.linkDialogBusy && !this.linkDialog?.open) {\n this.requestUpdate();\n }\n });\n };\n\n editor.on('selectionUpdate', refreshToolbar);\n editor.on('transaction', refreshToolbar);\n editor.on('focus', refreshToolbar);\n editor.on('blur', () => {\n this.linkBubbleVisible = false;\n this.requestUpdate();\n });\n this.selectionListenerAttached = true;\n }\n\n private updateLinkBubble(): void {\n const editor = this.host.editor;\n\n if (\n !editor\n || this.disabled\n || this.readonly\n || this.linkDialogBusy\n || this.linkDialog?.open\n || !editor.isFocused\n || !editor.isActive('link')\n ) {\n this.linkBubbleVisible = false;\n return;\n }\n\n const linkType = editor.state.schema.marks.link;\n const range = getMarkRange(editor.state.selection.$from, linkType);\n\n if (!range) {\n this.linkBubbleVisible = false;\n return;\n }\n\n const linkRect = posToDOMRect(editor.view, range.from, range.to);\n const mountRect = this.editorMount.getBoundingClientRect();\n const bubbleOffset = 8;\n\n this.linkBubbleHref = String(editor.getAttributes('link').href ?? '');\n this.linkBubbleTop = linkRect.top - mountRect.top - bubbleOffset;\n this.linkBubbleLeft = linkRect.left - mountRect.left + (linkRect.width / 2);\n this.linkBubbleVisible = true;\n }\n\n private handleLinkBubbleEdit = (event: Event): void => {\n event.preventDefault();\n\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n const state = getLinkEditState(editor);\n this.linkBubbleVisible = false;\n this.openLinkDialog({\n url: state.href,\n text: state.text,\n openInNewTab: state.openInNewTab,\n from: state.from,\n to: state.to,\n });\n };\n\n private handleLinkBubbleUnlink = (event: Event): void => {\n event.preventDefault();\n\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n unsetLinkFromEditor(editor);\n this.linkBubbleVisible = false;\n };\n\n private renderLinkBubble() {\n return html`\n <div\n class=\"link-bubble\"\n role=\"toolbar\"\n aria-label=\"Link actions\"\n tabindex=\"0\"\n style=${`top:${this.linkBubbleTop}px;left:${this.linkBubbleLeft}px;transform:translate(-50%, -100%);`}\n >\n <span class=\"link-bubble__arrow\" aria-hidden=\"true\"></span>\n <span class=\"link-bubble__url\" title=${this.linkBubbleHref}>${this.linkBubbleHref}</span>\n <span class=\"link-bubble__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"link-bubble__action\"\n @mousedown=${(event: Event) => event.preventDefault()}\n @click=${this.handleLinkBubbleEdit}\n >Edit</button>\n <span class=\"link-bubble__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"link-bubble__action\"\n @mousedown=${(event: Event) => event.preventDefault()}\n @click=${this.handleLinkBubbleUnlink}\n >Unlink</button>\n </div>\n `;\n }\n\n private syncEditorContent(): void {\n const content = this.contentError ? null : parseTiptapDocumentValue(this.value);\n this.host.setContent(content, { trailingCursorText: '\\u2060' });\n\n if (this.input) {\n this.input.value = this.value || '[]';\n }\n }\n\n private emitValueChange(value: string): void {\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: { value },\n bubbles: true,\n composed: true,\n }));\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private handleToolbarCommand(buttonName: string): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n runToolbarButton(editor, buttonName);\n }\n\n private openLinkMenu(): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n const selected = getSelectedText(editor);\n const { from, to } = editor.state.selection;\n\n const menu = this.shadowRoot?.querySelector<PkDropdownMenu>(\n `pk-dropdown-menu[for=\"${this.linkButtonId}\"]`,\n );\n\n void (async () => {\n await menu?.whenClosed();\n this.openLinkDialog(from !== to ? { text: selected, from, to } : undefined);\n })();\n }\n\n private openLinkDialog(initial?: LinkDialogSeed): void {\n const editor = this.host.editor;\n const url = initial?.url ?? '';\n\n this.linkDialogBusy = true;\n this.linkBubbleVisible = false;\n this.linkDialogSeed = {\n url,\n text: initial?.text ?? '',\n openInNewTab: initial?.openInNewTab ?? (editor ? getLinkOpenInNewTab(editor) : false),\n from: initial?.from,\n to: initial?.to,\n };\n this.linkDialogTitle = url.trim() ? 'Update Link' : 'Insert Link';\n this.linkDialogSubmitLabel = url.trim() ? 'Update' : 'Insert';\n\n if (!this.linkDialogMounted) {\n this.linkDialogMounted = true;\n }\n\n // Mount first, then open after the dropdown has fully demoted (caller awaits\n // whenClosed). Busy flag still suppresses toolbar refresh during show animation.\n queueMicrotask(async () => {\n await this.updateComplete;\n await this.linkDialog?.updateComplete;\n this.syncLinkDialogFields();\n // Prefer show() over flipping `open` before firstUpdated — that path only\n // call showModal() and skips PkShowEvent / enter animation.\n await this.linkDialog?.show();\n });\n }\n\n private closeLinkDialog(): void {\n void this.linkDialog?.hide('close-button');\n }\n\n private handleLinkDialogAfterHide = (): void => {\n this.linkDialogBusy = false;\n\n queueMicrotask(() => {\n if (this.isConnected && !this.linkDialog?.open) {\n this.requestUpdate();\n }\n });\n };\n\n private syncLinkDialogFields(): void {\n const seed = this.linkDialogSeed;\n\n if (this.linkUrlInput) {\n this.linkUrlInput.value = seed.url ?? '';\n }\n\n if (this.linkTextInput) {\n this.linkTextInput.value = seed.text ?? '';\n }\n\n if (this.linkNewTabCheckbox) {\n this.linkNewTabCheckbox.checked = Boolean(seed.openInNewTab);\n }\n\n this.updateLinkDialogSubmitState();\n }\n\n private updateLinkDialogSubmitState(): void {\n const canSubmit = Boolean(this.linkUrlInput?.value.trim());\n\n if (this.linkSubmitButton) {\n this.linkSubmitButton.disabled = !canSubmit;\n }\n }\n\n private handleLinkUrlInput = (): void => {\n this.updateLinkDialogSubmitState();\n };\n\n private handleLinkDialogKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Enter') {\n return;\n }\n\n const path = event.composedPath();\n\n if (path.some((node) => node instanceof HTMLElement && node.localName === 'pk-checkbox')) {\n return;\n }\n\n if (path.some((node) => node instanceof HTMLElement && node.localName === 'pk-button')) {\n return;\n }\n\n if (path.some((node) => node instanceof HTMLButtonElement)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.submitLinkDialog();\n };\n\n private handleLinkDialogSubmit = (): void => {\n this.submitLinkDialog();\n };\n\n private submitLinkDialog(): void {\n const editor = this.host.editor;\n const url = this.linkUrlInput?.value.trim() ?? '';\n\n if (!editor || !url) {\n return;\n }\n\n applyLinkToEditor(editor, {\n url,\n text: this.linkTextInput?.value ?? '',\n openInNewTab: Boolean(this.linkNewTabCheckbox?.checked),\n from: this.linkDialogSeed.from,\n to: this.linkDialogSeed.to,\n });\n\n this.closeLinkDialog();\n }\n\n private isLinkActive(): boolean {\n const editor = this.host.editor;\n return editor ? isTiptapButtonActive(editor, 'link') : false;\n }\n\n private renderLinkDialog() {\n return html`\n <pk-dialog\n class=\"link-dialog\"\n size=\"wide\"\n label=${this.linkDialogTitle}\n @pk-after-hide=${this.handleLinkDialogAfterHide}\n @keydown=${this.handleLinkDialogKeyDown}\n >\n <div class=\"link-dialog__fields\">\n <pk-field label=\"URL\" required .for=${this.linkUrlInputId}>\n <pk-input\n id=${this.linkUrlInputId}\n class=\"link-dialog__url-input\"\n type=\"url\"\n placeholder=\"https://\"\n autofocus\n @input=${this.handleLinkUrlInput}\n ></pk-input>\n </pk-field>\n <pk-field label=\"Text\" .for=${this.linkTextInputId}>\n <pk-input\n id=${this.linkTextInputId}\n class=\"link-dialog__text-input\"\n type=\"text\"\n ></pk-input>\n </pk-field>\n <pk-checkbox>Open link in new tab</pk-checkbox>\n </div>\n <pk-button slot=\"footer\" data-dialog-close>Cancel</pk-button>\n <pk-button\n slot=\"footer\"\n class=\"link-dialog__submit\"\n variant=\"primary\"\n disabled\n @click=${this.handleLinkDialogSubmit}\n >\n ${this.linkDialogSubmitLabel}\n </pk-button>\n </pk-dialog>\n `;\n }\n\n private getToolbarButtonId(buttonName: string): string {\n let id = this.toolbarButtonIds.get(buttonName);\n\n if (!id) {\n id = uniqueId(`pk-tiptap-toolbar-${buttonName}`);\n this.toolbarButtonIds.set(buttonName, id);\n }\n\n return id;\n }\n\n private getToolbarButtonLabel(buttonName: string): string {\n return TOOLBAR_LABELS[buttonName] ?? buttonName;\n }\n\n private renderToolbarTooltip(buttonId: string, label: string) {\n if (!this.toolbarTooltips) {\n return nothing;\n }\n\n return html`\n <pk-tooltip for=${buttonId} content=${label} placement=\"top\"></pk-tooltip>\n `;\n }\n\n private renderToolbarButton(buttonName: string) {\n const editor = this.host.editor;\n const icon = TOOLBAR_ICONS[buttonName];\n const label = this.getToolbarButtonLabel(buttonName);\n const buttonId = this.getToolbarButtonId(buttonName);\n const active = editor ? isTiptapButtonActive(editor, buttonName) : false;\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${buttonId}\n type=\"button\"\n class=\"toolbar-btn\"\n aria-label=${label}\n ?disabled=${this.disabled || this.readonly}\n data-state=${active ? 'active' : nothing}\n @click=${() => this.handleToolbarCommand(buttonName)}\n >\n ${icon ? unsafeSVG(icon) : html`<span class=\"toolbar-btn__label\">${label}</span>`}\n </button>\n ${this.renderToolbarTooltip(buttonId, label)}\n </div>\n `;\n }\n\n private handleCraftLink(config: LinkElementConfig): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n openCraftElementLinkSelector({\n config,\n elementSiteId: getLinkOptionsElementSiteId(this.resolveLinkOptions()),\n linkSelectorStorageKeyPrefix: this.linkSelectorStorageKeyPrefix,\n getSelectedText: () => getSelectedText(editor),\n onSelect: ({ url, text }) => { this.openLinkDialog({ url, text }); },\n host: createCraftElementSelectorHost(),\n });\n }\n\n private getToolbarGroupId(groupKey: string): string {\n let id = this.toolbarGroupIds.get(groupKey);\n\n if (!id) {\n id = uniqueId('pk-tiptap-toolbar-group');\n this.toolbarGroupIds.set(groupKey, id);\n }\n\n return id;\n }\n\n private renderToolbarSeparator() {\n return html`<span class=\"toolbar-separator\" aria-hidden=\"true\"></span>`;\n }\n\n private renderGroupTriggerContent(group: ToolbarGroup, triggerLabel: string, iconName: string) {\n const icon = TOOLBAR_ICONS[iconName];\n const showTextLabel = Boolean(group.label);\n\n if (showTextLabel && triggerLabel) {\n return html`\n <span class=\"toolbar-btn__trigger-label\">${triggerLabel}</span>\n <span class=\"toolbar-btn__chevron\">${unsafeSVG(TOOLBAR_CHEVRON_HTML)}</span>\n `;\n }\n\n return html`\n ${icon ? unsafeSVG(icon) : html`<span class=\"toolbar-btn__trigger-label\">${triggerLabel}</span>`}\n <span class=\"toolbar-btn__chevron\">${unsafeSVG(TOOLBAR_CHEVRON_HTML)}</span>\n `;\n }\n\n private renderToolbarGroup(group: ToolbarGroup, groupKey: string) {\n const editor = this.host.editor;\n const groupId = this.getToolbarGroupId(groupKey);\n const trigger = editor ? getToolbarGroupTriggerState(editor, group) : {\n activeName: null,\n label: group.label ?? '',\n isActive: false,\n icon: group.icon ?? getToolbarGroupDefaultIcon(group),\n };\n const menuItems = getToolbarGroupMenuItems(group);\n const tooltipLabel = group.label\n ?? (isHeadingsOnlyToolbarPreset(group.preset) ? 'Headings'\n : isFormattingToolbarPreset(group.preset) ? 'Formatting'\n : group.preset === 'lists' ? 'Lists'\n : group.preset === 'align' ? 'Alignment'\n : 'More');\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${groupId}\n type=\"button\"\n class=\"toolbar-btn toolbar-btn--menu\"\n aria-label=${tooltipLabel}\n aria-haspopup=\"menu\"\n ?disabled=${this.disabled || this.readonly}\n data-state=${trigger.isActive ? 'active' : nothing}\n >\n ${this.renderGroupTriggerContent(group, trigger.label, trigger.icon)}\n </button>\n ${this.renderToolbarTooltip(groupId, tooltipLabel)}\n <pk-dropdown-menu for=${groupId} placement=\"bottom-start\">\n ${menuItems.map((entry, itemIndex) => {\n if (entry.type === 'separator') {\n return html`<pk-dropdown-separator key=${`${groupKey}-sep-${itemIndex}`}></pk-dropdown-separator>`;\n }\n\n const itemName = entry.name;\n const active = editor ? isToolbarButtonActive(editor, itemName) : false;\n const prefixIcon = createToolbarPrefixIcon(itemName);\n const itemLabel = getToolbarMenuItemLabel(itemName);\n\n return html`\n <pk-dropdown-item\n key=${`${groupKey}-${itemName}-${itemIndex}`}\n ?data-active=${active || nothing}\n @click=${() => this.handleToolbarCommand(itemName)}\n >\n ${prefixIcon ?? nothing}\n ${itemLabel}\n </pk-dropdown-item>\n `;\n })}\n </pk-dropdown-menu>\n </div>\n `;\n }\n\n private renderToolbarNode(node: ToolbarNode, index: number) {\n if (node.type === 'separator') {\n return this.renderToolbarSeparator();\n }\n\n if (node.type === 'group') {\n return this.renderToolbarGroup(node.group, `group-${index}`);\n }\n\n if (node.name === 'link') {\n return this.renderLinkToolbarButton();\n }\n\n return this.renderToolbarButton(node.name);\n }\n\n private renderDefaultToolbar() {\n // `toolbar-end` — append custom controls (Formie variable picker, etc.) into the\n // stock toolbar flex/gap. Prefer over replacing the whole bar via slot=\"toolbar\".\n return html`\n <div class=\"toolbar\" part=\"toolbar\">\n ${this.toolbarNodes.map((node, index) => this.renderToolbarNode(node, index))}\n <slot name=\"toolbar-end\"></slot>\n </div>\n `;\n }\n\n private renderLinkToolbarButton() {\n const editor = this.host.editor;\n const craftOptions = getCraftLinkOptions(this.resolveLinkOptions());\n const label = this.getToolbarButtonLabel('link');\n const active = this.isLinkActive();\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${this.linkButtonId}\n type=\"button\"\n class=\"toolbar-btn\"\n aria-label=${label}\n aria-haspopup=\"menu\"\n ?disabled=${this.disabled || this.readonly}\n data-state=${active ? 'active' : nothing}\n >\n ${unsafeSVG(TOOLBAR_ICONS.link)}\n </button>\n ${this.renderToolbarTooltip(this.linkButtonId, label)}\n <pk-dropdown-menu for=${this.linkButtonId} placement=\"bottom-start\">\n ${craftOptions.map((option) => html`\n <pk-dropdown-item @click=${() => this.handleCraftLink(option)}>\n ${option.optionTitle}\n </pk-dropdown-item>\n `)}\n ${craftOptions.length > 0 ? html`<pk-dropdown-separator></pk-dropdown-separator>` : nothing}\n <pk-dropdown-item @click=${() => this.openLinkMenu()}>Insert Link</pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${!active}\n @click=${() => editor && unsetLinkFromEditor(editor)}\n >Unlink</pk-dropdown-item>\n </pk-dropdown-menu>\n </div>\n `;\n }\n\n override render() {\n return html`\n <div class=\"shell\" part=\"shell\">\n ${this.hasCustomToolbar\n ? html`<slot name=\"toolbar\"></slot>`\n : this.renderDefaultToolbar()}\n\n <div class=\"editor-mount\" part=\"editor\">\n ${this.contentError ? html`\n <div class=\"content-error\">\n <span>${unsafeSVG(renderIconHtml(triangleExclamation))}</span>\n <span>${this.contentError}</span>\n </div>\n ` : nothing}\n ${this.toolbarHasLink() && this.linkBubbleVisible ? this.renderLinkBubble() : nothing}\n </div>\n\n <input class=\"mirror-input\" type=\"text\" .value=${this.value} readonly tabindex=\"-1\" aria-hidden=\"true\" />\n ${this.toolbarHasLink() && this.linkDialogMounted ? this.renderLinkDialog() : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tiptap-editor': PkTiptapEditor;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tiptap.styles-ChAfyVi9.js","names":[],"sources":["../../src/components/tiptap/variable-tag-node-view.ts","../../src/components/tiptap/tiptap.styles.ts"],"sourcesContent":["import type { Editor, NodeViewRenderer, NodeViewRendererProps } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport { uniqueId } from '../../a11y/focus.js';\n\n/** Match kit v1 VariableTagView chip chrome (indigo + remove). */\nconst REMOVE_ICON = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M2.1 1.4 5 4.3l2.9-2.9.7.7L5.7 5l2.9 2.9-.7.7L5 5.7l-2.9 2.9-.7-.7L4.3 5 1.4 2.1z\"/>\n</svg>\n`.trim();\n\nexport const PK_VARIABLE_TAG_CONFIGURE_EVENT = 'pk-variable-tag-configure';\n\nexport type PkVariableTagConfigureDetail = {\n editor: Editor;\n anchor: HTMLElement;\n attrs: Record<string, unknown>;\n getPos: () => number | undefined;\n updateAttributes: (attributes: Record<string, unknown>) => void;\n deleteNode: () => void;\n};\n\nconst findTiptapHost = (viewDom: HTMLElement): HTMLElement | null => {\n let node: Node | null = viewDom;\n while (node) {\n if (node instanceof HTMLElement && node.localName.startsWith('pk-tiptap')) {\n return node;\n }\n\n node = node.parentNode instanceof ShadowRoot\n ? node.parentNode.host\n : node.parentNode;\n }\n\n return null;\n};\n\nconst emitConfigure = (\n editor: Editor,\n detail: PkVariableTagConfigureDetail,\n) => {\n const viewDom = editor.view.dom;\n const host = findTiptapHost(viewDom);\n\n // Preferred bridge for React/Formie: property callback on <pk-tiptap-*>.\n const configure = host && 'variableTagConfigure' in host\n ? (host as HTMLElement & {\n variableTagConfigure?: ((detail: PkVariableTagConfigureDetail) => void) | null;\n }).variableTagConfigure\n : null;\n\n if (typeof configure === 'function') {\n configure(detail);\n }\n\n // Composed event is the reliable Formie path (document capture listener).\n const target = host ?? viewDom;\n target.dispatchEvent(new CustomEvent(PK_VARIABLE_TAG_CONFIGURE_EVENT, {\n bubbles: true,\n composed: true,\n detail,\n }));\n};\n\n/**\n * DOM NodeViewRendererProps do NOT include React's `deleteNode` / `updateAttributes`\n * (those live on NodeViewProps for ReactNodeViewRenderer only). Build them from\n * editor + getPos — same operations ReactNodeViewRenderer wires for VariableTagView.\n */\nfunction createNodeViewCommands(\n editor: Editor,\n getPos: NodeViewRendererProps['getPos'],\n) {\n const resolvePos = (): number | undefined => {\n const pos = typeof getPos === 'function' ? getPos() : getPos;\n return typeof pos === 'number' ? pos : undefined;\n };\n\n const deleteNode = () => {\n const pos = resolvePos();\n if (typeof pos !== 'number') {\n return;\n }\n\n const live = editor.state.doc.nodeAt(pos);\n if (!live || live.type.name !== 'variableTag') {\n return;\n }\n\n editor\n .chain()\n .focus()\n .deleteRange({ from: pos, to: pos + live.nodeSize })\n .run();\n };\n\n const updateAttributes = (attributes: Record<string, unknown>) => {\n const pos = resolvePos();\n if (typeof pos !== 'number') {\n return;\n }\n\n const live = editor.state.doc.nodeAt(pos);\n if (!live || live.type.name !== 'variableTag') {\n return;\n }\n\n editor\n .chain()\n .command(({ tr, dispatch }) => {\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...live.attrs,\n ...attributes,\n });\n }\n return true;\n })\n .run();\n };\n\n return { deleteNode, updateAttributes, resolvePos };\n}\n\n/**\n * DOM node view for variable tags in vanilla editors.\n * Chip + remove match kit v1; configure UI is opened via `pk-variable-tag-configure`\n * (Formie mounts the edit overlay beside the WC editor).\n */\nexport function createVariableTagDomNodeView(): NodeViewRenderer {\n return (props) => {\n const { editor, getPos } = props;\n const { deleteNode, updateAttributes, resolvePos } = createNodeViewCommands(editor, getPos);\n\n let currentNode: ProseMirrorNode = props.node;\n\n const syncUnresolvedPresentation = (attrs: Record<string, unknown>) => {\n const unresolved = Boolean(attrs.unresolved);\n const token = String(attrs.value ?? '');\n const chipLabel = String(attrs.label || attrs.value || '');\n\n dom.classList.toggle('pk-variable-tag--unresolved', unresolved);\n if (unresolved) {\n dom.dataset.unresolved = 'true';\n // Hover: prompt to fix + keep the raw token for support/debug.\n dom.title = token\n ? `Unknown or missing reference — ${token}`\n : 'Unknown or missing reference';\n label.setAttribute('aria-invalid', 'true');\n } else {\n delete dom.dataset.unresolved;\n dom.removeAttribute('title');\n label.removeAttribute('aria-invalid');\n }\n\n label.textContent = chipLabel;\n };\n\n const dom = document.createElement('span');\n dom.className = 'pk-variable-tag';\n dom.id = uniqueId('pk-variable-tag');\n dom.setAttribute('contenteditable', 'false');\n // Do NOT set draggable=true permanently — HTML5-draggable hosts suppress click,\n // which kills configure. ProseMirror sets draggable temporarily on mousedown drag.\n // TipTap React node views use data-drag-handle on a TipTap NodeView class; keep the\n // attr for parity, but drag itself is PM's selectable+draggable atom behavior.\n dom.setAttribute('data-drag-handle', '');\n dom.dataset.label = String(currentNode.attrs.label ?? '');\n dom.dataset.variableValue = String(currentNode.attrs.value ?? '');\n\n // Match kit v1 VariableTagView: real button for activate.\n const label = document.createElement('button');\n label.type = 'button';\n label.className = 'pk-variable-tag__label';\n label.draggable = false;\n dom.append(label);\n syncUnresolvedPresentation(currentNode.attrs);\n\n let removeButton: HTMLButtonElement | null = null;\n let openOnInsertHandled = false;\n let openedAt = 0;\n\n const readLiveAttrs = () => {\n const pos = resolvePos();\n if (typeof pos === 'number') {\n const live = editor.state.doc.nodeAt(pos);\n if (live?.type.name === 'variableTag') {\n return { ...live.attrs };\n }\n }\n\n return { ...currentNode.attrs };\n };\n\n const openConfigure = () => {\n if (!editor.isEditable) {\n return;\n }\n\n // Dedupe repeated emits from nested handlers / openOnInsert.\n const now = Date.now();\n if (now - openedAt < 300) {\n return;\n }\n openedAt = now;\n\n // Strip any HTML5-draggable PM may have armed so configure stays clickable\n // after this interaction (draggable hosts suppress subsequent clicks).\n dom.removeAttribute('draggable');\n\n emitConfigure(editor, {\n editor,\n anchor: dom,\n attrs: readLiveAttrs(),\n getPos: resolvePos,\n updateAttributes,\n deleteNode,\n });\n };\n\n // Open on pointerdown — before ProseMirror can arm HTML5 drag on the atom.\n label.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n openConfigure();\n });\n label.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n openConfigure();\n });\n\n const syncRemoveButton = (editable: boolean) => {\n if (editable) {\n if (removeButton) {\n return;\n }\n\n removeButton = document.createElement('button');\n removeButton.type = 'button';\n removeButton.className = 'pk-variable-tag__remove';\n removeButton.setAttribute('aria-label', 'Remove');\n removeButton.draggable = false;\n removeButton.innerHTML = REMOVE_ICON;\n removeButton.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n event.stopPropagation();\n });\n removeButton.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n deleteNode();\n });\n dom.append(removeButton);\n return;\n }\n\n removeButton?.remove();\n removeButton = null;\n };\n\n syncRemoveButton(editor.isEditable);\n\n if (currentNode.attrs.openOnInsert && editor.isEditable && !openOnInsertHandled) {\n openOnInsertHandled = true;\n queueMicrotask(() => {\n updateAttributes({ openOnInsert: false });\n openConfigure();\n });\n }\n\n return {\n dom,\n // TipTap React node views stop PM from handling events inside the chip —\n // that prevents `draggable=true` arming, which otherwise kills configure.\n // Drag still works via outer NodeSelection + data-drag-handle when the\n // pointer starts on the chip chrome (not the label/remove controls).\n stopEvent: (event) => {\n const target = event.target as Node | null;\n if (!(target instanceof Element)) {\n return false;\n }\n\n return Boolean(\n target.closest('.pk-variable-tag__label')\n || target.closest('.pk-variable-tag__remove'),\n );\n },\n selectNode: () => {\n dom.classList.add('ProseMirror-selectednode');\n // Never keep HTML5-draggable while selected — it suppresses clicks.\n dom.removeAttribute('draggable');\n },\n deselectNode: () => {\n dom.classList.remove('ProseMirror-selectednode');\n dom.removeAttribute('draggable');\n },\n update(updatedNode) {\n if (updatedNode.type.name !== 'variableTag') {\n return false;\n }\n\n currentNode = updatedNode;\n dom.dataset.label = String(updatedNode.attrs.label ?? '');\n dom.dataset.variableValue = String(updatedNode.attrs.value ?? '');\n syncUnresolvedPresentation(updatedNode.attrs);\n syncRemoveButton(editor.isEditable);\n return true;\n },\n };\n };\n}\n","import { css } from 'lit';\n\n/**\n * Indigo chip matching kit v1 VariableTagView (`bg-[#5C6BC0] text-white rounded-[2px]`).\n * Shared by rich editor + single-line input ProseMirror hosts.\n */\nconst variableTagStyles = css`\n .pk-variable-tag {\n position: relative;\n display: inline-flex;\n align-items: stretch;\n max-width: 100%;\n margin-inline: 1px;\n margin-block-start: -3px;\n padding: 0;\n border-radius: 2px;\n background: #5c6bc0;\n color: #fff;\n font-size: 11px;\n font-weight: 400;\n line-height: 1;\n white-space: nowrap;\n vertical-align: middle;\n overflow: hidden;\n cursor: default;\n box-sizing: border-box;\n }\n\n /* Unresolved / missing reference — muted grey (not alarm yellow). */\n .pk-variable-tag--unresolved {\n background: var(--pk-color-gray-100, #f3f4f6);\n color: var(--pk-color-gray-600, #4b5563);\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-300, #d1d5db);\n }\n\n .pk-variable-tag--unresolved.ProseMirror-selectednode {\n box-shadow:\n inset 0 0 0 1px var(--pk-color-gray-400, #9ca3af),\n 0 0 0 2px rgba(156, 163, 175, 0.45);\n }\n\n .pk-variable-tag.ProseMirror-selectednode {\n outline: none;\n box-shadow: 0 0 0 2px rgba(123, 140, 232, 0.5);\n }\n\n .pk-variable-tag__label {\n display: inline-flex;\n align-items: center;\n max-width: 220px;\n margin: 0;\n padding: 4px 5px;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: inherit;\n line-height: inherit;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n user-select: none;\n }\n\n .pk-variable-tag__remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n align-self: stretch;\n margin: 0;\n padding: 4px 5px 4px 4px;\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n line-height: 0;\n appearance: none;\n }\n\n .pk-variable-tag__remove svg {\n display: block;\n width: 10px;\n height: 10px;\n pointer-events: none;\n }\n`;\n\nexport const tiptapProseMirrorStyles = css`\n @layer pk-component {\n .ProseMirror {\n outline: none;\n min-height: 2rem;\n padding: 1rem;\n background: rgb(251, 252, 254);\n /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\n font-family: var(--pk-font-family);\n /* Match pk-input / body (14px). sm (13px) matched field instructions and looked undersized vs v1. */\n font-size: var(--pk-font-size-base);\n line-height: 1.5;\n white-space: pre-wrap;\n box-sizing: border-box;\n }\n\n .ProseMirror p {\n margin: 0 0 0.5rem;\n }\n\n .ProseMirror p:last-child {\n margin-bottom: 0;\n }\n\n .ProseMirror h1 {\n font-size: 1.25rem;\n font-weight: 700;\n margin: 0 0 0.5rem;\n }\n\n .ProseMirror h2 {\n font-size: 1.125rem;\n font-weight: 600;\n margin: 0 0 0.5rem;\n }\n\n .ProseMirror h3,\n .ProseMirror h4,\n .ProseMirror h5,\n .ProseMirror h6 {\n font-weight: 600;\n margin: 0 0 0.5rem;\n }\n\n .ProseMirror a {\n color: var(--pk-color-blue-600);\n text-decoration: underline;\n cursor: pointer;\n }\n\n .ProseMirror ul,\n .ProseMirror ol {\n margin: 0 0 0.5rem;\n padding-left: 1.25rem;\n }\n\n .ProseMirror blockquote {\n margin: 0 0 0.5rem;\n padding-left: 0.75rem;\n border-left: 3px solid var(--pk-color-gray-300);\n color: var(--pk-color-gray-600);\n }\n\n .ProseMirror code {\n font-family: var(--pk-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: var(--pk-font-size-mono, 0.9em);\n line-height: var(--pk-line-height-mono, 1.5);\n background: var(--pk-color-gray-100);\n border-radius: 0.2rem;\n padding: 0.1rem 0.25rem;\n }\n\n .ProseMirror pre {\n margin: 0 0 0.5rem;\n padding: 0.75rem;\n background: var(--pk-color-gray-900);\n color: var(--pk-color-gray-50);\n border-radius: var(--pk-radius-md);\n overflow-x: auto;\n font-family: var(--pk-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);\n font-size: var(--pk-font-size-mono, 0.9em);\n line-height: var(--pk-line-height-mono, 1.5);\n }\n\n ${variableTagStyles}\n }\n`;\n\n/**\n * Single-line TipTap field — same box metrics as `pk-input` .input\n * (14px / line-height 1.4 / padding 6px 8px).\n *\n * ProseMirror always injects `br.ProseMirror-trailingBreak` for the caret.\n * Never `display: none` it — that freezes one-liner docs after the first character.\n * Clip to one line height instead so the break cannot inflate the control.\n */\nexport const tiptapInputProseMirrorStyles = css`\n @layer pk-component {\n .ProseMirror {\n outline: none;\n margin: 0;\n /* Match stock pk-input padding by default. Hosts can override density via\n * --pk-tiptap-input-* (light DOM cannot style .ProseMirror in the shadow tree).\n */\n padding-block: var(--pk-tiptap-input-padding-block, 6px);\n padding-inline-start: var(--pk-tiptap-input-padding-inline-start, 8px);\n padding-inline-end: var(--pk-tiptap-input-padding-inline-end, 8px);\n /* One-liner clip: padding + control line-height (v1 text-sm), not a fixed shell token. */\n height: var(--pk-tiptap-input-height, calc(var(--pk-input-control-line-height, 1.25rem) + 12px));\n max-height: var(--pk-tiptap-input-height, calc(var(--pk-input-control-line-height, 1.25rem) + 12px));\n background: var(--pk-input-bg);\n /* Craft CP body / field value text. */\n color: var(--pk-color-gray-700);\n font-family: var(--pk-font-family);\n font-size: var(--pk-tiptap-input-font-size, var(--pk-font-size-base));\n line-height: var(--pk-tiptap-input-line-height, var(--pk-input-control-line-height, 1.25rem));\n white-space: nowrap;\n overflow-x: auto;\n overflow-y: hidden;\n box-sizing: border-box;\n scrollbar-width: none;\n }\n\n .ProseMirror::-webkit-scrollbar {\n display: none;\n }\n\n /* OneLinerDocument is inline-only; keep p inline if a schema ever wraps text. */\n .ProseMirror p {\n margin: 0;\n display: inline;\n line-height: inherit;\n }\n\n /* Read-only display: no input padding/height box (v1 skipped chrome when readOnly).\n * Inherit color/weight so list name links (text-blue-600 font-bold) show through. */\n :host([readonly]) .ProseMirror {\n padding-block: 0;\n padding-inline: 0;\n height: auto;\n max-height: none;\n background: transparent;\n overflow: visible;\n white-space: normal;\n color: inherit;\n font-weight: inherit;\n font-size: inherit;\n }\n\n ${variableTagStyles}\n }\n`;\n\nexport const tiptapContentProseMirrorStyles = css`\n @layer pk-component {\n /* Inherit host color/size so light-DOM wrappers (warning banners, badges)\n can restyle read-only TipTap without piercing the shadow tree. */\n .ProseMirror {\n outline: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n .ProseMirror p {\n margin: 0;\n }\n }\n`;\n"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|