@verbb/plugin-kit-web 2.0.22 → 2.0.24

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 (481) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/custom-elements.json +8414 -7031
  3. package/dist/chunks/{active-elements-BwpXu8Lb.js → active-elements-739kISON.js} +1 -1
  4. package/dist/chunks/{active-elements-BwpXu8Lb.js.map → active-elements-739kISON.js.map} +1 -1
  5. package/dist/chunks/{animate-with-class-CsDwYnXL.js → animate-with-class-CjTZI0NU.js} +1 -1
  6. package/dist/chunks/{animate-with-class-CsDwYnXL.js.map → animate-with-class-CjTZI0NU.js.map} +1 -1
  7. package/dist/chunks/{autoloader-dJO3tYOX.js → autoloader-DcwybeWc.js} +3 -3
  8. package/dist/chunks/{autoloader-dJO3tYOX.js.map → autoloader-DcwybeWc.js.map} +1 -1
  9. package/dist/chunks/{button-group-item.styles-DYmBR28a.js → button-group-item.styles-D7tuu-sr.js} +1 -1
  10. package/dist/chunks/{button-group-item.styles-DYmBR28a.js.map → button-group-item.styles-D7tuu-sr.js.map} +1 -1
  11. package/dist/chunks/{component-registry-D34fm8xW.js → component-registry-B5pnAZsb.js} +6 -1
  12. package/dist/chunks/component-registry-B5pnAZsb.js.map +1 -0
  13. package/dist/chunks/{control-aria-B2QMq4ji.js → control-aria-CtNg2izr.js} +1 -1
  14. package/dist/chunks/{control-aria-B2QMq4ji.js.map → control-aria-CtNg2izr.js.map} +1 -1
  15. package/dist/chunks/{decorate-R0X811qp.js → decorate-Br_PE9pq.js} +3 -4
  16. package/dist/chunks/{decorate-R0X811qp.js.map → decorate-Br_PE9pq.js.map} +1 -1
  17. package/dist/chunks/decorators-BkErmuYK.js +2 -0
  18. package/dist/chunks/{dismissible-stack-XQUMfKO3.js → dismissible-stack-CwhtwAyo.js} +1 -1
  19. package/dist/chunks/{dismissible-stack-XQUMfKO3.js.map → dismissible-stack-CwhtwAyo.js.map} +1 -1
  20. package/dist/chunks/{field-labels-CmuAW8Cl.js → field-labels-pY-gQDwQ.js} +1 -1
  21. package/dist/chunks/{field-labels-CmuAW8Cl.js.map → field-labels-pY-gQDwQ.js.map} +1 -1
  22. package/dist/chunks/{focus-aa5dlv8k.js → focus-DcVUPVqn.js} +2 -2
  23. package/dist/chunks/{focus-aa5dlv8k.js.map → focus-DcVUPVqn.js.map} +1 -1
  24. package/dist/chunks/{form-control.styles-BQdimE5o.js → form-control.styles-CQ93gnVf.js} +1 -1
  25. package/dist/chunks/{form-control.styles-BQdimE5o.js.map → form-control.styles-CQ93gnVf.js.map} +1 -1
  26. package/dist/chunks/{has-slot-8BvCt_qo.js → has-slot-DJv86HKx.js} +1 -1
  27. package/dist/chunks/{has-slot-8BvCt_qo.js.map → has-slot-DJv86HKx.js.map} +1 -1
  28. package/dist/chunks/{icon.styles-BLTWLqYp.js → icon.styles-KWvfi7RV.js} +1 -1
  29. package/dist/chunks/{icon.styles-BLTWLqYp.js.map → icon.styles-KWvfi7RV.js.map} +1 -1
  30. package/dist/chunks/{icons-BR8JcQj2.js → icons-k1pvx6yX.js} +2 -2
  31. package/dist/chunks/{icons-BR8JcQj2.js.map → icons-k1pvx6yX.js.map} +1 -1
  32. package/dist/chunks/{mirror-validator-DCjNYrrx.js → mirror-validator-BkZlEv1Z.js} +1 -1
  33. package/dist/chunks/{mirror-validator-DCjNYrrx.js.map → mirror-validator-BkZlEv1Z.js.map} +1 -1
  34. package/dist/chunks/{option-filter-BQqr8Z21.js → option-filter-BkKyBg8L.js} +2 -2
  35. package/dist/chunks/{option-filter-BQqr8Z21.js.map → option-filter-BkKyBg8L.js.map} +1 -1
  36. package/dist/chunks/{overlay-lifecycle-D0pkTQyI.js → overlay-lifecycle-C582MGBJ.js} +1 -1
  37. package/dist/chunks/{overlay-lifecycle-D0pkTQyI.js.map → overlay-lifecycle-C582MGBJ.js.map} +1 -1
  38. package/dist/chunks/pk-alert-BQAb4lJc.js +666 -0
  39. package/dist/chunks/pk-alert-BQAb4lJc.js.map +1 -0
  40. package/dist/chunks/{pk-autocomplete-qy2Psvqm.js → pk-autocomplete-DUXhs1hi.js} +21 -20
  41. package/dist/chunks/pk-autocomplete-DUXhs1hi.js.map +1 -0
  42. package/dist/chunks/{pk-button-group-BSz5T5iS.js → pk-button-group-BY12Lbk7.js} +10 -7
  43. package/dist/chunks/pk-button-group-BY12Lbk7.js.map +1 -0
  44. package/dist/chunks/{pk-button-group-separator-DH3Rl24b.js → pk-button-group-separator-B1a8dP9A.js} +3 -2
  45. package/dist/chunks/pk-button-group-separator-B1a8dP9A.js.map +1 -0
  46. package/dist/chunks/{pk-button-group-text-Qro_KmZb.js → pk-button-group-text-CWNlZkyV.js} +3 -3
  47. package/dist/chunks/pk-button-group-text-CWNlZkyV.js.map +1 -0
  48. package/dist/chunks/{pk-button-BrH4u4Qr.js → pk-button-ntSVrer_.js} +8 -7
  49. package/dist/chunks/pk-button-ntSVrer_.js.map +1 -0
  50. package/dist/chunks/{pk-calendar-Z7Y0PjeY.js → pk-calendar-Df0c5u79.js} +12 -11
  51. package/dist/chunks/pk-calendar-Df0c5u79.js.map +1 -0
  52. package/dist/chunks/{pk-checkbox-13ArHSmt.js → pk-checkbox-L5uRex3b.js} +6 -5
  53. package/dist/chunks/pk-checkbox-L5uRex3b.js.map +1 -0
  54. package/dist/chunks/{pk-checkbox-select-Ckvfbu83.js → pk-checkbox-select-6OS0wFYO.js} +4 -3
  55. package/dist/chunks/pk-checkbox-select-6OS0wFYO.js.map +1 -0
  56. package/dist/chunks/{pk-clear--mPWZP7H.js → pk-clear-DHxP_2cm.js} +1 -1
  57. package/dist/chunks/{pk-clear--mPWZP7H.js.map → pk-clear-DHxP_2cm.js.map} +1 -1
  58. package/dist/chunks/{pk-code-editor-BlG6O5qB.js → pk-code-editor-vZriNR67.js} +6 -5
  59. package/dist/chunks/pk-code-editor-vZriNR67.js.map +1 -0
  60. package/dist/chunks/{pk-color-input-BRgQ5-vB.js → pk-color-input-Csbm4ROT.js} +6 -5
  61. package/dist/chunks/pk-color-input-Csbm4ROT.js.map +1 -0
  62. package/dist/chunks/{pk-combobox-ag89QEX2.js → pk-combobox-BrSBrldb.js} +25 -23
  63. package/dist/chunks/pk-combobox-BrSBrldb.js.map +1 -0
  64. package/dist/chunks/{pk-connect.styles-BhW406jt.js → pk-connect.styles-oKhxa_m2.js} +1 -1
  65. package/dist/chunks/{pk-connect.styles-BhW406jt.js.map → pk-connect.styles-oKhxa_m2.js.map} +1 -1
  66. package/dist/chunks/{pk-copy-button-BVaOLtYG.js → pk-copy-button-5i9v_zmu.js} +31 -9
  67. package/dist/chunks/pk-copy-button-5i9v_zmu.js.map +1 -0
  68. package/dist/chunks/{pk-date-picker-C2YvDPNm.js → pk-date-picker-C-w6Mn6j.js} +21 -20
  69. package/dist/chunks/pk-date-picker-C-w6Mn6j.js.map +1 -0
  70. package/dist/chunks/{pk-dialog-VMQqLW1f.js → pk-dialog-C7KZGpQs.js} +10 -9
  71. package/dist/chunks/pk-dialog-C7KZGpQs.js.map +1 -0
  72. package/dist/chunks/{pk-dropdown-item-D9OaG5o-.js → pk-dropdown-item-Ck2N_suK.js} +11 -8
  73. package/dist/chunks/pk-dropdown-item-Ck2N_suK.js.map +1 -0
  74. package/dist/chunks/{pk-dropdown-label-CRNWMWQd.js → pk-dropdown-label-BdZLeizJ.js} +2 -2
  75. package/dist/chunks/pk-dropdown-label-BdZLeizJ.js.map +1 -0
  76. package/dist/chunks/{pk-dropdown-menu-DW1wI8xQ.js → pk-dropdown-menu-DBsO1uYR.js} +22 -18
  77. package/dist/chunks/pk-dropdown-menu-DBsO1uYR.js.map +1 -0
  78. package/dist/chunks/{pk-editable-table-DDnu1I8Y.js → pk-editable-table-Cd8K6vT4.js} +26 -23
  79. package/dist/chunks/pk-editable-table-Cd8K6vT4.js.map +1 -0
  80. package/dist/chunks/{pk-field-UAlMq6mQ.js → pk-field--PCE9nOd.js} +9 -8
  81. package/dist/chunks/pk-field--PCE9nOd.js.map +1 -0
  82. package/dist/chunks/{pk-form-associated-element-GxX5lbnk.js → pk-form-associated-element-Doh2K3pG.js} +3 -3
  83. package/dist/chunks/pk-form-associated-element-Doh2K3pG.js.map +1 -0
  84. package/dist/chunks/{pk-image-browser-Bj8LhWfk.js → pk-image-browser-iUqdcLKs.js} +21 -21
  85. package/dist/chunks/pk-image-browser-iUqdcLKs.js.map +1 -0
  86. package/dist/chunks/{pk-input-BywmK5n2.js → pk-input-BUbXj9We.js} +14 -13
  87. package/dist/chunks/pk-input-BUbXj9We.js.map +1 -0
  88. package/dist/chunks/{pk-input-group-BLqKPnfc.js → pk-input-group-CN79c5HT.js} +5 -4
  89. package/dist/chunks/pk-input-group-CN79c5HT.js.map +1 -0
  90. package/dist/chunks/{pk-input-group-addon-ClBkGmAw.js → pk-input-group-addon-DpxfuYp1.js} +3 -2
  91. package/dist/chunks/pk-input-group-addon-DpxfuYp1.js.map +1 -0
  92. package/dist/chunks/{pk-input-group-button-CHQHsWd4.js → pk-input-group-button-D5Hm4saA.js} +3 -2
  93. package/dist/chunks/pk-input-group-button-D5Hm4saA.js.map +1 -0
  94. package/dist/chunks/{pk-input-group-input-oNnqMBGU.js → pk-input-group-input-Cm1MoHgN.js} +3 -2
  95. package/dist/chunks/pk-input-group-input-Cm1MoHgN.js.map +1 -0
  96. package/dist/chunks/{pk-input-group-text-HUxlXROB.js → pk-input-group-text-CtyJZ_Kg.js} +2 -2
  97. package/dist/chunks/pk-input-group-text-CtyJZ_Kg.js.map +1 -0
  98. package/dist/chunks/{pk-input-group-textarea-Cl2FNuw-.js → pk-input-group-textarea-BxmKGjdt.js} +3 -2
  99. package/dist/chunks/pk-input-group-textarea-BxmKGjdt.js.map +1 -0
  100. package/dist/chunks/{pk-lightswitch-VHfJizBW.js → pk-lightswitch-CSvgiHVQ.js} +9 -8
  101. package/dist/chunks/pk-lightswitch-CSvgiHVQ.js.map +1 -0
  102. package/dist/chunks/{pk-option-DQZHV9jL.js → pk-option-B_PF4v_Z.js} +9 -7
  103. package/dist/chunks/pk-option-B_PF4v_Z.js.map +1 -0
  104. package/dist/chunks/{pk-option-group-CCzJkBFp.js → pk-option-group-D6bHfn0j.js} +4 -3
  105. package/dist/chunks/pk-option-group-D6bHfn0j.js.map +1 -0
  106. package/dist/chunks/{pk-popover-D3jkHfwB.js → pk-popover-BOoGfR7I.js} +11 -10
  107. package/dist/chunks/pk-popover-BOoGfR7I.js.map +1 -0
  108. package/dist/chunks/{pk-popup-B65tZMQH.js → pk-popup-DVE93VSV.js} +32 -28
  109. package/dist/chunks/pk-popup-DVE93VSV.js.map +1 -0
  110. package/dist/chunks/{pk-radio-B5XkMHy3.js → pk-radio-D0eqmnlH.js} +3 -2
  111. package/dist/chunks/pk-radio-D0eqmnlH.js.map +1 -0
  112. package/dist/chunks/{pk-radio-group-Dzd-3HaQ.js → pk-radio-group-BehEZG_k.js} +8 -7
  113. package/dist/chunks/pk-radio-group-BehEZG_k.js.map +1 -0
  114. package/dist/chunks/{pk-scroll-area-CdfNxYz8.js → pk-scroll-area-BeaLZ6k-.js} +3 -2
  115. package/dist/chunks/pk-scroll-area-BeaLZ6k-.js.map +1 -0
  116. package/dist/chunks/{pk-select-b5S5WKc-.js → pk-select-DZNpEk5Z.js} +20 -19
  117. package/dist/chunks/pk-select-DZNpEk5Z.js.map +1 -0
  118. package/dist/chunks/{pk-separator-N-VyjYE6.js → pk-separator-ZkRowI5Y.js} +3 -2
  119. package/dist/chunks/pk-separator-ZkRowI5Y.js.map +1 -0
  120. package/dist/chunks/{pk-spinner-DweuYJ_Z.js → pk-spinner-Bxkn4iVO.js} +3 -2
  121. package/dist/chunks/pk-spinner-Bxkn4iVO.js.map +1 -0
  122. package/dist/chunks/pk-state-panel-BTo2xiug.js +604 -0
  123. package/dist/chunks/pk-state-panel-BTo2xiug.js.map +1 -0
  124. package/dist/chunks/{pk-status-BehQARDv.js → pk-status-CdiRBRyh.js} +3 -2
  125. package/dist/chunks/pk-status-CdiRBRyh.js.map +1 -0
  126. package/dist/chunks/{pk-tab-CTloD18e.js → pk-tab-CSbI3XxX.js} +2 -2
  127. package/dist/chunks/pk-tab-CSbI3XxX.js.map +1 -0
  128. package/dist/chunks/{pk-tab-heading-Cjcgebxn.js → pk-tab-heading-BMyLTBNc.js} +2 -2
  129. package/dist/chunks/pk-tab-heading-BMyLTBNc.js.map +1 -0
  130. package/dist/chunks/{pk-tab-panel-CkKU5-Ah.js → pk-tab-panel-sgdRjV8o.js} +2 -2
  131. package/dist/chunks/pk-tab-panel-sgdRjV8o.js.map +1 -0
  132. package/dist/chunks/{pk-tabs-BgEBki1q.js → pk-tabs-bBNCu_4h.js} +10 -7
  133. package/dist/chunks/pk-tabs-bBNCu_4h.js.map +1 -0
  134. package/dist/chunks/{pk-textarea-Dhj1WFLH.js → pk-textarea-B401dUWa.js} +11 -10
  135. package/dist/chunks/pk-textarea-B401dUWa.js.map +1 -0
  136. package/dist/chunks/{pk-time-picker-ChRbKHNB.js → pk-time-picker-DnNZVwRk.js} +6 -6
  137. package/dist/chunks/pk-time-picker-DnNZVwRk.js.map +1 -0
  138. package/dist/chunks/{pk-tiptap-content-CL8smjGi.js → pk-tiptap-content-C2qzGQKj.js} +4 -3
  139. package/dist/chunks/pk-tiptap-content-C2qzGQKj.js.map +1 -0
  140. package/dist/chunks/{pk-tiptap-editor-BMwedkPt.js → pk-tiptap-editor-y_QyNSR-.js} +20 -21
  141. package/dist/chunks/pk-tiptap-editor-y_QyNSR-.js.map +1 -0
  142. package/dist/chunks/{pk-tiptap-input-YKg4VLp_.js → pk-tiptap-input-0Xy6rrot.js} +7 -6
  143. package/dist/chunks/pk-tiptap-input-0Xy6rrot.js.map +1 -0
  144. package/dist/chunks/{pk-toggle-BthhH7vl.js → pk-toggle-Co8GsHuK.js} +4 -3
  145. package/dist/chunks/pk-toggle-Co8GsHuK.js.map +1 -0
  146. package/dist/chunks/{pk-toggle-group-D2Quux8D.js → pk-toggle-group-Ct1ljI-7.js} +7 -4
  147. package/dist/chunks/pk-toggle-group-Ct1ljI-7.js.map +1 -0
  148. package/dist/chunks/{pk-tooltip--QBV6puX.js → pk-tooltip-Cvv2f7T5.js} +7 -6
  149. package/dist/chunks/pk-tooltip-Cvv2f7T5.js.map +1 -0
  150. package/dist/chunks/{popup-content-animation.styles-BnNiguJo.js → popup-content-animation.styles-CJ8zGJz-.js} +1 -1
  151. package/dist/chunks/{popup-content-animation.styles-BnNiguJo.js.map → popup-content-animation.styles-CJ8zGJz-.js.map} +1 -1
  152. package/dist/chunks/{popup-placement-animation-WlEXnS85.js → popup-placement-animation-ClUYI79z.js} +1 -1
  153. package/dist/chunks/{popup-placement-animation-WlEXnS85.js.map → popup-placement-animation-ClUYI79z.js.map} +1 -1
  154. package/dist/chunks/{popup-pointer-CuLjk1th.js → popup-pointer-Bh_d205v.js} +1 -1
  155. package/dist/chunks/{popup-pointer-CuLjk1th.js.map → popup-pointer-Bh_d205v.js.map} +1 -1
  156. package/dist/chunks/{register-components-BT9THgdh.js → register-components-CZtpgZe3.js} +1 -1
  157. package/dist/chunks/{register-components-BT9THgdh.js.map → register-components-CZtpgZe3.js.map} +1 -1
  158. package/dist/chunks/{render-Dvc3MHQR.js → render-DQZp_Rak.js} +1 -1
  159. package/dist/chunks/{render-Dvc3MHQR.js.map → render-DQZp_Rak.js.map} +1 -1
  160. package/dist/chunks/{required-validator-CEg8dvjS.js → required-validator-I58oJGZ3.js} +1 -1
  161. package/dist/chunks/{required-validator-CEg8dvjS.js.map → required-validator-I58oJGZ3.js.map} +1 -1
  162. package/dist/chunks/{scroll-lock-Bbh3Sc5g.js → scroll-lock-DE1pElMQ.js} +2 -2
  163. package/dist/chunks/{scroll-lock-Bbh3Sc5g.js.map → scroll-lock-DE1pElMQ.js.map} +1 -1
  164. package/dist/chunks/{spinner-utils-CDfHypTv.js → spinner-utils-DXwIxQ6z.js} +1 -1
  165. package/dist/chunks/{spinner-utils-CDfHypTv.js.map → spinner-utils-DXwIxQ6z.js.map} +1 -1
  166. package/dist/chunks/{supports-popover-CUBsbHpS.js → supports-popover-BCqyOPtO.js} +1 -1
  167. package/dist/chunks/{supports-popover-CUBsbHpS.js.map → supports-popover-BCqyOPtO.js.map} +1 -1
  168. package/dist/chunks/{sync-listbox-separators-B1-V0oJi.js → sync-listbox-separators-saLEtPpJ.js} +2 -2
  169. package/dist/chunks/{sync-listbox-separators-B1-V0oJi.js.map → sync-listbox-separators-saLEtPpJ.js.map} +1 -1
  170. package/dist/chunks/{tiptap.styles-CPRows--.js → tiptap.styles-Q4ED1nBw.js} +2 -2
  171. package/dist/chunks/{tiptap.styles-CPRows--.js.map → tiptap.styles-Q4ED1nBw.js.map} +1 -1
  172. package/dist/component-registry.d.ts.map +1 -1
  173. package/dist/components/alert/index.d.ts +2 -0
  174. package/dist/components/alert/index.d.ts.map +1 -0
  175. package/dist/components/alert/pk-alert.d.ts +95 -0
  176. package/dist/components/alert/pk-alert.d.ts.map +1 -0
  177. package/dist/components/alert/pk-alert.js +2 -0
  178. package/dist/components/alert/pk-alert.styles.d.ts +2 -0
  179. package/dist/components/alert/pk-alert.styles.d.ts.map +1 -0
  180. package/dist/components/alert.d.ts +2 -0
  181. package/dist/components/alert.js +2 -0
  182. package/dist/components/autocomplete/pk-autocomplete.js +1 -1
  183. package/dist/components/autocomplete.js +1 -1
  184. package/dist/components/button/pk-button.js +1 -1
  185. package/dist/components/button-group/pk-button-group-separator.js +1 -1
  186. package/dist/components/button-group/pk-button-group-text.js +1 -1
  187. package/dist/components/button-group/pk-button-group.js +1 -1
  188. package/dist/components/button-group.js +3 -3
  189. package/dist/components/button.js +1 -1
  190. package/dist/components/calendar/pk-calendar.js +1 -1
  191. package/dist/components/calendar.js +1 -1
  192. package/dist/components/checkbox/pk-checkbox.js +1 -1
  193. package/dist/components/checkbox-select/pk-checkbox-select.js +1 -1
  194. package/dist/components/checkbox-select.js +1 -1
  195. package/dist/components/checkbox.js +1 -1
  196. package/dist/components/code-editor/pk-code-editor.js +1 -1
  197. package/dist/components/code-editor.js +1 -1
  198. package/dist/components/color-input/pk-color-input.js +1 -1
  199. package/dist/components/color-input.js +1 -1
  200. package/dist/components/combobox/pk-combobox.js +1 -1
  201. package/dist/components/combobox.js +1 -1
  202. package/dist/components/connect/pk-connect-oauth.js +5 -4
  203. package/dist/components/connect/pk-connect-oauth.js.map +1 -1
  204. package/dist/components/connect/pk-connect.d.ts +0 -1
  205. package/dist/components/connect/pk-connect.d.ts.map +1 -1
  206. package/dist/components/connect/pk-connect.js +27 -49
  207. package/dist/components/connect/pk-connect.js.map +1 -1
  208. package/dist/components/copy-button/pk-copy-button.d.ts +17 -2
  209. package/dist/components/copy-button/pk-copy-button.d.ts.map +1 -1
  210. package/dist/components/copy-button/pk-copy-button.js +1 -1
  211. package/dist/components/copy-button/pk-copy-button.styles.d.ts.map +1 -1
  212. package/dist/components/copy-button.js +1 -1
  213. package/dist/components/date-picker/pk-date-picker.js +1 -1
  214. package/dist/components/date-picker.js +1 -1
  215. package/dist/components/dialog/pk-dialog.js +1 -1
  216. package/dist/components/dialog.js +1 -1
  217. package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
  218. package/dist/components/dropdown-menu/pk-dropdown-label.js +1 -1
  219. package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
  220. package/dist/components/dropdown-menu/pk-dropdown-separator.js +1 -1
  221. package/dist/components/dropdown-menu/pk-dropdown-separator.js.map +1 -1
  222. package/dist/components/dropdown-menu.js +3 -3
  223. package/dist/components/editable-table/pk-editable-table.js +1 -1
  224. package/dist/components/editable-table.js +1 -1
  225. package/dist/components/field/pk-field.js +1 -1
  226. package/dist/components/field.js +1 -1
  227. package/dist/components/icon/pk-icon.js +2 -1
  228. package/dist/components/icon/pk-icon.js.map +1 -1
  229. package/dist/components/image-browser/pk-image-browser.js +1 -1
  230. package/dist/components/image-browser.js +1 -1
  231. package/dist/components/input/pk-input.js +1 -1
  232. package/dist/components/input-group/pk-input-group-addon.js +1 -1
  233. package/dist/components/input-group/pk-input-group-button.js +1 -1
  234. package/dist/components/input-group/pk-input-group-input.js +1 -1
  235. package/dist/components/input-group/pk-input-group-text.js +1 -1
  236. package/dist/components/input-group/pk-input-group-textarea.js +1 -1
  237. package/dist/components/input-group/pk-input-group.js +1 -1
  238. package/dist/components/input-group.js +6 -6
  239. package/dist/components/input.js +1 -1
  240. package/dist/components/lightswitch/pk-lightswitch.js +1 -1
  241. package/dist/components/lightswitch.js +1 -1
  242. package/dist/components/popover/pk-popover.js +1 -1
  243. package/dist/components/popover.js +1 -1
  244. package/dist/components/popup/pk-popup.js +1 -1
  245. package/dist/components/popup.js +1 -1
  246. package/dist/components/radio-group/pk-radio-group.js +1 -1
  247. package/dist/components/radio-group/pk-radio.js +1 -1
  248. package/dist/components/radio-group.js +2 -2
  249. package/dist/components/scroll-area/pk-scroll-area.js +1 -1
  250. package/dist/components/scroll-area.js +1 -1
  251. package/dist/components/select/pk-option-group.js +1 -1
  252. package/dist/components/select/pk-option.js +1 -1
  253. package/dist/components/select/pk-select.js +1 -1
  254. package/dist/components/select.js +3 -3
  255. package/dist/components/separator/pk-separator.js +1 -1
  256. package/dist/components/separator.js +1 -1
  257. package/dist/components/spinner/pk-spinner.js +1 -1
  258. package/dist/components/spinner.js +2 -2
  259. package/dist/components/state-panel/index.d.ts +2 -0
  260. package/dist/components/state-panel/index.d.ts.map +1 -0
  261. package/dist/components/state-panel/pk-state-panel.d.ts +89 -0
  262. package/dist/components/state-panel/pk-state-panel.d.ts.map +1 -0
  263. package/dist/components/state-panel/pk-state-panel.js +2 -0
  264. package/dist/components/state-panel/pk-state-panel.styles.d.ts +2 -0
  265. package/dist/components/state-panel/pk-state-panel.styles.d.ts.map +1 -0
  266. package/dist/components/state-panel.d.ts +2 -0
  267. package/dist/components/state-panel.js +2 -0
  268. package/dist/components/status/pk-status.js +1 -1
  269. package/dist/components/status.js +1 -1
  270. package/dist/components/tabs/pk-tab-heading.js +1 -1
  271. package/dist/components/tabs/pk-tab-panel.js +1 -1
  272. package/dist/components/tabs/pk-tab.js +1 -1
  273. package/dist/components/tabs/pk-tabs.js +1 -1
  274. package/dist/components/tabs.js +4 -4
  275. package/dist/components/textarea/pk-textarea.js +1 -1
  276. package/dist/components/textarea.js +1 -1
  277. package/dist/components/time-picker/pk-time-picker.js +1 -1
  278. package/dist/components/time-picker.js +1 -1
  279. package/dist/components/tiptap/pk-tiptap-content.js +1 -1
  280. package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
  281. package/dist/components/tiptap/pk-tiptap-input.js +1 -1
  282. package/dist/components/tiptap-content.js +1 -1
  283. package/dist/components/tiptap-editor.js +1 -1
  284. package/dist/components/tiptap-input.js +1 -1
  285. package/dist/components/toggle/pk-toggle.js +1 -1
  286. package/dist/components/toggle-group/pk-toggle-group.js +1 -1
  287. package/dist/components/toggle-group.js +1 -1
  288. package/dist/components/toggle.js +1 -1
  289. package/dist/components/tooltip/pk-tooltip.js +1 -1
  290. package/dist/components/tooltip.js +1 -1
  291. package/dist/connect/register-cp-connect.d.ts.map +1 -1
  292. package/dist/connect/register-cp-connect.js +8 -9
  293. package/dist/connect/register-cp-connect.js.map +1 -1
  294. package/dist/events/pk-dismiss.d.ts +10 -0
  295. package/dist/events/pk-dismiss.d.ts.map +1 -0
  296. package/dist/icons/index.js +2 -2
  297. package/dist/index.d.ts +3 -0
  298. package/dist/index.d.ts.map +1 -1
  299. package/dist/index.js +74 -67
  300. package/dist/index.js.map +1 -1
  301. package/dist/plugin-kit.css +2 -0
  302. package/dist/plugin-kit.js +4 -4
  303. package/dist/plugin-kit.js.map +1 -1
  304. package/dist/register-components.js +1 -1
  305. package/dist/register-pk.generated.d.ts +4 -0
  306. package/dist/register-pk.generated.d.ts.map +1 -1
  307. package/dist/register.d.ts +5 -1
  308. package/dist/register.d.ts.map +1 -1
  309. package/dist/register.js +124 -55
  310. package/dist/register.js.map +1 -0
  311. package/dist/styles/connect/pk-connect.css +6 -107
  312. package/dist/utilities/fouce.css +2 -0
  313. package/dist-loader/chunks/{button-group-item.styles-CsBQ3Cyh.js → button-group-item.styles-BQbvE3sC.js} +1 -1
  314. package/dist-loader/chunks/{codemirror-CSgOT0QM.js → codemirror-C_TTKlG1.js} +584 -436
  315. package/dist-loader/chunks/editor-CS16rBkM.js +110 -0
  316. package/dist-loader/chunks/{floating-ui-Cj0imr6d.js → floating-ui-BJQPB-Ip.js} +9 -11
  317. package/dist-loader/chunks/{lit-DpLik9Rf.js → lit-B6nFKgbW.js} +127 -89
  318. package/dist-loader/chunks/{option-filter-Bc5aNNT0.js → option-filter-BkKyBg8L.js} +1 -1
  319. package/dist-loader/chunks/{pk-a11y-CjB4-U-R.js → pk-a11y-mGj0G5AE.js} +1 -1
  320. package/dist-loader/chunks/{pk-base-B2MqxErC.js → pk-base-BGegy7-X.js} +2 -2
  321. package/dist-loader/chunks/{pk-button-Dfm23jEC.js → pk-button-DV9Tk5Pd.js} +5 -5
  322. package/dist-loader/chunks/{pk-calendar-BuSULJCU.js → pk-calendar-C0xpIVIw.js} +9 -9
  323. package/dist-loader/chunks/{pk-checkbox-BDoq3xg0.js → pk-checkbox-DhP0iMoP.js} +9 -6
  324. package/dist-loader/chunks/{pk-color-input-eLjO9zfn.js → pk-color-input-B02cYzyr.js} +4 -4
  325. package/dist-loader/chunks/{pk-combobox-DBvcyxRC.js → pk-combobox-S_tpNUHK.js} +19 -18
  326. package/dist-loader/chunks/{pk-connect.styles-k61snd3X.js → pk-connect.styles-B5qe5yQB.js} +1 -1
  327. package/dist-loader/chunks/pk-copy-button-D6tPuhJ3.js +198 -0
  328. package/dist-loader/chunks/{pk-date-picker-CYLpYIji.js → pk-date-picker-C0y4sfSf.js} +15 -15
  329. package/dist-loader/chunks/{pk-dialog-BtrH5Ke0.js → pk-dialog-BJs5fVHS.js} +7 -7
  330. package/dist-loader/chunks/{pk-dropdown-item-D8tfEU-k.js → pk-dropdown-item-Bs5NZDRh.js} +11 -9
  331. package/dist-loader/chunks/{pk-dropdown-label-TbLj4bHK.js → pk-dropdown-label-Cpl9-bzB.js} +2 -2
  332. package/dist-loader/chunks/{pk-dropdown-menu-C4GDW5pE.js → pk-dropdown-menu-CLrfuD3i.js} +20 -17
  333. package/dist-loader/chunks/{pk-field-BM0XD9Ij.js → pk-field-Pg61fxBR.js} +140 -74
  334. package/dist-loader/chunks/{pk-icon-_1F1aL74.js → pk-icon-B7ywfPb6.js} +4 -4
  335. package/dist-loader/chunks/{pk-input-DvBrD7Md.js → pk-input-Cj5s8eBT.js} +10 -10
  336. package/dist-loader/chunks/{pk-lightswitch-CcwlLQ9f.js → pk-lightswitch-rUGB1p8q.js} +6 -6
  337. package/dist-loader/chunks/{pk-option-DATPm0Bo.js → pk-option-B-MeLvZf.js} +8 -7
  338. package/dist-loader/chunks/{pk-popup-CUuGs8r_.js → pk-popup-CeyruJFh.js} +35 -29
  339. package/dist-loader/chunks/{pk-select-DpcvbzUL.js → pk-select-JUx3mxRS.js} +14 -14
  340. package/dist-loader/chunks/{pk-spinner-Dk_LbvHW.js → pk-spinner-B8iuHDQ9.js} +2 -2
  341. package/dist-loader/chunks/pk-state-panel-BhdZGllL.js +600 -0
  342. package/dist-loader/chunks/{pk-status-B8UvjIp2.js → pk-status-D3qVwWlR.js} +2 -2
  343. package/dist-loader/chunks/{pk-textarea-DeSuxufJ.js → pk-textarea-KnpJMQX2.js} +7 -7
  344. package/dist-loader/chunks/{pk-time-picker-DpJt8biN.js → pk-time-picker-DCqZ5z7M.js} +6 -6
  345. package/dist-loader/chunks/{pk-tooltip-DcF9J5GT.js → pk-tooltip-DStkplzy.js} +6 -6
  346. package/dist-loader/chunks/{popup-content-animation.styles-duCg9-CH.js → popup-content-animation.styles-BtUVJg82.js} +1 -1
  347. package/dist-loader/chunks/{render-Bnzcxfss.js → render-D9G_a_c2.js} +1 -1
  348. package/dist-loader/chunks/{svg-Bz-bXZn7.js → svg-BRgqS9vA.js} +8 -1
  349. package/dist-loader/chunks/{sync-listbox-separators-Ch5krDUs.js → sync-listbox-separators-saLEtPpJ.js} +1 -1
  350. package/dist-loader/chunks/{tiptap-CgXkiK8d.js → tiptap-uppXgD5k.js} +16099 -9213
  351. package/dist-loader/chunks/tiptap.styles-CyqI_Wrl.js +896 -0
  352. package/dist-loader/components/alert/alert.js +662 -0
  353. package/dist-loader/components/autocomplete/autocomplete.js +15 -15
  354. package/dist-loader/components/button/button.js +1 -1
  355. package/dist-loader/components/button-group/button-group-separator.js +2 -2
  356. package/dist-loader/components/button-group/button-group-text.js +3 -3
  357. package/dist-loader/components/button-group/button-group.js +9 -7
  358. package/dist-loader/components/calendar/calendar.js +1 -1
  359. package/dist-loader/components/checkbox/checkbox.js +1 -1
  360. package/dist-loader/components/checkbox-select/checkbox-select.js +3 -3
  361. package/dist-loader/components/code-editor/code-editor.js +4 -4
  362. package/dist-loader/components/color-input/color-input.js +1 -1
  363. package/dist-loader/components/combobox/combobox.js +1 -1
  364. package/dist-loader/components/connect/connect-oauth.js +5 -5
  365. package/dist-loader/components/connect/connect.js +28 -51
  366. package/dist-loader/components/copy-button/copy-button.js +1 -176
  367. package/dist-loader/components/date-picker/date-picker.js +1 -1
  368. package/dist-loader/components/dialog/dialog.js +1 -1
  369. package/dist-loader/components/dropdown-menu/dropdown-item.js +1 -1
  370. package/dist-loader/components/dropdown-menu/dropdown-label.js +1 -1
  371. package/dist-loader/components/dropdown-menu/dropdown-menu.js +1 -1
  372. package/dist-loader/components/dropdown-menu/dropdown-separator.js +2 -2
  373. package/dist-loader/components/editable-table/editable-table.js +25 -23
  374. package/dist-loader/components/field/field.js +1 -1
  375. package/dist-loader/components/icon/icon.js +3 -3
  376. package/dist-loader/components/image-browser/image-browser.js +15 -16
  377. package/dist-loader/components/input/input.js +1 -1
  378. package/dist-loader/components/input-group/input-group-addon.js +2 -2
  379. package/dist-loader/components/input-group/input-group-button.js +2 -2
  380. package/dist-loader/components/input-group/input-group-input.js +2 -2
  381. package/dist-loader/components/input-group/input-group-text.js +2 -2
  382. package/dist-loader/components/input-group/input-group-textarea.js +2 -2
  383. package/dist-loader/components/input-group/input-group.js +3 -3
  384. package/dist-loader/components/lightswitch/lightswitch.js +1 -1
  385. package/dist-loader/components/popover/popover.js +9 -9
  386. package/dist-loader/components/popup/popup.js +1 -1
  387. package/dist-loader/components/radio-group/radio-group.js +5 -5
  388. package/dist-loader/components/radio-group/radio.js +2 -2
  389. package/dist-loader/components/scroll-area/scroll-area.js +2 -2
  390. package/dist-loader/components/select/option-group.js +3 -3
  391. package/dist-loader/components/select/option.js +1 -1
  392. package/dist-loader/components/select/select.js +1 -1
  393. package/dist-loader/components/separator/separator.js +2 -2
  394. package/dist-loader/components/spinner/spinner.js +1 -1
  395. package/dist-loader/components/state-panel/state-panel.js +2 -0
  396. package/dist-loader/components/status/status.js +1 -1
  397. package/dist-loader/components/tabs/tab-heading.js +2 -2
  398. package/dist-loader/components/tabs/tab-panel.js +2 -2
  399. package/dist-loader/components/tabs/tab.js +2 -2
  400. package/dist-loader/components/tabs/tabs.js +9 -7
  401. package/dist-loader/components/textarea/textarea.js +1 -1
  402. package/dist-loader/components/time-picker/time-picker.js +1 -1
  403. package/dist-loader/components/tiptap/tiptap-content.js +5 -4
  404. package/dist-loader/components/tiptap/tiptap-editor.js +595 -21
  405. package/dist-loader/components/tiptap/tiptap-input.js +273 -5
  406. package/dist-loader/components/toggle/toggle.js +3 -3
  407. package/dist-loader/components/toggle-group/toggle-group.js +6 -4
  408. package/dist-loader/components/tooltip/tooltip.js +1 -1
  409. package/dist-loader/plugin-kit.css +2 -0
  410. package/dist-loader/plugin-kit.loader.js +6 -1
  411. package/dist-loader/styles/connect/pk-connect.css +6 -107
  412. package/dist-loader/utilities/fouce.css +2 -0
  413. package/package.json +49 -9
  414. package/dist/chunks/component-registry-D34fm8xW.js.map +0 -1
  415. package/dist/chunks/pk-autocomplete-qy2Psvqm.js.map +0 -1
  416. package/dist/chunks/pk-button-BrH4u4Qr.js.map +0 -1
  417. package/dist/chunks/pk-button-group-BSz5T5iS.js.map +0 -1
  418. package/dist/chunks/pk-button-group-separator-DH3Rl24b.js.map +0 -1
  419. package/dist/chunks/pk-button-group-text-Qro_KmZb.js.map +0 -1
  420. package/dist/chunks/pk-calendar-Z7Y0PjeY.js.map +0 -1
  421. package/dist/chunks/pk-checkbox-13ArHSmt.js.map +0 -1
  422. package/dist/chunks/pk-checkbox-select-Ckvfbu83.js.map +0 -1
  423. package/dist/chunks/pk-code-editor-BlG6O5qB.js.map +0 -1
  424. package/dist/chunks/pk-color-input-BRgQ5-vB.js.map +0 -1
  425. package/dist/chunks/pk-combobox-ag89QEX2.js.map +0 -1
  426. package/dist/chunks/pk-copy-button-BVaOLtYG.js.map +0 -1
  427. package/dist/chunks/pk-date-picker-C2YvDPNm.js.map +0 -1
  428. package/dist/chunks/pk-dialog-VMQqLW1f.js.map +0 -1
  429. package/dist/chunks/pk-dropdown-item-D9OaG5o-.js.map +0 -1
  430. package/dist/chunks/pk-dropdown-label-CRNWMWQd.js.map +0 -1
  431. package/dist/chunks/pk-dropdown-menu-DW1wI8xQ.js.map +0 -1
  432. package/dist/chunks/pk-editable-table-DDnu1I8Y.js.map +0 -1
  433. package/dist/chunks/pk-field-UAlMq6mQ.js.map +0 -1
  434. package/dist/chunks/pk-form-associated-element-GxX5lbnk.js.map +0 -1
  435. package/dist/chunks/pk-image-browser-Bj8LhWfk.js.map +0 -1
  436. package/dist/chunks/pk-input-BywmK5n2.js.map +0 -1
  437. package/dist/chunks/pk-input-group-BLqKPnfc.js.map +0 -1
  438. package/dist/chunks/pk-input-group-addon-ClBkGmAw.js.map +0 -1
  439. package/dist/chunks/pk-input-group-button-CHQHsWd4.js.map +0 -1
  440. package/dist/chunks/pk-input-group-input-oNnqMBGU.js.map +0 -1
  441. package/dist/chunks/pk-input-group-text-HUxlXROB.js.map +0 -1
  442. package/dist/chunks/pk-input-group-textarea-Cl2FNuw-.js.map +0 -1
  443. package/dist/chunks/pk-lightswitch-VHfJizBW.js.map +0 -1
  444. package/dist/chunks/pk-option-DQZHV9jL.js.map +0 -1
  445. package/dist/chunks/pk-option-group-CCzJkBFp.js.map +0 -1
  446. package/dist/chunks/pk-popover-D3jkHfwB.js.map +0 -1
  447. package/dist/chunks/pk-popup-B65tZMQH.js.map +0 -1
  448. package/dist/chunks/pk-radio-B5XkMHy3.js.map +0 -1
  449. package/dist/chunks/pk-radio-group-Dzd-3HaQ.js.map +0 -1
  450. package/dist/chunks/pk-scroll-area-CdfNxYz8.js.map +0 -1
  451. package/dist/chunks/pk-select-b5S5WKc-.js.map +0 -1
  452. package/dist/chunks/pk-separator-N-VyjYE6.js.map +0 -1
  453. package/dist/chunks/pk-spinner-DweuYJ_Z.js.map +0 -1
  454. package/dist/chunks/pk-status-BehQARDv.js.map +0 -1
  455. package/dist/chunks/pk-tab-CTloD18e.js.map +0 -1
  456. package/dist/chunks/pk-tab-heading-Cjcgebxn.js.map +0 -1
  457. package/dist/chunks/pk-tab-panel-CkKU5-Ah.js.map +0 -1
  458. package/dist/chunks/pk-tabs-BgEBki1q.js.map +0 -1
  459. package/dist/chunks/pk-textarea-Dhj1WFLH.js.map +0 -1
  460. package/dist/chunks/pk-time-picker-ChRbKHNB.js.map +0 -1
  461. package/dist/chunks/pk-tiptap-content-CL8smjGi.js.map +0 -1
  462. package/dist/chunks/pk-tiptap-editor-BMwedkPt.js.map +0 -1
  463. package/dist/chunks/pk-tiptap-input-YKg4VLp_.js.map +0 -1
  464. package/dist/chunks/pk-toggle-BthhH7vl.js.map +0 -1
  465. package/dist/chunks/pk-toggle-group-D2Quux8D.js.map +0 -1
  466. package/dist/chunks/pk-tooltip--QBV6puX.js.map +0 -1
  467. package/dist/chunks/register-BqkU5JNH.js +0 -148
  468. package/dist/chunks/register-BqkU5JNH.js.map +0 -1
  469. package/dist-loader/chunks/rolldown-runtime-CzwdidQP.js +0 -13
  470. package/dist-loader/chunks/supports-popover-COjbi2RP.js +0 -5
  471. package/dist-loader/chunks/tiptap.styles-C0E1NpSx.js +0 -1848
  472. /package/dist-loader/chunks/{animate-with-class-DT0jwaR_.js → animate-with-class-CjTZI0NU.js} +0 -0
  473. /package/dist-loader/chunks/{field-labels-D3lKQ2nq.js → field-labels-pY-gQDwQ.js} +0 -0
  474. /package/dist-loader/chunks/{has-slot-BGJeJdHr.js → has-slot-DJv86HKx.js} +0 -0
  475. /package/dist-loader/chunks/{mirror-validator-C5XrXPaq.js → mirror-validator-BkZlEv1Z.js} +0 -0
  476. /package/dist-loader/chunks/{overlay-lifecycle-C3tSQ3UR.js → overlay-lifecycle-C582MGBJ.js} +0 -0
  477. /package/dist-loader/chunks/{pk-clear-BMZUzwDt.js → pk-clear-DHxP_2cm.js} +0 -0
  478. /package/dist-loader/chunks/{popup-placement-animation-WlEXnS85.js → popup-placement-animation-ClUYI79z.js} +0 -0
  479. /package/dist-loader/chunks/{popup-pointer-Ck28WdVP.js → popup-pointer-Bh_d205v.js} +0 -0
  480. /package/dist-loader/chunks/{registry-BanyScVR.js → registry-CJc164pT.js} +0 -0
  481. /package/dist-loader/chunks/{required-validator-0XwZtX9k.js → required-validator-I58oJGZ3.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-tabs-BgEBki1q.js","names":[],"sources":["../../src/components/tabs/pk-tabs.styles.ts","../../src/components/tabs/pk-tabs.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Variant tokens are defined on `pk-tabs` and inherited by slotted\n * `pk-tab` / `pk-tab-panel` shadow roots (custom properties pierce shadow DOM).\n */\nexport const pkTabsStyles = css`\n @layer pk-component {\n :host {\n display: block;\n max-width: 100%;\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n /* Frame chrome on the host (matches v1 PaneTabs root) so consumer\n * overflow utilities on the host do not clip the pane shadow. */\n border-radius: var(--pk-tabs-root-radius);\n box-shadow: var(--pk-tabs-root-shadow);\n overflow: var(--pk-tabs-root-overflow);\n\n /* Root */\n --pk-tabs-root-gap: 0.75rem;\n --pk-tabs-root-height: auto;\n --pk-tabs-root-radius: 0;\n --pk-tabs-root-shadow: none;\n --pk-tabs-root-overflow: visible;\n\n /* List */\n --pk-tabs-list-display: inline-flex;\n --pk-tabs-list-width: fit-content;\n --pk-tabs-list-align-self: flex-start;\n --pk-tabs-list-align-items: center;\n --pk-tabs-list-padding: 2px;\n --pk-tabs-list-border-width: 1px;\n --pk-tabs-list-border-color: var(--pk-color-gray-150);\n --pk-tabs-list-border-bottom: var(--pk-tabs-list-border-width) solid var(--pk-tabs-list-border-color);\n --pk-tabs-list-radius: var(--pk-radius-md);\n --pk-tabs-list-bg: color-mix(in oklab, var(--pk-color-gray-100) 90%, transparent);\n --pk-tabs-list-shadow: 0 1px 2px rgba(31, 41, 51, 0.06);\n /* Transparent no-op — keyword none in a multi-shadow list invalidates the whole property. */\n --pk-tabs-list-inset-shadow: 0 0 #0000;\n --pk-tabs-list-color: var(--pk-color-gray-500);\n --pk-tabs-list-overflow-x: auto;\n --pk-tabs-list-overflow-y: visible;\n\n /* Trigger (inherited by pk-tab) */\n --pk-tabs-trigger-display: inline-flex;\n --pk-tabs-trigger-justify: center;\n --pk-tabs-trigger-width: auto;\n --pk-tabs-trigger-gap: 0.5rem;\n --pk-tabs-trigger-min-height: 2rem;\n --pk-tabs-trigger-padding-block: 0.375rem;\n --pk-tabs-trigger-padding-inline: 0.75rem;\n --pk-tabs-trigger-radius: var(--pk-radius-sm);\n --pk-tabs-trigger-color: inherit;\n --pk-tabs-trigger-font-size: 13px;\n --pk-tabs-trigger-font-weight: 400;\n --pk-tabs-trigger-text-align: center;\n --pk-tabs-trigger-text-transform: none;\n --pk-tabs-trigger-border-top: 0 solid transparent;\n --pk-tabs-trigger-hover-bg: rgb(255 255 255 / 0.7);\n --pk-tabs-trigger-hover-color: var(--pk-color-gray-700);\n --pk-tabs-trigger-selected-hover-bg: var(--pk-tabs-trigger-selected-bg, var(--pk-color-white));\n --pk-tabs-trigger-selected-hover-color: var(--pk-tabs-trigger-selected-color, var(--pk-color-gray-800));\n --pk-tabs-trigger-selected-bg: var(--pk-color-white);\n --pk-tabs-trigger-selected-color: var(--pk-color-gray-800);\n --pk-tabs-trigger-selected-shadow: 0 1px 2px rgba(31, 41, 51, 0.12);\n --pk-tabs-trigger-selected-radius: var(--pk-radius-sm);\n --pk-tabs-trigger-selected-border-top: 0 solid transparent;\n --pk-tabs-trigger-underline-height: 0;\n --pk-tabs-trigger-underline-inset: 15px;\n --pk-tabs-trigger-label-flex: 0 1 auto;\n --pk-tabs-trigger-icon-size: 1.125rem;\n --pk-tabs-trigger-icon-color: inherit;\n --pk-tabs-trigger-status-margin: 0;\n --pk-tabs-trigger-status-color: inherit;\n\n /* Group headings (pk-tab-heading) */\n --pk-tabs-heading-padding: 0.75rem 0.5rem 0.375rem;\n --pk-tabs-heading-color: var(--pk-color-gray-400);\n --pk-tabs-heading-font-size: 11px;\n --pk-tabs-heading-font-weight: 600;\n --pk-tabs-heading-letter-spacing: 0.04em;\n --pk-tabs-heading-text-transform: uppercase;\n\n /* Panel (inherited by pk-tab-panel) */\n --pk-tabs-panel-flex: none;\n --pk-tabs-panel-min-height: 0;\n --pk-tabs-panel-padding: 0;\n --pk-tabs-panel-bg: transparent;\n --pk-tabs-panel-radius: 0;\n --pk-tabs-panel-font-size: var(--pk-font-size-base);\n }\n\n :host([variant='pane']),\n :host([variant='modal']),\n :host([variant='sidebar']) {\n height: 100%;\n min-height: 0;\n --pk-tabs-root-height: 100%;\n }\n\n .tabs {\n display: flex;\n flex-direction: column;\n gap: var(--pk-tabs-root-gap);\n height: var(--pk-tabs-root-height);\n min-height: 0;\n /* Radius/shadow/overflow live on :host — keep the layout shell fill-only. */\n }\n\n .tabs[data-placement='bottom'] {\n flex-direction: column-reverse;\n }\n\n .tabs[data-placement='start'],\n .tabs[data-placement='end'] {\n flex-direction: row;\n align-items: flex-start;\n gap: 1rem;\n }\n\n .tabs[data-placement='end'] {\n flex-direction: row-reverse;\n }\n\n .tabs[data-placement='start'] .list,\n .tabs[data-placement='end'] .list {\n flex-direction: column;\n align-self: stretch;\n }\n\n .list {\n display: var(--pk-tabs-list-display);\n width: var(--pk-tabs-list-width);\n max-width: 100%;\n align-self: var(--pk-tabs-list-align-self);\n align-items: var(--pk-tabs-list-align-items);\n justify-content: flex-start;\n /* Tab strip must not shrink when panels flex-fill the column — otherwise\n * overflow-y clips trigger padding and the modal active underline. */\n flex-shrink: 0;\n position: relative;\n z-index: var(--pk-tabs-list-z-index, auto);\n isolation: isolate;\n padding: var(--pk-tabs-list-padding);\n border: var(--pk-tabs-list-border-width) solid var(--pk-tabs-list-border-color);\n border-bottom: var(--pk-tabs-list-border-bottom, var(--pk-tabs-list-border-width) solid var(--pk-tabs-list-border-color));\n border-radius: var(--pk-tabs-list-radius);\n background: var(--pk-tabs-list-bg);\n box-shadow: var(--pk-tabs-list-shadow), var(--pk-tabs-list-inset-shadow);\n color: var(--pk-tabs-list-color);\n overflow-x: var(--pk-tabs-list-overflow-x, auto);\n overflow-y: var(--pk-tabs-list-overflow-y, visible);\n }\n\n /* Pane — matches plugin-kit-react PaneTabs */\n :host([variant='pane']) {\n --pk-tabs-root-gap: 0;\n --pk-tabs-root-radius: var(--pk-radius-lg);\n --pk-tabs-root-shadow:\n 0 0 0 1px var(--pk-color-gray-200),\n 0 2px 12px rgb(205 216 228 / 50%);\n --pk-tabs-root-overflow: visible;\n\n --pk-tabs-list-display: flex;\n --pk-tabs-list-width: auto;\n --pk-tabs-list-align-self: stretch;\n --pk-tabs-list-align-items: flex-end;\n --pk-tabs-list-padding: 0;\n --pk-tabs-list-border-width: 0;\n --pk-tabs-list-radius: var(--pk-radius-lg) var(--pk-radius-lg) 0 0;\n --pk-tabs-list-bg: var(--pk-color-gray-50);\n /* Must not use keyword none — box-shadow: none, inset … is invalid and drops the hairline. */\n --pk-tabs-list-shadow: inset 0 -1px 0 0 rgb(154 165 177 / 25%);\n --pk-tabs-list-inset-shadow: 0 0 #0000;\n --pk-tabs-list-overflow-x: auto;\n --pk-tabs-list-overflow-y: visible;\n\n --pk-tabs-trigger-display: flex;\n --pk-tabs-trigger-justify: flex-start;\n --pk-tabs-trigger-min-height: 45px;\n --pk-tabs-trigger-padding-block: 0;\n --pk-tabs-trigger-padding-inline: 24px;\n --pk-tabs-trigger-radius: 0;\n --pk-tabs-trigger-border-top: 0 solid transparent;\n --pk-tabs-trigger-color: var(--pk-color-gray-550);\n --pk-tabs-trigger-font-size: var(--pk-font-size-base);\n --pk-tabs-trigger-font-weight: 400;\n --pk-tabs-trigger-hover-bg: var(--pk-color-slate-100);\n --pk-tabs-trigger-hover-color: var(--pk-color-gray-550);\n --pk-tabs-trigger-selected-bg: var(--pk-color-white);\n --pk-tabs-trigger-selected-color: var(--pk-color-gray-700);\n --pk-tabs-trigger-selected-border-top: 0 solid transparent;\n /* Match Craft .pane-tabs [role=tab].sel — inset top accent + elevation. */\n --pk-tabs-trigger-selected-shadow:\n inset 0 2px 0 var(--pk-color-gray-500),\n 0 0 0 1px rgb(51 64 77 / 10%),\n 0 2px 12px rgb(205 216 228 / 90%);\n --pk-tabs-trigger-selected-radius: 2px 2px 0 0;\n\n /* 0% basis — panel fills leftover height and scrolls; auto basis grew with\n * content and clipped under dialog overflow:hidden (Edit Buttons Appearance). */\n --pk-tabs-panel-flex: 1 1 0%;\n --pk-tabs-panel-min-height: 0;\n /*\n * No built-in panel inset — matches v1 PaneTabsContent (padding came from\n * the consumer: ReportTabPanel / FormBuilderTabContent / DefaultsPanel p-6).\n * A non-zero value here double-pads those surfaces.\n */\n --pk-tabs-panel-padding: 0;\n --pk-tabs-panel-bg: var(--pk-color-white);\n --pk-tabs-panel-radius: 0 0 var(--pk-radius-lg) var(--pk-radius-lg);\n --pk-tabs-panel-font-size: var(--pk-font-size-sm, 14px);\n }\n\n /* Craft bumps the first tab start corner to --radius-lg so the inset\n * accent follows the pane radius instead of reading as clipped at 2px.\n */\n :host([variant='pane']) ::slotted(pk-tab:first-child) {\n --pk-tabs-trigger-selected-radius: var(--pk-radius-lg) 2px 0 0;\n }\n\n /* Modal — matches plugin-kit-react ModalTabs */\n :host([variant='modal']) {\n --pk-tabs-root-gap: 0;\n --pk-tabs-root-height: 100%;\n /* Dialog already rounds the panel — host radius + overflow clips the\n * first tab’s focus ring into a one-corner “rounded border”. */\n --pk-tabs-root-radius: 0;\n /* Clip to the height chain so panels scroll inside, not through the footer. */\n --pk-tabs-root-overflow: hidden;\n\n --pk-tabs-list-display: flex;\n --pk-tabs-list-width: 100%;\n --pk-tabs-list-align-self: stretch;\n --pk-tabs-list-align-items: stretch;\n --pk-tabs-list-padding: 0;\n --pk-tabs-list-border-width: 0;\n --pk-tabs-list-border-bottom: 1px solid var(--pk-color-gray-100);\n --pk-tabs-list-radius: 0;\n --pk-tabs-list-bg: var(--pk-color-white);\n --pk-tabs-list-shadow: 0 1px 5px #cdd8e440;\n /* Transparent no-op — keyword none in a multi-shadow list invalidates the whole property. */\n --pk-tabs-list-inset-shadow: 0 0 #0000;\n --pk-tabs-list-color: inherit;\n --pk-tabs-list-overflow-x: auto;\n /* auto (not hidden): overflow-x:auto + overflow-y:hidden clips ~1 device\n * pixel of the bottom active underline, so the 2px sky bar reads as 1px. */\n --pk-tabs-list-overflow-y: auto;\n /* v1 ModalTabsList z-11 — keep the strip above scrolling panel content\n * (editable-table action columns, etc.) when body/panel scrolls. */\n --pk-tabs-list-z-index: 11;\n\n --pk-tabs-trigger-display: inline-flex;\n --pk-tabs-trigger-justify: center;\n --pk-tabs-trigger-min-height: auto;\n --pk-tabs-trigger-padding-block: 15px;\n --pk-tabs-trigger-padding-inline: 15px;\n --pk-tabs-trigger-radius: 0;\n --pk-tabs-trigger-color: #64788d;\n --pk-tabs-trigger-font-size: 12px;\n --pk-tabs-trigger-font-weight: 500;\n --pk-tabs-trigger-text-transform: uppercase;\n --pk-tabs-trigger-hover-bg: transparent;\n --pk-tabs-trigger-hover-color: var(--pk-color-sky-600);\n --pk-tabs-trigger-selected-bg: transparent;\n --pk-tabs-trigger-selected-color: #64788d;\n --pk-tabs-trigger-selected-hover-bg: transparent;\n --pk-tabs-trigger-selected-hover-color: var(--pk-color-sky-600);\n /* Active (mouse) = 15px-inset underline. Active + :focus-visible = screen3 box. */\n --pk-tabs-trigger-selected-shadow: none;\n --pk-tabs-trigger-selected-radius: 0;\n --pk-tabs-trigger-underline-height: 2px;\n --pk-tabs-trigger-underline-inset: 15px;\n --pk-tabs-trigger-focus-selected-shadow: inset 0 0 0 2px var(--pk-color-sky-600);\n --pk-tabs-trigger-focus-selected-underline-height: 0;\n\n /* 0% basis — panel fills leftover height and scrolls; auto basis grew with\n * content and clipped under dialog overflow:hidden (Edit Buttons Appearance). */\n --pk-tabs-panel-flex: 1 1 0%;\n --pk-tabs-panel-min-height: 0;\n --pk-tabs-panel-padding: 1rem;\n --pk-tabs-panel-bg: transparent;\n --pk-tabs-panel-radius: 0;\n --pk-tabs-panel-font-size: var(--pk-font-size-sm, 14px);\n }\n\n /* Sidebar — vertical nav list with optional icons, status, and headings */\n :host([variant='sidebar']) {\n --pk-tabs-root-gap: 0;\n --pk-tabs-root-radius: 0;\n --pk-tabs-root-shadow: none;\n --pk-tabs-root-overflow: visible;\n\n --pk-tabs-list-display: flex;\n --pk-tabs-list-width: var(--pk-tabs-sidebar-width, 14rem);\n --pk-tabs-list-align-self: stretch;\n --pk-tabs-list-align-items: stretch;\n --pk-tabs-list-padding: 0.5rem;\n --pk-tabs-list-border-width: 0;\n --pk-tabs-list-border-bottom: 0 solid transparent;\n --pk-tabs-list-radius: 0;\n --pk-tabs-list-bg: var(--pk-color-gray-100);\n --pk-tabs-list-shadow: 0 0 #0000;\n --pk-tabs-list-inset-shadow: 0 0 #0000;\n --pk-tabs-list-color: var(--pk-color-gray-600);\n --pk-tabs-list-overflow-x: hidden;\n --pk-tabs-list-overflow-y: auto;\n\n --pk-tabs-trigger-display: flex;\n --pk-tabs-trigger-justify: flex-start;\n --pk-tabs-trigger-width: 100%;\n /* Match Craft/Formie integrations nav: padding 7px 10px, 16px icons, content-sized height. */\n --pk-tabs-trigger-gap: 10px;\n --pk-tabs-trigger-min-height: 0;\n --pk-tabs-trigger-padding-block: 7px;\n --pk-tabs-trigger-padding-inline: 10px;\n --pk-tabs-trigger-radius: var(--pk-radius-md);\n --pk-tabs-trigger-color: var(--pk-color-gray-700);\n --pk-tabs-trigger-font-size: 13px;\n --pk-tabs-trigger-font-weight: 400;\n --pk-tabs-trigger-line-height: 1.2;\n --pk-tabs-trigger-text-align: start;\n --pk-tabs-trigger-text-transform: none;\n --pk-tabs-trigger-border-top: 0 solid transparent;\n --pk-tabs-trigger-hover-bg: color-mix(in oklab, var(--pk-color-gray-200) 70%, transparent);\n --pk-tabs-trigger-hover-color: var(--pk-color-gray-800);\n --pk-tabs-trigger-selected-bg: var(--pk-color-gray-500);\n --pk-tabs-trigger-selected-color: var(--pk-color-white);\n --pk-tabs-trigger-selected-hover-bg: var(--pk-color-gray-500);\n --pk-tabs-trigger-selected-hover-color: var(--pk-color-white);\n --pk-tabs-trigger-selected-shadow: none;\n --pk-tabs-trigger-selected-radius: var(--pk-radius-md);\n --pk-tabs-trigger-selected-border-top: 0 solid transparent;\n --pk-tabs-trigger-underline-height: 0;\n --pk-tabs-trigger-label-flex: 1 1 auto;\n --pk-tabs-trigger-icon-size: 16px;\n --pk-tabs-trigger-status-margin: auto;\n --pk-tabs-trigger-status-color: var(--pk-color-gray-400);\n\n --pk-tabs-heading-padding: 14px 10px 5px;\n --pk-tabs-heading-color: var(--pk-color-gray-400);\n --pk-tabs-heading-font-size: 11px;\n --pk-tabs-heading-font-weight: 600;\n --pk-tabs-heading-letter-spacing: 0.04em;\n --pk-tabs-heading-text-transform: uppercase;\n\n /* 0% basis — panel fills leftover height and scrolls; auto basis grew with\n * content and clipped under dialog overflow:hidden (Edit Buttons Appearance). */\n --pk-tabs-panel-flex: 1 1 0%;\n --pk-tabs-panel-min-height: 0;\n --pk-tabs-panel-padding: 1.25rem;\n --pk-tabs-panel-bg: var(--pk-color-white);\n --pk-tabs-panel-radius: 0;\n --pk-tabs-panel-font-size: var(--pk-font-size-base);\n }\n\n :host([variant='sidebar']) .tabs {\n flex-direction: row;\n align-items: stretch;\n gap: 0;\n }\n\n :host([variant='sidebar']) .tabs[data-placement='end'] {\n flex-direction: row-reverse;\n }\n\n :host([variant='sidebar']) .list {\n flex-direction: column;\n gap: 0.125rem;\n flex: none;\n }\n\n :host([variant='sidebar']) ::slotted(pk-tab) {\n display: block;\n width: 100%;\n }\n\n :host([variant='sidebar']) ::slotted(pk-tab-heading) {\n display: block;\n width: 100%;\n }\n\n /* First group heading sits closer to the list top edge */\n :host([variant='sidebar']) ::slotted(pk-tab-heading:first-child) {\n --pk-tabs-heading-padding: 10px 10px 5px;\n }\n\n /* Hollow inactive dots read better on the selected dark pill */\n :host([variant='sidebar']) ::slotted(pk-tab[selected]) {\n --pk-tabs-trigger-status-color: var(--pk-color-gray-300);\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { uniqueId } from '../../a11y/focus.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport type { PkTabBase } from './pk-tab-base.js';\nimport type { PkTabPanelBase } from './pk-tab-panel-base.js';\nimport { pkTabsStyles } from './pk-tabs.styles.js';\n\nexport type PkTabsVariant = 'default' | 'pane' | 'modal' | 'sidebar';\nexport type PkTabsOrientation = 'horizontal' | 'vertical';\nexport type PkTabsPlacement = 'top' | 'bottom' | 'start' | 'end';\nexport type PkTabsActivation = 'auto' | 'manual';\n\n/**\n * Tab group — coordinates slotted `pk-tab` (nav) and `pk-tab-panel` children.\n *\n * @slot nav - `pk-tab` triggers and optional `pk-tab-heading` group labels\n * @slot - `pk-tab-panel` content panels\n *\n * @event pk-change - Active tab changed.\n * @event pk-tab-show - A tab panel became visible.\n * @event pk-tab-hide - A tab panel became hidden.\n *\n * @csspart base - Root container\n * @csspart list - Tab list\n */\n@customElement('pk-tabs')\nexport class PkTabs extends PkElement {\n static override styles = pkTabsStyles;\n\n @property()\n value = '';\n\n /** Visual style — `default` (segmented), `pane`, `modal`, or `sidebar` (vertical nav). */\n @property({ reflect: true })\n variant: PkTabsVariant = 'default';\n\n @property({ reflect: true })\n orientation: PkTabsOrientation = 'horizontal';\n\n @property({ reflect: true })\n placement: PkTabsPlacement = 'top';\n\n /**\n * `manual` — arrow keys move focus only; Enter/Space activates (Base UI default).\n * `auto` — arrow keys activate tabs immediately.\n */\n @property({ reflect: true })\n activation: PkTabsActivation = 'manual';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n private readonly baseId = uniqueId('pk-tabs');\n\n @state()\n private tabs: PkTabBase[] = [];\n\n @state()\n private panels: PkTabPanelBase[] = [];\n\n @state()\n private focusedValue = '';\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('pk-tab-select', this.handleTabSelect as EventListener);\n this.addEventListener('pk-tab-keydown', this.handleTabKeyDown as EventListener);\n }\n\n override disconnectedCallback(): void {\n this.removeEventListener('pk-tab-select', this.handleTabSelect as EventListener);\n this.removeEventListener('pk-tab-keydown', this.handleTabKeyDown as EventListener);\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') || changed.has('disabled') || changed.has('activation')) {\n if (changed.has('value')) {\n this.focusedValue = this.value;\n }\n\n this.applySelection();\n }\n }\n\n private syncTabs = (): void => {\n const slot = this.shadowRoot?.querySelector('slot[name=\"nav\"]') as HTMLSlotElement | null;\n\n if (!slot) {\n return;\n }\n\n this.tabs = slot.assignedElements({ flatten: true }).filter(\n (element) => element.tagName === 'PK-TAB',\n ) as PkTabBase[];\n\n this.ensureDefaultValue();\n this.applySelection();\n };\n\n private syncPanels = (): void => {\n const slot = this.shadowRoot?.querySelector('slot:not([name])') as HTMLSlotElement | null;\n\n if (!slot) {\n return;\n }\n\n this.panels = slot.assignedElements({ flatten: true }).filter(\n (element) => element.tagName === 'PK-TAB-PANEL',\n ) as PkTabPanelBase[];\n\n this.applySelection();\n };\n\n private ensureDefaultValue(): void {\n if (this.value || this.tabs.length === 0) {\n return;\n }\n\n const firstEnabled = this.tabs.find((tab) => !tab.disabled && !this.disabled);\n\n if (firstEnabled) {\n this.value = firstEnabled.value;\n this.focusedValue = this.value;\n }\n }\n\n private getEnabledTabs(): PkTabBase[] {\n return this.tabs.filter((tab) => !tab.disabled && !this.disabled);\n }\n\n /**\n * Sidebar is inherently a vertical nav list. Layout CSS and keyboard arrows\n * both follow this effective orientation so consumers can omit the attrs.\n */\n private getEffectiveOrientation(): PkTabsOrientation {\n return this.variant === 'sidebar' ? 'vertical' : this.orientation;\n }\n\n private getEffectivePlacement(): PkTabsPlacement {\n if (this.variant === 'sidebar') {\n return this.placement === 'top' || this.placement === 'bottom' ? 'start' : this.placement;\n }\n\n return this.placement;\n }\n\n private applySelection(): void {\n const previousValue = this.getAttribute('data-current-value') ?? '';\n const focusTarget = this.activation === 'manual' ? this.focusedValue : this.value;\n\n for (const tab of this.tabs) {\n const selected = tab.value === this.value;\n const tabId = `${this.baseId}-tab-${tab.value}`;\n const panelId = `${this.baseId}-panel-${tab.value}`;\n\n tab.selected = selected;\n tab.disabled = this.disabled || tab.hasAttribute('disabled');\n tab.focusIndex = tab.value === focusTarget ? 0 : -1;\n tab.panelId = panelId;\n tab.id = tabId;\n }\n\n for (const panel of this.panels) {\n const selected = panel.value === this.value;\n const tabId = `${this.baseId}-tab-${panel.value}`;\n const panelId = `${this.baseId}-panel-${panel.value}`;\n\n if (panel.hidden !== !selected) {\n if (selected) {\n this.dispatchEvent(new CustomEvent('pk-tab-show', {\n detail: { value: panel.value },\n bubbles: true,\n composed: true,\n }));\n } else if (previousValue === panel.value) {\n this.dispatchEvent(new CustomEvent('pk-tab-hide', {\n detail: { value: panel.value },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n panel.hidden = !selected;\n panel.tabId = tabId;\n panel.id = panelId;\n }\n\n this.setAttribute('data-current-value', this.value);\n }\n\n /**\n * `pk-tab-select` / `pk-tab-keydown` bubble + compose out of nested tab groups\n * (e.g. modal tabs inside a pane). Only own nav-slot tabs may drive this instance.\n */\n private isOwnTabEvent(event: Event): boolean {\n const target = event.target;\n\n return target instanceof HTMLElement\n && target.tagName === 'PK-TAB'\n && this.tabs.includes(target as PkTabBase);\n }\n\n private handleTabSelect = (event: CustomEvent<{ value: string }>): void => {\n if (!this.isOwnTabEvent(event) || this.disabled) {\n return;\n }\n\n // Nested groups stop here so ancestor `pk-tabs` never adopt foreign values.\n event.stopPropagation();\n\n const { value } = event.detail;\n\n if (value === this.value && this.activation === 'manual') {\n this.focusedValue = value;\n this.applySelection();\n return;\n }\n\n if (value === this.value) {\n return;\n }\n\n this.selectTab(value);\n };\n\n private selectTab(value: string): void {\n this.value = value;\n this.focusedValue = value;\n this.applySelection();\n\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n private handleTabKeyDown = (event: CustomEvent<{ event: KeyboardEvent; value: string }>): void => {\n if (!this.isOwnTabEvent(event)) {\n return;\n }\n\n event.stopPropagation();\n\n const keyboardEvent = event.detail.event;\n const enabled = this.getEnabledTabs();\n\n if (enabled.length === 0) {\n return;\n }\n\n const currentIndex = enabled.findIndex((tab) => tab.value === event.detail.value);\n\n if (currentIndex < 0) {\n return;\n }\n\n let nextIndex = currentIndex;\n const isHorizontal = this.getEffectiveOrientation() === 'horizontal';\n\n switch (keyboardEvent.key) {\n case 'ArrowDown':\n if (isHorizontal) {\n return;\n }\n keyboardEvent.preventDefault();\n nextIndex = currentIndex >= enabled.length - 1 ? 0 : currentIndex + 1;\n break;\n\n case 'ArrowUp':\n if (isHorizontal) {\n return;\n }\n keyboardEvent.preventDefault();\n nextIndex = currentIndex <= 0 ? enabled.length - 1 : currentIndex - 1;\n break;\n\n case 'ArrowRight':\n if (!isHorizontal) {\n return;\n }\n keyboardEvent.preventDefault();\n nextIndex = currentIndex >= enabled.length - 1 ? 0 : currentIndex + 1;\n break;\n\n case 'ArrowLeft':\n if (!isHorizontal) {\n return;\n }\n keyboardEvent.preventDefault();\n nextIndex = currentIndex <= 0 ? enabled.length - 1 : currentIndex - 1;\n break;\n\n case 'Home':\n keyboardEvent.preventDefault();\n nextIndex = 0;\n break;\n\n case 'End':\n keyboardEvent.preventDefault();\n nextIndex = enabled.length - 1;\n break;\n\n default:\n return;\n }\n\n const next = enabled[nextIndex];\n\n if (!next) {\n return;\n }\n\n if (this.activation === 'auto') {\n if (next.value !== this.value) {\n this.selectTab(next.value);\n } else {\n next.focusControl();\n }\n } else {\n this.focusedValue = next.value;\n this.applySelection();\n next.focusControl();\n }\n };\n\n override render() {\n const orientation = this.getEffectiveOrientation();\n const placement = this.getEffectivePlacement();\n\n return html`\n <div part=\"base\" class=\"tabs pk-tabs\" data-placement=${placement}>\n <div\n part=\"list\"\n class=\"list pk-tabs__list\"\n role=\"tablist\"\n aria-orientation=${orientation}\n aria-label=${this.ariaLabel ?? nothing}\n @slotchange=${this.syncTabs}\n >\n <slot name=\"nav\"></slot>\n </div>\n <slot @slotchange=${this.syncPanels}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tabs': PkTabs;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-textarea-Dhj1WFLH.js","names":[],"sources":["../../src/components/textarea/pk-textarea.styles.ts","../../src/components/textarea/pk-textarea.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkTextareaStyles = css`\n @layer pk-component {\n :host {\n display: block;\n width: 100%;\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n }\n\n .textarea {\n display: block;\n width: 100%;\n min-height: 5rem;\n margin: 0;\n padding: 7px 10px;\n border: var(--pk-input-border);\n border-radius: var(--pk-textarea-border-radius, var(--pk-radius-md));\n background: var(--pk-input-bg);\n background-clip: padding-box;\n /* Craft CP body / field value text. */\n color: var(--pk-color-gray-700);\n font: inherit;\n line-height: 1.4;\n resize: vertical;\n appearance: none;\n box-sizing: border-box;\n outline: none;\n transition: border-color 0.12s ease, box-shadow 0.12s ease;\n }\n\n .textarea::placeholder {\n color: var(--pk-input-placeholder-color, var(--pk-color-gray-400));\n }\n\n /* Craft: focus is box-shadow only — do not also flip border-color (double ring). */\n :host(:not([invalid]):not(:state(user-invalid))) .textarea:focus,\n :host(:not([invalid]):not(:state(user-invalid))) .textarea:focus-visible,\n :host([data-state='focus-visible']:not([invalid]):not(:state(user-invalid))) .textarea {\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n .textarea:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--pk-color-gray-50);\n }\n\n :host([invalid]) .textarea,\n :host(:state(user-invalid)) .textarea {\n border-color: var(--pk-color-rose-600);\n }\n\n :host([invalid]) .textarea:focus,\n :host([invalid]) .textarea:focus-visible,\n :host([invalid][data-state='focus-visible']) .textarea,\n :host(:state(user-invalid)) .textarea:focus,\n :host(:state(user-invalid)) .textarea:focus-visible {\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n /* Editable-table cells (v1): flush into the row and fill cell height.\n * Chain height through form-control — percentage on .textarea alone\n * doesn't resolve when the wrapper sizes to content (rows / min-height). */\n :host([fit-cell]),\n :host([data-editable-table-input]) {\n display: block;\n height: 100%;\n min-height: 100%;\n box-sizing: border-box;\n overflow: hidden;\n }\n\n :host([fit-cell]) .form-control,\n :host([data-editable-table-input]) .form-control {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 100%;\n }\n\n :host([fit-cell]) .textarea,\n :host([data-editable-table-input]) .textarea {\n flex: 1 1 auto;\n border: none;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n height: 100%;\n min-height: 0;\n max-height: 100%;\n /* Match text-cell inset (v1 py-1.5 / px-2). 0.5rem block padding +\n * line-height 1.4 overflows the 34px et cell and shows a scrollbar\n * even for empty / single-line notes. */\n padding: 0.375rem 0.5rem;\n line-height: 1.25;\n overflow-x: hidden;\n overflow-y: auto;\n resize: none;\n }\n\n :host([fit-cell]:not([invalid]):not(:state(user-invalid))) .textarea:focus,\n :host([fit-cell]:not([invalid]):not(:state(user-invalid))) .textarea:focus-visible,\n :host([fit-cell][data-state='focus-visible']:not([invalid]):not(:state(user-invalid))) .textarea,\n :host([data-editable-table-input]:not([invalid]):not(:state(user-invalid))) .textarea:focus,\n :host([data-editable-table-input]:not([invalid]):not(:state(user-invalid))) .textarea:focus-visible,\n :host([data-editable-table-input][data-state='focus-visible']:not([invalid]):not(:state(user-invalid))) .textarea {\n border: none;\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200);\n }\n\n :host([fit-cell][invalid]) .textarea,\n :host([fit-cell]:state(user-invalid)) .textarea,\n :host([fit-cell][invalid]) .textarea:focus,\n :host([fit-cell][invalid]) .textarea:focus-visible,\n :host([fit-cell]:state(user-invalid)) .textarea:focus,\n :host([fit-cell]:state(user-invalid)) .textarea:focus-visible,\n :host([data-editable-table-input][invalid]) .textarea,\n :host([data-editable-table-input]:state(user-invalid)) .textarea,\n :host([data-editable-table-input][invalid]) .textarea:focus,\n :host([data-editable-table-input][invalid]) .textarea:focus-visible,\n :host([data-editable-table-input]:state(user-invalid)) .textarea:focus,\n :host([data-editable-table-input]:state(user-invalid)) .textarea:focus-visible {\n border: none;\n box-shadow: inset 0 0 0 1px var(--pk-color-rose-600);\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { formControlStyles } from '../../base/form-control.styles.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { HasSlotController } from '../../internal/has-slot.js';\nimport { syncStandaloneControlAria } from '../../internal/control-aria.js';\nimport { hasInstructionContent, readLegacyInstructions } from '../../internal/field-labels.js';\nimport { MirrorValidator, RequiredValidator } from '../../validators/index.js';\nimport { pkTextareaStyles } from './pk-textarea.styles.js';\n\nexport type PkTextareaSize = 'default' | 'sm';\n\n/**\n * Multiline text field — API, Craft visuals.\n *\n * @slot label\n * @slot instructions\n * @slot hint - Alias for `instructions`\n *\n * @csspart form-control - Wrapper\n * @csspart label - Label\n * @csspart instructions - Instructions\n * @csspart textarea - Native textarea\n */\n@customElement('pk-textarea')\nexport class PkTextarea extends PkFormAssociatedElement {\n static override styles = [formControlStyles, pkTextareaStyles];\n\n static override get validators() {\n return [...super.validators, MirrorValidator(), RequiredValidator()];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n private readonly hasSlotController = new HasSlotController(this, 'instructions', 'hint', 'label');\n\n private readonly controlId = uniqueId('pk-textarea');\n\n @query('textarea')\n override input!: HTMLTextAreaElement;\n\n @property()\n placeholder = '';\n\n private _value: string | null = null;\n\n get value(): string {\n if (this.valueHasChanged) {\n return this._value ?? '';\n }\n\n return this._value ?? this.defaultValue ?? '';\n }\n\n @state()\n set value(val: string | null) {\n const next = val ?? '';\n\n if (this._value === next) {\n return;\n }\n\n this.valueHasChanged = true;\n this._value = next;\n }\n\n @property({ attribute: 'value', reflect: true })\n defaultValue: string | null = null;\n\n @property({ reflect: true })\n size: PkTextareaSize = 'default';\n\n @property()\n label = '';\n\n @property()\n instructions = '';\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n /** Flush + fill parent cell (editable tables). */\n @property({ type: Boolean, reflect: true, attribute: 'fit-cell' })\n fitCell = false;\n\n /** Native `rows` — use `1` in table cells so intrinsic height doesn't overflow. */\n @property({ type: Number })\n rows?: number;\n\n @property({ type: Number, attribute: 'max-length' })\n maxlength?: number;\n\n @property({ attribute: 'with-label', type: Boolean })\n withLabel = false;\n\n @property({ attribute: 'with-instructions', type: Boolean })\n withInstructions = false;\n\n override connectedCallback(): void {\n this.instructions = readLegacyInstructions(this, this.instructions);\n\n if (this.hasAttribute('with-hint')) {\n this.withInstructions = true;\n }\n\n super.connectedCallback();\n }\n\n protected override syncFormValue(): void {\n this.setValue(this.value || '');\n }\n\n protected override resetToDefaultValue(): void {\n this.valueHasChanged = false;\n this._value = null;\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.value = state;\n }\n }\n\n override formResetCallback(): void {\n this.valueHasChanged = false;\n this._value = null;\n\n if (this.input) {\n this.input.value = this.defaultValue ?? '';\n }\n\n super.formResetCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') || changed.has('defaultValue')) {\n this.setState('blank', !this.value);\n }\n\n super.updated(changed);\n }\n\n protected override syncStandaloneAria(): void {\n if (!this.input) {\n return;\n }\n\n const hasLabel = this.hasLabelContent();\n const hasInstructions = this.hasInstructionsContent();\n\n syncStandaloneControlAria({\n control: this.input,\n labelId: `${this.controlId}-label`,\n instructionsId: `${this.controlId}-instructions`,\n hasLabel,\n hasInstructions,\n required: this.required,\n invalid: this.invalid || !this.internals.validity.valid,\n });\n }\n\n private hasLabelContent(): boolean {\n return Boolean(this.label) || this.hasSlotController.test('label', this.withLabel);\n }\n\n private hasInstructionsContent(): boolean {\n return hasInstructionContent(\n (name, flag) => this.hasSlotController.test(name, flag),\n this.instructions,\n this.withInstructions,\n );\n }\n\n focus(options?: FocusOptions): void {\n this.input?.focus(options);\n }\n\n blur(): void {\n this.input?.blur();\n }\n\n private handleInput(): void {\n this.value = this.input.value;\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n }\n\n private handleChange(event: Event): void {\n this.value = this.input.value;\n event.stopPropagation();\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n override render() {\n const hasLabel = this.hasLabelContent();\n const hasInstructions = this.hasInstructionsContent();\n\n return html`\n <div part=\"form-control\" class=\"form-control\">\n ${hasLabel\n ? html`\n <label\n part=\"label\"\n class=\"form-control__label\"\n id=${`${this.controlId}-label`}\n for=${`${this.controlId}-control`}\n >\n <slot name=\"label\">${this.label}</slot>\n </label>\n `\n : nothing}\n\n ${hasInstructions\n ? html`\n <p\n part=\"instructions\"\n class=\"form-control__instructions\"\n id=${`${this.controlId}-instructions`}\n >\n <slot name=\"instructions\">${this.instructions}</slot>\n <slot name=\"hint\"></slot>\n </p>\n `\n : nothing}\n\n <textarea\n part=\"textarea\"\n class=\"textarea\"\n id=${hasLabel ? `${this.controlId}-control` : nothing}\n rows=${ifDefined(this.fitCell ? (this.rows ?? 1) : this.rows)}\n .value=${live(this.value)}\n placeholder=${this.placeholder || nothing}\n maxlength=${ifDefined(this.maxlength)}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n @input=${this.handleInput}\n @change=${this.handleChange}\n @focus=${() => this.dispatchEvent(new Event('focus', { bubbles: true, composed: true }))}\n @blur=${() => this.dispatchEvent(new Event('blur', { bubbles: true, composed: true }))}\n ></textarea>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-textarea': PkTextarea;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-time-picker-ChRbKHNB.js","names":[],"sources":["../../src/utils/time-options.ts","../../src/components/time-picker/pk-time-picker.styles.ts","../../src/components/time-picker/pk-time-picker.ts"],"sourcesContent":["export type TimeOption = {\n value: string;\n label: string;\n};\n\nexport type TimepickerFormatOptions = {\n timeFormat?: string;\n lang?: {\n AM?: string;\n PM?: string;\n };\n locale?: string;\n};\n\nlet timeOptionsCache: TimeOption[] | null = null;\n\nfunction resolveTimepickerOptions(): Required<Pick<TimepickerFormatOptions, 'timeFormat' | 'lang'>> & { locale: string } {\n const craft = (globalThis as typeof globalThis & {\n Craft?: { timepicker?: TimepickerFormatOptions };\n }).Craft?.timepicker;\n\n return {\n timeFormat: craft?.timeFormat || 'g:i A',\n lang: {\n AM: craft?.lang?.AM || 'AM',\n PM: craft?.lang?.PM || 'PM',\n },\n locale: craft?.locale || document.documentElement.lang || 'en-US',\n };\n}\n\n/** Generate time options in 30-minute increments — mirrors React `generateTimeOptions`. */\nexport function generateTimeOptions(): TimeOption[] {\n if (timeOptionsCache) {\n return timeOptionsCache;\n }\n\n const options: TimeOption[] = [];\n const { timeFormat, lang, locale } = resolveTimepickerOptions();\n\n for (let hour = 0; hour < 24; hour += 1) {\n for (let minute = 0; minute < 60; minute += 30) {\n const timeString = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;\n\n let displayTime: string;\n\n if (timeFormat === 'g:i A') {\n let displayHour = hour;\n\n if (hour === 0) {\n displayHour = 12;\n } else if (hour > 12) {\n displayHour = hour - 12;\n }\n\n const ampm = hour >= 12 ? lang.PM : lang.AM;\n displayTime = `${displayHour}:${minute.toString().padStart(2, '0')} ${ampm}`;\n } else if (timeFormat === 'G:i') {\n displayTime = timeString;\n } else {\n displayTime = new Date(`2000-01-01T${timeString}:00`).toLocaleTimeString(locale, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: timeFormat.includes('A'),\n });\n }\n\n options.push({\n value: timeString,\n label: displayTime,\n });\n }\n }\n\n timeOptionsCache = options;\n\n return options;\n}\n\nexport function clearTimeOptionsCache(): void {\n timeOptionsCache = null;\n}\n","import { css } from 'lit';\n\nexport const pkTimePickerStyles = css`\n @layer pk-component {\n :host {\n display: inline-block;\n width: 8.125rem;\n min-width: 8.125rem;\n color: var(--pk-color-gray-700);\n --pk-select-trigger-border-width: 1px;\n --pk-select-item-min-height: 2.125rem;\n --pk-select-item-padding-block: 0;\n --pk-select-item-padding-inline: 10px;\n --pk-select-item-font-size: var(--pk-font-size-base);\n }\n\n .control {\n justify-content: flex-start;\n gap: 0.5rem;\n width: 100%;\n height: 2.125rem;\n min-height: 2.125rem;\n border-color: var(--pk-color-slate-400) !important;\n border-radius: var(--pk-radius-lg) !important;\n background: transparent !important;\n background-color: transparent !important;\n text-align: left;\n font-weight: 400;\n line-height: 1.2;\n cursor: default;\n }\n\n :host([open]) .control {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host(:not([disabled])) .control:hover:not(:disabled) {\n background: var(--pk-color-slate-50) !important;\n background-color: var(--pk-color-slate-50) !important;\n }\n\n :host(:not([disabled])[open]) .control:hover:not(:disabled),\n :host(:not([disabled])) .control:active:not(:disabled) {\n background: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n background-color: var(--pk-color-slate-150, var(--pk-color-slate-100)) !important;\n }\n\n :host(:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border-color: var(--pk-color-sky-600) !important;\n box-shadow: var(--pk-input-focus-shadow);\n }\n\n :host(:not([invalid]):not(:state(user-invalid))[open]) .control:focus-visible,\n :host(:not([invalid]):not(:state(user-invalid))[open][data-state='focus-visible']) .control {\n border-color: var(--pk-color-slate-400) !important;\n box-shadow: none;\n }\n\n :host([invalid]) .control,\n :host(:state(user-invalid)) .control {\n border-color: var(--pk-color-rose-600) !important;\n }\n\n :host([invalid]) .control:focus-visible,\n :host([invalid][data-state='focus-visible']) .control,\n :host(:state(user-invalid)) .control:focus-visible,\n :host(:state(user-invalid)[data-state='focus-visible']) .control {\n box-shadow: var(--pk-input-invalid-focus-shadow);\n }\n\n .control-start {\n color: var(--pk-color-gray-400);\n pointer-events: none;\n }\n\n .control-start svg {\n display: block;\n width: 14px;\n height: 14px;\n }\n\n .value {\n flex: 1;\n line-height: 1.2;\n color: inherit;\n }\n\n .value.is-placeholder {\n color: var(--pk-color-gray-400);\n }\n\n .icon {\n margin-inline-start: auto;\n color: var(--pk-color-gray-600);\n }\n\n .panel {\n min-width: 8rem;\n max-height: 15rem;\n }\n\n /* Editable-table cells: flush fill — must live here so !important beats the\n * standalone trigger chrome (external ::part cannot override it). */\n :host(.cell-pk-control) {\n display: block;\n width: 100%;\n min-width: 0;\n height: 100%;\n --pk-select-trigger-border-width: 0;\n --pk-select-item-min-height: 100%;\n --pk-select-item-padding-block: 0;\n }\n\n :host(.cell-pk-control) .control {\n width: 100%;\n height: 100% !important;\n min-height: 100% !important;\n border: 0 !important;\n border-radius: 0 !important;\n background: transparent !important;\n background-color: transparent !important;\n }\n\n :host(.cell-pk-control:not([disabled])) .control:hover:not(:disabled),\n :host(.cell-pk-control[open]) .control,\n :host(.cell-pk-control:not([disabled])[open]) .control:hover:not(:disabled),\n :host(.cell-pk-control:not([disabled])) .control:active:not(:disabled) {\n border-radius: 0 !important;\n }\n\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))) .control:focus-visible,\n :host(.cell-pk-control:not([invalid]):not(:state(user-invalid))[data-state='focus-visible']) .control {\n border: 0 !important;\n box-shadow: inset 0 0 0 1px var(--pk-color-gray-200, #e5e7eb);\n }\n }\n`;\n","import { customElement } from '../../decorators.js';\n\nimport { createIconElement, clock } from '../../icons/index.js';\nimport { PkSelect } from '../select/pk-select.js';\n// Time picker seeds light-DOM options at connect — register the CE so getLabel() works.\nimport '../select/pk-option.js';\nimport { pkSelectStyles } from '../select/pk-select.styles.js';\nimport { generateTimeOptions } from '../../utils/time-options.js';\nimport { pkTimePickerStyles } from './pk-time-picker.styles.js';\n\n/**\n * Time picker — select wrapper with 30-minute increments and a clock icon.\n * Mirrors React `TimePicker` (not `pk-time-input`).\n *\n * @slot start - Overrides the default clock icon\n * @slot - Additional `pk-option` items append after the generated list\n *\n * @event input\n * @event change\n * @event pk-change - `detail.value`\n */\n@customElement('pk-time-picker')\nexport class PkTimePicker extends PkSelect {\n // Flatten — `pkSelectStyles` is already a CSSResult[].\n static override styles = [...pkSelectStyles, pkTimePickerStyles];\n\n private optionsSeeded = false;\n\n override connectedCallback(): void {\n this.ensureTimeOptions();\n this.ensureClockIcon();\n super.connectedCallback();\n }\n\n private ensureTimeOptions(): void {\n if (this.optionsSeeded || this.querySelector('pk-option')) {\n this.optionsSeeded = true;\n return;\n }\n\n for (const option of generateTimeOptions()) {\n const element = document.createElement('pk-option');\n element.value = option.value;\n element.textContent = option.label;\n this.append(element);\n }\n\n this.optionsSeeded = true;\n }\n\n private ensureClockIcon(): void {\n if (this.querySelector('[slot=\"start\"]')) {\n return;\n }\n\n const icon = createIconElement(clock);\n icon.setAttribute('slot', 'start');\n this.prepend(icon);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-time-picker': PkTimePicker;\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAI,mBAAwC;AAE5C,SAAS,2BAAgH;CACrH,MAAM,QAAS,WAEZ,OAAO;AAEV,QAAO;EACH,YAAY,OAAO,cAAc;EACjC,MAAM;GACF,IAAI,OAAO,MAAM,MAAM;GACvB,IAAI,OAAO,MAAM,MAAM;GAC1B;EACD,QAAQ,OAAO,UAAU,SAAS,gBAAgB,QAAQ;EAC7D;;;AAIL,SAAgB,sBAAoC;AAChD,KAAI,iBACA,QAAO;CAGX,MAAM,UAAwB,EAAE;CAChC,MAAM,EAAE,YAAY,MAAM,WAAW,0BAA0B;AAE/D,MAAK,IAAI,OAAO,GAAG,OAAO,IAAI,QAAQ,EAClC,MAAK,IAAI,SAAS,GAAG,SAAS,IAAI,UAAU,IAAI;EAC5C,MAAM,aAAa,GAAG,KAAK,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI;EAE5F,IAAI;AAEJ,MAAI,eAAe,SAAS;GACxB,IAAI,cAAc;AAElB,OAAI,SAAS,EACT,eAAc;YACP,OAAO,GACd,eAAc,OAAO;GAGzB,MAAM,OAAO,QAAQ,KAAK,KAAK,KAAK,KAAK;AACzC,iBAAc,GAAG,YAAY,GAAG,OAAO,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;aAC/D,eAAe,MACtB,eAAc;MAEd,gCAAc,IAAI,KAAK,cAAc,WAAW,KAAK,EAAC,mBAAmB,QAAQ;GAC7E,MAAM;GACN,QAAQ;GACR,QAAQ,WAAW,SAAS,IAAI;GACnC,CAAC;AAGN,UAAQ,KAAK;GACT,OAAO;GACP,OAAO;GACV,CAAC;;AAIV,oBAAmB;AAEnB,QAAO;;;;AC1EX,IAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoB9B,IAAA,eAAA,MAAM,qBAAqB,SAAS;;;uBAIf;;;gBAFC,CAAC,GAAG,gBAAgB,mBAAmB;;CAIhE,oBAAmC;AAC/B,OAAK,mBAAmB;AACxB,OAAK,iBAAiB;AACtB,QAAM,mBAAmB;;CAG7B,oBAAkC;AAC9B,MAAI,KAAK,iBAAiB,KAAK,cAAc,YAAY,EAAE;AACvD,QAAK,gBAAgB;AACrB;;AAGJ,OAAK,MAAM,UAAU,qBAAqB,EAAE;GACxC,MAAM,UAAU,SAAS,cAAc,YAAY;AACnD,WAAQ,QAAQ,OAAO;AACvB,WAAQ,cAAc,OAAO;AAC7B,QAAK,OAAO,QAAQ;;AAGxB,OAAK,gBAAgB;;CAGzB,kBAAgC;AAC5B,MAAI,KAAK,cAAc,mBAAiB,CACpC;EAGJ,MAAM,OAAO,kBAAkB,cAAA,MAAM;AACrC,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,QAAQ,KAAK;;;2BApCzB,cAAc,iBAAiB,CAAA,EAAA,aAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-tiptap-content-CL8smjGi.js","names":[],"sources":["../../src/components/tiptap/pk-tiptap-content.styles.ts","../../src/components/tiptap/pk-tiptap-content.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkTiptapContentStyles = css`\n @layer pk-component {\n :host {\n display: block;\n width: 100%;\n /* Inherit light-DOM color/size (warning banners, badges). Tokens override when set. */\n color: var(--pk-tiptap-content-color, inherit);\n font-family: var(--pk-font-family);\n font-size: var(--pk-tiptap-content-font-size, inherit);\n line-height: var(--pk-tiptap-content-line-height, 1.4);\n }\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property, query } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\nimport { Editor } from '@tiptap/core';\nimport {\n createTiptapExtensions,\n valueToContent,\n} from '@verbb/plugin-kit-tiptap-core';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { createVariableTagDomNodeView } from './variable-tag-node-view.js';\nimport { pkTiptapContentStyles } from './pk-tiptap-content.styles.js';\nimport { tiptapContentProseMirrorStyles } from './tiptap.styles.js';\n\nfunction serializeContent(doc: ReturnType<typeof valueToContent>): string {\n if (!doc) {\n return '[]';\n }\n\n if (Array.isArray(doc.content)) {\n return JSON.stringify(doc.content);\n }\n\n return JSON.stringify(doc);\n}\n\n/**\n * Read-only TipTap / ProseMirror renderer.\n *\n * Pass the same `value` shapes as TiptapEditor: node array, doc object, or JSON string.\n */\n@customElement('pk-tiptap-content')\nexport class PkTiptapContent extends PkElement {\n static override styles = [pkTiptapContentStyles, tiptapContentProseMirrorStyles];\n\n @query('.editor-mount')\n private editorMount!: HTMLDivElement;\n\n private editor: Editor | null = null;\n\n @property({ attribute: 'value' })\n value = '';\n\n override disconnectedCallback(): void {\n this.editor?.destroy();\n this.editor = null;\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') && this.editor) {\n this.syncContent();\n }\n\n super.updated(changed);\n }\n\n override firstUpdated(): void {\n this.mountEditor();\n }\n\n private mountEditor(): void {\n this.editor = new Editor({\n element: this.editorMount,\n extensions: createTiptapExtensions({\n variableTagNodeView: createVariableTagDomNodeView(),\n surface: 'content',\n }),\n content: valueToContent(this.value),\n editable: false,\n });\n }\n\n private syncContent(): void {\n if (!this.editor) {\n return;\n }\n\n const doc = valueToContent(this.value) ?? { type: 'doc', content: [] };\n const incoming = serializeContent(valueToContent(this.value));\n const current = serializeContent(this.editor.getJSON() as ReturnType<typeof valueToContent>);\n\n if (incoming === current) {\n return;\n }\n\n this.editor.commands.setContent(doc);\n }\n\n override render() {\n return html`<div class=\"editor-mount\" part=\"content\"></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tiptap-content': PkTiptapContent;\n }\n}\n"],"mappings":";;;;;;AAEA,IAAa,wBAAwB,GAAG;;;;;;;;;;;;;;;ACYxC,SAAS,iBAAiB,KAAgD;AACtE,KAAI,CAAC,IACD,QAAO;AAGX,KAAI,MAAM,QAAQ,IAAI,QAAQ,CAC1B,QAAO,KAAK,UAAU,IAAI,QAAQ;AAGtC,QAAO,KAAK,UAAU,IAAI;;AASvB,IAAA,kBAAA,MAAM,wBAAwB,UAAU;;;gBAMX;eAGxB;;;gBARiB,CAAC,uBAAuB,+BAA+B;;CAUhF,uBAAsC;AAClC,OAAK,QAAQ,SAAS;AACtB,OAAK,SAAS;AACd,QAAM,sBAAsB;;CAGhC,QAAiB,SAA+B;AAC5C,MAAI,QAAQ,IAAI,QAAQ,IAAI,KAAK,OAC7B,MAAK,aAAa;AAGtB,QAAM,QAAQ,QAAQ;;CAG1B,eAA8B;AAC1B,OAAK,aAAa;;CAGtB,cAA4B;AACxB,OAAK,SAAS,IAAI,OAAO;GACrB,SAAS,KAAK;GACd,YAAY,uBAAuB;IAC/B,qBAAqB,8BAA8B;IACnD,SAAS;IACZ,CAAC;GACF,SAAS,eAAe,KAAK,MAAM;GACnC,UAAU;GACb,CAAC;;CAGN,cAA4B;AACxB,MAAI,CAAC,KAAK,OACN;EAGJ,MAAM,MAAM,eAAe,KAAK,MAAM,IAAI;GAAE,MAAM;GAAO,SAAS,EAAE;GAAE;AAItE,MAHiB,iBAAiB,eAAe,KAAK,MAAM,CAGxD,KAFY,iBAAiB,KAAK,OAAO,SAAS,CAErC,CACb;AAGJ,OAAK,OAAO,SAAS,WAAW,IAAI;;CAGxC,SAAkB;AACd,SAAO,IAAI;;;YAvDd,MAAM,gBAAgB,CAAA,EAAA,gBAAA,WAAA,eAAA,KAAA,EAAA;YAKtB,SAAS,EAAE,WAAW,SAAS,CAAC,CAAA,EAAA,gBAAA,WAAA,SAAA,KAAA,EAAA;8BATpC,cAAc,oBAAoB,CAAA,EAAA,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-tiptap-editor-BMwedkPt.js","names":[],"sources":["../../src/components/tiptap/tiptap-editor-host.ts","../../src/components/tiptap/tiptap-utils.ts","../../src/components/tiptap/tiptap-toolbar.ts","../../src/components/tiptap/pk-tiptap-editor.styles.ts","../../src/components/tiptap/pk-tiptap-editor.ts"],"sourcesContent":["import { Editor, type Extensions } from '@tiptap/core';\nimport {\n createTiptapExtensions,\n normalizeContentArray,\n valueToContent,\n} from '@verbb/plugin-kit-tiptap-core';\n\nexport function serializeTiptapDocumentContent(content: unknown): string {\n return JSON.stringify(normalizeContentArray(content));\n}\n\n/** Normalize React/HTML `value` into the JSON string the editor stores and emits. */\nexport function serializeTiptapDocumentValue(raw: string | unknown[] | null | undefined): string {\n if (raw == null) {\n return '[]';\n }\n\n if (typeof raw === 'string') {\n return raw;\n }\n\n if (Array.isArray(raw)) {\n return JSON.stringify(raw);\n }\n\n return '[]';\n}\n\nexport function parseTiptapDocumentValue(raw: string | unknown[] | null | undefined): unknown[] {\n if (raw == null || raw === '') {\n return [];\n }\n\n // React often passes a document array prop — accept it without JSON.parse.\n if (Array.isArray(raw)) {\n return raw;\n }\n\n if (typeof raw !== 'string') {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport type TiptapEditorHostOptions = {\n element: HTMLElement;\n extensions?: Extensions;\n content: unknown;\n editable: boolean;\n trailingCursorText?: string;\n minHeight?: string;\n onUpdate?: (content: unknown[]) => void;\n};\n\nexport class TiptapEditorHost {\n editor: Editor | null = null;\n\n private lastEmitted: string | null = null;\n\n /** Skip TipTap `onUpdate` while applying controlled prop content — otherwise setContent\n * re-emits pk-change → React setValue → value prop → setContent … forever. */\n private suppressUpdateEmission = false;\n\n mount({\n element,\n extensions,\n content,\n editable,\n trailingCursorText = '\\u2060',\n minHeight,\n onUpdate,\n }: TiptapEditorHostOptions): void {\n const doc = valueToContent(content, { trailingCursorText });\n\n this.editor = new Editor({\n element,\n extensions: extensions ?? createTiptapExtensions({ trailingCursorText }),\n content: doc,\n editable,\n onUpdate: ({ editor }) => {\n const normalized = normalizeContentArray(editor.getJSON().content);\n const serialized = JSON.stringify(normalized);\n this.lastEmitted = serialized;\n\n if (this.suppressUpdateEmission) {\n return;\n }\n\n onUpdate?.(normalized);\n },\n });\n\n if (minHeight) {\n this.editor.view.dom.style.minHeight = minHeight;\n }\n }\n\n setContent(content: unknown, options: { trailingCursorText?: string; respectFocus?: boolean } = {}): void {\n if (!this.editor) {\n return;\n }\n\n const { trailingCursorText = '\\u2060', respectFocus = true } = options;\n\n if (respectFocus && this.editor.isFocused) {\n return;\n }\n\n const doc = valueToContent(content, { trailingCursorText });\n const incoming = JSON.stringify(doc?.content ?? []);\n const current = JSON.stringify(this.editor.getJSON().content ?? []);\n\n if (incoming === current || incoming === this.lastEmitted) {\n return;\n }\n\n this.suppressUpdateEmission = true;\n try {\n this.editor.commands.setContent(doc ?? { type: 'doc', content: [] });\n } finally {\n this.suppressUpdateEmission = false;\n }\n }\n\n destroy(): void {\n this.editor?.destroy();\n this.editor = null;\n this.lastEmitted = null;\n this.suppressUpdateEmission = false;\n }\n}\n","import type {\n ElementSelectorHost,\n LinkOptionsInput,\n ToolbarNode,\n} from '@verbb/plugin-kit-tiptap-core';\nimport { parseToolbarConfig } from '@verbb/plugin-kit-tiptap-core';\n\ndeclare global {\n interface Window {\n Craft?: {\n createElementSelectorModal?: ElementSelectorHost['openElementSelector'];\n };\n }\n}\n\nexport function createCraftElementSelectorHost(): ElementSelectorHost {\n return {\n openElementSelector: (elementType, options) => {\n const craft = window.Craft;\n\n if (!craft?.createElementSelectorModal) {\n throw new Error('Craft element selector is not available in this environment.');\n }\n\n // Craft reads its selector registry through `this`, so preserve the global as receiver.\n craft.createElementSelectorModal(elementType, options);\n },\n };\n}\n\nexport function parseLinkOptionsAttribute(raw: string | null): LinkOptionsInput | undefined {\n if (!raw) {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as LinkOptionsInput;\n } catch {\n return undefined;\n }\n}\n\nexport function parseButtonsAttribute(raw: string | null | undefined): string[] {\n if (!raw) {\n return ['bold', 'italic'];\n }\n\n return raw\n .split(',')\n .map((button) => button.trim())\n .filter(Boolean);\n}\n\nexport function parseToolbarAttribute(\n toolbarRaw: string | ToolbarNode[] | null | undefined,\n buttonsRaw: string | string[] | null | undefined,\n): ToolbarNode[] {\n if (Array.isArray(toolbarRaw)) {\n return parseToolbarConfig(toolbarRaw);\n }\n\n if (typeof toolbarRaw === 'string' && toolbarRaw.trim()) {\n return parseToolbarConfig(toolbarRaw);\n }\n\n if (Array.isArray(buttonsRaw)) {\n return parseToolbarConfig(buttonsRaw.join(','));\n }\n\n return parseToolbarConfig(buttonsRaw ?? 'bold,italic');\n}\n","import { getRegisteredTiptapToolbarControl } from '@verbb/plugin-kit-tiptap-core';\n\nimport {\n alignCenter,\n alignJustify,\n alignLeft,\n alignRight,\n arrowRotateLeft,\n arrowRotateRight,\n bold,\n bracketsCurly,\n chevronDown,\n code,\n fileDashedLine,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heading,\n highlighter,\n italic,\n link,\n listOl,\n listUl,\n minus,\n paragraph,\n quoteRight,\n smallCaps,\n strikethrough,\n subscript,\n superscript,\n table,\n textSlash,\n underline,\n renderIconHtml,\n} from '../../icons/index.js';\n\nexport const TOOLBAR_CHEVRON_HTML = renderIconHtml(chevronDown);\n\nexport const TOOLBAR_ICONS: Record<string, string> = {\n bold: renderIconHtml(bold),\n italic: renderIconHtml(italic),\n underline: renderIconHtml(underline),\n strikethrough: renderIconHtml(strikethrough),\n subscript: renderIconHtml(subscript),\n superscript: renderIconHtml(superscript),\n 'small-caps': renderIconHtml(smallCaps),\n code: renderIconHtml(bracketsCurly),\n 'code-block': renderIconHtml(code),\n highlight: renderIconHtml(highlighter),\n h1: renderIconHtml(h1),\n h2: renderIconHtml(h2),\n h3: renderIconHtml(h3),\n h4: renderIconHtml(h4),\n h5: renderIconHtml(h5),\n h6: renderIconHtml(h6),\n heading: renderIconHtml(heading),\n paragraph: renderIconHtml(paragraph),\n 'unordered-list': renderIconHtml(listUl),\n 'ordered-list': renderIconHtml(listOl),\n blockquote: renderIconHtml(quoteRight),\n 'align-left': renderIconHtml(alignLeft),\n 'align-center': renderIconHtml(alignCenter),\n 'align-right': renderIconHtml(alignRight),\n 'align-justify': renderIconHtml(alignJustify),\n 'clear-format': renderIconHtml(textSlash),\n hr: renderIconHtml(minus),\n 'line-break': renderIconHtml(fileDashedLine),\n link: renderIconHtml(link),\n table: renderIconHtml(table),\n undo: renderIconHtml(arrowRotateLeft),\n redo: renderIconHtml(arrowRotateRight),\n};\n\nexport const TOOLBAR_LABELS: Record<string, string> = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n 'small-caps': 'Small caps',\n 'font-family': 'Font family',\n 'font-size': 'Font size',\n 'text-color': 'Text and background color',\n 'line-height': 'Line height',\n code: 'Inline code',\n 'code-block': 'Code block',\n highlight: 'Highlight',\n h1: 'Heading 1',\n h2: 'Heading 2',\n h3: 'Heading 3',\n h4: 'Heading 4',\n h5: 'Heading 5',\n h6: 'Heading 6',\n paragraph: 'Paragraph',\n 'unordered-list': 'Bullet list',\n 'ordered-list': 'Numbered list',\n blockquote: 'Blockquote',\n 'align-left': 'Align left',\n 'align-center': 'Align center',\n 'align-right': 'Align right',\n 'align-justify': 'Justify',\n 'clear-format': 'Clear format',\n hr: 'Horizontal rule',\n 'line-break': 'Line break',\n link: 'Link',\n table: 'Table',\n undo: 'Undo',\n redo: 'Redo',\n};\n\nexport function getToolbarMenuItemLabel(buttonName: string): string {\n return TOOLBAR_LABELS[buttonName]\n ?? getRegisteredTiptapToolbarControl(buttonName)?.label\n ?? buttonName;\n}\n\nexport function getToolbarButtonIcon(buttonName: string): string | undefined {\n const registeredIcon = getRegisteredTiptapToolbarControl(buttonName)?.icon;\n\n return TOOLBAR_ICONS[buttonName]\n ?? (registeredIcon ? renderIconHtml(registeredIcon) : undefined);\n}\n\n/** Prefix icon for `pk-dropdown-item` — SVG must carry `slot=\"prefix\"` directly. */\nexport function createToolbarPrefixIcon(buttonName: string): SVGSVGElement | null {\n const iconHtml = getToolbarButtonIcon(buttonName);\n\n if (!iconHtml) {\n return null;\n }\n\n const template = document.createElement('template');\n template.innerHTML = iconHtml.trim();\n const icon = template.content.firstElementChild;\n\n if (!(icon instanceof SVGSVGElement)) {\n return null;\n }\n\n icon.setAttribute('slot', 'prefix');\n icon.setAttribute('aria-hidden', 'true');\n icon.setAttribute('width', '12');\n icon.setAttribute('height', '12');\n icon.classList.add('pk-dropdown-item__prefix-icon');\n\n return icon;\n}\n","import { css } from 'lit';\n\nexport const pkTiptapEditorStyles = css`\n @layer pk-component {\n :host {\n display: block;\n width: 100%;\n font-family: var(--pk-font-family);\n }\n\n .shell {\n overflow: hidden;\n border: var(--pk-input-border);\n border-radius: var(--pk-radius-md);\n background: #fff;\n }\n\n :host([invalid]) .shell,\n :host(:state(user-invalid)) .shell {\n border-color: var(--pk-color-rose-600);\n }\n\n .toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid rgba(96, 125, 159, 0.4);\n background: #fff;\n box-shadow: 0 2px 3px rgba(49, 49, 93, 0.07);\n }\n\n .toolbar-item {\n display: inline-flex;\n }\n\n .toolbar-item pk-tooltip {\n display: contents;\n }\n\n .toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: transparent;\n color: #1c2e36;\n cursor: pointer;\n }\n\n .toolbar-btn:hover:not(:disabled) {\n background: rgb(241, 245, 249);\n }\n\n .toolbar-btn[data-state='active'] {\n background: rgb(226, 232, 240);\n }\n\n .toolbar-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .toolbar-btn svg {\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n }\n\n .toolbar-btn--menu {\n width: auto;\n min-width: 2rem;\n gap: 0.125rem;\n padding: 0 0.375rem;\n }\n\n .toolbar-btn__trigger-label {\n font-size: 0.625rem;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n }\n\n .toolbar-btn__chevron {\n display: inline-flex;\n flex-shrink: 0;\n opacity: 0.7;\n }\n\n .toolbar-btn__chevron svg {\n width: 0.5rem;\n height: 0.5rem;\n }\n\n .toolbar-separator {\n align-self: center;\n flex-shrink: 0;\n width: 1px;\n height: 1.25rem;\n margin: 0 0.125rem;\n background: rgba(96, 125, 159, 0.35);\n }\n\n .toolbar-btn__label {\n font-size: 0.625rem;\n font-weight: 600;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n }\n\n .toolbar-btn--text-style {\n max-width: 9rem;\n padding-inline: 0.5rem;\n }\n\n .toolbar-btn__text-style-value {\n overflow: hidden;\n font-size: var(--pk-font-size-xs);\n line-height: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .toolbar-btn--color .toolbar-btn__text-style-value {\n min-width: 1rem;\n border-bottom: 2px solid var(--text-style-trigger-color, currentColor);\n color: var(--text-style-trigger-color, currentColor);\n font-weight: 700;\n text-align: center;\n }\n\n pk-dropdown-menu.text-style-palette::part(panel) {\n display: grid;\n grid-template-columns: repeat(5, 2rem);\n gap: 0.625rem 0.75rem;\n width: max-content;\n min-width: 0;\n padding: 1rem;\n }\n\n .text-style-palette__label {\n grid-column: 1 / -1;\n color: var(--pk-color-gray-900);\n }\n\n .text-style-palette__label::part(label) {\n padding: 0 0 0.125rem;\n font-size: var(--pk-font-size-base);\n font-weight: 600;\n }\n\n .text-style-palette__label--highlight {\n margin-top: 0.375rem;\n }\n\n .text-style-palette__option {\n width: 2rem;\n height: 2rem;\n --pk-dropdown-item-gap: 0;\n --pk-dropdown-item-icon-size: 1.625rem;\n }\n\n .text-style-palette__option::part(item) {\n justify-content: center;\n width: 2rem;\n height: 2rem;\n min-height: 0;\n padding: 0;\n border-radius: 50%;\n background: transparent;\n }\n\n .text-style-palette__option:hover::part(item),\n .text-style-palette__option:focus-within::part(item),\n .text-style-palette__option[data-highlighted]::part(item),\n .text-style-palette__option[checked]::part(item) {\n background: transparent;\n }\n\n .text-style-palette__option::part(prefix) {\n width: 1.625rem;\n height: 1.625rem;\n }\n\n .text-style-palette__option::part(label) {\n position: absolute;\n }\n\n .text-style-palette__option::part(check) {\n display: none;\n }\n\n .text-style-palette__swatch {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.625rem;\n height: 1.625rem;\n box-sizing: border-box;\n border: 1px solid rgba(15, 23, 42, 0.16);\n border-radius: 50%;\n }\n\n /* Keep the state treatment concentric with the slotted swatch. The\n dropdown item's shadow button is wider than its prefix in some hosts. */\n .text-style-palette__option:hover .text-style-palette__swatch,\n .text-style-palette__option:focus-within .text-style-palette__swatch,\n .text-style-palette__option[data-highlighted] .text-style-palette__swatch,\n .text-style-palette__option[checked] .text-style-palette__swatch {\n box-shadow: 0 0 0 0.25rem var(--pk-color-slate-100);\n }\n\n .text-style-palette__swatch--text {\n border-color: var(--text-style-swatch, rgba(15, 23, 42, 0.35));\n color: var(--text-style-swatch, #1f2937);\n font-size: var(--pk-font-size-base);\n font-weight: 500;\n line-height: 1;\n }\n\n .text-style-palette__swatch--highlight {\n background: var(--text-style-swatch, #fff);\n }\n\n .text-style-palette__accessible-label {\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 .text-style-palette pk-tooltip {\n display: contents;\n }\n\n /* Full toolbar replace (slot=toolbar on host when hasCustomToolbar). */\n .toolbar ::slotted([slot='toolbar']) {\n display: contents;\n }\n\n /* Append lane inside the stock toolbar — one flex item per slotted root (same gap). */\n .toolbar ::slotted([slot='toolbar-end']) {\n display: inline-flex;\n align-items: center;\n }\n\n .editor-mount {\n position: relative;\n }\n\n .content-error {\n display: flex;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--pk-color-rose-200);\n background: var(--pk-color-rose-50);\n color: var(--pk-color-rose-800);\n font-size: var(--pk-font-size-sm);\n }\n\n .mirror-input {\n display: none;\n }\n\n /* No trigger slot — collapse the host so it does not reserve shell space.\n Toolbar refresh while open is still gated by linkDialogBusy / open. */\n .link-dialog {\n display: contents;\n }\n\n .link-dialog__fields {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .link-bubble {\n position: absolute;\n z-index: 250;\n display: flex;\n align-items: center;\n gap: 0;\n width: max-content;\n max-width: calc(100% - 1rem);\n padding: 0;\n border: 0;\n border-radius: var(--pk-radius-md);\n background: #1c2e36;\n color: #fff;\n font-size: 12px;\n line-height: 1.5;\n overflow: visible;\n pointer-events: auto;\n white-space: nowrap;\n }\n\n .link-bubble__arrow {\n position: absolute;\n left: 50%;\n bottom: -0.25rem;\n width: 0.5rem;\n height: 0.5rem;\n background: #1c2e36;\n transform: translateX(-50%) rotate(45deg);\n pointer-events: none;\n }\n\n .link-bubble__url,\n .link-bubble__action {\n box-sizing: border-box;\n padding: 6px 8px;\n font-size: 12px;\n line-height: 1.5;\n }\n\n .link-bubble__url {\n display: inline-flex;\n align-items: center;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .link-bubble__divider {\n flex-shrink: 0;\n align-self: center;\n width: 1px;\n height: 12px;\n background: #616d73;\n }\n\n .link-bubble__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: #fff;\n font-family: inherit;\n font-weight: inherit;\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n appearance: none;\n -webkit-appearance: none;\n min-height: 0;\n transition: color 0.15s ease;\n }\n\n .link-bubble__action:hover {\n color: rgb(255 255 255 / 0.7);\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport {\n applyLinkToEditor,\n createTiptapExtensions,\n getCraftLinkOptions,\n getFatalTiptapContentError,\n getRegisteredTiptapToolbarControl,\n getLinkEditState,\n getLinkOptionsElementSiteId,\n getLinkOpenInNewTab,\n getSelectedText,\n getToolbarGroupDefaultIcon,\n getToolbarGroupMenuItems,\n getToolbarGroupTriggerState,\n isFormattingToolbarPreset,\n isHeadingsOnlyToolbarPreset,\n isTiptapButtonActive,\n isToolbarButtonActive,\n openCraftElementLinkSelector,\n runToolbarButton,\n resolveTiptapTextStyleToolbarConfig,\n toolbarIncludesButton,\n unsetLinkFromEditor,\n type LinkElementConfig,\n type LinkOptionsInput,\n type ToolbarGroup,\n type ToolbarNode,\n type TiptapTextStyleOption,\n type TiptapTextStyleToolbarConfig,\n} from '@verbb/plugin-kit-tiptap-core';\nimport { getMarkRange, posToDOMRect } from '@tiptap/core';\n\nimport { formControlStyles } from '../../base/form-control.styles.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { uniqueId } from '../../a11y/focus.js';\nimport { MirrorValidator } from '../../validators/index.js';\nimport {\n link,\n triangleExclamation,\n renderIconHtml,\n} from '../../icons/index.js';\n\nimport '../button/pk-button.js';\nimport '../checkbox/pk-checkbox.js';\nimport '../dialog/pk-dialog.js';\nimport '../dropdown-menu/pk-dropdown-item.js';\nimport '../dropdown-menu/pk-dropdown-label.js';\nimport '../field/pk-field.js';\nimport '../input/pk-input.js';\nimport '../dropdown-menu/pk-dropdown-menu.js';\nimport '../dropdown-menu/pk-dropdown-separator.js';\nimport '../tooltip/pk-tooltip.js';\nimport type { PkButton } from '../button/pk-button.js';\nimport type { PkCheckbox } from '../checkbox/pk-checkbox.js';\nimport type { PkDialog } from '../dialog/pk-dialog.js';\nimport type { PkDropdownItem } from '../dropdown-menu/pk-dropdown-item.js';\nimport type { PkDropdownMenu } from '../dropdown-menu/pk-dropdown-menu.js';\nimport type { PkInput } from '../input/pk-input.js';\nimport { TiptapEditorHost, parseTiptapDocumentValue, serializeTiptapDocumentContent, serializeTiptapDocumentValue } from './tiptap-editor-host.js';\nimport { createCraftElementSelectorHost, parseLinkOptionsAttribute, parseToolbarAttribute } from './tiptap-utils.js';\nimport {\n TOOLBAR_CHEVRON_HTML,\n TOOLBAR_ICONS,\n TOOLBAR_LABELS,\n createToolbarPrefixIcon,\n getToolbarButtonIcon,\n getToolbarMenuItemLabel,\n} from './tiptap-toolbar.js';\nimport { createVariableTagDomNodeView } from './variable-tag-node-view.js';\nimport { pkTiptapEditorStyles } from './pk-tiptap-editor.styles.js';\nimport { tiptapProseMirrorStyles } from './tiptap.styles.js';\n\ntype LinkDialogSeed = {\n url?: string;\n text?: string;\n openInNewTab?: boolean;\n from?: number;\n to?: number;\n};\n\n/**\n * TipTap document editor with a Craft-styled toolbar.\n *\n * @slot toolbar - Replace the entire default toolbar (opt-in via light-DOM presence).\n * @slot toolbar-end - Append controls after stock toolbar buttons (same flex gap).\n */\n@customElement('pk-tiptap-editor')\nexport class PkTiptapEditor extends PkFormAssociatedElement {\n static override styles = [formControlStyles, pkTiptapEditorStyles, tiptapProseMirrorStyles];\n\n static override get validators() {\n return [...super.validators, MirrorValidator()];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n @query('.editor-mount')\n private editorMount!: HTMLDivElement;\n\n @query('.mirror-input')\n override input!: HTMLInputElement;\n\n @query('.link-dialog')\n private linkDialog?: PkDialog;\n\n @query('pk-input.link-dialog__url-input')\n private linkUrlInput?: PkInput;\n\n @query('pk-input.link-dialog__text-input')\n private linkTextInput?: PkInput;\n\n @query('pk-checkbox')\n private linkNewTabCheckbox?: PkCheckbox;\n\n @query('pk-button.link-dialog__submit')\n private linkSubmitButton?: PkButton;\n\n private readonly linkUrlInputId = uniqueId('pk-tiptap-link-url');\n\n private readonly linkTextInputId = uniqueId('pk-tiptap-link-text');\n\n private readonly host = new TiptapEditorHost();\n\n private _value: string | null = null;\n\n /**\n * Flat toolbar button list. HTML uses a comma-separated attribute; React may\n * pass a `string[]`. Named `buttons` (not `buttonsAttr`) so React can set the\n * property — a getter-only `buttons` previously threw on assign.\n */\n @property({\n attribute: 'buttons',\n converter: {\n fromAttribute: (value: string | null) => value ?? 'bold,italic',\n toAttribute: (value: string | string[] | null | undefined) => {\n if (value == null) {\n return 'bold,italic';\n }\n\n return Array.isArray(value) ? value.join(',') : value;\n },\n },\n })\n buttons: string | string[] = 'bold,italic';\n\n /** Structured toolbar config — JSON string attribute, or a node array from React. */\n @property({\n attribute: 'toolbar',\n converter: {\n fromAttribute: (value: string | null) => value,\n toAttribute: (value: string | ToolbarNode[] | null | undefined) => {\n if (value == null) {\n return null;\n }\n\n return typeof value === 'string' ? value : JSON.stringify(value);\n },\n },\n })\n toolbar: string | ToolbarNode[] | null = null;\n\n /** Values shown by the optional TextStyle toolbar controls. */\n @property({\n attribute: 'text-style-options',\n converter: {\n fromAttribute: (value: string | null) => {\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value) as TiptapTextStyleToolbarConfig;\n } catch {\n return null;\n }\n },\n toAttribute: (value: TiptapTextStyleToolbarConfig | null | undefined) => (\n value ? JSON.stringify(value) : null\n ),\n },\n })\n textStyleOptions: TiptapTextStyleToolbarConfig | null = null;\n\n /** JSON configuration for Craft entry, asset, category, or custom element links. */\n @property({ attribute: 'link-options' })\n linkOptions: string | null = null;\n\n /** Required storage-key prefix when Craft element link options are enabled. */\n @property({ attribute: 'link-selector-storage-key-prefix' })\n linkSelectorStorageKeyPrefix?: string;\n\n @property({ type: Number })\n rows = 4;\n\n @property()\n placeholder = '';\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n /**\n * Formie / React configure bridge — called when a chip is activated for editing.\n * Prefer this over listening for `pk-variable-tag-configure` from React.\n */\n @property({ attribute: false })\n variableTagConfigure: ((detail: import('./variable-tag-node-view.js').PkVariableTagConfigureDetail) => void) | null = null;\n\n @property({ attribute: 'invalid-content-message' })\n invalidContentMessage = '';\n\n /** Show `pk-tooltip` hints on toolbar buttons (default: on). */\n @property({ type: Boolean, attribute: 'toolbar-tooltips' })\n toolbarTooltips = true;\n\n private linkDialogBusy = false;\n\n private linkDialogSeed: LinkDialogSeed = {};\n\n @state()\n private linkDialogTitle = 'Insert Link';\n\n @state()\n private linkDialogSubmitLabel = 'Insert';\n\n @state()\n private linkDialogMounted = false;\n\n @state()\n private linkBubbleVisible = false;\n\n @state()\n private linkBubbleHref = '';\n\n @state()\n private linkBubbleTop = 0;\n\n @state()\n private linkBubbleLeft = 0;\n\n private hasCustomToolbar = false;\n\n private readonly linkButtonId = uniqueId('pk-tiptap-link-btn');\n\n private readonly toolbarButtonIds = new Map<string, string>();\n\n private readonly toolbarGroupIds = new Map<string, string>();\n\n private selectionListenerAttached = false;\n\n get value(): string {\n if (this.valueHasChanged) {\n return this._value ?? '[]';\n }\n\n return this._value ?? this.defaultValue ?? '[]';\n }\n\n /**\n * Document JSON string. Also accepts a TipTap node array (common from React)\n * and serializes it — arrays previously bypassed JSON.parse and mounted empty.\n */\n @state()\n set value(val: string | unknown[] | null) {\n const next = serializeTiptapDocumentValue(val);\n\n if (this._value === next) {\n return;\n }\n\n this.valueHasChanged = true;\n this._value = next;\n }\n\n @property({ attribute: 'value', reflect: true })\n defaultValue: string | null = '[]';\n\n get editor() {\n return this.host.editor;\n }\n\n get toolbarNodes(): ToolbarNode[] {\n const buttonsRaw = Array.isArray(this.buttons) ? this.buttons.join(',') : this.buttons;\n\n return parseToolbarAttribute(this.toolbar, buttonsRaw)\n .filter((node) => node.type !== 'button' || node.name !== 'variableTag');\n }\n\n /** Resolved flat button names from the active toolbar config. */\n get buttonNames(): string[] {\n return this.toolbarNodes\n .filter((node): node is Extract<ToolbarNode, { type: 'button' }> => node.type === 'button')\n .map((node) => node.name);\n }\n\n private toolbarHasLink(): boolean {\n return toolbarIncludesButton(this.toolbarNodes, 'link');\n }\n\n private resolveLinkOptions(): LinkOptionsInput | undefined {\n return parseLinkOptionsAttribute(this.linkOptions);\n }\n\n private get contentError(): string {\n return this.resolveContentError();\n }\n\n protected override syncFormValue(): void {\n this.setValue(this.value || '[]');\n\n if (this.input) {\n this.input.value = this.value || '[]';\n }\n }\n\n protected override resetToDefaultValue(): void {\n this.valueHasChanged = false;\n this._value = null;\n this.syncEditorContent();\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.value = state;\n this.syncEditorContent();\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.hasCustomToolbar = Boolean(this.querySelector('[slot=\"toolbar\"]'));\n }\n\n override disconnectedCallback(): void {\n this.linkDialog?.forceOverlayReset();\n this.linkDialogBusy = false;\n this.host.destroy();\n this.selectionListenerAttached = false;\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') && !changed.has('defaultValue')) {\n this.syncEditorContent();\n }\n\n if (changed.has('defaultValue') && !this.valueHasChanged) {\n this.syncEditorContent();\n }\n\n if (changed.has('disabled') || changed.has('readonly')) {\n this.host.editor?.setEditable(!this.disabled && !this.readonly);\n }\n\n super.updated(changed);\n }\n\n override firstUpdated(): void {\n queueMicrotask(() => {\n this.mountEditor();\n this.syncFormValue();\n });\n }\n\n private resolveContentError(): string {\n const detected = getFatalTiptapContentError(this.value);\n return detected ? (this.invalidContentMessage || detected) : '';\n }\n\n private mountEditor(): void {\n const content = this.contentError ? null : parseTiptapDocumentValue(this.value);\n const normalizedRows = Math.max(1, Number(this.rows || 0));\n const minHeight = `${(normalizedRows * 24) + 32}px`;\n\n this.host.mount({\n element: this.editorMount,\n extensions: createTiptapExtensions({\n trailingCursorText: '\\u2060',\n variableTagNodeView: createVariableTagDomNodeView(),\n }),\n content,\n editable: !this.disabled && !this.readonly && !this.contentError,\n trailingCursorText: '\\u2060',\n minHeight,\n onUpdate: (nextContent) => {\n const serialized = serializeTiptapDocumentContent(nextContent);\n this.value = serialized;\n\n if (this.input) {\n this.input.value = serialized;\n }\n\n this.syncFormValue();\n // Emit JSON string (matches `value` prop) — arrays caused Formie controlled\n // fields to write mismatched types and re-enter sync forever.\n this.emitValueChange(serialized);\n },\n });\n\n queueMicrotask(() => {\n this.attachSelectionListeners();\n // Visibility predicates need the mounted Editor instance before the\n // first custom-control render can be authoritative.\n this.requestUpdate();\n });\n }\n\n private attachSelectionListeners(): void {\n const editor = this.host.editor;\n\n if (!editor || this.selectionListenerAttached) {\n return;\n }\n\n const refreshToolbar = () => {\n if (this.linkDialogBusy || this.linkDialog?.open) {\n this.linkBubbleVisible = false;\n return;\n }\n\n this.updateLinkBubble();\n\n queueMicrotask(() => {\n if (this.isConnected && !this.linkDialogBusy && !this.linkDialog?.open) {\n this.requestUpdate();\n }\n });\n };\n\n editor.on('selectionUpdate', refreshToolbar);\n editor.on('transaction', refreshToolbar);\n editor.on('focus', refreshToolbar);\n editor.on('blur', () => {\n this.linkBubbleVisible = false;\n this.requestUpdate();\n });\n this.selectionListenerAttached = true;\n }\n\n private updateLinkBubble(): void {\n const editor = this.host.editor;\n\n if (\n !editor\n || this.disabled\n || this.readonly\n || this.linkDialogBusy\n || this.linkDialog?.open\n || !editor.isFocused\n || !editor.isActive('link')\n ) {\n this.linkBubbleVisible = false;\n return;\n }\n\n const linkType = editor.state.schema.marks.link;\n const range = getMarkRange(editor.state.selection.$from, linkType);\n\n if (!range) {\n this.linkBubbleVisible = false;\n return;\n }\n\n const linkRect = posToDOMRect(editor.view, range.from, range.to);\n const mountRect = this.editorMount.getBoundingClientRect();\n const bubbleOffset = 8;\n\n this.linkBubbleHref = String(editor.getAttributes('link').href ?? '');\n this.linkBubbleTop = linkRect.top - mountRect.top - bubbleOffset;\n this.linkBubbleLeft = linkRect.left - mountRect.left + (linkRect.width / 2);\n this.linkBubbleVisible = true;\n }\n\n private handleLinkBubbleEdit = (event: Event): void => {\n event.preventDefault();\n\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n const state = getLinkEditState(editor);\n this.linkBubbleVisible = false;\n this.openLinkDialog({\n url: state.href,\n text: state.text,\n openInNewTab: state.openInNewTab,\n from: state.from,\n to: state.to,\n });\n };\n\n private handleLinkBubbleUnlink = (event: Event): void => {\n event.preventDefault();\n\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n unsetLinkFromEditor(editor);\n this.linkBubbleVisible = false;\n };\n\n private renderLinkBubble() {\n return html`\n <div\n class=\"link-bubble\"\n role=\"toolbar\"\n aria-label=\"Link actions\"\n tabindex=\"0\"\n style=${`top:${this.linkBubbleTop}px;left:${this.linkBubbleLeft}px;transform:translate(-50%, -100%);`}\n >\n <span class=\"link-bubble__arrow\" aria-hidden=\"true\"></span>\n <span class=\"link-bubble__url\">${this.linkBubbleHref}</span>\n <span class=\"link-bubble__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"link-bubble__action\"\n @mousedown=${(event: Event) => event.preventDefault()}\n @click=${this.handleLinkBubbleEdit}\n >Edit</button>\n <span class=\"link-bubble__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"link-bubble__action\"\n @mousedown=${(event: Event) => event.preventDefault()}\n @click=${this.handleLinkBubbleUnlink}\n >Unlink</button>\n </div>\n `;\n }\n\n private syncEditorContent(): void {\n const content = this.contentError ? null : parseTiptapDocumentValue(this.value);\n this.host.setContent(content, { trailingCursorText: '\\u2060' });\n\n if (this.input) {\n this.input.value = this.value || '[]';\n }\n }\n\n private emitValueChange(value: string): void {\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: { value },\n bubbles: true,\n composed: true,\n }));\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private handleToolbarCommand(buttonName: string): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n runToolbarButton(editor, buttonName);\n }\n\n private openLinkMenu(): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n const selected = getSelectedText(editor);\n const { from, to } = editor.state.selection;\n\n const menu = this.shadowRoot?.querySelector<PkDropdownMenu>(\n `pk-dropdown-menu[for=\"${this.linkButtonId}\"]`,\n );\n\n void (async () => {\n await menu?.whenClosed();\n this.openLinkDialog(from !== to ? { text: selected, from, to } : undefined);\n })();\n }\n\n private openLinkDialog(initial?: LinkDialogSeed): void {\n const editor = this.host.editor;\n const url = initial?.url ?? '';\n\n this.linkDialogBusy = true;\n this.linkBubbleVisible = false;\n this.linkDialogSeed = {\n url,\n text: initial?.text ?? '',\n openInNewTab: initial?.openInNewTab ?? (editor ? getLinkOpenInNewTab(editor) : false),\n from: initial?.from,\n to: initial?.to,\n };\n this.linkDialogTitle = url.trim() ? 'Update Link' : 'Insert Link';\n this.linkDialogSubmitLabel = url.trim() ? 'Update' : 'Insert';\n\n if (!this.linkDialogMounted) {\n this.linkDialogMounted = true;\n }\n\n // Mount first, then open after the dropdown has fully demoted (caller awaits\n // whenClosed). Busy flag still suppresses toolbar refresh during show animation.\n queueMicrotask(async () => {\n await this.updateComplete;\n await this.linkDialog?.updateComplete;\n this.syncLinkDialogFields();\n // Prefer show() over flipping `open` before firstUpdated — that path only\n // call showModal() and skips PkShowEvent / enter animation.\n await this.linkDialog?.show();\n });\n }\n\n private closeLinkDialog(): void {\n void this.linkDialog?.hide('close-button');\n }\n\n private handleLinkDialogAfterHide = (): void => {\n this.linkDialogBusy = false;\n\n queueMicrotask(() => {\n if (this.isConnected && !this.linkDialog?.open) {\n this.requestUpdate();\n }\n });\n };\n\n private syncLinkDialogFields(): void {\n const seed = this.linkDialogSeed;\n\n if (this.linkUrlInput) {\n this.linkUrlInput.value = seed.url ?? '';\n }\n\n if (this.linkTextInput) {\n this.linkTextInput.value = seed.text ?? '';\n }\n\n if (this.linkNewTabCheckbox) {\n this.linkNewTabCheckbox.checked = Boolean(seed.openInNewTab);\n }\n\n this.updateLinkDialogSubmitState();\n }\n\n private updateLinkDialogSubmitState(): void {\n const canSubmit = Boolean(this.linkUrlInput?.value.trim());\n\n if (this.linkSubmitButton) {\n this.linkSubmitButton.disabled = !canSubmit;\n }\n }\n\n private handleLinkUrlInput = (): void => {\n this.updateLinkDialogSubmitState();\n };\n\n private handleLinkDialogKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Enter') {\n return;\n }\n\n const path = event.composedPath();\n\n if (path.some((node) => node instanceof HTMLElement && node.localName === 'pk-checkbox')) {\n return;\n }\n\n if (path.some((node) => node instanceof HTMLElement && node.localName === 'pk-button')) {\n return;\n }\n\n if (path.some((node) => node instanceof HTMLButtonElement)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.submitLinkDialog();\n };\n\n private handleLinkDialogSubmit = (): void => {\n this.submitLinkDialog();\n };\n\n private submitLinkDialog(): void {\n const editor = this.host.editor;\n const url = this.linkUrlInput?.value.trim() ?? '';\n\n if (!editor || !url) {\n return;\n }\n\n applyLinkToEditor(editor, {\n url,\n text: this.linkTextInput?.value ?? '',\n openInNewTab: Boolean(this.linkNewTabCheckbox?.checked),\n from: this.linkDialogSeed.from,\n to: this.linkDialogSeed.to,\n });\n\n this.closeLinkDialog();\n }\n\n private isLinkActive(): boolean {\n const editor = this.host.editor;\n return editor ? isTiptapButtonActive(editor, 'link') : false;\n }\n\n private renderLinkDialog() {\n return html`\n <pk-dialog\n class=\"link-dialog\"\n size=\"wide\"\n label=${this.linkDialogTitle}\n @pk-after-hide=${this.handleLinkDialogAfterHide}\n @keydown=${this.handleLinkDialogKeyDown}\n >\n <div class=\"link-dialog__fields\">\n <pk-field label=\"URL\" required .for=${this.linkUrlInputId}>\n <pk-input\n id=${this.linkUrlInputId}\n class=\"link-dialog__url-input\"\n type=\"url\"\n placeholder=\"https://\"\n autofocus\n @input=${this.handleLinkUrlInput}\n ></pk-input>\n </pk-field>\n <pk-field label=\"Text\" .for=${this.linkTextInputId}>\n <pk-input\n id=${this.linkTextInputId}\n class=\"link-dialog__text-input\"\n type=\"text\"\n ></pk-input>\n </pk-field>\n <pk-checkbox>Open link in new tab</pk-checkbox>\n </div>\n <pk-button slot=\"footer\" data-dialog-close>Cancel</pk-button>\n <pk-button\n slot=\"footer\"\n class=\"link-dialog__submit\"\n variant=\"primary\"\n disabled\n @click=${this.handleLinkDialogSubmit}\n >\n ${this.linkDialogSubmitLabel}\n </pk-button>\n </pk-dialog>\n `;\n }\n\n private getToolbarButtonId(buttonName: string): string {\n let id = this.toolbarButtonIds.get(buttonName);\n\n if (!id) {\n id = uniqueId(`pk-tiptap-toolbar-${buttonName}`);\n this.toolbarButtonIds.set(buttonName, id);\n }\n\n return id;\n }\n\n private getToolbarButtonLabel(buttonName: string): string {\n return TOOLBAR_LABELS[buttonName]\n ?? getRegisteredTiptapToolbarControl(buttonName)?.label\n ?? buttonName;\n }\n\n private renderToolbarTooltip(buttonId: string, label: string) {\n if (!this.toolbarTooltips) {\n return nothing;\n }\n\n return html`\n <pk-tooltip for=${buttonId} content=${label} placement=\"top\"></pk-tooltip>\n `;\n }\n\n private renderToolbarButton(buttonName: string) {\n const editor = this.host.editor;\n const registered = getRegisteredTiptapToolbarControl(buttonName);\n\n if (registered?.isVisible && (!editor || !registered.isVisible(editor))) {\n return nothing;\n }\n\n const icon = getToolbarButtonIcon(buttonName);\n const label = this.getToolbarButtonLabel(buttonName);\n const buttonId = this.getToolbarButtonId(buttonName);\n const active = editor ? isTiptapButtonActive(editor, buttonName) : false;\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${buttonId}\n type=\"button\"\n class=\"toolbar-btn\"\n aria-label=${label}\n ?disabled=${this.disabled || this.readonly}\n data-state=${active ? 'active' : nothing}\n @click=${() => this.handleToolbarCommand(buttonName)}\n >\n ${icon ? unsafeSVG(icon) : html`<span class=\"toolbar-btn__label\">${label}</span>`}\n </button>\n ${this.renderToolbarTooltip(buttonId, label)}\n </div>\n `;\n }\n\n private get textStyleToolbarConfig() {\n return resolveTiptapTextStyleToolbarConfig(this.textStyleOptions);\n }\n\n private getTextStyleValue(attribute: string): string | null {\n const value = this.host.editor?.getAttributes('textStyle')[attribute];\n return typeof value === 'string' && value ? value : null;\n }\n\n private setTextStyleValue(attribute: string, value: string | null): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n const chain = editor.chain().focus();\n\n switch (attribute) {\n case 'fontFamily':\n value ? chain.setFontFamily(value).run() : chain.unsetFontFamily().run();\n break;\n case 'fontSize':\n value ? chain.setFontSize(value).run() : chain.unsetFontSize().run();\n break;\n case 'color':\n value ? chain.setColor(value).run() : chain.unsetColor().run();\n break;\n case 'backgroundColor':\n value ? chain.setBackgroundColor(value).run() : chain.unsetBackgroundColor().run();\n break;\n case 'lineHeight':\n value ? chain.setLineHeight(value).run() : chain.unsetLineHeight().run();\n break;\n }\n }\n\n private getTextStyleOptionLabel(options: TiptapTextStyleOption[], value: string | null): string {\n return options.find((option) => option.value === value)?.label\n ?? options.find((option) => option.value === null)?.label\n ?? 'Default';\n }\n\n private renderTextStyleOptions(attribute: string, options: TiptapTextStyleOption[]) {\n const currentValue = this.getTextStyleValue(attribute);\n\n return options.map((option) => html`\n <pk-dropdown-item\n type=\"radio\"\n radio-group=${attribute}\n value=${option.value ?? ''}\n ?checked=${option.value === currentValue}\n @click=${() => this.setTextStyleValue(attribute, option.value)}\n >\n ${option.label}\n </pk-dropdown-item>\n `);\n }\n\n private renderTextStylePaletteOptions(\n attribute: 'color' | 'backgroundColor',\n options: TiptapTextStyleOption[],\n idPrefix: string,\n ) {\n const currentValue = this.getTextStyleValue(attribute);\n const isTextColor = attribute === 'color';\n\n return options.map((option, index) => {\n const optionId = `${idPrefix}-${attribute}-${index}`;\n const accessibleLabel = option.value\n ? `${option.label} ${isTextColor ? 'text' : 'highlight'}`\n : isTextColor ? 'Default text color' : 'No highlight';\n\n return html`\n <pk-dropdown-item\n id=${optionId}\n class=\"text-style-palette__option\"\n type=\"radio\"\n radio-group=${attribute}\n value=${option.value ?? ''}\n ?checked=${option.value === currentValue}\n @click=${() => this.setTextStyleValue(attribute, option.value)}\n >\n <span\n slot=\"start\"\n class=\"text-style-palette__swatch ${isTextColor ? 'text-style-palette__swatch--text' : 'text-style-palette__swatch--highlight'}\"\n style=${option.value ? `--text-style-swatch:${option.value}` : ''}\n data-empty=${option.value === null ? '' : nothing}\n aria-hidden=\"true\"\n >${isTextColor ? 'A' : nothing}</span>\n <span class=\"text-style-palette__accessible-label\">${accessibleLabel}</span>\n </pk-dropdown-item>\n ${this.toolbarTooltips ? html`\n <pk-tooltip for=${optionId} content=${accessibleLabel} placement=\"top\"></pk-tooltip>\n ` : nothing}\n `;\n });\n }\n\n private handleTextStylePaletteKeyDown(event: KeyboardEvent): void {\n const deltas: Partial<Record<KeyboardEvent['key'], number>> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -5,\n ArrowDown: 5,\n };\n const delta = deltas[event.key];\n\n if (!delta) {\n return;\n }\n\n const menu = event.currentTarget as PkDropdownMenu;\n const item = event.composedPath().find((node): node is PkDropdownItem => (\n node instanceof HTMLElement\n && node.localName === 'pk-dropdown-item'\n && node.classList.contains('text-style-palette__option')\n ));\n const items = menu.getItems().filter((candidate) => (\n candidate.classList.contains('text-style-palette__option')\n ));\n const index = item ? items.indexOf(item) : -1;\n\n if (index === -1) {\n return;\n }\n\n // The menu remains the focus/dismissal owner; only its directional\n // movement changes to match the palette's five-column visual layout.\n const target = items[Math.max(0, Math.min(index + delta, items.length - 1))];\n\n event.preventDefault();\n event.stopPropagation();\n target?.focusControl();\n }\n\n private renderTextStyleToolbar(buttonName: string) {\n const config = this.textStyleToolbarConfig;\n const buttonId = this.getToolbarButtonId(buttonName);\n const triggerColor = buttonName === 'text-color' ? this.getTextStyleValue('color') : null;\n let triggerLabel = '';\n let menuContent: unknown = nothing;\n\n if (buttonName === 'font-family') {\n triggerLabel = this.getTextStyleOptionLabel(config.fontFamilies, this.getTextStyleValue('fontFamily'));\n menuContent = html`${this.renderTextStyleOptions('fontFamily', config.fontFamilies)}`;\n } else if (buttonName === 'font-size') {\n triggerLabel = this.getTextStyleOptionLabel(config.fontSizes, this.getTextStyleValue('fontSize'));\n menuContent = html`${this.renderTextStyleOptions('fontSize', config.fontSizes)}`;\n } else if (buttonName === 'line-height') {\n triggerLabel = this.getTextStyleOptionLabel(config.lineHeights, this.getTextStyleValue('lineHeight'));\n menuContent = html`${this.renderTextStyleOptions('lineHeight', config.lineHeights)}`;\n } else {\n triggerLabel = 'A';\n menuContent = html`\n <pk-dropdown-label class=\"text-style-palette__label\">Text color</pk-dropdown-label>\n ${this.renderTextStylePaletteOptions('color', config.textColors, buttonId)}\n <pk-dropdown-label class=\"text-style-palette__label text-style-palette__label--highlight\">Highlight color</pk-dropdown-label>\n ${this.renderTextStylePaletteOptions('backgroundColor', config.backgroundColors, buttonId)}\n `;\n }\n\n const label = this.getToolbarButtonLabel(buttonName);\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${buttonId}\n type=\"button\"\n class=\"toolbar-btn toolbar-btn--menu toolbar-btn--text-style ${buttonName === 'text-color' ? 'toolbar-btn--color' : ''}\"\n aria-label=${label}\n aria-haspopup=\"menu\"\n ?disabled=${this.disabled || this.readonly}\n style=${triggerColor ? `--text-style-trigger-color:${triggerColor}` : ''}\n >\n <span class=\"toolbar-btn__text-style-value\">${triggerLabel}</span>\n <span class=\"toolbar-btn__chevron\">${unsafeSVG(TOOLBAR_CHEVRON_HTML)}</span>\n </button>\n ${this.renderToolbarTooltip(buttonId, label)}\n <pk-dropdown-menu\n for=${buttonId}\n placement=\"bottom-start\"\n class=${buttonName === 'text-color' ? 'text-style-palette' : ''}\n @keydown=${buttonName === 'text-color' ? this.handleTextStylePaletteKeyDown : nothing}\n >\n ${menuContent}\n </pk-dropdown-menu>\n </div>\n `;\n }\n\n private handleCraftLink(config: LinkElementConfig): void {\n const editor = this.host.editor;\n\n if (!editor) {\n return;\n }\n\n openCraftElementLinkSelector({\n config,\n elementSiteId: getLinkOptionsElementSiteId(this.resolveLinkOptions()),\n linkSelectorStorageKeyPrefix: this.linkSelectorStorageKeyPrefix,\n getSelectedText: () => getSelectedText(editor),\n onSelect: ({ url, text }) => { this.openLinkDialog({ url, text }); },\n host: createCraftElementSelectorHost(),\n });\n }\n\n private getToolbarGroupId(groupKey: string): string {\n let id = this.toolbarGroupIds.get(groupKey);\n\n if (!id) {\n id = uniqueId('pk-tiptap-toolbar-group');\n this.toolbarGroupIds.set(groupKey, id);\n }\n\n return id;\n }\n\n private renderToolbarSeparator() {\n return html`<span class=\"toolbar-separator\" aria-hidden=\"true\"></span>`;\n }\n\n private renderGroupTriggerContent(group: ToolbarGroup, triggerLabel: string, iconName: string) {\n const icon = getToolbarButtonIcon(iconName);\n const showTextLabel = Boolean(group.label);\n\n if (showTextLabel && triggerLabel) {\n return html`\n <span class=\"toolbar-btn__trigger-label\">${triggerLabel}</span>\n <span class=\"toolbar-btn__chevron\">${unsafeSVG(TOOLBAR_CHEVRON_HTML)}</span>\n `;\n }\n\n return html`\n ${icon ? unsafeSVG(icon) : html`<span class=\"toolbar-btn__trigger-label\">${triggerLabel}</span>`}\n <span class=\"toolbar-btn__chevron\">${unsafeSVG(TOOLBAR_CHEVRON_HTML)}</span>\n `;\n }\n\n private renderToolbarGroup(group: ToolbarGroup, groupKey: string) {\n const editor = this.host.editor;\n const groupId = this.getToolbarGroupId(groupKey);\n const trigger = editor ? getToolbarGroupTriggerState(editor, group) : {\n activeName: null,\n label: group.label ?? '',\n isActive: false,\n icon: group.icon ?? getToolbarGroupDefaultIcon(group),\n };\n const menuItems = getToolbarGroupMenuItems(group).filter((entry) => {\n if (entry.type === 'separator') {\n return true;\n }\n\n const control = getRegisteredTiptapToolbarControl(entry.name);\n return !control?.isVisible || Boolean(editor && control.isVisible(editor));\n });\n\n if (!menuItems.some((entry) => entry.type === 'item')) {\n return nothing;\n }\n const tooltipLabel = group.label\n ?? (isHeadingsOnlyToolbarPreset(group.preset) ? 'Headings'\n : isFormattingToolbarPreset(group.preset) ? 'Formatting'\n : group.preset === 'lists' ? 'Lists'\n : group.preset === 'align' ? 'Alignment'\n : 'More');\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${groupId}\n type=\"button\"\n class=\"toolbar-btn toolbar-btn--menu\"\n aria-label=${tooltipLabel}\n aria-haspopup=\"menu\"\n ?disabled=${this.disabled || this.readonly}\n data-state=${trigger.isActive ? 'active' : nothing}\n >\n ${this.renderGroupTriggerContent(group, trigger.label, trigger.icon)}\n </button>\n ${this.renderToolbarTooltip(groupId, tooltipLabel)}\n <pk-dropdown-menu for=${groupId} placement=\"bottom-start\">\n ${menuItems.map((entry, itemIndex) => {\n if (entry.type === 'separator') {\n return html`<pk-dropdown-separator key=${`${groupKey}-sep-${itemIndex}`}></pk-dropdown-separator>`;\n }\n\n const itemName = entry.name;\n const active = editor ? isToolbarButtonActive(editor, itemName) : false;\n const prefixIcon = createToolbarPrefixIcon(itemName);\n const itemLabel = getToolbarMenuItemLabel(itemName);\n\n return html`\n <pk-dropdown-item\n key=${`${groupKey}-${itemName}-${itemIndex}`}\n ?data-active=${active || nothing}\n @click=${() => this.handleToolbarCommand(itemName)}\n >\n ${prefixIcon ?? nothing}\n ${itemLabel}\n </pk-dropdown-item>\n `;\n })}\n </pk-dropdown-menu>\n </div>\n `;\n }\n\n private renderToolbarNode(node: ToolbarNode, index: number) {\n if (node.type === 'separator') {\n return this.renderToolbarSeparator();\n }\n\n if (node.type === 'group') {\n return this.renderToolbarGroup(node.group, `group-${index}`);\n }\n\n if (node.name === 'link') {\n return this.renderLinkToolbarButton();\n }\n\n if (['font-family', 'font-size', 'text-color', 'line-height'].includes(node.name)) {\n return this.renderTextStyleToolbar(node.name);\n }\n\n return this.renderToolbarButton(node.name);\n }\n\n private renderDefaultToolbar() {\n // `toolbar-end` — append custom controls (Formie variable picker, etc.) into the\n // stock toolbar flex/gap. Prefer over replacing the whole bar via slot=\"toolbar\".\n return html`\n <div class=\"toolbar\" part=\"toolbar\">\n ${this.toolbarNodes.map((node, index) => this.renderToolbarNode(node, index))}\n <slot name=\"toolbar-end\"></slot>\n </div>\n `;\n }\n\n private renderLinkToolbarButton() {\n const editor = this.host.editor;\n const craftOptions = getCraftLinkOptions(this.resolveLinkOptions());\n const label = this.getToolbarButtonLabel('link');\n const active = this.isLinkActive();\n\n return html`\n <div class=\"toolbar-item\">\n <button\n id=${this.linkButtonId}\n type=\"button\"\n class=\"toolbar-btn\"\n aria-label=${label}\n aria-haspopup=\"menu\"\n ?disabled=${this.disabled || this.readonly}\n data-state=${active ? 'active' : nothing}\n >\n ${unsafeSVG(TOOLBAR_ICONS.link)}\n </button>\n ${this.renderToolbarTooltip(this.linkButtonId, label)}\n <pk-dropdown-menu for=${this.linkButtonId} placement=\"bottom-start\">\n ${craftOptions.map((option) => html`\n <pk-dropdown-item @click=${() => this.handleCraftLink(option)}>\n ${option.optionTitle}\n </pk-dropdown-item>\n `)}\n ${craftOptions.length > 0 ? html`<pk-dropdown-separator></pk-dropdown-separator>` : nothing}\n <pk-dropdown-item @click=${() => this.openLinkMenu()}>Insert Link</pk-dropdown-item>\n <pk-dropdown-item\n ?disabled=${!active}\n @click=${() => editor && unsetLinkFromEditor(editor)}\n >Unlink</pk-dropdown-item>\n </pk-dropdown-menu>\n </div>\n `;\n }\n\n override render() {\n return html`\n <div class=\"shell\" part=\"shell\">\n ${this.hasCustomToolbar\n ? html`<slot name=\"toolbar\"></slot>`\n : this.renderDefaultToolbar()}\n\n <div class=\"editor-mount\" part=\"editor\">\n ${this.contentError ? html`\n <div class=\"content-error\">\n <span>${unsafeSVG(renderIconHtml(triangleExclamation))}</span>\n <span>${this.contentError}</span>\n </div>\n ` : nothing}\n ${this.toolbarHasLink() && this.linkBubbleVisible ? this.renderLinkBubble() : nothing}\n </div>\n\n <input class=\"mirror-input\" type=\"text\" .value=${this.value} readonly tabindex=\"-1\" aria-hidden=\"true\" />\n ${this.toolbarHasLink() && this.linkDialogMounted ? this.renderLinkDialog() : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tiptap-editor': PkTiptapEditor;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-tiptap-input-YKg4VLp_.js","names":[],"sources":["../../src/components/tiptap/pk-tiptap-input.styles.ts","../../src/components/tiptap/pk-tiptap-input.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkTiptapInputStyles = css`\n @layer pk-component {\n :host {\n display: block;\n width: 100%;\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: 1.4;\n }\n\n /* Same chrome as pk-input .input — border/radius live on the shell. */\n .shell {\n box-sizing: border-box;\n border: var(--pk-input-border);\n border-radius: var(--pk-input-border-radius, var(--pk-radius-sm));\n background: var(--pk-input-bg);\n overflow: hidden;\n }\n\n :host([invalid]) .shell,\n :host(:state(user-invalid)) .shell {\n border-color: var(--pk-color-rose-600);\n }\n\n /* Editable-table cells (v1): flush TipTap shell — chips sit in the row, not a boxed field. */\n :host([fit-cell]),\n :host([data-editable-table-input]) {\n display: block;\n height: 100%;\n min-height: 100%;\n box-sizing: border-box;\n }\n\n :host([fit-cell]) .shell,\n :host([data-editable-table-input]) .shell {\n border: none;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n height: 100%;\n min-height: 100%;\n }\n\n /* Read-only display (lists, picker cards): v1 skipped input chrome when readOnly. */\n :host([readonly]) .shell {\n border: none;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n overflow: visible;\n }\n\n :host([fit-cell][invalid]) .shell,\n :host([fit-cell]:state(user-invalid)) .shell,\n :host([data-editable-table-input][invalid]) .shell,\n :host([data-editable-table-input]:state(user-invalid)) .shell {\n border: none;\n box-shadow: inset 0 0 0 1px var(--pk-color-rose-600);\n }\n\n .editor-mount {\n display: block;\n min-width: 0;\n }\n\n .mirror-input {\n display: none;\n }\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\nimport {\n contentToValue,\n createTiptapInputExtensions,\n dedupeVariableOptions,\n flattenVariableOptions,\n inputValueToContent,\n type VariableOption,\n} from '@verbb/plugin-kit-tiptap-core';\nimport { Editor } from '@tiptap/core';\n\nimport { formControlStyles } from '../../base/form-control.styles.js';\nimport { PkFormAssociatedElement } from '../../base/pk-form-associated-element.js';\nimport { MirrorValidator } from '../../validators/index.js';\nimport { createVariableTagDomNodeView } from './variable-tag-node-view.js';\nimport { pkTiptapInputStyles } from './pk-tiptap-input.styles.js';\nimport { tiptapInputProseMirrorStyles } from './tiptap.styles.js';\n\n/** Category map keyed like Formie / kit v1 (`fieldsVariables`, `formVariables`, …). */\nexport type PkTiptapVariableCategories = Record<string, VariableOption[]>;\n\n@customElement('pk-tiptap-input')\nexport class PkTiptapInput extends PkFormAssociatedElement {\n // Compact input chrome only — do not pull in editor `tiptapProseMirrorStyles`\n // (padding: 1rem) or single-line fields look massively padded.\n static override styles = [formControlStyles, pkTiptapInputStyles, tiptapInputProseMirrorStyles];\n\n static override get validators() {\n return [...super.validators, MirrorValidator()];\n }\n\n override assumeInteractionOn = ['blur', 'input'];\n\n @query('.editor-mount')\n private editorMount!: HTMLDivElement;\n\n @query('.mirror-input')\n override input!: HTMLInputElement;\n\n private editor: Editor | null = null;\n\n private lastEmitted: string | null = null;\n\n /** Avoid setContent → onUpdate → pk-change loops with controlled React values. */\n private suppressUpdateEmission = false;\n\n private _value: string | null = null;\n\n /**\n * Variable options used to resolve chip labels when hydrating from `{token}` strings.\n * Without this, saved field tokens fall back to UID title-casing after reload.\n */\n @property({ attribute: false })\n variableCategories: PkTiptapVariableCategories = {};\n\n /**\n * Formie / React configure bridge — called when a chip is activated for editing.\n * Prefer this over listening for `pk-variable-tag-configure` from React.\n */\n @property({ attribute: false })\n variableTagConfigure: ((detail: import('./variable-tag-node-view.js').PkVariableTagConfigureDetail) => void) | null = null;\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n @property({ type: Boolean, reflect: true })\n invalid = false;\n\n /** Flush + fill parent cell (editable tables). */\n @property({ type: Boolean, reflect: true, attribute: 'fit-cell' })\n fitCell = false;\n\n get value(): string {\n if (this.valueHasChanged) {\n return this._value ?? '';\n }\n\n return this._value ?? this.defaultValue ?? '';\n }\n\n @state()\n set value(val: string | null) {\n const next = val ?? '';\n\n if (this._value === next) {\n return;\n }\n\n this.valueHasChanged = true;\n this._value = next;\n }\n\n @property({ attribute: 'value', reflect: true })\n defaultValue: string | null = '';\n\n get editorInstance() {\n return this.editor;\n }\n\n private resolveVariableLists(): {\n topLevel: VariableOption[];\n all: VariableOption[];\n } {\n const topLevel = dedupeVariableOptions(\n Object.values(this.variableCategories ?? {}).flatMap((items) => {\n return Array.isArray(items) ? items : [];\n }),\n );\n\n return {\n topLevel,\n all: flattenVariableOptions(topLevel),\n };\n }\n\n private resolveEditorContent() {\n const { topLevel, all } = this.resolveVariableLists();\n return inputValueToContent(this.value, topLevel, all);\n }\n\n protected override syncFormValue(): void {\n this.setValue(this.value || '');\n\n if (this.input) {\n this.input.value = this.value || '';\n }\n }\n\n protected override resetToDefaultValue(): void {\n this.valueHasChanged = false;\n this._value = null;\n this.syncEditorContent(true);\n }\n\n protected override restoreFormState(state: string | File | FormData | null): void {\n if (typeof state === 'string') {\n this.value = state;\n this.syncEditorContent(true);\n }\n }\n\n override disconnectedCallback(): void {\n this.editor?.destroy();\n this.editor = null;\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('value') && !changed.has('defaultValue')) {\n this.syncEditorContent();\n }\n\n if (changed.has('defaultValue') && !this.valueHasChanged) {\n this.syncEditorContent();\n }\n\n // Categories often arrive with the field after first paint — re-hydrate labels.\n if (changed.has('variableCategories') && this.editor) {\n this.syncEditorContent(true);\n }\n\n if (changed.has('disabled') || changed.has('readonly')) {\n this.editor?.setEditable(!this.disabled && !this.readonly);\n }\n\n super.updated(changed);\n }\n\n override firstUpdated(): void {\n this.mountEditor();\n this.syncFormValue();\n }\n\n private mountEditor(): void {\n const content = this.resolveEditorContent();\n\n this.editor = new Editor({\n element: this.editorMount,\n extensions: createTiptapInputExtensions({\n variableTagNodeView: createVariableTagDomNodeView(),\n }),\n content,\n editable: !this.disabled && !this.readonly,\n onUpdate: ({ editor }) => {\n const nextValue = contentToValue(editor.getJSON().content);\n this.lastEmitted = nextValue;\n\n if (this.suppressUpdateEmission) {\n return;\n }\n\n this.value = nextValue;\n\n if (this.input) {\n this.input.value = nextValue;\n }\n\n this.syncFormValue();\n this.emitValueChange(nextValue);\n },\n });\n }\n\n private syncEditorContent(force = false): void {\n if (!this.editor) {\n return;\n }\n\n if (!force && !this.readonly && this.editor.isFocused) {\n return;\n }\n\n const nextContent = this.resolveEditorContent();\n const currentContent = this.editor.getJSON();\n\n if (JSON.stringify(nextContent) === JSON.stringify(currentContent)) {\n return;\n }\n\n // Same token string with newly available categories still needs a force remount\n // so chip labels upgrade from UID fallback → option labels.\n if (!force && this.lastEmitted === this.value) {\n return;\n }\n\n this.suppressUpdateEmission = true;\n try {\n this.editor.commands.setContent(nextContent ?? { type: 'doc', content: [] });\n } finally {\n this.suppressUpdateEmission = false;\n }\n }\n\n private emitValueChange(value: string): void {\n this.dispatchEvent(new CustomEvent('pk-change', {\n detail: { value },\n bubbles: true,\n composed: true,\n }));\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n override render() {\n return html`\n <div class=\"shell\" part=\"shell\">\n <div class=\"editor-mount\" part=\"editor\"></div>\n <input class=\"mirror-input\" type=\"text\" .value=${this.value} readonly tabindex=\"-1\" aria-hidden=\"true\" />\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tiptap-input': PkTiptapInput;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-toggle-BthhH7vl.js","names":[],"sources":["../../src/components/toggle/pk-toggle.styles.ts","../../src/components/toggle/pk-toggle.ts"],"sourcesContent":["import { css } from 'lit';\n\nimport {\n buttonGroupBorderJoinStyles,\n buttonGroupCornerRadiusStyles,\n buttonGroupCornerRoleStyles,\n buttonGroupIndentStyles,\n} from '../button-group/button-group-item.styles.js';\n\nexport const pkToggleStyles = [\n buttonGroupCornerRoleStyles(),\n buttonGroupCornerRadiusStyles('.button'),\n buttonGroupIndentStyles(),\n buttonGroupBorderJoinStyles('.button'),\n css`\n @layer pk-component {\n :host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n }\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.25rem;\n min-width: 2rem;\n height: 2rem;\n margin: 0;\n padding: 0 0.5rem;\n border: 0;\n border-radius: var(--pk-radius-lg);\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: 1.4;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n appearance: none;\n transition: background-color 0.12s ease, box-shadow 0.12s ease;\n }\n\n .button:focus {\n outline: none;\n }\n\n .button:focus-visible {\n box-shadow: var(--pk-shadow-focus);\n }\n\n .button[aria-pressed='true'],\n .button[data-state='on'] {\n background: var(--pk-color-slate-250);\n }\n\n .button:hover:not(:disabled) {\n background: var(--pk-color-slate-250);\n }\n\n .button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n pointer-events: none;\n }\n\n :host([variant='outline']) .button {\n border: 1px solid var(--pk-color-slate-300);\n background: transparent;\n color: var(--pk-color-gray-700);\n }\n\n :host([variant='outline']) .button:hover:not(:disabled),\n :host([variant='outline']) .button[aria-pressed='true'],\n :host([variant='outline']) .button[data-state='on'],\n :host([variant='outline'][pressed]) .button {\n background: var(--pk-color-slate-250);\n }\n\n :host([size='sm']) .button {\n min-width: 1.75rem;\n height: 1.75rem;\n padding-inline: 0.375rem;\n font-size: 0.8rem;\n border-radius: min(var(--pk-radius-md), 12px);\n }\n\n :host([size='lg']) .button {\n min-width: 2.25rem;\n height: 2.25rem;\n padding-inline: 0.625rem;\n }\n\n .button ::slotted(svg) {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n pointer-events: none;\n }\n\n :host([data-pk-group-join]) .button:focus-visible {\n z-index: 1;\n position: relative;\n }\n\n :host([data-pk-group-join][size='sm'][data-pk-group-item-first][data-pk-group-orientation='horizontal']) .button {\n border-top-left-radius: min(var(--pk-radius-md), 12px);\n border-bottom-left-radius: min(var(--pk-radius-md), 12px);\n }\n\n :host([data-pk-group-join][size='sm'][data-pk-group-item-last][data-pk-group-orientation='horizontal']) .button {\n border-top-right-radius: min(var(--pk-radius-md), 12px);\n border-bottom-right-radius: min(var(--pk-radius-md), 12px);\n }\n\n :host([data-pk-group-join][size='sm'][data-pk-group-item-first][data-pk-group-orientation='vertical']) .button {\n border-top-left-radius: min(var(--pk-radius-md), 12px);\n border-top-right-radius: min(var(--pk-radius-md), 12px);\n }\n\n :host([data-pk-group-join][size='sm'][data-pk-group-item-last][data-pk-group-orientation='vertical']) .button {\n border-bottom-left-radius: min(var(--pk-radius-md), 12px);\n border-bottom-right-radius: min(var(--pk-radius-md), 12px);\n }\n\n :host([data-tg-orientation='vertical']) {\n display: block;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n :host([data-tg-orientation='vertical']) .button {\n width: 100%;\n box-sizing: border-box;\n }\n\n :host([data-pk-group-orientation='vertical']) {\n display: block;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n :host([data-pk-group-orientation='vertical']) .button {\n width: 100%;\n box-sizing: border-box;\n }\n\n :host-context(pk-button-group[exclusive]):host([pressed]) .button:focus-visible {\n box-shadow: var(--pk-shadow-focus-outset, var(--pk-shadow-focus));\n }\n\n :host-context(pk-button-group[exclusive]):host([variant='outline']:not([pressed])) .button {\n background: var(--pk-action-fill);\n border-color: transparent;\n }\n\n :host-context(pk-button-group[exclusive]):host([variant='outline'][pressed]) .button {\n border-color: transparent;\n }\n\n :host-context(pk-button-group[exclusive]):host([variant='outline']) .button {\n border-radius: 0;\n }\n\n :host-context(pk-button-group[orientation='vertical']) {\n display: block;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n :host-context(pk-button-group[orientation='vertical']) .button {\n width: 100%;\n box-sizing: border-box;\n }\n }\n `,\n /* Unlayered — must beat buttonGroupBorderJoinStyles for outer edge on first joined outline item. */\n css`\n :host([data-pk-group-join][data-pk-group-item-first][data-pk-group-orientation='horizontal'][variant='outline']) .button {\n border-left: 1px solid var(--pk-color-slate-300);\n }\n\n :host([data-pk-group-join][data-pk-group-item-first][data-pk-group-orientation='vertical'][variant='outline']) .button {\n border-top: 1px solid var(--pk-color-slate-300);\n }\n `,\n];\n","import { html, nothing } from 'lit';\nimport { customElement, property } from '../../decorators.js';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { pkToggleStyles } from './pk-toggle.styles.js';\n\nexport type PkToggleVariant = 'default' | 'outline';\nexport type PkToggleSize = 'default' | 'sm' | 'lg';\n\n/**\n * Two-state toggle button.\n *\n * @slot - Button label or icon content\n *\n * @csspart base - Toggle button element\n */\n@customElement('pk-toggle')\nexport class PkToggle extends PkElement {\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n static override styles = pkToggleStyles;\n\n @property({ type: Boolean, reflect: true })\n pressed = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ reflect: true })\n variant: PkToggleVariant = 'default';\n\n @property({ reflect: true })\n size: PkToggleSize = 'default';\n\n @property({ attribute: 'data-value' })\n value = '';\n\n @property({ attribute: 'aria-label' })\n ariaLabel: string | null = null;\n\n private handleClick(): void {\n if (this.disabled || this.closest('pk-toggle-group')) {\n return;\n }\n\n this.pressed = !this.pressed;\n\n this.dispatchEvent(new CustomEvent('pk-pressed-change', {\n detail: { pressed: this.pressed },\n bubbles: true,\n composed: true,\n }));\n\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n override render() {\n return html`\n <button\n part=\"base\"\n class=\"button\"\n type=\"button\"\n ?disabled=${this.disabled}\n aria-pressed=${this.pressed ? 'true' : 'false'}\n aria-label=${this.ariaLabel ?? nothing}\n data-state=${this.pressed ? 'on' : 'off'}\n @click=${this.handleClick}\n >\n <slot></slot>\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-toggle': PkToggle;\n }\n}\n"],"mappings":";;;;AASA,IAAa,iBAAiB;CAC1B,6BAA6B;CAC7B,8BAA8B,UAAU;CACxC,yBAAyB;CACzB,4BAA4B,UAAU;CACtC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyKH,GAAG;;;;;;;;;CASN;;;AC/KM,IAAA,WAAA,MAAM,iBAAiB,UAAU;;;iBAS1B;kBAGC;iBAGgB;cAGN;eAGb;mBAGmB;;;2BAvByB;GAChD,MAAM;GACN,gBAAgB;GACnB;;;gBAEwB;;CAoBzB,cAA4B;AACxB,MAAI,KAAK,YAAY,KAAK,QAAQ,kBAAkB,CAChD;AAGJ,OAAK,UAAU,CAAC,KAAK;AAErB,OAAK,cAAc,IAAI,YAAY,qBAAqB;GACpD,QAAQ,EAAE,SAAS,KAAK,SAAS;GACjC,SAAS;GACT,UAAU;GACb,CAAC,CAAC;AAEH,OAAK,cAAc,IAAI,MAAM,UAAU;GAAE,SAAS;GAAM,UAAU;GAAM,CAAC,CAAC;;CAG9E,SAAkB;AACd,SAAO,IAAI;;;;;4BAKS,KAAK,SAAS;+BACX,KAAK,UAAU,SAAS,QAAQ;6BAClC,KAAK,aAAa,QAAQ;6BAC1B,KAAK,UAAU,OAAO,MAAM;yBAChC,KAAK,YAAY;;;;;;;YA5CrC,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,WAAA,KAAA,EAAA;YAG1C,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,SAAA,WAAA,YAAA,KAAA,EAAA;YAG1C,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,SAAA,WAAA,WAAA,KAAA,EAAA;YAG3B,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,SAAA,WAAA,QAAA,KAAA,EAAA;YAG3B,SAAS,EAAE,WAAW,cAAc,CAAC,CAAA,EAAA,SAAA,WAAA,SAAA,KAAA,EAAA;YAGrC,SAAS,EAAE,WAAW,cAAc,CAAC,CAAA,EAAA,SAAA,WAAA,aAAA,KAAA,EAAA;uBAxBzC,cAAc,YAAY,CAAA,EAAA,SAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-toggle-group-D2Quux8D.js","names":[],"sources":["../../src/components/toggle-group/pk-toggle-group.styles.ts","../../src/components/toggle-group/pk-toggle-group.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkToggleGroupStyles = css`\n @layer pk-component {\n :host {\n display: inline-flex;\n vertical-align: middle;\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: var(--pk-line-height);\n }\n\n .group {\n display: inline-flex;\n width: fit-content;\n align-items: center;\n border-radius: var(--pk-radius-lg);\n gap: calc(var(--pk-toggle-group-spacing, 0) * 0.25rem);\n }\n\n :host([size='sm']) .group {\n border-radius: min(var(--pk-radius-md), 10px);\n }\n\n :host([orientation='vertical']) .group {\n flex-direction: column;\n align-items: stretch;\n }\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport type { PkToggleSize, PkToggleVariant } from '../toggle/pk-toggle.js';\nimport { pkToggleGroupStyles } from './pk-toggle-group.styles.js';\n\nexport type PkToggleGroupOrientation = 'horizontal' | 'vertical';\n\nconst GROUP_JOIN_ATTR = 'data-pk-group-join';\nconst GROUP_ITEM_FIRST = 'data-pk-group-item-first';\nconst GROUP_ITEM_LAST = 'data-pk-group-item-last';\nconst GROUP_ORIENTATION_ATTR = 'data-pk-group-orientation';\nconst TOGGLE_ORIENTATION_ATTR = 'data-tg-orientation';\n\n/**\n * Group of toggle buttons with shared selection.\n *\n * @slot - `pk-toggle` or `button[data-value]` items\n *\n * @csspart base - Group container\n */\n@customElement('pk-toggle-group')\nexport class PkToggleGroup extends PkElement {\n static override styles = pkToggleGroupStyles;\n\n @property({ reflect: true })\n orientation: PkToggleGroupOrientation = 'horizontal';\n\n @property({ reflect: true })\n variant: PkToggleVariant = 'default';\n\n @property({ reflect: true })\n size: PkToggleSize = 'default';\n\n /** Gap between items — `0` joins adjacent toggles (React `spacing={0}`). */\n @property({ type: Number, reflect: true })\n spacing = 0;\n\n /** @deprecated Use `spacing=\"0\"` — kept for backward compatibility. */\n @property({ type: Boolean, reflect: true })\n joined = true;\n\n @property({ type: Boolean })\n multiple = false;\n\n @property({ type: Array, attribute: false })\n value: string[] = [];\n\n @state()\n private items: HTMLElement[] = [];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncJoinedFromSpacing();\n this.addEventListener('click', this.handleClick);\n this.addEventListener('slotchange', this.syncItems);\n }\n\n override disconnectedCallback(): void {\n this.removeEventListener('click', this.handleClick);\n this.removeEventListener('slotchange', this.syncItems);\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('spacing')) {\n this.syncJoinedFromSpacing();\n }\n\n if (changed.has('joined') && !changed.has('spacing')) {\n this.spacing = this.joined ? 0 : 2;\n }\n\n if (changed.has('variant') || changed.has('size') || changed.has('spacing') || changed.has('orientation')) {\n this.syncGroupLayout();\n }\n\n // Keep pressed/aria-pressed in sync when value is set as a property\n // (HTML has no value attribute — docs/playground set `.value` after mount).\n if (changed.has('value') && this.items.length) {\n this.applySelection();\n }\n }\n\n private clearLayoutAttrs(item: HTMLElement): void {\n item.removeAttribute(GROUP_JOIN_ATTR);\n item.removeAttribute(GROUP_ITEM_FIRST);\n item.removeAttribute(GROUP_ITEM_LAST);\n item.removeAttribute(GROUP_ORIENTATION_ATTR);\n item.removeAttribute(TOGGLE_ORIENTATION_ATTR);\n }\n\n private syncGroupLayout(): void {\n for (const item of this.items) {\n this.clearLayoutAttrs(item);\n }\n\n for (const item of this.items) {\n if (this.orientation !== 'horizontal') {\n item.setAttribute(TOGGLE_ORIENTATION_ATTR, this.orientation);\n }\n }\n\n if (this.spacing !== 0) {\n return;\n }\n\n for (let index = 0; index < this.items.length; index++) {\n const item = this.items[index];\n item.setAttribute(GROUP_ORIENTATION_ATTR, this.orientation);\n item.setAttribute(GROUP_JOIN_ATTR, '');\n\n if (index === 0) {\n item.setAttribute(GROUP_ITEM_FIRST, '');\n }\n\n if (index === this.items.length - 1) {\n item.setAttribute(GROUP_ITEM_LAST, '');\n }\n }\n }\n\n private syncJoinedFromSpacing(): void {\n this.joined = this.spacing === 0;\n }\n\n private syncItems = (): void => {\n const slot = this.shadowRoot?.querySelector('slot');\n\n if (!slot) {\n return;\n }\n\n this.items = slot.assignedElements({ flatten: true }) as HTMLElement[];\n this.applyGroupProps();\n this.syncGroupLayout();\n this.applySelection();\n };\n\n private applyGroupProps(): void {\n for (const item of this.items) {\n if (item.tagName !== 'PK-TOGGLE') {\n continue;\n }\n\n item.setAttribute('variant', this.variant);\n item.setAttribute('size', this.size);\n }\n }\n\n private getItemValue(item: HTMLElement): string | null {\n return item.getAttribute('data-value') ?? item.dataset.value ?? null;\n }\n\n private isItemDisabled(item: HTMLElement): boolean {\n return item.hasAttribute('disabled') || item.matches(':disabled');\n }\n\n private applySelection(): void {\n for (const item of this.items) {\n const itemValue = this.getItemValue(item);\n\n if (!itemValue) {\n continue;\n }\n\n const selected = this.value.includes(itemValue);\n item.setAttribute('aria-pressed', selected ? 'true' : 'false');\n\n if (item.tagName === 'PK-TOGGLE') {\n if (selected) {\n item.setAttribute('pressed', '');\n } else {\n item.removeAttribute('pressed');\n }\n }\n }\n }\n\n private handleClick = (event: Event): void => {\n const target = (event.target as HTMLElement).closest('[data-value]') as HTMLElement | null;\n\n if (!target || !this.items.includes(target) || this.isItemDisabled(target)) {\n return;\n }\n\n event.preventDefault();\n\n const itemValue = this.getItemValue(target);\n\n if (!itemValue) {\n return;\n }\n\n if (this.multiple) {\n this.value = this.value.includes(itemValue)\n ? this.value.filter((v) => v !== itemValue)\n : [...this.value, itemValue];\n } else {\n this.value = this.value.includes(itemValue) ? [] : [itemValue];\n }\n\n this.applySelection();\n\n this.dispatchEvent(new CustomEvent('pk-value-change', {\n detail: { value: [...this.value] },\n bubbles: true,\n composed: true,\n }));\n };\n\n override render() {\n return html`\n <div\n part=\"base\"\n class=\"group\"\n role=\"group\"\n style=${`--pk-toggle-group-spacing: ${this.spacing}`}\n @slotchange=${this.syncItems}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-toggle-group': PkToggleGroup;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-tooltip--QBV6puX.js","names":[],"sources":["../../src/components/tooltip/pk-tooltip.styles.ts","../../src/components/tooltip/pk-tooltip.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * Tooltip motion — enter: fade + zoom + slide; exit: fade + zoom only, 150ms ease.\n */\nconst tooltipContentAnimationStyles = css`\n @layer pk-component {\n .content.pk-popup-content {\n transform-origin: var(--pk-transform-origin, top);\n }\n\n .content.pk-popup-content[data-open] {\n animation: pk-tooltip-in 150ms ease forwards;\n }\n\n .content.pk-popup-content[data-open][data-side='top'] {\n animation-name: pk-tooltip-in-top;\n }\n\n .content.pk-popup-content[data-open][data-side='bottom'] {\n animation-name: pk-tooltip-in-bottom;\n }\n\n .content.pk-popup-content[data-open][data-side='left'] {\n animation-name: pk-tooltip-in-left;\n }\n\n .content.pk-popup-content[data-open][data-side='right'] {\n animation-name: pk-tooltip-in-right;\n }\n\n .content.pk-popup-content.closing {\n animation: pk-tooltip-out 150ms ease;\n }\n\n @keyframes pk-tooltip-in {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes pk-tooltip-out {\n from {\n opacity: 1;\n transform: scale(1);\n }\n\n to {\n opacity: 0;\n transform: scale(0.95);\n }\n }\n\n @keyframes pk-tooltip-in-top {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(0.5rem);\n }\n\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n @keyframes pk-tooltip-in-bottom {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(-0.5rem);\n }\n\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n @keyframes pk-tooltip-in-left {\n from {\n opacity: 0;\n transform: scale(0.95) translateX(0.5rem);\n }\n\n to {\n opacity: 1;\n transform: scale(1) translateX(0);\n }\n }\n\n @keyframes pk-tooltip-in-right {\n from {\n opacity: 0;\n transform: scale(0.95) translateX(-0.5rem);\n }\n\n to {\n opacity: 1;\n transform: scale(1) translateX(0);\n }\n }\n }\n`;\n\nexport const pkTooltipStyles = [\n tooltipContentAnimationStyles,\n css`\n @layer pk-component {\n :host {\n display: inline-block;\n max-width: 100%;\n align-self: flex-start;\n flex: none;\n vertical-align: middle;\n --pk-popup-z-index: 250;\n --pk-tooltip-arrow-size: 9px;\n --pk-tooltip-arrow-inset: 1px;\n }\n\n .content:not([data-open]):not(.closing) {\n opacity: 0;\n pointer-events: none;\n }\n\n .content[data-open]:not(.closing) {\n opacity: 1;\n }\n\n .content {\n position: relative;\n isolation: isolate;\n overflow: visible;\n width: fit-content;\n max-width: 20rem;\n padding: 4px 8px;\n border-radius: var(--pk-radius-sm);\n background: #1c2e36;\n color: var(--pk-color-white);\n font-family: var(--pk-font-family);\n font-size: 12px;\n line-height: 1.4;\n pointer-events: none;\n }\n\n .content::after {\n content: '';\n position: absolute;\n z-index: -1;\n width: var(--pk-tooltip-arrow-size);\n height: var(--pk-tooltip-arrow-size);\n background: #1c2e36;\n border-radius: 2px;\n rotate: 45deg;\n pointer-events: none;\n }\n\n .content[data-side='top']::after {\n left: calc(50% - var(--pk-tooltip-arrow-size) / 2);\n bottom: calc(var(--pk-tooltip-arrow-size) * -0.5 + var(--pk-tooltip-arrow-inset));\n }\n\n .content[data-side='bottom']::after {\n left: calc(50% - var(--pk-tooltip-arrow-size) / 2);\n top: calc(var(--pk-tooltip-arrow-size) * -0.5 + var(--pk-tooltip-arrow-inset));\n }\n\n .content[data-side='left']::after {\n top: calc(50% - var(--pk-tooltip-arrow-size) / 2);\n right: calc(var(--pk-tooltip-arrow-size) * -0.5 + var(--pk-tooltip-arrow-inset));\n }\n\n .content[data-side='right']::after {\n top: calc(50% - var(--pk-tooltip-arrow-size) / 2);\n left: calc(var(--pk-tooltip-arrow-size) * -0.5 + var(--pk-tooltip-arrow-inset));\n }\n\n .content[hidden] {\n display: none !important;\n }\n }\n `,\n];\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { 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} from '../../events/overlay-lifecycle.js';\n// Keep the internal element registered when production builds erase type-only imports.\nimport '../popup/pk-popup.js';\nimport type { PkPopup, PkPopupPlacement } from '../popup/pk-popup.js';\nimport { syncPopupPlacementAnimation, waitForPopupReposition, getPopupSide } from '../../utils/popup-placement-animation.js';\nimport { pkTooltipStyles } from './pk-tooltip.styles.js';\n\n/**\n * Tooltip — pattern: hover/focus shows floating hint.\n *\n * @slot trigger - Element that receives the tooltip\n * @slot - Tooltip content (falls back to `content` attribute)\n *\n * @csspart content - Tooltip body\n */\n@customElement('pk-tooltip')\nexport class PkTooltip extends PkElement {\n static override styles = pkTooltipStyles;\n\n @property({ reflect: true })\n placement: PkPopupPlacement = 'top';\n\n /** `hover focus` (default) or `manual` for programmatic open only. */\n @property({ reflect: true })\n trigger: 'hover focus' | 'manual' = 'hover focus';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Number, attribute: 'open-delay' })\n openDelay = 0;\n\n @property({ type: Number, attribute: 'close-delay' })\n closeDelay = 0;\n\n @property()\n content = '';\n\n /** Anchor element id — alternative to the trigger slot. */\n @property({ reflect: true })\n for = '';\n\n @query('pk-popup')\n private popupElement!: PkPopup;\n\n @state()\n private open = false;\n\n private triggerElement: HTMLElement | null = null;\n\n @state()\n private contentAnimated = false;\n\n @state()\n private closing = false;\n\n @state()\n private contentSide: ReturnType<typeof getPopupSide> | null = null;\n\n /**\n * True only when the default slot has real nodes. Pretty-printed HTML often\n * leaves whitespace text nodes in the default slot, which would otherwise\n * suppress the `content` attribute fallback and show an empty tooltip body.\n */\n @state()\n private hasSlottedBody = false;\n\n private readonly triggerId = uniqueId('pk-tooltip-trigger');\n private openTimer?: number;\n private closeTimer?: number;\n private readonly tooltipId = uniqueId('pk-tooltip');\n private showGeneration = 0;\n private exitGeneration = 0;\n\n override disconnectedCallback(): void {\n this.popupElement?.removeEventListener('pk-reposition', this.syncPlacementAnimation);\n this.clearTimers();\n this.hideTooltip(true);\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n if (changed.has('trigger') || changed.has('disabled') || changed.has('for')) {\n this.rebindTrigger();\n }\n\n if (this.disabled && this.open) {\n this.hideTooltip(true);\n }\n }\n\n override firstUpdated(): void {\n this.popupElement.addEventListener('pk-reposition', this.syncPlacementAnimation);\n\n if (this.for) {\n queueMicrotask(() => {\n this.resolveExternalTrigger();\n });\n }\n }\n\n /** Opens the tooltip programmatically. */\n async show(): Promise<void> {\n if (this.disabled) {\n return;\n }\n\n this.clearTimers();\n this.showTooltip(true);\n await this.updateComplete;\n }\n\n /** Closes the tooltip programmatically. */\n async hide(): Promise<void> {\n this.clearTimers();\n this.hideTooltip(true);\n await this.updateComplete;\n }\n\n private clearTimers(): void {\n window.clearTimeout(this.openTimer);\n window.clearTimeout(this.closeTimer);\n }\n\n private syncPlacementAnimation = (): void => {\n const placement = this.popupElement?.getAttribute('data-current-placement') ?? this.placement;\n const content = this.popupElement?.getContentElement();\n\n this.contentSide = placement ? getPopupSide(placement) : null;\n syncPopupPlacementAnimation(this.popupElement, placement);\n\n if (content) {\n syncPopupPlacementAnimation(content, placement);\n }\n };\n\n private resolveExternalTrigger(): void {\n this.triggerElement = resolveElementById(this, this.for);\n this.rebindTrigger();\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.rebindTrigger();\n this.requestUpdate();\n }\n\n private onBodySlotChange = (event: Event): void => {\n const slot = event.target as HTMLSlotElement;\n this.hasSlottedBody = slot.assignedNodes({ flatten: true }).some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true;\n }\n\n return node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim());\n });\n };\n\n private rebindTrigger(): void {\n this.unbindTrigger(this.triggerElement);\n\n if (this.for) {\n this.triggerElement = resolveElementById(this, this.for);\n }\n\n this.bindTrigger(this.triggerElement);\n }\n\n private usesPointerTrigger(): boolean {\n return !this.disabled && this.trigger !== 'manual';\n }\n\n private bindTrigger(trigger: HTMLElement | null): void {\n if (!trigger || !this.usesPointerTrigger()) {\n return;\n }\n\n if (!trigger.id) {\n trigger.id = this.triggerId;\n }\n\n trigger.setAttribute('aria-describedby', this.tooltipId);\n trigger.addEventListener('mouseenter', this.scheduleShow);\n trigger.addEventListener('mouseleave', this.scheduleHide);\n trigger.addEventListener('focus', this.scheduleShow);\n trigger.addEventListener('blur', this.scheduleHide);\n }\n\n private unbindTrigger(trigger: HTMLElement | null): void {\n if (!trigger) {\n return;\n }\n\n trigger.removeAttribute('aria-describedby');\n trigger.removeEventListener('mouseenter', this.scheduleShow);\n trigger.removeEventListener('mouseleave', this.scheduleHide);\n trigger.removeEventListener('focus', this.scheduleShow);\n trigger.removeEventListener('blur', this.scheduleHide);\n }\n\n private scheduleShow = (): void => {\n if (!this.usesPointerTrigger()) {\n return;\n }\n\n window.clearTimeout(this.closeTimer);\n window.clearTimeout(this.openTimer);\n this.openTimer = window.setTimeout(() => this.showTooltip(), this.openDelay);\n };\n\n private scheduleHide = (): void => {\n if (!this.usesPointerTrigger()) {\n return;\n }\n\n window.clearTimeout(this.openTimer);\n window.clearTimeout(this.closeTimer);\n this.closeTimer = window.setTimeout(() => this.hideTooltip(), this.closeDelay);\n };\n\n private getAnchor(): Element | string | null {\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 prepareContentForEnter(content: HTMLElement | null | undefined): void {\n if (!content) {\n return;\n }\n\n content.classList.remove('closing');\n content.style.animation = 'none';\n void content.getBoundingClientRect();\n content.style.removeProperty('animation');\n content.style.removeProperty('opacity');\n content.style.removeProperty('transform');\n }\n\n private showTooltip(force = false): void {\n if (!this.getAnchor()) {\n return;\n }\n\n if (this.open && this.contentAnimated && !this.closing && !force) {\n return;\n }\n\n if (!this.open) {\n this.dispatchEvent(new PkShowEvent());\n }\n\n const generation = ++this.showGeneration;\n this.exitGeneration += 1;\n this.closing = false;\n this.open = true;\n this.contentAnimated = false;\n this.prepareContentForEnter(this.popupElement?.getContentElement());\n\n void this.updateComplete.then(async () => {\n if (generation !== this.showGeneration) {\n return;\n }\n\n await waitForPopupReposition(this.popupElement, this.placement);\n\n if (generation !== this.showGeneration) {\n return;\n }\n\n this.syncPlacementAnimation();\n this.prepareContentForEnter(this.popupElement?.getContentElement());\n this.contentAnimated = 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 private hideTooltip(immediate = false, cancelable = false): void {\n if ((!this.open && !this.closing) && !immediate) {\n return;\n }\n\n if (this.closing && !immediate) {\n return;\n }\n\n if (cancelable) {\n const hideEvent = new PkHideEvent('api');\n\n if (!this.dispatchEvent(hideEvent)) {\n return;\n }\n }\n\n this.showGeneration += 1;\n\n if (immediate) {\n this.finishHide();\n return;\n }\n\n if (!this.contentAnimated) {\n this.finishHide();\n return;\n }\n\n void this.playExitAnimation();\n }\n\n private async playExitAnimation(): Promise<void> {\n if (!this.open) {\n return;\n }\n\n const generation = this.exitGeneration + 1;\n this.exitGeneration = generation;\n\n const content = this.popupElement?.getContentElement();\n\n this.closing = true;\n this.contentAnimated = false;\n\n if (content) {\n await this.waitForExitAnimation(content);\n }\n\n if (generation !== this.exitGeneration) {\n return;\n }\n\n this.finishHide();\n }\n\n private waitForExitAnimation(content: HTMLElement): Promise<void> {\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 content.removeEventListener('animationend', onAnimationEnd);\n window.clearTimeout(fallback);\n content.classList.remove('closing');\n resolve();\n };\n\n const onAnimationEnd = (event: AnimationEvent): void => {\n if (event.target === content && event.animationName.startsWith('pk-tooltip-out')) {\n finish();\n }\n };\n\n content.classList.add('closing');\n content.addEventListener('animationend', onAnimationEnd);\n const fallback = window.setTimeout(finish, 200);\n });\n }\n\n private finishHide(): void {\n const content = this.popupElement?.getContentElement();\n\n this.closing = false;\n this.contentAnimated = false;\n this.contentSide = null;\n this.open = false;\n this.popupElement?.removeAttribute('data-side');\n this.prepareContentForEnter(content);\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 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=${4}\n hover-bridge\n flip\n shift\n >\n <div\n part=\"content\"\n class=${classMap({\n content: true,\n 'pk-popup-content': true,\n closing: this.closing,\n })}\n id=${this.tooltipId}\n role=\"tooltip\"\n ?hidden=${!this.open && !this.closing}\n data-open=${this.contentAnimated && !this.closing ? '' : nothing}\n data-side=${this.contentSide ?? nothing}\n >\n <slot @slotchange=${this.onBodySlotChange}></slot>\n ${this.hasSlottedBody ? nothing : (this.content || nothing)}\n </div>\n </pk-popup>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-tooltip': PkTooltip;\n }\n}\n"],"mappings":"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"}