@verbb/plugin-kit-web 2.0.1 → 2.0.4

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.
Files changed (172) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/chunks/{autoloader-DzOTQqe6.js → autoloader-DXK9MVuw.js} +2 -2
  3. package/dist/chunks/{autoloader-DzOTQqe6.js.map → autoloader-DXK9MVuw.js.map} +1 -1
  4. package/dist/chunks/{component-registry-CpZiIDh4.js → component-registry-BOlxFlou.js} +1 -1
  5. package/dist/chunks/{component-registry-CpZiIDh4.js.map → component-registry-BOlxFlou.js.map} +1 -1
  6. package/dist/chunks/{pk-button-Cilu5WAT.js → pk-button-QpDDlRbG.js} +8 -3
  7. package/dist/chunks/pk-button-QpDDlRbG.js.map +1 -0
  8. package/dist/chunks/{pk-checkbox-select-ZEJ6WIQn.js → pk-checkbox-select-9lqd9Rwz.js} +2 -1
  9. package/dist/chunks/{pk-checkbox-select-ZEJ6WIQn.js.map → pk-checkbox-select-9lqd9Rwz.js.map} +1 -1
  10. package/dist/chunks/{pk-combobox-Dd1ik0Ko.js → pk-combobox-DtkXaX67.js} +3 -2
  11. package/dist/chunks/pk-combobox-DtkXaX67.js.map +1 -0
  12. package/dist/chunks/{pk-copy-button-DPh5TOF9.js → pk-copy-button-C17MLLYS.js} +2 -1
  13. package/dist/chunks/{pk-copy-button-DPh5TOF9.js.map → pk-copy-button-C17MLLYS.js.map} +1 -1
  14. package/dist/chunks/{pk-date-picker-CkwU4DzD.js → pk-date-picker-DIoQlPI9.js} +3 -2
  15. package/dist/chunks/pk-date-picker-DIoQlPI9.js.map +1 -0
  16. package/dist/chunks/{pk-dropdown-item-BFyjtsL5.js → pk-dropdown-item-P3LLojCI.js} +16 -1
  17. package/dist/chunks/pk-dropdown-item-P3LLojCI.js.map +1 -0
  18. package/dist/chunks/{pk-dropdown-label-DfACId-K.js → pk-dropdown-label-ibVrU6-U.js} +10 -4
  19. package/dist/chunks/pk-dropdown-label-ibVrU6-U.js.map +1 -0
  20. package/dist/chunks/{pk-dropdown-menu-DWlxkDIs.js → pk-dropdown-menu-CsX95MCP.js} +2 -2
  21. package/dist/chunks/pk-dropdown-menu-CsX95MCP.js.map +1 -0
  22. package/dist/chunks/{pk-editable-table-pBkD6izs.js → pk-editable-table-wtsSKfzS.js} +14 -1
  23. package/dist/chunks/{pk-editable-table-pBkD6izs.js.map → pk-editable-table-wtsSKfzS.js.map} +1 -1
  24. package/dist/chunks/{pk-option-C3Zqmu3z.js → pk-option-C-cR-jOv.js} +11 -3
  25. package/dist/chunks/pk-option-C-cR-jOv.js.map +1 -0
  26. package/dist/chunks/{pk-popover-XZZdJ4WI.js → pk-popover-CVvwXMld.js} +2 -2
  27. package/dist/chunks/pk-popover-CVvwXMld.js.map +1 -0
  28. package/dist/chunks/{pk-select-B17rV6BR.js → pk-select-odSNU1tN.js} +3 -2
  29. package/dist/chunks/pk-select-odSNU1tN.js.map +1 -0
  30. package/dist/chunks/{pk-tab-CzV7pOdp.js → pk-tab-BdoPiYfT.js} +8 -2
  31. package/dist/chunks/pk-tab-BdoPiYfT.js.map +1 -0
  32. package/dist/chunks/{pk-time-picker-DbW_hMs2.js → pk-time-picker-DtX0LtID.js} +3 -2
  33. package/dist/chunks/{pk-time-picker-DbW_hMs2.js.map → pk-time-picker-DtX0LtID.js.map} +1 -1
  34. package/dist/chunks/{pk-tiptap-editor-umIuEaXh.js → pk-tiptap-editor-CdoutapZ.js} +10 -1
  35. package/dist/chunks/{pk-tiptap-editor-umIuEaXh.js.map → pk-tiptap-editor-CdoutapZ.js.map} +1 -1
  36. package/dist/chunks/pk-tooltip-fcUbVGli.js.map +1 -1
  37. package/dist/chunks/popup-pointer-DMnuZDQl.js +34 -0
  38. package/dist/chunks/popup-pointer-DMnuZDQl.js.map +1 -0
  39. package/dist/chunks/register-22v142C-.js +143 -0
  40. package/dist/chunks/register-22v142C-.js.map +1 -0
  41. package/dist/chunks/{register-components-DNw6EYNo.js → register-components-BG_6_v_T.js} +1 -1
  42. package/dist/chunks/{register-components-DNw6EYNo.js.map → register-components-BG_6_v_T.js.map} +1 -1
  43. package/dist/components/button/pk-button.js +1 -1
  44. package/dist/components/button/pk-button.styles.d.ts.map +1 -1
  45. package/dist/components/button.js +1 -1
  46. package/dist/components/checkbox-select/pk-checkbox-select.js +1 -1
  47. package/dist/components/checkbox-select.js +1 -1
  48. package/dist/components/combobox/pk-combobox.d.ts.map +1 -1
  49. package/dist/components/combobox/pk-combobox.js +1 -1
  50. package/dist/components/combobox.js +1 -1
  51. package/dist/components/copy-button/pk-copy-button.js +1 -1
  52. package/dist/components/copy-button.js +1 -1
  53. package/dist/components/date-picker/pk-date-picker.d.ts.map +1 -1
  54. package/dist/components/date-picker/pk-date-picker.js +1 -1
  55. package/dist/components/date-picker.js +1 -1
  56. package/dist/components/dropdown-menu/dropdown-menu-size.styles.d.ts.map +1 -1
  57. package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
  58. package/dist/components/dropdown-menu/pk-dropdown-item.styles.d.ts.map +1 -1
  59. package/dist/components/dropdown-menu/pk-dropdown-label.js +1 -1
  60. package/dist/components/dropdown-menu/pk-dropdown-label.styles.d.ts.map +1 -1
  61. package/dist/components/dropdown-menu/pk-dropdown-menu.d.ts.map +1 -1
  62. package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
  63. package/dist/components/dropdown-menu.js +3 -3
  64. package/dist/components/editable-table/pk-editable-table.js +1 -1
  65. package/dist/components/editable-table.js +1 -1
  66. package/dist/components/popover/pk-popover.d.ts.map +1 -1
  67. package/dist/components/popover/pk-popover.js +1 -1
  68. package/dist/components/popover.js +1 -1
  69. package/dist/components/select/pk-option.js +1 -1
  70. package/dist/components/select/pk-option.styles.d.ts.map +1 -1
  71. package/dist/components/select/pk-select.d.ts.map +1 -1
  72. package/dist/components/select/pk-select.js +1 -1
  73. package/dist/components/select.js +2 -2
  74. package/dist/components/tabs/pk-tab.js +1 -1
  75. package/dist/components/tabs/pk-tab.styles.d.ts.map +1 -1
  76. package/dist/components/tabs.js +1 -1
  77. package/dist/components/time-picker/pk-time-picker.js +1 -1
  78. package/dist/components/time-picker.js +1 -1
  79. package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
  80. package/dist/components/tiptap-editor.js +1 -1
  81. package/dist/components/tooltip/pk-tooltip.d.ts.map +1 -1
  82. package/dist/index.js +19 -19
  83. package/dist/plugin-kit.js +2 -2
  84. package/dist/register-components.js +1 -1
  85. package/dist/register.js +18 -79
  86. package/dist/utils/popup-pointer.d.ts +3 -0
  87. package/dist/utils/popup-pointer.d.ts.map +1 -1
  88. package/dist-loader/chunks/{pk-button-BlSs4e6V.js → pk-button-CK5FZiwP.js} +9 -5
  89. package/dist-loader/chunks/{pk-calendar-RXCDDhLI.js → pk-calendar-Ir5izQJH.js} +3 -3
  90. package/dist-loader/chunks/{pk-checkbox-hJCj8In8.js → pk-checkbox-CoDX2G3J.js} +2 -2
  91. package/dist-loader/chunks/{pk-color-input-BfNtLznP.js → pk-color-input-BEmVZXSP.js} +2 -2
  92. package/dist-loader/chunks/{pk-combobox-1PJBcIrV.js → pk-combobox-fXGaY4L0.js} +11 -10
  93. package/dist-loader/chunks/{pk-date-picker-D4vCtbw-.js → pk-date-picker-B3eWgHtv.js} +12 -11
  94. package/dist-loader/chunks/{pk-dialog-D1RZjwQN.js → pk-dialog-CP1YT85H.js} +4 -4
  95. package/dist-loader/chunks/{pk-dropdown-item-BJIhQ0Mw.js → pk-dropdown-item-DkZRcPJ5.js} +20 -5
  96. package/dist-loader/chunks/{pk-dropdown-menu-I1s3TBiA.js → pk-dropdown-menu-CajQAobW.js} +6 -6
  97. package/dist-loader/chunks/{pk-field-BnKPT_Kk.js → pk-field-CIfymz5G.js} +3 -3
  98. package/dist-loader/chunks/{pk-input-Oarjv7Vc.js → pk-input-CXE7_rTQ.js} +6 -6
  99. package/dist-loader/chunks/{pk-lightswitch-D-UrNM3y.js → pk-lightswitch-BHEOy7aK.js} +4 -4
  100. package/dist-loader/chunks/{pk-option-CCZebfif.js → pk-option-vh8UvSAI.js} +12 -4
  101. package/dist-loader/chunks/{pk-popup-BNRyCsVX.js → pk-popup-BYFbKaHH.js} +2 -2
  102. package/dist-loader/chunks/{pk-select-BcbtjIoP.js → pk-select-CbmPJCx8.js} +11 -10
  103. package/dist-loader/chunks/{pk-textarea-CC6WXpIu.js → pk-textarea-Ch8JpP83.js} +4 -4
  104. package/dist-loader/chunks/{pk-time-picker-BtGXo-KJ.js → pk-time-picker-DZljwJn9.js} +4 -3
  105. package/dist-loader/chunks/{pk-tooltip-JJRxVXYD.js → pk-tooltip-DHiCn33o.js} +3 -3
  106. package/dist-loader/chunks/popup-pointer-BTS3Y6LE.js +32 -0
  107. package/dist-loader/chunks/{render-DApFfV9S.js → render-BCU9WDSk.js} +1 -1
  108. package/dist-loader/chunks/{icons-B1i-oRoD.js → svg-BCGsRUz7.js} +34 -1
  109. package/dist-loader/chunks/{tiptap-Db7MTUH1.js → tiptap-_LAjdgeV.js} +1 -1
  110. package/dist-loader/chunks/{tiptap.styles-DAH_90Fi.js → tiptap.styles-CDjt6Iz4.js} +1 -1
  111. package/dist-loader/components/button/button.js +1 -1
  112. package/dist-loader/components/button-group/button-group-text.js +1 -1
  113. package/dist-loader/components/calendar/calendar.js +1 -1
  114. package/dist-loader/components/checkbox/checkbox.js +1 -1
  115. package/dist-loader/components/checkbox-select/checkbox-select.js +1 -0
  116. package/dist-loader/components/code-editor/code-editor.js +2 -2
  117. package/dist-loader/components/color-input/color-input.js +1 -1
  118. package/dist-loader/components/combobox/combobox.js +1 -1
  119. package/dist-loader/components/copy-button/copy-button.js +3 -2
  120. package/dist-loader/components/date-picker/date-picker.js +1 -1
  121. package/dist-loader/components/dialog/dialog.js +1 -1
  122. package/dist-loader/components/dropdown-menu/dropdown-item.js +1 -1
  123. package/dist-loader/components/dropdown-menu/dropdown-label.js +9 -3
  124. package/dist-loader/components/dropdown-menu/dropdown-menu.js +1 -1
  125. package/dist-loader/components/editable-table/editable-table.js +16 -3
  126. package/dist-loader/components/field/field.js +1 -1
  127. package/dist-loader/components/icon/icon.js +43 -2
  128. package/dist-loader/components/input/input.js +1 -1
  129. package/dist-loader/components/input-group/input-group.js +1 -1
  130. package/dist-loader/components/lightswitch/lightswitch.js +1 -1
  131. package/dist-loader/components/popover/popover.js +6 -6
  132. package/dist-loader/components/popup/popup.js +1 -1
  133. package/dist-loader/components/radio-group/radio-group.js +3 -3
  134. package/dist-loader/components/select/option.js +1 -1
  135. package/dist-loader/components/select/select.js +1 -1
  136. package/dist-loader/components/tabs/tab.js +7 -1
  137. package/dist-loader/components/textarea/textarea.js +1 -1
  138. package/dist-loader/components/time-picker/time-picker.js +1 -1
  139. package/dist-loader/components/tiptap/tiptap-content.js +2 -2
  140. package/dist-loader/components/tiptap/tiptap-editor.js +13 -5
  141. package/dist-loader/components/tiptap/tiptap-input.js +3 -3
  142. package/dist-loader/components/toggle/toggle.js +1 -1
  143. package/dist-loader/components/tooltip/tooltip.js +1 -1
  144. package/package.json +8 -7
  145. package/dist/chunks/pk-button-Cilu5WAT.js.map +0 -1
  146. package/dist/chunks/pk-combobox-Dd1ik0Ko.js.map +0 -1
  147. package/dist/chunks/pk-date-picker-CkwU4DzD.js.map +0 -1
  148. package/dist/chunks/pk-dropdown-item-BFyjtsL5.js.map +0 -1
  149. package/dist/chunks/pk-dropdown-label-DfACId-K.js.map +0 -1
  150. package/dist/chunks/pk-dropdown-menu-DWlxkDIs.js.map +0 -1
  151. package/dist/chunks/pk-option-C3Zqmu3z.js.map +0 -1
  152. package/dist/chunks/pk-popover-XZZdJ4WI.js.map +0 -1
  153. package/dist/chunks/pk-select-B17rV6BR.js.map +0 -1
  154. package/dist/chunks/pk-tab-CzV7pOdp.js.map +0 -1
  155. package/dist/chunks/popup-pointer-C8lypj8V.js +0 -21
  156. package/dist/chunks/popup-pointer-C8lypj8V.js.map +0 -1
  157. package/dist/register.js.map +0 -1
  158. package/dist-loader/chunks/popup-pointer-BC4n_sNb.js +0 -19
  159. package/dist-loader/chunks/svg-Boar0Kf1.js +0 -34
  160. /package/dist-loader/chunks/{animate-with-class-DT0jwaR_.js → animate-with-class-B2hHgK5M.js} +0 -0
  161. /package/dist-loader/chunks/{button-group-item.styles-Dwakbyx5.js → button-group-item.styles-BNc-ksl1.js} +0 -0
  162. /package/dist-loader/chunks/{codemirror-CSgOT0QM.js → codemirror-CHXb-wYU.js} +0 -0
  163. /package/dist-loader/chunks/{field-labels-D3lKQ2nq.js → field-labels-Vo3wHq49.js} +0 -0
  164. /package/dist-loader/chunks/{floating-ui-87vslRWW.js → floating-ui-BTBNFWAR.js} +0 -0
  165. /package/dist-loader/chunks/{has-slot-BGJeJdHr.js → has-slot-BZDcCpf9.js} +0 -0
  166. /package/dist-loader/chunks/{mirror-validator-C5XrXPaq.js → mirror-validator-DEz3BsbN.js} +0 -0
  167. /package/dist-loader/chunks/{overlay-lifecycle-C3tSQ3UR.js → overlay-lifecycle-BG4QMRLw.js} +0 -0
  168. /package/dist-loader/chunks/{pk-clear-BMZUzwDt.js → pk-clear-BRS8vkV-.js} +0 -0
  169. /package/dist-loader/chunks/{popup-content-animation.styles-S6CK-zPp.js → popup-content-animation.styles-C9ffC35f.js} +0 -0
  170. /package/dist-loader/chunks/{popup-placement-animation-WlEXnS85.js → popup-placement-animation-BPjq650B.js} +0 -0
  171. /package/dist-loader/chunks/{required-validator-0XwZtX9k.js → required-validator-DXqqPVeW.js} +0 -0
  172. /package/dist-loader/chunks/{sync-listbox-separators-Bcja51HC.js → sync-listbox-separators-CT3oGzTf.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-dropdown-menu-DWlxkDIs.js","names":[],"sources":["../../src/components/dropdown-menu/pk-dropdown-menu.styles.ts","../../src/components/dropdown-menu/pk-dropdown-menu.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport { buttonGroupCornerRoleStyles } from '../button-group/button-group-item.styles.js';\nimport { dropdownMenuHostSizeStyles, dropdownMenuPanelSizeStyles } from './dropdown-menu-size.styles.js';\n\n/**\n * Dropdown panel motion — `pk-dropdown` scale+fade, with transform\n * origin from `pk-popup`’s `--pk-transform-origin` (Base UI / v1 alignment).\n * */\nexport const pkDropdownMenuStyles = [\n buttonGroupCornerRoleStyles(),\n dropdownMenuHostSizeStyles,\n dropdownMenuPanelSizeStyles,\n css`\n @layer pk-component {\n /* Standalone: keep a real box so the trigger is not a flex-stretched\n child of the page (display:contents flattened pk-button to full card width).\n Button groups override below — same as legacy + React MenuButton inline-flex wrap. */\n :host {\n display: inline-block;\n position: relative;\n width: fit-content;\n max-width: 100%;\n align-self: flex-start;\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 width: auto;\n max-width: none;\n align-self: auto;\n }\n\n /* Belt-and-suspenders if a parent still flattens layout onto the trigger. */\n ::slotted([slot='trigger']) {\n width: fit-content;\n max-width: 100%;\n flex: 0 0 auto;\n align-self: flex-start;\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 align-self: auto;\n max-width: none;\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 /* Menu panel — hug content; do not stretch to trigger/anchor width. */\n .panel {\n display: flex;\n flex-direction: column;\n width: max-content;\n min-width: 8rem;\n margin: 0;\n overflow: auto;\n padding: 4px 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 /* v1 DropdownMenuItem had no face color — inherited Craft body\n * (--text-color ≈ gray-700). Do not force gray-900 (too dark). */\n color: var(--text-color, var(--pk-color-gray-700));\n outline: none;\n text-align: start;\n user-select: none;\n /* Match v1 Base UI: popup writes --pk-transform-origin from the\n * anchor center on the connecting edge (e.g. top-right for\n * bottom-end). Keyword edge centers made end-aligned menus\n * scale from the middle of the panel. */\n transform-origin: var(--pk-transform-origin, top);\n }\n\n .panel.show {\n animation: pk-dropdown-menu-show 100ms ease;\n }\n\n .panel.hide {\n animation: pk-dropdown-menu-show 100ms ease reverse;\n }\n\n .panel[hidden] {\n display: none !important;\n }\n\n ::slotted(pk-dropdown-item),\n ::slotted(pk-dropdown-separator),\n ::slotted(pk-dropdown-label),\n .panel > pk-dropdown-item,\n .panel > pk-dropdown-separator,\n .panel > pk-dropdown-label {\n display: block;\n }\n\n ::slotted([data-menu-item]) {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n margin: 0;\n padding: 8px 12px;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: var(--pk-font-size-base);\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 ::slotted([data-menu-item]:hover:not([disabled])) {\n background: var(--pk-color-slate-100);\n }\n\n ::slotted([data-menu-item]:focus-visible) {\n background: var(--pk-color-slate-100);\n }\n\n ::slotted([data-menu-item][disabled]) {\n pointer-events: none;\n opacity: 0.5;\n }\n\n ::slotted(pk-dropdown-item[destructive]),\n ::slotted([data-destructive]) {\n color: var(--pk-color-error);\n }\n\n ::slotted([data-menu-separator]) {\n display: block;\n height: 1px;\n margin: 4px 0;\n background: var(--pk-color-slate-200);\n border: 0;\n padding: 0;\n }\n }\n\n /* Outside @layer so constructed stylesheets resolve the name reliably. */\n @keyframes pk-dropdown-menu-show {\n from {\n scale: 0.9;\n opacity: 0;\n }\n\n to {\n scale: 1;\n opacity: 1;\n }\n }\n `,\n];\n","import { html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nimport { activeElements } from '../../a11y/active-elements.js';\nimport { isTopDismissible, registerDismissible, unregisterDismissible } from '../../a11y/dismissible-stack.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport {\n PkAfterHideEvent,\n PkAfterShowEvent,\n PkHideEvent,\n PkShowEvent,\n type PkOverlaySource,\n} from '../../events/overlay-lifecycle.js';\nimport { resolveElementById } from '../../internal/resolve-element-by-id.js';\nimport { animateWithClass } from '../../utils/animate-with-class.js';\nimport { waitForPopupReposition } from '../../utils/popup-placement-animation.js';\nimport { PkPopup, type PkPopupPlacement } from '../popup/pk-popup.js';\nimport { PkDropdownItem } from './pk-dropdown-item.js';\nimport { pkDropdownMenuStyles } from './pk-dropdown-menu.styles.js';\n\nexport type PkDropdownMenuSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl';\n\n/**\n * @deprecated Imperative `items` was removed with the port — slot `pk-dropdown-item`\n * (and separators) instead. Type kept for React re-exports / migration.\n */\nexport type PkMenuItem = {\n id: string;\n label?: string;\n type?: 'item' | 'separator';\n disabled?: boolean;\n destructive?: boolean;\n};\n\n/** Tracks open menus — closing one closes others ( `pk-dropdown`). */\nconst openDropdowns = new Set<PkDropdownMenu>();\n\n/**\n * Dropdown menu — literal `pk-dropdown` overlay lifecycle with Plugin Kit styling.\n * Panel motion: content-sized, scale+fade; origin from popup `--pk-transform-origin`\n * (anchor center on the connecting edge — matches v1 / Base UI).\n * Keyboard navigation matches arrows, Home/End, typeahead, Enter/Space, submenu ←/→.\n *\n * @slot trigger - Menu trigger (when not using `for`)\n * @slot - `pk-dropdown-item` elements\n *\n * @attr for - Id of an external trigger in the same root (TipTap toolbar pattern)\n *\n * @csspart panel - Menu panel\n */\n@customElement('pk-dropdown-menu')\nexport class PkDropdownMenu extends PkElement {\n static override styles = pkDropdownMenuStyles;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ reflect: true })\n size: PkDropdownMenuSize = 'default';\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'bottom-start';\n\n @property({ attribute: 'side-offset', type: Number })\n sideOffset = 4;\n\n @property({ type: Number })\n distance = 4;\n\n @property({ type: Number })\n skidding = 0;\n\n /** External trigger id — preferred over `slot=\"trigger\"` when set (TipTap toolbar). */\n @property({ reflect: true })\n for = '';\n\n @query('slot:not([name])')\n private defaultSlot!: HTMLSlotElement;\n\n @query('#menu')\n private menuElement!: HTMLDivElement;\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n /** Typeahead buffer — cleared ~1s after last printable key */\n private userTypedQuery = '';\n\n private userTypedTimeout = 0;\n\n /** Nested submenu path for ArrowLeft/Right (`openSubmenuStack`). */\n private openSubmenuStack: PkDropdownItem[] = [];\n\n /**\n * Set when the trigger opens the menu via ArrowUp/Down.\n * Pointer opens must not pre-activate item[0] — that made the first ArrowDown\n * advance to item[1] while nothing looked selected (our paint:false divergence).\n * Keyboard opens open with focus on the first item: focus + activate the first item.\n */\n private openedByKeyboard = false;\n\n /**\n * Bound trigger — either `for`-resolved or slotted.\n * Resolve from this host (not the popup) so shadow-root ids like TipTap's work.\n */\n private triggerElement: HTMLElement | null = null;\n\n /** Legacy compat for overlay lab snapshots and dismiss recovery. */\n get panelElement(): HTMLDivElement | null {\n return this.menuElement ?? null;\n }\n\n get popup(): PkPopup | null {\n return this.popupElement ?? null;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Host capture — do not rely on per-trigger listeners. React can replace the\n // slotted trigger (or miss slotchange) after tree remounts; getTrigger() is live.\n this.addEventListener('click', this.handleTriggerClick, true);\n this.addEventListener('keydown', this.handleTriggerKeyDown);\n }\n\n override firstUpdated(): void {\n // Sibling / slotted triggers may not be queryable until the parent finishes rendering.\n const sync = (): void => {\n if (this.for) {\n this.resolveExternalTrigger();\n return;\n }\n\n this.syncSlottedTrigger();\n };\n\n queueMicrotask(sync);\n // React often appends the slotted trigger after Lit's first microtask.\n requestAnimationFrame(sync);\n }\n\n override disconnectedCallback(): void {\n window.clearTimeout(this.userTypedTimeout);\n this.removeEventListener('click', this.handleTriggerClick, true);\n this.removeEventListener('keydown', this.handleTriggerKeyDown);\n this.unbindTrigger(this.triggerElement);\n this.triggerElement = null;\n this.closeAllSubmenus();\n // Demote popup before teardown — otherwise a remounted/reused host can hit\n // showMenu()'s `active` early-return and never paint the panel again.\n if (this.popupElement) {\n this.popupElement.active = false;\n }\n this.menuElement?.classList.remove('show', 'hide');\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n document.removeEventListener('pointerdown', this.handleDocumentPointerDown, true);\n document.removeEventListener('mousemove', this.handleGlobalMouseMove);\n unregisterDismissible(this);\n openDropdowns.delete(this);\n super.disconnectedCallback();\n }\n\n override async updated(changed: Map<string, unknown>): Promise<void> {\n super.updated(changed);\n\n if (changed.has('for')) {\n this.resolveExternalTrigger();\n }\n\n if (changed.has('open')) {\n this.syncTriggerExpanded();\n }\n\n if (!changed.has('open')) {\n return;\n }\n\n const previousOpen = changed.get('open');\n\n if (previousOpen === this.open) {\n return;\n }\n\n if (previousOpen === undefined && this.open === false) {\n return;\n }\n\n if (this.open) {\n await this.showMenu();\n } else {\n this.closeAllSubmenus();\n await this.hideMenu('unknown');\n }\n }\n\n getItems(includeDisabled = false): PkDropdownItem[] {\n const items = (this.defaultSlot?.assignedElements({ flatten: true }) ?? [])\n .filter((el): el is PkDropdownItem => el.localName === 'pk-dropdown-item');\n\n return includeDisabled ? items : items.filter((item) => !item.disabled);\n }\n\n /** Submenu children of a parent item (light-DOM `slot=\"submenu\"`). */\n getSubmenuItems(parentItem: PkDropdownItem, includeDisabled = false): PkDropdownItem[] {\n const submenuSlot = parentItem.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"submenu\"]');\n const assigned = submenuSlot?.assignedElements({ flatten: true })\n ?? [...parentItem.children].filter((el) => el.getAttribute('slot') === 'submenu');\n\n const items = assigned.filter((el): el is PkDropdownItem => el.localName === 'pk-dropdown-item');\n\n return includeDisabled ? items : items.filter((item) => !item.disabled);\n }\n\n getTrigger(): HTMLElement | null {\n if (this.for) {\n // Prefer live resolve so TipTap re-renders of the sibling button still bind.\n return resolveElementById(this, this.for) ?? this.triggerElement;\n }\n\n // Prefer the live slotted node — React may replace it without rebinding.\n return this.querySelector('[slot=\"trigger\"]') ?? this.triggerElement;\n }\n\n /**\n * Floating UI / light-dismiss anchor — Element (not id string) so resolution\n * happens from this host's root, not pk-popup's shadow root.\n */\n private getAnchor(): Element | '' {\n return this.getTrigger() ?? '';\n }\n\n private resolveExternalTrigger(): void {\n this.unbindTrigger(this.triggerElement);\n this.triggerElement = this.for ? resolveElementById(this, this.for) : null;\n this.bindTrigger(this.triggerElement);\n this.requestUpdate();\n }\n\n private onTriggerSlotChange(event: Event): void {\n // `for` owns the trigger when set — ignore slotted nodes.\n if (this.for) {\n return;\n }\n\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 this.requestUpdate();\n }\n\n /** Sync aria + cached trigger from the trigger slot (safe to call repeatedly). */\n private syncSlottedTrigger(): void {\n const slot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]');\n\n if (slot) {\n this.onTriggerSlotChange({ target: slot } as unknown as Event);\n }\n }\n\n /** Aria (+ listeners for external `for` triggers that sit outside this host). */\n private bindTrigger(trigger: HTMLElement | null): void {\n if (!trigger) {\n return;\n }\n\n trigger.setAttribute('aria-haspopup', 'menu');\n\n // Slotted triggers are handled by host capture. External `for` triggers are not\n // descendants, so they need direct listeners.\n if (this.for) {\n trigger.addEventListener('click', this.handleExternalTriggerClick);\n trigger.addEventListener('keydown', this.handleTriggerKeyDown);\n }\n\n this.syncTriggerExpanded();\n }\n\n private unbindTrigger(trigger: HTMLElement | null): void {\n trigger?.removeEventListener('click', this.handleExternalTriggerClick);\n trigger?.removeEventListener('keydown', this.handleTriggerKeyDown);\n }\n\n private syncTriggerExpanded(): void {\n this.getTrigger()?.setAttribute('aria-expanded', this.open ? 'true' : 'false');\n }\n\n /** Called by `pk-dropdown-item` after a selection. */\n closeAfterSelect(_source: PkOverlaySource = 'api'): void {\n this.open = false;\n }\n\n /** `makeSelection()` — single `pk-select` on the menu host. */\n private makeSelection(item: PkDropdownItem): void {\n const trigger = this.getTrigger();\n\n if (item.disabled) {\n return;\n }\n\n if (item.type === 'checkbox') {\n item.checked = !item.checked;\n }\n\n if (item.type === 'radio' && !item.checked) {\n item.checked = true;\n }\n\n const detail = {\n value: item.value,\n type: item.type,\n checked: item.checked,\n radioGroup: item.radioGroup,\n };\n\n // Fire on the item first so React `DropdownItem onPkSelect` works. Non-bubbling so the\n // menu host listener (below) is not double-invoked from the same gesture.\n item.dispatchEvent(new CustomEvent('pk-select', {\n detail,\n bubbles: false,\n composed: false,\n cancelable: true,\n }));\n\n // parity — also expose selection on the menu host.\n const selectEvent = new CustomEvent('pk-select', {\n detail,\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(selectEvent);\n\n if (!selectEvent.defaultPrevented) {\n this.open = false;\n trigger?.focus({ preventScroll: true });\n }\n }\n\n private resolveMenuItem(event: Event): PkDropdownItem | null {\n const target = event.target;\n\n if (target instanceof PkDropdownItem) {\n return target;\n }\n\n if (target instanceof Element) {\n const closest = target.closest('pk-dropdown-item');\n\n if (closest instanceof PkDropdownItem) {\n return closest;\n }\n }\n\n const fromPath = event.composedPath().find(\n (node): node is PkDropdownItem => node instanceof PkDropdownItem,\n );\n\n return fromPath ?? null;\n }\n\n /** Resolves after exit animation and popup demotion — safe point to open a modal. */\n whenClosed(): Promise<void> {\n if (!this.open) {\n return this.popupElement?.active\n ? this.popupElement.stop()\n : Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n this.addEventListener('pk-after-hide', () => {\n void this.popupElement.stop().then(() => resolve());\n }, { once: true });\n });\n }\n\n /** Recovery hook — clears leaked document dismiss listeners after abnormal teardown. */\n forceDismissCleanup(): void {\n this.open = false;\n this.popupElement.active = false;\n this.menuElement?.classList.remove('show', 'hide');\n this.closeAllSubmenus();\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n document.removeEventListener('pointerdown', this.handleDocumentPointerDown, true);\n document.removeEventListener('mousemove', this.handleGlobalMouseMove);\n unregisterDismissible(this);\n openDropdowns.delete(this);\n }\n\n private handleMenuClick = (event: Event): void => {\n const item = this.resolveMenuItem(event);\n\n if (!item || item.disabled) {\n return;\n }\n\n if (item.hasSubmenu()) {\n if (!item.submenuOpen) {\n this.closeSiblingSubmenus(item);\n this.addToSubmenuStack(item);\n item.openSubmenu();\n }\n\n event.stopPropagation();\n return;\n }\n\n this.makeSelection(item);\n };\n\n /** `handleSubmenuOpening` — keep stack in sync when items notify on hover. */\n private handleSubmenuOpening = (event: Event): void => {\n const openingItem = (event as CustomEvent<{ item: PkDropdownItem }>).detail?.item;\n\n if (!(openingItem instanceof PkDropdownItem)) {\n return;\n }\n\n this.closeSiblingSubmenus(openingItem);\n this.addToSubmenuStack(openingItem);\n };\n\n /**\n * `handleGlobalMouseMove` — close the current submenu when the pointer\n * leaves both the parent item and its submenu panel (with a short grace period).\n */\n private handleGlobalMouseMove = (event: MouseEvent): void => {\n const currentSubmenuItem = this.getCurrentSubmenuItem();\n\n if (!currentSubmenuItem?.submenuOpen || !currentSubmenuItem.submenuElement) {\n return;\n }\n\n const submenuElement = currentSubmenuItem.submenuElement;\n const composedPath = event.composedPath();\n const submenuItemHovered = currentSubmenuItem.matches(':hover');\n const submenuElementHovered = Boolean(submenuElement.matches(':hover'));\n const isOverItem = submenuItemHovered\n || composedPath.some((el) => el === currentSubmenuItem);\n const isOverSubmenu = submenuElementHovered\n || composedPath.some(\n (el) => el instanceof HTMLElement && el.closest('[part=\"submenu\"]') === submenuElement,\n );\n\n if (!isOverItem && !isOverSubmenu) {\n // delayed close — same captured hover flags (grace for gap transit).\n window.setTimeout(() => {\n if (!submenuItemHovered && !submenuElementHovered) {\n currentSubmenuItem.submenuOpen = false;\n }\n }, 100);\n }\n };\n\n private handleTriggerClick = (event: Event): void => {\n const trigger = this.getTrigger();\n\n // Host capture: only toggle when the composed path hits the live trigger.\n if (!trigger || !event.composedPath().includes(trigger)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.openedByKeyboard = false;\n this.open = !this.open;\n };\n\n /** Direct listener for `for` triggers (outside this host's composed tree). */\n private handleExternalTriggerClick = (event: Event): void => {\n event.preventDefault();\n event.stopPropagation();\n this.openedByKeyboard = false;\n this.open = !this.open;\n };\n\n /** ArrowDown/Up on a closed trigger opens and focuses the first item ( APG). */\n private handleTriggerKeyDown = (event: KeyboardEvent): void => {\n // Host keydown: require the live trigger in the path. External `for` binds this\n // directly on the trigger, so the path check still passes.\n const trigger = this.getTrigger();\n\n if (!trigger || !event.composedPath().includes(trigger)) {\n return;\n }\n\n if (this.open) {\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n this.openedByKeyboard = true;\n this.open = true;\n }\n };\n\n private isRtl(): boolean {\n return getComputedStyle(this).direction === 'rtl';\n }\n\n private addToSubmenuStack(item: PkDropdownItem): void {\n const index = this.openSubmenuStack.indexOf(item);\n\n if (index !== -1) {\n this.openSubmenuStack = this.openSubmenuStack.slice(0, index + 1);\n } else {\n this.openSubmenuStack.push(item);\n }\n }\n\n private removeFromSubmenuStack(): PkDropdownItem | undefined {\n return this.openSubmenuStack.pop();\n }\n\n private getCurrentSubmenuItem(): PkDropdownItem | undefined {\n return this.openSubmenuStack.length > 0\n ? this.openSubmenuStack[this.openSubmenuStack.length - 1]\n : undefined;\n }\n\n private closeAllSubmenus(): void {\n this.getItems(true).forEach((item) => {\n item.submenuOpen = false;\n item.active = false;\n });\n this.openSubmenuStack = [];\n }\n\n private closeSiblingSubmenus(item: PkDropdownItem): void {\n const parentItem = item.closest('pk-dropdown-item:not([slot=\"submenu\"])');\n const siblings = parentItem instanceof PkDropdownItem\n ? this.getSubmenuItems(parentItem, true)\n : this.getItems(true);\n\n siblings.forEach((sibling) => {\n if (sibling !== item && sibling.submenuOpen) {\n sibling.submenuOpen = false;\n }\n });\n\n if (!this.openSubmenuStack.includes(item)) {\n this.openSubmenuStack.push(item);\n }\n }\n\n private setActiveItem(items: PkDropdownItem[], itemToSelect: PkDropdownItem): void {\n items.forEach((item) => {\n item.active = item === itemToSelect;\n\n // Keyboard-driven selection — paint explicitly:focus-visible uses :focus-visible on the\n // host; our control is a shadow button, so :focus-visible alone is unreliable from\n // the document keydown listener.\n if (item === itemToSelect) {\n item.setAttribute('data-highlighted', '');\n } else {\n item.removeAttribute('data-highlighted');\n }\n });\n itemToSelect.focus({ preventScroll: true });\n itemToSelect.scrollIntoView({ block: 'nearest' });\n }\n\n /** `handleDocumentKeyDown` — arrows, Home/End, typeahead, Enter/Space, submenu. */\n private handleDocumentKeyDown = (event: KeyboardEvent): void => {\n const isRtl = this.isRtl();\n\n if (event.key === 'Escape' && this.open && isTopDismissible(this)) {\n event.preventDefault();\n event.stopPropagation();\n this.open = false;\n this.getTrigger()?.focus({ preventScroll: true });\n return;\n }\n\n if (!this.open) {\n return;\n }\n\n const activeElement = [...activeElements()].find((el) => el.localName === 'pk-dropdown-item');\n const isFocusedOnItem = activeElement?.localName === 'pk-dropdown-item';\n const currentSubmenuItem = this.getCurrentSubmenuItem();\n const isInSubmenu = Boolean(currentSubmenuItem);\n\n let items: PkDropdownItem[];\n let activeItem: PkDropdownItem | undefined;\n let activeItemIndex: number;\n\n if (isInSubmenu && currentSubmenuItem) {\n items = this.getSubmenuItems(currentSubmenuItem);\n activeItem = items.find((item) => item.active || item === activeElement);\n activeItemIndex = activeItem ? items.indexOf(activeItem) : -1;\n } else {\n items = this.getItems();\n activeItem = items.find((item) => item.active || item === activeElement);\n activeItemIndex = activeItem ? items.indexOf(activeItem) : -1;\n }\n\n let itemToSelect: PkDropdownItem | undefined;\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n itemToSelect = activeItemIndex > 0\n ? items[activeItemIndex - 1]\n : items[items.length - 1];\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n event.stopPropagation();\n itemToSelect = activeItemIndex !== -1 && activeItemIndex < items.length - 1\n ? items[activeItemIndex + 1]\n : items[0];\n }\n\n if (event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight') && isFocusedOnItem && activeItem) {\n if (activeItem.hasSubmenu()) {\n event.preventDefault();\n event.stopPropagation();\n this.closeSiblingSubmenus(activeItem);\n activeItem.openSubmenu();\n this.addToSubmenuStack(activeItem);\n window.setTimeout(() => {\n const submenuItems = this.getSubmenuItems(activeItem);\n\n if (submenuItems.length > 0) {\n this.setActiveItem(submenuItems, submenuItems[0]);\n }\n }, 0);\n return;\n }\n }\n\n if (event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft') && isInSubmenu) {\n event.preventDefault();\n event.stopPropagation();\n const removedItem = this.removeFromSubmenuStack();\n\n if (removedItem) {\n removedItem.submenuOpen = false;\n window.setTimeout(() => {\n removedItem.focus({ preventScroll: true });\n removedItem.active = true;\n const parentItems = removedItem.slot === 'submenu'\n && removedItem.parentElement instanceof PkDropdownItem\n ? this.getSubmenuItems(removedItem.parentElement)\n : this.getItems();\n parentItems.forEach((item) => {\n if (item !== removedItem) {\n item.active = false;\n }\n });\n }, 0);\n }\n\n return;\n }\n\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n itemToSelect = event.key === 'Home' ? items[0] : items[items.length - 1];\n }\n\n if (event.key === 'Tab') {\n this.open = false;\n return;\n }\n\n // Typeahead — printable keys ; Space alone activates when the buffer is empty.\n if (\n event.key.length === 1\n && !(event.metaKey || event.ctrlKey || event.altKey)\n && !(event.key === ' ' && this.userTypedQuery === '')\n ) {\n window.clearTimeout(this.userTypedTimeout);\n this.userTypedTimeout = window.setTimeout(() => {\n this.userTypedQuery = '';\n }, 1000);\n this.userTypedQuery += event.key;\n\n const selectionQuery = this.userTypedQuery.trim().toLowerCase();\n itemToSelect = items.find((item) => {\n const label = (item.textContent || '').trim().toLowerCase();\n return label.startsWith(selectionQuery);\n });\n }\n\n if (itemToSelect) {\n event.preventDefault();\n event.stopPropagation();\n this.setActiveItem(items, itemToSelect);\n return;\n }\n\n if (\n (event.key === 'Enter' || (event.key === ' ' && this.userTypedQuery === ''))\n && isFocusedOnItem\n && activeItem\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n if (activeItem.hasSubmenu()) {\n this.closeSiblingSubmenus(activeItem);\n activeItem.openSubmenu();\n this.addToSubmenuStack(activeItem);\n window.setTimeout(() => {\n const submenuItems = this.getSubmenuItems(activeItem);\n\n if (submenuItems.length > 0) {\n this.setActiveItem(submenuItems, submenuItems[0]);\n }\n }, 0);\n } else {\n this.makeSelection(activeItem);\n }\n }\n };\n\n private handleDocumentPointerDown = (event: Event): void => {\n const path = event.composedPath();\n const trigger = this.getTrigger();\n\n // Treat the trigger as inside — otherwise pointerdown closes and the following\n // click re-opens (external `for` triggers sit outside this host).\n if (path.some((el) => el === this || el === trigger)) {\n return;\n }\n\n this.open = false;\n };\n\n /** `showMenu()` — only called from `updated()` when `open` becomes true. */\n private async showMenu(): Promise<void> {\n if (!this.popupElement || !this.menuElement) {\n return;\n }\n\n // TipTap / late-mounted `for` siblings — refresh before positioning.\n if (this.for && !this.triggerElement?.isConnected) {\n this.resolveExternalTrigger();\n }\n\n const showEvent = new PkShowEvent();\n\n if (!this.dispatchEvent(showEvent)) {\n this.open = false;\n return;\n }\n\n if (this.popupElement.active) {\n // Interrupted hide can leave `active` true while the panel is gone —\n // recover instead of no-op return (next open would silently fail).\n this.popupElement.active = false;\n this.menuElement.classList.remove('show', 'hide');\n await this.updateComplete;\n }\n\n openDropdowns.forEach((dropdown) => {\n if (dropdown !== this) {\n dropdown.open = false;\n }\n });\n\n this.popupElement.active = true;\n this.open = true;\n openDropdowns.add(this);\n registerDismissible(this);\n document.addEventListener('keydown', this.handleDocumentKeyDown);\n document.addEventListener('pointerdown', this.handleDocumentPointerDown, true);\n document.addEventListener('mousemove', this.handleGlobalMouseMove);\n\n // Let Floating UI write data-current-placement before the show animation\n // (origin CSS keys off that attribute).\n await this.updateComplete;\n await waitForPopupReposition(this.popupElement, this.placement, 100, { requireEvent: true });\n\n if (!this.open) {\n // Show aborted mid-flight — demote so the next open is not stuck.\n this.popupElement.active = false;\n openDropdowns.delete(this);\n unregisterDismissible(this);\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n document.removeEventListener('pointerdown', this.handleDocumentPointerDown, true);\n document.removeEventListener('mousemove', this.handleGlobalMouseMove);\n return;\n }\n\n this.menuElement.classList.remove('hide');\n await animateWithClass(this.menuElement, 'show');\n\n const items = this.getItems();\n\n if (items.length > 0) {\n if (this.openedByKeyboard) {\n // Show path — first item is the current option (and :focus-visible).\n this.setActiveItem(items, items[0]);\n } else {\n // Pointer open: do not pre-set item.active / item focus.\n // Still focuses item[0] here; with our prior paint:false that left an\n // invisible active index so the first ArrowDown skipped to item[1].\n // Leaving index at -1 makes the first ArrowDown select items[0] (index formula\n // when activeItemIndex === -1). Focus the menu panel for screen readers.\n items.forEach((item) => {\n item.active = false;\n item.removeAttribute('data-highlighted');\n });\n this.menuElement.focus({ preventScroll: true });\n }\n }\n\n this.openedByKeyboard = false;\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 * `hideMenu()` — only called from `updated()` when `open` becomes false.\n * Demote popup via `active = false` after the hide animation (hide order).\n */\n private async hideMenu(source: PkOverlaySource): Promise<void> {\n if (!this.popupElement || !this.menuElement) {\n return;\n }\n\n const hideEvent = new PkHideEvent(source);\n\n if (!this.dispatchEvent(hideEvent)) {\n this.open = true;\n return;\n }\n\n this.open = false;\n openDropdowns.delete(this);\n unregisterDismissible(this);\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n document.removeEventListener('pointerdown', this.handleDocumentPointerDown, true);\n document.removeEventListener('mousemove', this.handleGlobalMouseMove);\n this.userTypedQuery = '';\n window.clearTimeout(this.userTypedTimeout);\n\n this.getItems(true).forEach((item) => {\n item.active = false;\n item.removeAttribute('data-highlighted');\n });\n\n this.menuElement.classList.remove('show');\n await animateWithClass(this.menuElement, 'hide');\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\n override render() {\n const popupActive = this.hasUpdated ? this.popupElement?.active : this.open;\n // Pass Element when using `for` — string ids resolve from pk-popup's shadow and miss TipTap siblings.\n const externalAnchor = this.for ? this.getAnchor() : '';\n\n return html`\n <pk-popup\n .anchor=${externalAnchor}\n placement=${this.placement}\n .distance=${this.distance || this.sideOffset}\n .skidding=${this.skidding}\n ?active=${popupActive}\n flip\n shift\n .shiftPadding=${10}\n auto-size=\"vertical\"\n .autoSizePadding=${10}\n >\n <slot\n name=\"trigger\"\n slot=\"anchor\"\n @slotchange=${this.onTriggerSlotChange}\n ></slot>\n\n <div\n id=\"menu\"\n part=\"panel\"\n class=\"panel\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-orientation=\"vertical\"\n data-size=${this.size}\n @click=${this.handleMenuClick}\n @pk-submenu-open=${this.handleSubmenuOpening}\n >\n <slot></slot>\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-dropdown-menu': PkDropdownMenu;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AASA,IAAa,uBAAuB;CAChC,6BAA6B;CAC7B;CACA;CACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoKN;;;;AC9ID,IAAM,gCAAgB,IAAI,KAAqB;AAgBxC,IAAA,iBAAA,MAAM,uBAAuB,UAAU;;;cAInC;cAGoB;mBAGG;oBAGjB;kBAGF;kBAGA;aAIL;wBAYmB;0BAEE;0BAGkB,EAAE;0BAQpB;wBAMkB;0BA8RlB,UAAuB;GAC9C,MAAM,OAAO,KAAK,gBAAgB,MAAM;AAExC,OAAI,CAAC,QAAQ,KAAK,SACd;AAGJ,OAAI,KAAK,YAAY,EAAE;AACnB,QAAI,CAAC,KAAK,aAAa;AACnB,UAAK,qBAAqB,KAAK;AAC/B,UAAK,kBAAkB,KAAK;AAC5B,UAAK,aAAa;;AAGtB,UAAM,iBAAiB;AACvB;;AAGJ,QAAK,cAAc,KAAK;;+BAII,UAAuB;GACnD,MAAM,cAAe,MAAgD,QAAQ;AAE7E,OAAI,EAAE,uBAAuB,gBACzB;AAGJ,QAAK,qBAAqB,YAAY;AACtC,QAAK,kBAAkB,YAAY;;gCAON,UAA4B;GACzD,MAAM,qBAAqB,KAAK,uBAAuB;AAEvD,OAAI,CAAC,oBAAoB,eAAe,CAAC,mBAAmB,eACxD;GAGJ,MAAM,iBAAiB,mBAAmB;GAC1C,MAAM,eAAe,MAAM,cAAc;GACzC,MAAM,qBAAqB,mBAAmB,QAAQ,SAAS;GAC/D,MAAM,wBAAwB,QAAQ,eAAe,QAAQ,SAAS,CAAC;GACvE,MAAM,aAAa,sBACZ,aAAa,MAAM,OAAO,OAAO,mBAAmB;GAC3D,MAAM,gBAAgB,yBACf,aAAa,MACX,OAAO,cAAc,eAAe,GAAG,QAAQ,qBAAmB,KAAK,eAC3E;AAEL,OAAI,CAAC,cAAc,CAAC,cAEhB,QAAO,iBAAiB;AACpB,QAAI,CAAC,sBAAsB,CAAC,sBACxB,oBAAmB,cAAc;MAEtC,IAAI;;6BAIe,UAAuB;GACjD,MAAM,UAAU,KAAK,YAAY;AAGjC,OAAI,CAAC,WAAW,CAAC,MAAM,cAAc,CAAC,SAAS,QAAQ,CACnD;AAGJ,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,QAAK,mBAAmB;AACxB,QAAK,OAAO,CAAC,KAAK;;qCAIgB,UAAuB;AACzD,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,QAAK,mBAAmB;AACxB,QAAK,OAAO,CAAC,KAAK;;+BAIU,UAA+B;GAG3D,MAAM,UAAU,KAAK,YAAY;AAEjC,OAAI,CAAC,WAAW,CAAC,MAAM,cAAc,CAAC,SAAS,QAAQ,CACnD;AAGJ,OAAI,KAAK,KACL;AAGJ,OAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACtD,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,SAAK,mBAAmB;AACxB,SAAK,OAAO;;;gCAuEa,UAA+B;GAC5D,MAAM,QAAQ,KAAK,OAAO;AAE1B,OAAI,MAAM,QAAQ,YAAY,KAAK,QAAQ,iBAAiB,KAAK,EAAE;AAC/D,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,SAAK,OAAO;AACZ,SAAK,YAAY,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC;AACjD;;AAGJ,OAAI,CAAC,KAAK,KACN;GAGJ,MAAM,gBAAgB,CAAC,GAAG,gBAAgB,CAAC,CAAC,MAAM,OAAO,GAAG,cAAc,mBAAmB;GAC7F,MAAM,kBAAkB,eAAe,cAAc;GACrD,MAAM,qBAAqB,KAAK,uBAAuB;GACvD,MAAM,cAAc,QAAQ,mBAAmB;GAE/C,IAAI;GACJ,IAAI;GACJ,IAAI;AAEJ,OAAI,eAAe,oBAAoB;AACnC,YAAQ,KAAK,gBAAgB,mBAAmB;AAChD,iBAAa,MAAM,MAAM,SAAS,KAAK,UAAU,SAAS,cAAc;AACxE,sBAAkB,aAAa,MAAM,QAAQ,WAAW,GAAG;UACxD;AACH,YAAQ,KAAK,UAAU;AACvB,iBAAa,MAAM,MAAM,SAAS,KAAK,UAAU,SAAS,cAAc;AACxE,sBAAkB,aAAa,MAAM,QAAQ,WAAW,GAAG;;GAG/D,IAAI;AAEJ,OAAI,MAAM,QAAQ,WAAW;AACzB,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,mBAAe,kBAAkB,IAC3B,MAAM,kBAAkB,KACxB,MAAM,MAAM,SAAS;;AAG/B,OAAI,MAAM,QAAQ,aAAa;AAC3B,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,mBAAe,oBAAoB,MAAM,kBAAkB,MAAM,SAAS,IACpE,MAAM,kBAAkB,KACxB,MAAM;;AAGhB,OAAI,MAAM,SAAS,QAAQ,cAAc,iBAAiB,mBAAmB;QACrE,WAAW,YAAY,EAAE;AACzB,WAAM,gBAAgB;AACtB,WAAM,iBAAiB;AACvB,UAAK,qBAAqB,WAAW;AACrC,gBAAW,aAAa;AACxB,UAAK,kBAAkB,WAAW;AAClC,YAAO,iBAAiB;MACpB,MAAM,eAAe,KAAK,gBAAgB,WAAW;AAErD,UAAI,aAAa,SAAS,EACtB,MAAK,cAAc,cAAc,aAAa,GAAG;QAEtD,EAAE;AACL;;;AAIR,OAAI,MAAM,SAAS,QAAQ,eAAe,gBAAgB,aAAa;AACnE,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;IACvB,MAAM,cAAc,KAAK,wBAAwB;AAEjD,QAAI,aAAa;AACb,iBAAY,cAAc;AAC1B,YAAO,iBAAiB;AACpB,kBAAY,MAAM,EAAE,eAAe,MAAM,CAAC;AAC1C,kBAAY,SAAS;AAKrB,OAJoB,YAAY,SAAS,aAClC,YAAY,yBAAyB,iBACtC,KAAK,gBAAgB,YAAY,cAAc,GAC/C,KAAK,UAAU,EACT,SAAS,SAAS;AAC1B,WAAI,SAAS,YACT,MAAK,SAAS;QAEpB;QACH,EAAE;;AAGT;;AAGJ,OAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,OAAO;AAC7C,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,mBAAe,MAAM,QAAQ,SAAS,MAAM,KAAK,MAAM,MAAM,SAAS;;AAG1E,OAAI,MAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ;;AAIJ,OACI,MAAM,IAAI,WAAW,KAClB,EAAE,MAAM,WAAW,MAAM,WAAW,MAAM,WAC1C,EAAE,MAAM,QAAQ,OAAO,KAAK,mBAAmB,KACpD;AACE,WAAO,aAAa,KAAK,iBAAiB;AAC1C,SAAK,mBAAmB,OAAO,iBAAiB;AAC5C,UAAK,iBAAiB;OACvB,IAAK;AACR,SAAK,kBAAkB,MAAM;IAE7B,MAAM,iBAAiB,KAAK,eAAe,MAAM,CAAC,aAAa;AAC/D,mBAAe,MAAM,MAAM,SAAS;AAEhC,aADe,KAAK,eAAe,IAAI,MAAM,CAAC,aACvC,CAAM,WAAW,eAAe;MACzC;;AAGN,OAAI,cAAc;AACd,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AACvB,SAAK,cAAc,OAAO,aAAa;AACvC;;AAGJ,QACK,MAAM,QAAQ,WAAY,MAAM,QAAQ,OAAO,KAAK,mBAAmB,OACrE,mBACA,YACL;AACE,UAAM,gBAAgB;AACtB,UAAM,iBAAiB;AAEvB,QAAI,WAAW,YAAY,EAAE;AACzB,UAAK,qBAAqB,WAAW;AACrC,gBAAW,aAAa;AACxB,UAAK,kBAAkB,WAAW;AAClC,YAAO,iBAAiB;MACpB,MAAM,eAAe,KAAK,gBAAgB,WAAW;AAErD,UAAI,aAAa,SAAS,EACtB,MAAK,cAAc,cAAc,aAAa,GAAG;QAEtD,EAAE;UAEL,MAAK,cAAc,WAAW;;;oCAKL,UAAuB;GACxD,MAAM,OAAO,MAAM,cAAc;GACjC,MAAM,UAAU,KAAK,YAAY;AAIjC,OAAI,KAAK,MAAM,OAAO,OAAO,QAAQ,OAAO,QAAQ,CAChD;AAGJ,QAAK,OAAO;;;;gBA1qBS;;;CAwDzB,IAAI,eAAsC;AACtC,SAAO,KAAK,eAAe;;CAG/B,IAAI,QAAwB;AACxB,SAAO,KAAK,gBAAgB;;CAGhC,oBAAmC;AAC/B,QAAM,mBAAmB;AAGzB,OAAK,iBAAiB,SAAS,KAAK,oBAAoB,KAAK;AAC7D,OAAK,iBAAiB,WAAW,KAAK,qBAAqB;;CAG/D,eAA8B;EAE1B,MAAM,aAAmB;AACrB,OAAI,KAAK,KAAK;AACV,SAAK,wBAAwB;AAC7B;;AAGJ,QAAK,oBAAoB;;AAG7B,iBAAe,KAAK;AAEpB,wBAAsB,KAAK;;CAG/B,uBAAsC;AAClC,SAAO,aAAa,KAAK,iBAAiB;AAC1C,OAAK,oBAAoB,SAAS,KAAK,oBAAoB,KAAK;AAChE,OAAK,oBAAoB,WAAW,KAAK,qBAAqB;AAC9D,OAAK,cAAc,KAAK,eAAe;AACvC,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;AAGvB,MAAI,KAAK,aACL,MAAK,aAAa,SAAS;AAE/B,OAAK,aAAa,UAAU,OAAO,QAAQ,OAAO;AAClD,WAAS,oBAAoB,WAAW,KAAK,sBAAsB;AACnE,WAAS,oBAAoB,eAAe,KAAK,2BAA2B,KAAK;AACjF,WAAS,oBAAoB,aAAa,KAAK,sBAAsB;AACrE,wBAAsB,KAAK;AAC3B,gBAAc,OAAO,KAAK;AAC1B,QAAM,sBAAsB;;CAGhC,MAAe,QAAQ,SAA8C;AACjE,QAAM,QAAQ,QAAQ;AAEtB,MAAI,QAAQ,IAAI,MAAM,CAClB,MAAK,wBAAwB;AAGjC,MAAI,QAAQ,IAAI,OAAO,CACnB,MAAK,qBAAqB;AAG9B,MAAI,CAAC,QAAQ,IAAI,OAAO,CACpB;EAGJ,MAAM,eAAe,QAAQ,IAAI,OAAO;AAExC,MAAI,iBAAiB,KAAK,KACtB;AAGJ,MAAI,iBAAiB,KAAA,KAAa,KAAK,SAAS,MAC5C;AAGJ,MAAI,KAAK,KACL,OAAM,KAAK,UAAU;OAClB;AACH,QAAK,kBAAkB;AACvB,SAAM,KAAK,SAAS,UAAU;;;CAItC,SAAS,kBAAkB,OAAyB;EAChD,MAAM,SAAS,KAAK,aAAa,iBAAiB,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE,EACrE,QAAQ,OAA6B,GAAG,cAAc,mBAAmB;AAE9E,SAAO,kBAAkB,QAAQ,MAAM,QAAQ,SAAS,CAAC,KAAK,SAAS;;;CAI3E,gBAAgB,YAA4B,kBAAkB,OAAyB;EAKnF,MAAM,UAJc,WAAW,YAAY,cAA+B,yBAAuB,GACnE,iBAAiB,EAAE,SAAS,MAAM,CAAC,IAC1D,CAAC,GAAG,WAAW,SAAS,CAAC,QAAQ,OAAO,GAAG,aAAa,OAAO,KAAK,UAAU,EAE9D,QAAQ,OAA6B,GAAG,cAAc,mBAAmB;AAEhG,SAAO,kBAAkB,QAAQ,MAAM,QAAQ,SAAS,CAAC,KAAK,SAAS;;CAG3E,aAAiC;AAC7B,MAAI,KAAK,IAEL,QAAO,mBAAmB,MAAM,KAAK,IAAI,IAAI,KAAK;AAItD,SAAO,KAAK,cAAc,qBAAmB,IAAI,KAAK;;;;;;CAO1D,YAAkC;AAC9B,SAAO,KAAK,YAAY,IAAI;;CAGhC,yBAAuC;AACnC,OAAK,cAAc,KAAK,eAAe;AACvC,OAAK,iBAAiB,KAAK,MAAM,mBAAmB,MAAM,KAAK,IAAI,GAAG;AACtE,OAAK,YAAY,KAAK,eAAe;AACrC,OAAK,eAAe;;CAGxB,oBAA4B,OAAoB;AAE5C,MAAI,KAAK,IACL;EAIJ,MAAM,CAAC,WADM,MAAM,OACI,iBAAiB,EAAE,SAAS,MAAM,CAAC;AAE1D,OAAK,cAAc,KAAK,eAAe;AACvC,OAAK,iBAAiB,WAAW;AACjC,OAAK,YAAY,KAAK,eAAe;AACrC,OAAK,eAAe;;;CAIxB,qBAAmC;EAC/B,MAAM,OAAO,KAAK,WAAW,cAA+B,yBAAuB;AAEnF,MAAI,KACA,MAAK,oBAAoB,EAAE,QAAQ,MAAM,CAAqB;;;CAKtE,YAAoB,SAAmC;AACnD,MAAI,CAAC,QACD;AAGJ,UAAQ,aAAa,iBAAiB,OAAO;AAI7C,MAAI,KAAK,KAAK;AACV,WAAQ,iBAAiB,SAAS,KAAK,2BAA2B;AAClE,WAAQ,iBAAiB,WAAW,KAAK,qBAAqB;;AAGlE,OAAK,qBAAqB;;CAG9B,cAAsB,SAAmC;AACrD,WAAS,oBAAoB,SAAS,KAAK,2BAA2B;AACtE,WAAS,oBAAoB,WAAW,KAAK,qBAAqB;;CAGtE,sBAAoC;AAChC,OAAK,YAAY,EAAE,aAAa,iBAAiB,KAAK,OAAO,SAAS,QAAQ;;;CAIlF,iBAAiB,UAA2B,OAAa;AACrD,OAAK,OAAO;;;CAIhB,cAAsB,MAA4B;EAC9C,MAAM,UAAU,KAAK,YAAY;AAEjC,MAAI,KAAK,SACL;AAGJ,MAAI,KAAK,SAAS,WACd,MAAK,UAAU,CAAC,KAAK;AAGzB,MAAI,KAAK,SAAS,WAAW,CAAC,KAAK,QAC/B,MAAK,UAAU;EAGnB,MAAM,SAAS;GACX,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,SAAS,KAAK;GACd,YAAY,KAAK;GACpB;AAID,OAAK,cAAc,IAAI,YAAY,aAAa;GAC5C;GACA,SAAS;GACT,UAAU;GACV,YAAY;GACf,CAAC,CAAC;EAGH,MAAM,cAAc,IAAI,YAAY,aAAa;GAC7C;GACA,SAAS;GACT,UAAU;GACV,YAAY;GACf,CAAC;AAEF,OAAK,cAAc,YAAY;AAE/B,MAAI,CAAC,YAAY,kBAAkB;AAC/B,QAAK,OAAO;AACZ,YAAS,MAAM,EAAE,eAAe,MAAM,CAAC;;;CAI/C,gBAAwB,OAAqC;EACzD,MAAM,SAAS,MAAM;AAErB,MAAI,kBAAkB,eAClB,QAAO;AAGX,MAAI,kBAAkB,SAAS;GAC3B,MAAM,UAAU,OAAO,QAAQ,mBAAmB;AAElD,OAAI,mBAAmB,eACnB,QAAO;;AAQf,SAJiB,MAAM,cAAc,CAAC,MACjC,SAAiC,gBAAgB,eAG/C,IAAY;;;CAIvB,aAA4B;AACxB,MAAI,CAAC,KAAK,KACN,QAAO,KAAK,cAAc,SACpB,KAAK,aAAa,MAAM,GACxB,QAAQ,SAAS;AAG3B,SAAO,IAAI,SAAe,YAAY;AAClC,QAAK,iBAAiB,uBAAuB;AACpC,SAAK,aAAa,MAAM,CAAC,WAAW,SAAS,CAAC;MACpD,EAAE,MAAM,MAAM,CAAC;IACpB;;;CAIN,sBAA4B;AACxB,OAAK,OAAO;AACZ,OAAK,aAAa,SAAS;AAC3B,OAAK,aAAa,UAAU,OAAO,QAAQ,OAAO;AAClD,OAAK,kBAAkB;AACvB,WAAS,oBAAoB,WAAW,KAAK,sBAAsB;AACnE,WAAS,oBAAoB,eAAe,KAAK,2BAA2B,KAAK;AACjF,WAAS,oBAAoB,aAAa,KAAK,sBAAsB;AACrE,wBAAsB,KAAK;AAC3B,gBAAc,OAAO,KAAK;;CAgH9B,QAAyB;AACrB,SAAO,iBAAiB,KAAK,CAAC,cAAc;;CAGhD,kBAA0B,MAA4B;EAClD,MAAM,QAAQ,KAAK,iBAAiB,QAAQ,KAAK;AAEjD,MAAI,UAAU,GACV,MAAK,mBAAmB,KAAK,iBAAiB,MAAM,GAAG,QAAQ,EAAE;MAEjE,MAAK,iBAAiB,KAAK,KAAK;;CAIxC,yBAA6D;AACzD,SAAO,KAAK,iBAAiB,KAAK;;CAGtC,wBAA4D;AACxD,SAAO,KAAK,iBAAiB,SAAS,IAChC,KAAK,iBAAiB,KAAK,iBAAiB,SAAS,KACrD,KAAA;;CAGV,mBAAiC;AAC7B,OAAK,SAAS,KAAK,CAAC,SAAS,SAAS;AAClC,QAAK,cAAc;AACnB,QAAK,SAAS;IAChB;AACF,OAAK,mBAAmB,EAAE;;CAG9B,qBAA6B,MAA4B;EACrD,MAAM,aAAa,KAAK,QAAQ,2CAAyC;AAKzE,GAJiB,sBAAsB,iBACjC,KAAK,gBAAgB,YAAY,KAAK,GACtC,KAAK,SAAS,KAAK,EAEhB,SAAS,YAAY;AAC1B,OAAI,YAAY,QAAQ,QAAQ,YAC5B,SAAQ,cAAc;IAE5B;AAEF,MAAI,CAAC,KAAK,iBAAiB,SAAS,KAAK,CACrC,MAAK,iBAAiB,KAAK,KAAK;;CAIxC,cAAsB,OAAyB,cAAoC;AAC/E,QAAM,SAAS,SAAS;AACpB,QAAK,SAAS,SAAS;AAKvB,OAAI,SAAS,aACT,MAAK,aAAa,oBAAoB,GAAG;OAEzC,MAAK,gBAAgB,mBAAmB;IAE9C;AACF,eAAa,MAAM,EAAE,eAAe,MAAM,CAAC;AAC3C,eAAa,eAAe,EAAE,OAAO,WAAW,CAAC;;;CA+KrD,MAAc,WAA0B;AACpC,MAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,YAC5B;AAIJ,MAAI,KAAK,OAAO,CAAC,KAAK,gBAAgB,YAClC,MAAK,wBAAwB;EAGjC,MAAM,YAAY,IAAI,aAAa;AAEnC,MAAI,CAAC,KAAK,cAAc,UAAU,EAAE;AAChC,QAAK,OAAO;AACZ;;AAGJ,MAAI,KAAK,aAAa,QAAQ;AAG1B,QAAK,aAAa,SAAS;AAC3B,QAAK,YAAY,UAAU,OAAO,QAAQ,OAAO;AACjD,SAAM,KAAK;;AAGf,gBAAc,SAAS,aAAa;AAChC,OAAI,aAAa,KACb,UAAS,OAAO;IAEtB;AAEF,OAAK,aAAa,SAAS;AAC3B,OAAK,OAAO;AACZ,gBAAc,IAAI,KAAK;AACvB,sBAAoB,KAAK;AACzB,WAAS,iBAAiB,WAAW,KAAK,sBAAsB;AAChE,WAAS,iBAAiB,eAAe,KAAK,2BAA2B,KAAK;AAC9E,WAAS,iBAAiB,aAAa,KAAK,sBAAsB;AAIlE,QAAM,KAAK;AACX,QAAM,uBAAuB,KAAK,cAAc,KAAK,WAAW,KAAK,EAAE,cAAc,MAAM,CAAC;AAE5F,MAAI,CAAC,KAAK,MAAM;AAEZ,QAAK,aAAa,SAAS;AAC3B,iBAAc,OAAO,KAAK;AAC1B,yBAAsB,KAAK;AAC3B,YAAS,oBAAoB,WAAW,KAAK,sBAAsB;AACnE,YAAS,oBAAoB,eAAe,KAAK,2BAA2B,KAAK;AACjF,YAAS,oBAAoB,aAAa,KAAK,sBAAsB;AACrE;;AAGJ,OAAK,YAAY,UAAU,OAAO,OAAO;AACzC,QAAM,iBAAiB,KAAK,aAAa,OAAO;EAEhD,MAAM,QAAQ,KAAK,UAAU;AAE7B,MAAI,MAAM,SAAS,EACf,KAAI,KAAK,iBAEL,MAAK,cAAc,OAAO,MAAM,GAAG;OAChC;AAMH,SAAM,SAAS,SAAS;AACpB,SAAK,SAAS;AACd,SAAK,gBAAgB,mBAAmB;KAC1C;AACF,QAAK,YAAY,MAAM,EAAE,eAAe,MAAM,CAAC;;AAIvD,OAAK,mBAAmB;AAExB,OAAK,cAAc,IAAI,kBAAkB,CAAC;AAC1C,OAAK,cAAc,IAAI,YAAY,kBAAkB;GACjD,QAAQ,EAAE,MAAM,MAAM;GACtB,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;;;;;CAOP,MAAc,SAAS,QAAwC;AAC3D,MAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,YAC5B;EAGJ,MAAM,YAAY,IAAI,YAAY,OAAO;AAEzC,MAAI,CAAC,KAAK,cAAc,UAAU,EAAE;AAChC,QAAK,OAAO;AACZ;;AAGJ,OAAK,OAAO;AACZ,gBAAc,OAAO,KAAK;AAC1B,wBAAsB,KAAK;AAC3B,WAAS,oBAAoB,WAAW,KAAK,sBAAsB;AACnE,WAAS,oBAAoB,eAAe,KAAK,2BAA2B,KAAK;AACjF,WAAS,oBAAoB,aAAa,KAAK,sBAAsB;AACrE,OAAK,iBAAiB;AACtB,SAAO,aAAa,KAAK,iBAAiB;AAE1C,OAAK,SAAS,KAAK,CAAC,SAAS,SAAS;AAClC,QAAK,SAAS;AACd,QAAK,gBAAgB,mBAAmB;IAC1C;AAEF,OAAK,YAAY,UAAU,OAAO,OAAO;AACzC,QAAM,iBAAiB,KAAK,aAAa,OAAO;AAChD,OAAK,aAAa,SAAS;AAE3B,OAAK,cAAc,IAAI,kBAAkB,CAAC;AAC1C,OAAK,cAAc,IAAI,YAAY,kBAAkB;GACjD,QAAQ,EAAE,MAAM,OAAO;GACvB,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,SAAkB;EACd,MAAM,cAAc,KAAK,aAAa,KAAK,cAAc,SAAS,KAAK;AAIvE,SAAO,IAAI;;0BAFY,KAAK,MAAM,KAAK,WAAW,GAAG,GAIpB;4BACb,KAAK,UAAU;4BACf,KAAK,YAAY,KAAK,WAAW;4BACjC,KAAK,SAAS;0BAChB,YAAY;;;gCAGN,GAAG;;mCAEA,GAAG;;;;;kCAKJ,KAAK,oBAAoB;;;;;;;;;;gCAU3B,KAAK,KAAK;6BACb,KAAK,gBAAgB;uCACX,KAAK,qBAAqB;;;;;;;;YA/0B5D,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,eAAA,WAAA,QAAA,KAAA,EAAA;YAG1C,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,eAAA,WAAA,QAAA,KAAA,EAAA;YAG3B,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,eAAA,WAAA,aAAA,KAAA,EAAA;YAG3B,SAAS;CAAE,WAAW;CAAe,MAAM;CAAQ,CAAC,CAAA,EAAA,eAAA,WAAA,cAAA,KAAA,EAAA;YAGpD,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,eAAA,WAAA,YAAA,KAAA,EAAA;YAG1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,eAAA,WAAA,YAAA,KAAA,EAAA;YAI1B,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,eAAA,WAAA,OAAA,KAAA,EAAA;YAG3B,MAAM,mBAAmB,CAAA,EAAA,eAAA,WAAA,eAAA,KAAA,EAAA;YAGzB,MAAM,QAAQ,CAAA,EAAA,eAAA,WAAA,eAAA,KAAA,EAAA;YAGd,MAAM,WAAW,CAAA,EAAA,eAAA,WAAA,gBAAA,KAAA,EAAA;6BAhCrB,cAAc,mBAAmB,CAAA,EAAA,eAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-option-C3Zqmu3z.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\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 /* Craft CP body text (~gray-700), not gray-900. */\n color: var(--pk-color-gray-700);\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 'lit/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-XZZdJ4WI.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 'lit/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';\nimport { PkPopup, type 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-select-B17rV6BR.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 'lit/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';\nimport { PkPopup, type 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-tab-CzV7pOdp.js","names":[],"sources":["../../src/components/tabs/pk-tab-base.ts","../../src/components/tabs/pk-tab.styles.ts","../../src/components/tabs/pk-tab.ts"],"sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { PkElement } from '../../base/pk-element.js';\n\n/** Shared tab trigger behaviour for all tab variants. */\nexport class PkTabBase extends PkElement {\n @property()\n value = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n @property({ type: Number, attribute: 'focus-index' })\n focusIndex = -1;\n\n @property()\n panelId?: string;\n\n focusControl(): void {\n this.shadowRoot?.querySelector<HTMLButtonElement>('.trigger')?.focus();\n }\n\n protected handleClick(): void {\n if (this.disabled) {\n return;\n }\n\n this.dispatchEvent(new CustomEvent('pk-tab-select', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n protected handleKeyDown(event: KeyboardEvent): void {\n this.dispatchEvent(new CustomEvent('pk-tab-keydown', {\n detail: { event, value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n protected renderTrigger(className: string) {\n return html`\n <button\n part=\"trigger\"\n type=\"button\"\n class=${className}\n role=\"tab\"\n ?disabled=${this.disabled}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-selected=${this.selected ? 'true' : 'false'}\n tabindex=${this.focusIndex}\n aria-controls=${this.panelId ?? nothing}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n >\n <span part=\"icon\" class=\"icon\">\n <slot name=\"icon\"></slot>\n </span>\n <span part=\"label\" class=\"label\">\n <slot></slot>\n </span>\n <span part=\"status\" class=\"status\">\n <slot name=\"status\"></slot>\n </span>\n </button>\n `;\n }\n}\n","import { css } from 'lit';\n\nexport const pkTabStyles = css`\n @layer pk-component {\n :host {\n /* Size to the shadow trigger. Prefer flex-start so a short list line\n * (or host utilities like Tailwind items-center) cannot stretch the\n * host shorter than the trigger and clip the modal active underline. */\n display: inline-flex;\n flex-shrink: 0;\n align-self: flex-start;\n height: auto;\n min-height: auto;\n align-items: stretch;\n }\n\n .trigger {\n position: relative;\n display: var(--pk-tabs-trigger-display, inline-flex);\n align-items: center;\n justify-content: var(--pk-tabs-trigger-justify, center);\n gap: var(--pk-tabs-trigger-gap, 0.5rem);\n width: var(--pk-tabs-trigger-width, auto);\n min-height: var(--pk-tabs-trigger-min-height, 2rem);\n padding: var(--pk-tabs-trigger-padding-block, 0.375rem)\n var(--pk-tabs-trigger-padding-inline, 0.75rem);\n border: 0;\n border-top: var(--pk-tabs-trigger-border-top, 0 solid transparent);\n border-radius: var(--pk-tabs-trigger-radius, var(--pk-radius-sm));\n background: transparent;\n color: var(--pk-tabs-trigger-color, inherit);\n font: inherit;\n font-family: var(--pk-font-family);\n font-size: var(--pk-tabs-trigger-font-size, 13px);\n font-weight: var(--pk-tabs-trigger-font-weight, 400);\n line-height: var(--pk-tabs-trigger-line-height, 1.4);\n text-align: var(--pk-tabs-trigger-text-align, center);\n text-transform: var(--pk-tabs-trigger-text-transform, none);\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n box-shadow: none;\n box-sizing: border-box;\n transition: background-color 0.12s ease, color 0.12s ease, box-shadow 0.12s ease, border-color 0.12s ease;\n }\n\n /* Collapse optional icon/status lanes when nothing is slotted. */\n .icon,\n .status {\n display: none;\n flex: none;\n align-items: center;\n justify-content: center;\n line-height: 0;\n }\n\n .icon:has(::slotted(*)),\n .status:has(::slotted(*)) {\n display: inline-flex;\n }\n\n .icon {\n width: var(--pk-tabs-trigger-icon-size, 1.125rem);\n height: var(--pk-tabs-trigger-icon-size, 1.125rem);\n font-size: var(--pk-tabs-trigger-icon-size, 1.125rem);\n color: var(--pk-tabs-trigger-icon-color, inherit);\n }\n\n .icon ::slotted(*) {\n display: block;\n max-width: 100%;\n max-height: 100%;\n /* Kill pk-icon text-baseline nudge so logos/icons sit on the flex midline. */\n vertical-align: 0;\n }\n\n .label {\n display: inline-flex;\n flex: var(--pk-tabs-trigger-label-flex, 0 1 auto);\n align-items: center;\n min-width: 0;\n line-height: inherit;\n }\n\n .status {\n margin-inline-start: var(--pk-tabs-trigger-status-margin, 0);\n color: var(--pk-tabs-trigger-status-color, inherit);\n }\n\n .trigger:hover:not(:disabled):not([aria-disabled='true']):not([aria-selected='true']) {\n border-top-color: transparent;\n background: var(--pk-tabs-trigger-hover-bg, rgb(255 255 255 / 0.7));\n color: var(--pk-tabs-trigger-hover-color, var(--pk-color-gray-700));\n }\n\n /*\n * Focus ring is only for :focus-visible on a non-selected tab (manual\n * activation). Selected + focus-visible must NOT draw a ring — active\n * chrome is the underline (mouse) or is replaced by the modal focus box\n * via --pk-tabs-trigger-focus-selected-shadow when set.\n */\n .trigger:focus-visible:not([aria-selected='true']) {\n box-shadow: inset 0 0 0 2px var(--pk-color-sky-600);\n }\n\n .trigger:disabled,\n .trigger[aria-disabled='true'] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .trigger[aria-selected='true'],\n :host([selected]) .trigger {\n border-top: var(--pk-tabs-trigger-selected-border-top, var(--pk-tabs-trigger-border-top, 0 solid transparent));\n border-radius: var(--pk-tabs-trigger-selected-radius, var(--pk-radius-sm));\n background: var(--pk-tabs-trigger-selected-bg, var(--pk-color-white));\n color: var(--pk-tabs-trigger-selected-color, var(--pk-color-gray-800));\n box-shadow: var(--pk-tabs-trigger-selected-shadow, 0 1px 2px rgba(31, 41, 51, 0.12));\n }\n\n .trigger[aria-selected='true']:hover,\n :host([selected]) .trigger:hover {\n background: var(--pk-tabs-trigger-selected-hover-bg, var(--pk-tabs-trigger-selected-bg, var(--pk-color-white)));\n color: var(--pk-tabs-trigger-selected-hover-color, var(--pk-tabs-trigger-selected-color, var(--pk-color-gray-800)));\n }\n\n /* screen3: keyboard focus on the active tab → full inset box, no underline. */\n .trigger[aria-selected='true']:focus-visible,\n :host([selected]) .trigger:focus-visible {\n box-shadow: var(\n --pk-tabs-trigger-focus-selected-shadow,\n var(--pk-tabs-trigger-selected-shadow, 0 0 #0000)\n );\n }\n\n .trigger[aria-selected='true']:focus-visible::after,\n :host([selected]) .trigger:focus-visible::after {\n height: var(--pk-tabs-trigger-focus-selected-underline-height, var(--pk-tabs-trigger-underline-height, 0));\n }\n\n .trigger[aria-selected='true']::after,\n :host([selected]) .trigger::after {\n content: '';\n position: absolute;\n right: var(--pk-tabs-trigger-underline-inset, 15px);\n bottom: 0;\n left: var(--pk-tabs-trigger-underline-inset, 15px);\n height: var(--pk-tabs-trigger-underline-height, 0);\n /* Keep the bar above the list hairline when both meet at the clip edge. */\n z-index: 1;\n background: var(--pk-color-sky-600);\n pointer-events: none;\n }\n\n /*\n * Validation error chrome (v1 ModalTabs / PaneTabs text-error).\n * Host sets data-has-errors; light-DOM text-* cannot pierce the trigger.\n */\n :host([data-has-errors]) {\n --pk-tabs-trigger-color: var(--pk-color-error, #d81f23);\n --pk-tabs-trigger-hover-color: var(--pk-color-rose-700, #be123c);\n --pk-tabs-trigger-selected-color: var(--pk-color-error, #d81f23);\n --pk-tabs-trigger-selected-hover-color: var(--pk-color-rose-700, #be123c);\n --pk-tabs-trigger-icon-color: inherit;\n --pk-tabs-trigger-status-color: inherit;\n }\n }\n`;\n","import { customElement } from 'lit/decorators.js';\n\nimport { PkTabBase } from './pk-tab-base.js';\nimport { pkTabStyles } from './pk-tab.styles.js';\n\n/**\n * Tab trigger — use inside `pk-tabs` with `slot=\"nav\"`.\n *\n * @slot - Tab label\n * @slot icon - Optional leading content (icon, logo, etc.)\n * @slot status - Optional trailing content (status dot, badge, etc.)\n *\n * @csspart trigger - Tab button\n * @csspart icon - Icon slot wrapper (hidden when empty)\n * @csspart label - Label slot wrapper\n * @csspart status - Status slot wrapper (hidden when empty)\n */\n@customElement('pk-tab')\nexport class PkTab extends PkTabBase {\n static override styles = pkTabStyles;\n\n override render() {\n return this.renderTrigger('trigger pk-tabs__trigger');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tab': PkTab;\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,YAAb,cAA+B,UAAU;;;eAE7B;kBAGG;kBAGA;oBAGE;;CAKb,eAAqB;AACjB,OAAK,YAAY,cAAiC,WAAW,EAAE,OAAO;;CAG1E,cAA8B;AAC1B,MAAI,KAAK,SACL;AAGJ,OAAK,cAAc,IAAI,YAAY,iBAAiB;GAChD,QAAQ,EAAE,OAAO,KAAK,OAAO;GAC7B,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,cAAwB,OAA4B;AAChD,OAAK,cAAc,IAAI,YAAY,kBAAkB;GACjD,QAAQ;IAAE;IAAO,OAAO,KAAK;IAAO;GACpC,SAAS;GACT,UAAU;GACb,CAAC,CAAC;;CAGP,cAAwB,WAAmB;AACvC,SAAO,IAAI;;;;wBAIK,UAAU;;4BAEN,KAAK,SAAS;gCACV,KAAK,WAAW,SAAS,QAAQ;gCACjC,KAAK,WAAW,SAAS,QAAQ;2BACtC,KAAK,WAAW;gCACX,KAAK,WAAW,QAAQ;yBAC/B,KAAK,YAAY;2BACf,KAAK,cAAc;;;;;;;;;;;;;;;YApDzC,UAAU,CAAA,EAAA,UAAA,WAAA,SAAA,KAAA,EAAA;YAGV,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,UAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,UAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC,CAAA,EAAA,UAAA,WAAA,cAAA,KAAA,EAAA;YAGpD,UAAU,CAAA,EAAA,UAAA,WAAA,WAAA,KAAA,EAAA;;;ACjBf,IAAa,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgBvB,IAAA,QAAA,MAAM,cAAc,UAAU;;gBACR;;CAEzB,SAAkB;AACd,SAAO,KAAK,cAAc,2BAA2B;;;oBAL5D,cAAc,SAAS,CAAA,EAAA,MAAA"}
@@ -1,21 +0,0 @@
1
- //#region src/utils/popup-pointer.ts
2
- /** Shared hit/focus-path testing for pk-popup consumers (pointer or keyboard events). */
3
- function isEventInsideOverlay(event, options = {}) {
4
- const path = event.composedPath();
5
- if (options.host && path.includes(options.host)) return true;
6
- if (options.anchor && path.includes(options.anchor)) return true;
7
- if (options.panel && path.includes(options.panel)) return true;
8
- return path.some((node) => {
9
- if (!(node instanceof HTMLElement)) return false;
10
- if (node.classList.contains("popup") || node.localName === "pk-popup") return true;
11
- return options.extraMatches?.(node) ?? false;
12
- });
13
- }
14
- /** Shared light-dismiss hit testing for pk-popup consumers. */
15
- function isPointerInsideOverlay(event, options = {}) {
16
- return isEventInsideOverlay(event, options);
17
- }
18
- //#endregion
19
- export { isPointerInsideOverlay as n, isEventInsideOverlay as t };
20
-
21
- //# sourceMappingURL=popup-pointer-C8lypj8V.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"popup-pointer-C8lypj8V.js","names":[],"sources":["../../src/utils/popup-pointer.ts"],"sourcesContent":["/**\n * Returns true when a pointer event occurred on pk-popup content.\n */\nexport function isPointerInPopupSurface(event: PointerEvent): boolean {\n return event.composedPath().some((node) => {\n if (!(node instanceof HTMLElement)) {\n return false;\n }\n\n return node.classList.contains('popup')\n || node.localName === 'pk-popup';\n });\n}\n\nexport type PointerInsideOverlayOptions = {\n host?: HTMLElement;\n anchor?: Element | null;\n panel?: Element | null;\n extraMatches?: (element: HTMLElement) => boolean;\n};\n\n/** Shared hit/focus-path testing for pk-popup consumers (pointer or keyboard events). */\nexport function isEventInsideOverlay(\n event: Event,\n options: PointerInsideOverlayOptions = {},\n): boolean {\n const path = event.composedPath();\n\n if (options.host && path.includes(options.host)) {\n return true;\n }\n\n if (options.anchor && path.includes(options.anchor)) {\n return true;\n }\n\n if (options.panel && path.includes(options.panel)) {\n return true;\n }\n\n return path.some((node) => {\n if (!(node instanceof HTMLElement)) {\n return false;\n }\n\n if (node.classList.contains('popup') || node.localName === 'pk-popup') {\n return true;\n }\n\n return options.extraMatches?.(node) ?? false;\n });\n}\n\n/** Shared light-dismiss hit testing for pk-popup consumers. */\nexport function isPointerInsideOverlay(\n event: PointerEvent,\n options: PointerInsideOverlayOptions = {},\n): boolean {\n return isEventInsideOverlay(event, options);\n}\n"],"mappings":";;AAsBA,SAAgB,qBACZ,OACA,UAAuC,EAAE,EAClC;CACP,MAAM,OAAO,MAAM,cAAc;AAEjC,KAAI,QAAQ,QAAQ,KAAK,SAAS,QAAQ,KAAK,CAC3C,QAAO;AAGX,KAAI,QAAQ,UAAU,KAAK,SAAS,QAAQ,OAAO,CAC/C,QAAO;AAGX,KAAI,QAAQ,SAAS,KAAK,SAAS,QAAQ,MAAM,CAC7C,QAAO;AAGX,QAAO,KAAK,MAAM,SAAS;AACvB,MAAI,EAAE,gBAAgB,aAClB,QAAO;AAGX,MAAI,KAAK,UAAU,SAAS,QAAQ,IAAI,KAAK,cAAc,WACvD,QAAO;AAGX,SAAO,QAAQ,eAAe,KAAK,IAAI;GACzC;;;AAIN,SAAgB,uBACZ,OACA,UAAuC,EAAE,EAClC;AACP,QAAO,qBAAqB,OAAO,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.js","names":[],"sources":["../src/register.ts"],"sourcesContent":["// Full-library path: every curated glyph is available to `<pk-icon icon=\"…\">`.\nimport '@verbb/plugin-kit-icons/all.js';\n\nimport { PkButton } from './components/button/pk-button.js';\nimport { PkButtonGroup } from './components/button-group/pk-button-group.js';\nimport { PkButtonGroupSeparator } from './components/button-group/pk-button-group-separator.js';\nimport { PkButtonGroupText } from './components/button-group/pk-button-group-text.js';\nimport { PkCheckbox } from './components/checkbox/pk-checkbox.js';\nimport { PkCheckboxSelect } from './components/checkbox-select/pk-checkbox-select.js';\nimport { PkCodeEditor } from './components/code-editor/pk-code-editor.js';\nimport { PkColorInput } from './components/color-input/pk-color-input.js';\nimport { PkCalendar } from './components/calendar/pk-calendar.js';\nimport { PkDatePicker } from './components/date-picker/pk-date-picker.js';\nimport { PkCombobox } from './components/combobox/pk-combobox.js';\nimport { PkCopyButton } from './components/copy-button/pk-copy-button.js';\nimport { PkDialog } from './components/dialog/pk-dialog.js';\nimport { PkDropdownLabel } from './components/dropdown-menu/pk-dropdown-label.js';\nimport { PkDropdownMenu } from './components/dropdown-menu/pk-dropdown-menu.js';\nimport { PkDropdownItem } from './components/dropdown-menu/pk-dropdown-item.js';\nimport { PkDropdownSeparator } from './components/dropdown-menu/pk-dropdown-separator.js';\nimport { PkEditableTable } from './components/editable-table/pk-editable-table.js';\nimport { PkField } from './components/field/pk-field.js';\nimport { PkIcon } from './components/icon/pk-icon.js';\nimport { PkInput } from './components/input/pk-input.js';\nimport { PkInputGroup } from './components/input-group/pk-input-group.js';\nimport { PkInputGroupAddon } from './components/input-group/pk-input-group-addon.js';\nimport { PkInputGroupButton } from './components/input-group/pk-input-group-button.js';\nimport { PkInputGroupInput } from './components/input-group/pk-input-group-input.js';\nimport { PkInputGroupText } from './components/input-group/pk-input-group-text.js';\nimport { PkInputGroupTextarea } from './components/input-group/pk-input-group-textarea.js';\nimport { PkLightswitch } from './components/lightswitch/pk-lightswitch.js';\nimport { PkOption } from './components/select/pk-option.js';\nimport { PkOptionGroup } from './components/select/pk-option-group.js';\nimport { PkPopover } from './components/popover/pk-popover.js';\nimport { PkPopup } from './components/popup/pk-popup.js';\nimport { PkRadio } from './components/radio-group/pk-radio.js';\nimport { PkRadioGroup } from './components/radio-group/pk-radio-group.js';\nimport { PkScrollArea } from './components/scroll-area/pk-scroll-area.js';\nimport { PkSelect } from './components/select/pk-select.js';\nimport { PkSeparator } from './components/separator/pk-separator.js';\nimport { PkSpinner } from './components/spinner/pk-spinner.js';\nimport { PkStatus } from './components/status/pk-status.js';\nimport { PkTab } from './components/tabs/pk-tab.js';\nimport { PkTabHeading } from './components/tabs/pk-tab-heading.js';\nimport { PkTabPanel } from './components/tabs/pk-tab-panel.js';\nimport { PkTabs } from './components/tabs/pk-tabs.js';\nimport { PkTextarea } from './components/textarea/pk-textarea.js';\nimport { PkTiptapContent } from './components/tiptap/pk-tiptap-content.js';\nimport { PkTiptapEditor } from './components/tiptap/pk-tiptap-editor.js';\nimport { PkTiptapInput } from './components/tiptap/pk-tiptap-input.js';\nimport { PkTimePicker } from './components/time-picker/pk-time-picker.js';\nimport { PkToggle } from './components/toggle/pk-toggle.js';\nimport { PkToggleGroup } from './components/toggle-group/pk-toggle-group.js';\nimport { PkTooltip } from './components/tooltip/pk-tooltip.js';\n\nexport * from './components/button/index.js';\nexport * from './components/button-group/index.js';\nexport * from './components/checkbox/index.js';\nexport * from './components/checkbox-select/index.js';\nexport * from './components/input/index.js';\nexport * from './components/input-group/index.js';\nexport * from './components/textarea/index.js';\nexport * from './components/separator/index.js';\nexport * from './components/status/index.js';\nexport * from './components/toggle/index.js';\nexport * from './components/toggle-group/index.js';\nexport * from './components/lightswitch/index.js';\nexport * from './components/copy-button/index.js';\nexport * from './components/dialog/index.js';\nexport * from './components/dropdown-menu/index.js';\nexport * from './components/field/index.js';\nexport * from './components/popover/index.js';\nexport * from './components/popup/index.js';\nexport * from './components/tooltip/index.js';\nexport * from './components/radio-group/index.js';\nexport * from './components/tabs/index.js';\nexport * from './components/scroll-area/index.js';\nexport * from './components/color-input/index.js';\nexport * from './components/code-editor/index.js';\nexport * from './components/calendar/index.js';\nexport * from './components/date-picker/index.js';\nexport * from './components/select/index.js';\nexport * from './components/spinner/index.js';\nexport * from './components/time-picker/index.js';\nexport * from './components/tiptap/index.js';\n\nexport {\n PkButton,\n PkButtonGroup,\n PkButtonGroupSeparator,\n PkButtonGroupText,\n PkCheckbox,\n PkCheckboxSelect,\n PkColorInput,\n PkCodeEditor,\n PkCalendar,\n PkDatePicker,\n PkCombobox,\n PkCopyButton,\n PkDialog,\n PkDropdownMenu,\n PkDropdownItem,\n PkDropdownSeparator,\n PkEditableTable,\n PkField,\n PkIcon,\n PkInput,\n PkInputGroup,\n PkInputGroupAddon,\n PkInputGroupButton,\n PkInputGroupInput,\n PkInputGroupText,\n PkInputGroupTextarea,\n PkLightswitch,\n PkOption,\n PkOptionGroup,\n PkPopover,\n PkPopup,\n PkRadio,\n PkRadioGroup,\n PkScrollArea,\n PkSelect,\n PkSeparator,\n PkSpinner,\n PkStatus,\n PkTab,\n PkTabPanel,\n PkTabs,\n PkTextarea,\n PkTimePicker,\n PkTiptapContent,\n PkTiptapEditor,\n PkTiptapInput,\n PkToggle,\n PkToggleGroup,\n PkTooltip,\n};\n\nconst COMPONENTS: [string, CustomElementConstructor][] = [\n ['pk-spinner', PkSpinner],\n ['pk-icon', PkIcon],\n ['pk-button', PkButton],\n ['pk-checkbox', PkCheckbox],\n ['pk-checkbox-select', PkCheckboxSelect],\n ['pk-color-input', PkColorInput],\n ['pk-code-editor', PkCodeEditor],\n ['pk-input', PkInput],\n ['pk-input-group', PkInputGroup],\n ['pk-input-group-addon', PkInputGroupAddon],\n ['pk-input-group-button', PkInputGroupButton],\n ['pk-input-group-input', PkInputGroupInput],\n ['pk-input-group-text', PkInputGroupText],\n ['pk-input-group-textarea', PkInputGroupTextarea],\n ['pk-textarea', PkTextarea],\n ['pk-tiptap-editor', PkTiptapEditor],\n ['pk-tiptap-input', PkTiptapInput],\n ['pk-tiptap-content', PkTiptapContent],\n ['pk-field', PkField],\n ['pk-separator', PkSeparator],\n ['pk-status', PkStatus],\n ['pk-toggle', PkToggle],\n ['pk-toggle-group', PkToggleGroup],\n ['pk-lightswitch', PkLightswitch],\n ['pk-button-group', PkButtonGroup],\n ['pk-button-group-separator', PkButtonGroupSeparator],\n ['pk-button-group-text', PkButtonGroupText],\n ['pk-dialog', PkDialog],\n ['pk-popup', PkPopup],\n ['pk-dropdown-label', PkDropdownLabel],\n ['pk-dropdown-item', PkDropdownItem],\n ['pk-dropdown-separator', PkDropdownSeparator],\n ['pk-dropdown-menu', PkDropdownMenu],\n ['pk-editable-table', PkEditableTable],\n ['pk-popover', PkPopover],\n ['pk-tooltip', PkTooltip],\n ['pk-radio', PkRadio],\n ['pk-radio-group', PkRadioGroup],\n ['pk-tab', PkTab],\n ['pk-tab-heading', PkTabHeading],\n ['pk-tab-panel', PkTabPanel],\n ['pk-tabs', PkTabs],\n ['pk-scroll-area', PkScrollArea],\n ['pk-option', PkOption],\n ['pk-option-group', PkOptionGroup],\n ['pk-select', PkSelect],\n ['pk-calendar', PkCalendar],\n ['pk-date-picker', PkDatePicker],\n ['pk-combobox', PkCombobox],\n ['pk-time-picker', PkTimePicker],\n ['pk-copy-button', PkCopyButton],\n];\n\n/** Side-effect registration for all Plugin Kit web components. */\nexport function registerAll(): void {\n for (const [tag, ctor] of COMPONENTS) {\n if (!customElements.get(tag)) {\n customElements.define(tag, ctor);\n }\n }\n}\n\nexport {\n createRegisterComponents,\n type PkComponentTag,\n} from './register-components.js';\n\nexport { BUNDLER_TAG_IMPORT_PATHS as componentImportPaths } from './component-registry.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0IA,IAAM,aAAmD;CACrD,CAAC,cAAc,UAAU;CACzB,CAAC,WAAW,OAAO;CACnB,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,sBAAsB,iBAAiB;CACxC,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CAChC,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,yBAAyB,mBAAmB;CAC7C,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,uBAAuB,iBAAiB;CACzC,CAAC,2BAA2B,qBAAqB;CACjD,CAAC,eAAe,WAAW;CAC3B,CAAC,oBAAoB,eAAe;CACpC,CAAC,mBAAmB,cAAc;CAClC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,YAAY,QAAQ;CACrB,CAAC,gBAAgB,YAAY;CAC7B,CAAC,aAAa,SAAS;CACvB,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,kBAAkB,cAAc;CACjC,CAAC,mBAAmB,cAAc;CAClC,CAAC,6BAA6B,uBAAuB;CACrD,CAAC,wBAAwB,kBAAkB;CAC3C,CAAC,aAAa,SAAS;CACvB,CAAC,YAAY,QAAQ;CACrB,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,oBAAoB,eAAe;CACpC,CAAC,yBAAyB,oBAAoB;CAC9C,CAAC,oBAAoB,eAAe;CACpC,CAAC,qBAAqB,gBAAgB;CACtC,CAAC,cAAc,UAAU;CACzB,CAAC,cAAc,UAAU;CACzB,CAAC,YAAY,QAAQ;CACrB,CAAC,kBAAkB,aAAa;CAChC,CAAC,UAAU,MAAM;CACjB,CAAC,kBAAkB,aAAa;CAChC,CAAC,gBAAgB,WAAW;CAC5B,CAAC,WAAW,OAAO;CACnB,CAAC,kBAAkB,aAAa;CAChC,CAAC,aAAa,SAAS;CACvB,CAAC,mBAAmB,cAAc;CAClC,CAAC,aAAa,SAAS;CACvB,CAAC,eAAe,WAAW;CAC3B,CAAC,kBAAkB,aAAa;CAChC,CAAC,eAAe,WAAW;CAC3B,CAAC,kBAAkB,aAAa;CAChC,CAAC,kBAAkB,aAAa;CACnC;;AAGD,SAAgB,cAAoB;AAChC,MAAK,MAAM,CAAC,KAAK,SAAS,WACtB,KAAI,CAAC,eAAe,IAAI,IAAI,CACxB,gBAAe,OAAO,KAAK,KAAK"}
@@ -1,19 +0,0 @@
1
- //#region src/utils/popup-pointer.ts
2
- /** Shared hit/focus-path testing for pk-popup consumers (pointer or keyboard events). */
3
- function isEventInsideOverlay(event, options = {}) {
4
- const path = event.composedPath();
5
- if (options.host && path.includes(options.host)) return true;
6
- if (options.anchor && path.includes(options.anchor)) return true;
7
- if (options.panel && path.includes(options.panel)) return true;
8
- return path.some((node) => {
9
- if (!(node instanceof HTMLElement)) return false;
10
- if (node.classList.contains("popup") || node.localName === "pk-popup") return true;
11
- return options.extraMatches?.(node) ?? false;
12
- });
13
- }
14
- /** Shared light-dismiss hit testing for pk-popup consumers. */
15
- function isPointerInsideOverlay(event, options = {}) {
16
- return isEventInsideOverlay(event, options);
17
- }
18
- //#endregion
19
- export { isPointerInsideOverlay as n, isEventInsideOverlay as t };
@@ -1,34 +0,0 @@
1
- //#region ../plugin-kit-icons/dist/svg.js
2
- var escapeHtml = (value) => {
3
- return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
4
- };
5
- /** Build the `viewBox` value for an icon. */
6
- var iconViewBox = (icon) => {
7
- return `0 0 ${icon.width} ${icon.height}`;
8
- };
9
- /**
10
- * Render a {@link PkIcon} to a standalone SVG markup string.
11
- *
12
- * Framework-agnostic: web components pass the result through Lit's `unsafeSVG`,
13
- * or parse it into an element. React consumers should use their own component
14
- * (the raw {@link PkIcon} data is exported for that purpose).
15
- */
16
- var iconToSvg = (icon, options = {}) => {
17
- const { title, className, attributes = {} } = options;
18
- const attrs = {
19
- xmlns: "http://www.w3.org/2000/svg",
20
- viewBox: iconViewBox(icon),
21
- ...attributes
22
- };
23
- if (className) attrs.class = className;
24
- if (title) attrs.role = "img";
25
- else {
26
- attrs["aria-hidden"] = "true";
27
- attrs.focusable = "false";
28
- }
29
- return `<svg ${Object.entries(attrs).map(([key, value]) => {
30
- return `${key}="${escapeHtml(value)}"`;
31
- }).join(" ")}>${title ? `<title>${escapeHtml(title)}</title>` : ""}<path fill="currentColor" d="${escapeHtml(icon.path)}"/></svg>`;
32
- };
33
- //#endregion
34
- export { iconToSvg as t };