@verbb/plugin-kit-web 2.0.13 → 2.0.15

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 (247) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/chunks/{decorate-W02hmVTt.js → decorate-R0X811qp.js} +13 -2
  3. package/dist/chunks/decorate-R0X811qp.js.map +1 -0
  4. package/dist/chunks/{pk-button-QpDDlRbG.js → pk-button-BWGDkuzc.js} +3 -4
  5. package/dist/chunks/{pk-button-QpDDlRbG.js.map → pk-button-BWGDkuzc.js.map} +1 -1
  6. package/dist/chunks/{pk-button-group-D9hqSfb_.js → pk-button-group-BSz5T5iS.js} +2 -3
  7. package/dist/chunks/pk-button-group-BSz5T5iS.js.map +1 -0
  8. package/dist/chunks/{pk-button-group-separator-DG0CYaqc.js → pk-button-group-separator-DH3Rl24b.js} +2 -3
  9. package/dist/chunks/pk-button-group-separator-DH3Rl24b.js.map +1 -0
  10. package/dist/chunks/{pk-button-group-text-C5z4P7ur.js → pk-button-group-text-Qro_KmZb.js} +2 -3
  11. package/dist/chunks/{pk-button-group-text-C5z4P7ur.js.map → pk-button-group-text-Qro_KmZb.js.map} +1 -1
  12. package/dist/chunks/{pk-calendar-CoUil0F7.js → pk-calendar-enTOUCRD.js} +2 -3
  13. package/dist/chunks/pk-calendar-enTOUCRD.js.map +1 -0
  14. package/dist/chunks/{pk-checkbox-Bavq3-9C.js → pk-checkbox-CvZwJZn_.js} +3 -4
  15. package/dist/chunks/pk-checkbox-CvZwJZn_.js.map +1 -0
  16. package/dist/chunks/{pk-checkbox-select-9lqd9Rwz.js → pk-checkbox-select-DclPoyDM.js} +3 -4
  17. package/dist/chunks/pk-checkbox-select-DclPoyDM.js.map +1 -0
  18. package/dist/chunks/{pk-code-editor-DSG6AwLV.js → pk-code-editor-CrKnJUyi.js} +3 -4
  19. package/dist/chunks/pk-code-editor-CrKnJUyi.js.map +1 -0
  20. package/dist/chunks/{pk-color-input-BCCXCZMA.js → pk-color-input-DXdqNCK7.js} +3 -4
  21. package/dist/chunks/pk-color-input-DXdqNCK7.js.map +1 -0
  22. package/dist/chunks/{pk-combobox-BqaSsLJb.js → pk-combobox-BLft8AXy.js} +4 -5
  23. package/dist/chunks/pk-combobox-BLft8AXy.js.map +1 -0
  24. package/dist/chunks/{pk-copy-button-CfeVuQ0r.js → pk-copy-button-asOLQkqk.js} +3 -4
  25. package/dist/chunks/pk-copy-button-asOLQkqk.js.map +1 -0
  26. package/dist/chunks/{pk-date-picker-BM4HMb4-.js → pk-date-picker-Bri3kZ6x.js} +5 -6
  27. package/dist/chunks/pk-date-picker-Bri3kZ6x.js.map +1 -0
  28. package/dist/chunks/{pk-dialog-Ck1InIBC.js → pk-dialog-BbEfvb0g.js} +2 -3
  29. package/dist/chunks/pk-dialog-BbEfvb0g.js.map +1 -0
  30. package/dist/chunks/{pk-dropdown-item-HcIUlFH1.js → pk-dropdown-item-BoZTGWMU.js} +2 -3
  31. package/dist/chunks/pk-dropdown-item-BoZTGWMU.js.map +1 -0
  32. package/dist/chunks/{pk-dropdown-label-DLgrmYND.js → pk-dropdown-label-Da28F917.js} +2 -3
  33. package/dist/chunks/{pk-dropdown-label-DLgrmYND.js.map → pk-dropdown-label-Da28F917.js.map} +1 -1
  34. package/dist/chunks/{pk-dropdown-menu-r5wgkvmZ.js → pk-dropdown-menu-CfZc7dIz.js} +4 -5
  35. package/dist/chunks/pk-dropdown-menu-CfZc7dIz.js.map +1 -0
  36. package/dist/chunks/{pk-editable-table-DQZQ6JLb.js → pk-editable-table-Cn4WXqAo.js} +208 -21
  37. package/dist/chunks/pk-editable-table-Cn4WXqAo.js.map +1 -0
  38. package/dist/chunks/{pk-field-JFP24j4o.js → pk-field-NL4KdFZC.js} +2 -3
  39. package/dist/chunks/pk-field-NL4KdFZC.js.map +1 -0
  40. package/dist/chunks/{pk-form-associated-element-DmZKgNPL.js → pk-form-associated-element-9M2NzOE2.js} +2 -2
  41. package/dist/chunks/{pk-form-associated-element-DmZKgNPL.js.map → pk-form-associated-element-9M2NzOE2.js.map} +1 -1
  42. package/dist/chunks/{pk-input-naIRPWGC.js → pk-input-DDkIXOkt.js} +3 -4
  43. package/dist/chunks/pk-input-DDkIXOkt.js.map +1 -0
  44. package/dist/chunks/{pk-input-group-CGHQKrt8.js → pk-input-group-CRPSBFhX.js} +2 -3
  45. package/dist/chunks/pk-input-group-CRPSBFhX.js.map +1 -0
  46. package/dist/chunks/{pk-input-group-addon-DXbNbsfY.js → pk-input-group-addon-B0StOmTJ.js} +2 -3
  47. package/dist/chunks/pk-input-group-addon-B0StOmTJ.js.map +1 -0
  48. package/dist/chunks/{pk-input-group-button-XOfVLqGO.js → pk-input-group-button-CnKajvsP.js} +2 -3
  49. package/dist/chunks/pk-input-group-button-CnKajvsP.js.map +1 -0
  50. package/dist/chunks/{pk-input-group-input-CSmR5vdY.js → pk-input-group-input-mllffsjQ.js} +2 -3
  51. package/dist/chunks/pk-input-group-input-mllffsjQ.js.map +1 -0
  52. package/dist/chunks/{pk-input-group-text-C6ekhtff.js → pk-input-group-text-DvaPJvh2.js} +2 -3
  53. package/dist/chunks/pk-input-group-text-DvaPJvh2.js.map +1 -0
  54. package/dist/chunks/{pk-input-group-textarea-DALr3pdU.js → pk-input-group-textarea-CqYv8tUQ.js} +2 -3
  55. package/dist/chunks/pk-input-group-textarea-CqYv8tUQ.js.map +1 -0
  56. package/dist/chunks/{pk-lightswitch-B-rLflNq.js → pk-lightswitch-DI1BeCmA.js} +3 -4
  57. package/dist/chunks/pk-lightswitch-DI1BeCmA.js.map +1 -0
  58. package/dist/chunks/{pk-option-Cy7oOcwF.js → pk-option-MGj9SKOK.js} +2 -3
  59. package/dist/chunks/pk-option-MGj9SKOK.js.map +1 -0
  60. package/dist/chunks/{pk-option-group-BAFSIZTa.js → pk-option-group-Cs6N7mlP.js} +2 -3
  61. package/dist/chunks/pk-option-group-Cs6N7mlP.js.map +1 -0
  62. package/dist/chunks/{pk-popover-G3ojheBD.js → pk-popover-duyNosk2.js} +3 -4
  63. package/dist/chunks/pk-popover-duyNosk2.js.map +1 -0
  64. package/dist/chunks/{pk-popup-CgiXok-U.js → pk-popup-B9AgBC2V.js} +2 -3
  65. package/dist/chunks/pk-popup-B9AgBC2V.js.map +1 -0
  66. package/dist/chunks/{pk-radio-CDfhOW8L.js → pk-radio-BK4D2Htu.js} +2 -3
  67. package/dist/chunks/pk-radio-BK4D2Htu.js.map +1 -0
  68. package/dist/chunks/{pk-radio-group-BazmLDvl.js → pk-radio-group-BRJIjOsR.js} +3 -4
  69. package/dist/chunks/pk-radio-group-BRJIjOsR.js.map +1 -0
  70. package/dist/chunks/{pk-scroll-area-BjU7-vZX.js → pk-scroll-area-BR6ckorh.js} +2 -3
  71. package/dist/chunks/pk-scroll-area-BR6ckorh.js.map +1 -0
  72. package/dist/chunks/{pk-select-BeMDXEC6.js → pk-select-C1s0OJr0.js} +4 -5
  73. package/dist/chunks/pk-select-C1s0OJr0.js.map +1 -0
  74. package/dist/chunks/{pk-separator-CLb9n0FK.js → pk-separator-CHij3vEG.js} +2 -3
  75. package/dist/chunks/pk-separator-CHij3vEG.js.map +1 -0
  76. package/dist/chunks/{pk-spinner-Blxd3SIH.js → pk-spinner-DweuYJ_Z.js} +2 -3
  77. package/dist/chunks/{pk-spinner-Blxd3SIH.js.map → pk-spinner-DweuYJ_Z.js.map} +1 -1
  78. package/dist/chunks/{pk-status-7_5dEuw-.js → pk-status-D1IzTSI2.js} +2 -3
  79. package/dist/chunks/{pk-status-7_5dEuw-.js.map → pk-status-D1IzTSI2.js.map} +1 -1
  80. package/dist/chunks/{pk-tab-f1OLMVXs.js → pk-tab-2MHunhlF.js} +3 -3
  81. package/dist/chunks/{pk-tab-f1OLMVXs.js.map → pk-tab-2MHunhlF.js.map} +1 -1
  82. package/dist/chunks/{pk-tab-heading-79ZuLhXi.js → pk-tab-heading-BV6m_sT-.js} +2 -3
  83. package/dist/chunks/pk-tab-heading-BV6m_sT-.js.map +1 -0
  84. package/dist/chunks/{pk-tab-panel-DdAbrOBF.js → pk-tab-panel-C6FxQw9q.js} +3 -3
  85. package/dist/chunks/{pk-tab-panel-DdAbrOBF.js.map → pk-tab-panel-C6FxQw9q.js.map} +1 -1
  86. package/dist/chunks/{pk-tabs-BhC5PAnO.js → pk-tabs-BTE63uK9.js} +2 -3
  87. package/dist/chunks/{pk-tabs-BhC5PAnO.js.map → pk-tabs-BTE63uK9.js.map} +1 -1
  88. package/dist/chunks/{pk-textarea-BEapC8Rk.js → pk-textarea-BcAyZYC-.js} +3 -4
  89. package/dist/chunks/pk-textarea-BcAyZYC-.js.map +1 -0
  90. package/dist/chunks/{pk-time-picker-RlAqlho4.js → pk-time-picker-5D4nmig2.js} +4 -5
  91. package/dist/chunks/{pk-time-picker-RlAqlho4.js.map → pk-time-picker-5D4nmig2.js.map} +1 -1
  92. package/dist/chunks/{pk-tiptap-content-zzx3-xrD.js → pk-tiptap-content-BPd4GO6c.js} +2 -3
  93. package/dist/chunks/pk-tiptap-content-BPd4GO6c.js.map +1 -0
  94. package/dist/chunks/{pk-tiptap-editor-DpT4TYdi.js → pk-tiptap-editor-tG67Vegc.js} +11 -12
  95. package/dist/chunks/pk-tiptap-editor-tG67Vegc.js.map +1 -0
  96. package/dist/chunks/{pk-tiptap-input-D7xj13FY.js → pk-tiptap-input-CtefNnaK.js} +3 -4
  97. package/dist/chunks/pk-tiptap-input-CtefNnaK.js.map +1 -0
  98. package/dist/chunks/{pk-toggle-5-GKVLye.js → pk-toggle-CW-lflrh.js} +2 -3
  99. package/dist/chunks/{pk-toggle-5-GKVLye.js.map → pk-toggle-CW-lflrh.js.map} +1 -1
  100. package/dist/chunks/{pk-toggle-group-CWDwYlgR.js → pk-toggle-group-BKymefo3.js} +2 -3
  101. package/dist/chunks/pk-toggle-group-BKymefo3.js.map +1 -0
  102. package/dist/chunks/{pk-tooltip-DAq-JZpg.js → pk-tooltip-BoDq8YVe.js} +3 -4
  103. package/dist/chunks/pk-tooltip-BoDq8YVe.js.map +1 -0
  104. package/dist/chunks/{register-C9xZttKy.js → register-CQodpTWT.js} +50 -50
  105. package/dist/chunks/{register-C9xZttKy.js.map → register-CQodpTWT.js.map} +1 -1
  106. package/dist/components/button/pk-button.js +1 -1
  107. package/dist/components/button-group/pk-button-group-separator.js +1 -1
  108. package/dist/components/button-group/pk-button-group-text.js +1 -1
  109. package/dist/components/button-group/pk-button-group.js +1 -1
  110. package/dist/components/button-group.js +3 -3
  111. package/dist/components/button.js +1 -1
  112. package/dist/components/calendar/pk-calendar.js +1 -1
  113. package/dist/components/calendar.js +1 -1
  114. package/dist/components/checkbox/pk-checkbox.js +1 -1
  115. package/dist/components/checkbox-select/pk-checkbox-select.js +1 -1
  116. package/dist/components/checkbox-select.js +1 -1
  117. package/dist/components/checkbox.js +1 -1
  118. package/dist/components/code-editor/pk-code-editor.js +1 -1
  119. package/dist/components/code-editor.js +1 -1
  120. package/dist/components/color-input/pk-color-input.js +1 -1
  121. package/dist/components/color-input.js +1 -1
  122. package/dist/components/combobox/pk-combobox.js +1 -1
  123. package/dist/components/combobox.js +1 -1
  124. package/dist/components/connect/pk-connect-oauth.js +3 -4
  125. package/dist/components/connect/pk-connect-oauth.js.map +1 -1
  126. package/dist/components/connect/pk-connect.js +4 -5
  127. package/dist/components/connect/pk-connect.js.map +1 -1
  128. package/dist/components/copy-button/pk-copy-button.js +1 -1
  129. package/dist/components/copy-button.js +1 -1
  130. package/dist/components/date-picker/pk-date-picker.js +1 -1
  131. package/dist/components/date-picker.js +1 -1
  132. package/dist/components/dialog/pk-dialog.js +1 -1
  133. package/dist/components/dialog.js +1 -1
  134. package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
  135. package/dist/components/dropdown-menu/pk-dropdown-label.js +1 -1
  136. package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
  137. package/dist/components/dropdown-menu/pk-dropdown-separator.js +1 -2
  138. package/dist/components/dropdown-menu/pk-dropdown-separator.js.map +1 -1
  139. package/dist/components/dropdown-menu.js +3 -3
  140. package/dist/components/editable-table/editable-table-model.d.ts +16 -0
  141. package/dist/components/editable-table/editable-table-model.d.ts.map +1 -1
  142. package/dist/components/editable-table/pk-editable-table.d.ts +25 -0
  143. package/dist/components/editable-table/pk-editable-table.d.ts.map +1 -1
  144. package/dist/components/editable-table/pk-editable-table.js +1 -1
  145. package/dist/components/editable-table.js +1 -1
  146. package/dist/components/field/pk-field.js +1 -1
  147. package/dist/components/field.js +1 -1
  148. package/dist/components/icon/pk-icon.js +1 -2
  149. package/dist/components/icon/pk-icon.js.map +1 -1
  150. package/dist/components/input/pk-input.js +1 -1
  151. package/dist/components/input-group/pk-input-group-addon.js +1 -1
  152. package/dist/components/input-group/pk-input-group-button.js +1 -1
  153. package/dist/components/input-group/pk-input-group-input.js +1 -1
  154. package/dist/components/input-group/pk-input-group-text.js +1 -1
  155. package/dist/components/input-group/pk-input-group-textarea.js +1 -1
  156. package/dist/components/input-group/pk-input-group.js +1 -1
  157. package/dist/components/input-group.js +6 -6
  158. package/dist/components/input.js +1 -1
  159. package/dist/components/lightswitch/pk-lightswitch.js +1 -1
  160. package/dist/components/lightswitch.js +1 -1
  161. package/dist/components/popover/pk-popover.js +1 -1
  162. package/dist/components/popover.js +1 -1
  163. package/dist/components/popup/pk-popup.js +1 -1
  164. package/dist/components/popup.js +1 -1
  165. package/dist/components/radio-group/pk-radio-group.js +1 -1
  166. package/dist/components/radio-group/pk-radio.js +1 -1
  167. package/dist/components/radio-group.js +2 -2
  168. package/dist/components/scroll-area/pk-scroll-area.js +1 -1
  169. package/dist/components/scroll-area.js +1 -1
  170. package/dist/components/select/pk-option-group.js +1 -1
  171. package/dist/components/select/pk-option.js +1 -1
  172. package/dist/components/select/pk-select.js +1 -1
  173. package/dist/components/select.js +3 -3
  174. package/dist/components/separator/pk-separator.js +1 -1
  175. package/dist/components/separator.js +1 -1
  176. package/dist/components/spinner/pk-spinner.js +1 -1
  177. package/dist/components/spinner.js +1 -1
  178. package/dist/components/status/pk-status.js +1 -1
  179. package/dist/components/status.js +1 -1
  180. package/dist/components/tabs/pk-tab-heading.js +1 -1
  181. package/dist/components/tabs/pk-tab-panel.js +1 -1
  182. package/dist/components/tabs/pk-tab.js +1 -1
  183. package/dist/components/tabs/pk-tabs.js +1 -1
  184. package/dist/components/tabs.js +4 -4
  185. package/dist/components/textarea/pk-textarea.js +1 -1
  186. package/dist/components/textarea.js +1 -1
  187. package/dist/components/time-picker/pk-time-picker.js +1 -1
  188. package/dist/components/time-picker.js +1 -1
  189. package/dist/components/tiptap/pk-tiptap-content.js +1 -1
  190. package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
  191. package/dist/components/tiptap/pk-tiptap-input.js +1 -1
  192. package/dist/components/tiptap-content.js +1 -1
  193. package/dist/components/tiptap-editor.js +1 -1
  194. package/dist/components/tiptap-input.js +1 -1
  195. package/dist/components/toggle/pk-toggle.js +1 -1
  196. package/dist/components/toggle-group/pk-toggle-group.js +1 -1
  197. package/dist/components/toggle-group.js +1 -1
  198. package/dist/components/toggle.js +1 -1
  199. package/dist/components/tooltip/pk-tooltip.js +1 -1
  200. package/dist/components/tooltip.js +1 -1
  201. package/dist/connect/register-cp-connect.js +3 -3
  202. package/dist/decorators.d.ts +12 -0
  203. package/dist/decorators.d.ts.map +1 -0
  204. package/dist/index.js +52 -52
  205. package/dist/register.js +50 -50
  206. package/dist-loader/components/editable-table/editable-table.js +192 -4
  207. package/package.json +7 -7
  208. package/dist/chunks/decorate-W02hmVTt.js.map +0 -1
  209. package/dist/chunks/pk-button-group-D9hqSfb_.js.map +0 -1
  210. package/dist/chunks/pk-button-group-separator-DG0CYaqc.js.map +0 -1
  211. package/dist/chunks/pk-calendar-CoUil0F7.js.map +0 -1
  212. package/dist/chunks/pk-checkbox-Bavq3-9C.js.map +0 -1
  213. package/dist/chunks/pk-checkbox-select-9lqd9Rwz.js.map +0 -1
  214. package/dist/chunks/pk-code-editor-DSG6AwLV.js.map +0 -1
  215. package/dist/chunks/pk-color-input-BCCXCZMA.js.map +0 -1
  216. package/dist/chunks/pk-combobox-BqaSsLJb.js.map +0 -1
  217. package/dist/chunks/pk-copy-button-CfeVuQ0r.js.map +0 -1
  218. package/dist/chunks/pk-date-picker-BM4HMb4-.js.map +0 -1
  219. package/dist/chunks/pk-dialog-Ck1InIBC.js.map +0 -1
  220. package/dist/chunks/pk-dropdown-item-HcIUlFH1.js.map +0 -1
  221. package/dist/chunks/pk-dropdown-menu-r5wgkvmZ.js.map +0 -1
  222. package/dist/chunks/pk-editable-table-DQZQ6JLb.js.map +0 -1
  223. package/dist/chunks/pk-field-JFP24j4o.js.map +0 -1
  224. package/dist/chunks/pk-input-group-CGHQKrt8.js.map +0 -1
  225. package/dist/chunks/pk-input-group-addon-DXbNbsfY.js.map +0 -1
  226. package/dist/chunks/pk-input-group-button-XOfVLqGO.js.map +0 -1
  227. package/dist/chunks/pk-input-group-input-CSmR5vdY.js.map +0 -1
  228. package/dist/chunks/pk-input-group-text-C6ekhtff.js.map +0 -1
  229. package/dist/chunks/pk-input-group-textarea-DALr3pdU.js.map +0 -1
  230. package/dist/chunks/pk-input-naIRPWGC.js.map +0 -1
  231. package/dist/chunks/pk-lightswitch-B-rLflNq.js.map +0 -1
  232. package/dist/chunks/pk-option-Cy7oOcwF.js.map +0 -1
  233. package/dist/chunks/pk-option-group-BAFSIZTa.js.map +0 -1
  234. package/dist/chunks/pk-popover-G3ojheBD.js.map +0 -1
  235. package/dist/chunks/pk-popup-CgiXok-U.js.map +0 -1
  236. package/dist/chunks/pk-radio-CDfhOW8L.js.map +0 -1
  237. package/dist/chunks/pk-radio-group-BazmLDvl.js.map +0 -1
  238. package/dist/chunks/pk-scroll-area-BjU7-vZX.js.map +0 -1
  239. package/dist/chunks/pk-select-BeMDXEC6.js.map +0 -1
  240. package/dist/chunks/pk-separator-CLb9n0FK.js.map +0 -1
  241. package/dist/chunks/pk-tab-heading-79ZuLhXi.js.map +0 -1
  242. package/dist/chunks/pk-textarea-BEapC8Rk.js.map +0 -1
  243. package/dist/chunks/pk-tiptap-content-zzx3-xrD.js.map +0 -1
  244. package/dist/chunks/pk-tiptap-editor-DpT4TYdi.js.map +0 -1
  245. package/dist/chunks/pk-tiptap-input-D7xj13FY.js.map +0 -1
  246. package/dist/chunks/pk-toggle-group-CWDwYlgR.js.map +0 -1
  247. package/dist/chunks/pk-tooltip-DAq-JZpg.js.map +0 -1
@@ -774,6 +774,62 @@ var isCustomColumn = (column) => {
774
774
  if (type === "custom") return true;
775
775
  return typeof type === "string" && !BUILTIN_COLUMN_TYPES.has(type);
776
776
  };
777
+ /**
778
+ * Column types that receive TSV paste *writes* (Craft `importData` fills textual
779
+ * cells; checkbox/radio/lightswitch and static/custom cells are skipped).
780
+ */
781
+ var PASTE_IMPORT_SKIP_TYPES = new Set([
782
+ "checkbox",
783
+ "radio",
784
+ "lightswitch",
785
+ "heading",
786
+ "label"
787
+ ]);
788
+ /**
789
+ * Types that intercept multi-cell paste (Craft attaches `handlePaste` to textual
790
+ * inputs except multiline — native paste stays on `textarea`).
791
+ */
792
+ var PASTE_INTERCEPT_TYPES = new Set([
793
+ "text",
794
+ "number",
795
+ "email",
796
+ "url",
797
+ "handle",
798
+ "value",
799
+ "color",
800
+ "date",
801
+ "time"
802
+ ]);
803
+ /** Whether a multi-cell paste gesturing from this cell should run `importData`. */
804
+ var columnInterceptsPaste = (column) => {
805
+ if (isCustomColumn(column)) return false;
806
+ return PASTE_INTERCEPT_TYPES.has(column.type ?? "text");
807
+ };
808
+ /** Whether `importData` should write a clipboard cell into this column. */
809
+ var columnAcceptsPasteImport = (column) => {
810
+ if (isCustomColumn(column)) return false;
811
+ return !PASTE_IMPORT_SKIP_TYPES.has(column.type ?? "text");
812
+ };
813
+ /**
814
+ * Craft `Craft.trim(text, ' \\n\\r')` — strip spaces/newlines from both ends so a
815
+ * trailing spreadsheet newline does not create an empty extra row.
816
+ */
817
+ var trimClipboardText = (text) => {
818
+ return String(text ?? "").replace(/^[\n\r ]+|[\n\r ]+$/g, "");
819
+ };
820
+ /** True when clipboard looks like a multi-cell / multi-row TSV paste. */
821
+ var isMultiCellClipboard = (text) => {
822
+ return /[\t\r\n]/.test(text);
823
+ };
824
+ /**
825
+ * Parse spreadsheet clipboard text into a grid (rows → cells).
826
+ * Excel / Sheets copy as tab-separated values with newline-separated rows.
827
+ */
828
+ var parseTsvClipboard = (text) => {
829
+ const trimmed = trimClipboardText(text);
830
+ if (!trimmed) return [];
831
+ return trimmed.split(/\r?\n|\r/).map((line) => line.split(" "));
832
+ };
777
833
  //#endregion
778
834
  //#region src/components/editable-table/pk-editable-table.ts
779
835
  /** Craft CP reorder diamond (`grip-move`). */
@@ -799,6 +855,8 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
799
855
  this.allowAdd = true;
800
856
  this.allowDelete = true;
801
857
  this.allowReorder = true;
858
+ this.allowInsert = true;
859
+ this.maxRows = null;
802
860
  this.addRowLabel = "";
803
861
  this.fieldName = "";
804
862
  this.cellErrors = {};
@@ -875,7 +933,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
875
933
  return this.validColumns.filter(isGeneratedColumn);
876
934
  }
877
935
  get showActionsColumn() {
878
- return this.allowReorder || this.allowDelete || Boolean(this.getRowMenuItems);
936
+ return this.allowReorder || this.allowDelete || this.allowInsert || Boolean(this.getRowMenuItems);
879
937
  }
880
938
  cleanRows() {
881
939
  return this.internalRows.map((row) => {
@@ -1063,23 +1121,123 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
1063
1121
  }));
1064
1122
  this.commitRows(next, cellChanges);
1065
1123
  }
1066
- addRow() {
1067
- if (this.disabled || !this.allowAdd) return;
1124
+ canAddRow(currentCount = this.internalRows.length) {
1125
+ if (this.disabled || !this.allowAdd) return false;
1126
+ if (this.maxRows != null && Number.isFinite(this.maxRows) && currentCount >= this.maxRows) return false;
1127
+ return true;
1128
+ }
1129
+ createEmptyRow() {
1130
+ if (!this.canAddRow()) return null;
1068
1131
  const row = {
1069
1132
  _id: nextRowId(),
1070
1133
  ...this.newRowDefaults && typeof this.newRowDefaults === "object" ? this.newRowDefaults : {}
1071
1134
  };
1072
1135
  for (const column of this.validColumns) if (!(column.name in row)) row[column.name] = defaultValueForColumn(column);
1136
+ return row;
1137
+ }
1138
+ addRow() {
1139
+ const row = this.createEmptyRow();
1140
+ if (!row) return;
1073
1141
  this.internalRows = [...this.internalRows, row];
1074
1142
  this.syncGeneratedModesFromRows();
1075
1143
  this.emitChange();
1076
1144
  }
1145
+ /** Insert a blank row at `index` (0 = above first row). No-ops when add is disallowed. */
1146
+ insertRowAt(index) {
1147
+ const row = this.createEmptyRow();
1148
+ if (!row) return;
1149
+ const clamped = Math.max(0, Math.min(index, this.internalRows.length));
1150
+ const next = this.internalRows.slice();
1151
+ next.splice(clamped, 0, row);
1152
+ this.internalRows = next;
1153
+ this.syncGeneratedModesFromRows();
1154
+ this.emitChange();
1155
+ }
1077
1156
  removeRow(rowIndex) {
1078
1157
  if (this.disabled || !this.allowDelete) return;
1079
1158
  this.internalRows = this.internalRows.filter((_, index) => index !== rowIndex);
1080
1159
  this.syncGeneratedModesFromRows();
1081
1160
  this.emitChange();
1082
1161
  }
1162
+ /**
1163
+ * Craft EditableTable paste: intercept only when the clipboard has tabs/newlines.
1164
+ * Listens on the scroll wrapper so events compose out of cell control shadows.
1165
+ */
1166
+ handleTablePaste(event) {
1167
+ if (this.disabled || !event.clipboardData) return;
1168
+ const data = trimClipboardText(event.clipboardData.getData("text/plain") || event.clipboardData.getData("Text") || "");
1169
+ if (!isMultiCellClipboard(data)) return;
1170
+ const path = event.composedPath();
1171
+ let cell = null;
1172
+ let row = null;
1173
+ for (const node of path) {
1174
+ if (node instanceof HTMLTableCellElement && node.tagName === "TD" && !node.classList.contains("actions")) cell = node;
1175
+ if (node instanceof HTMLTableRowElement && node.dataset.rowId) {
1176
+ row = node;
1177
+ break;
1178
+ }
1179
+ }
1180
+ if (!cell || !row) return;
1181
+ const rowIndex = this.internalRows.findIndex((item) => String(item._id) === row.dataset.rowId);
1182
+ const columnIndex = [...row.querySelectorAll(":scope > td:not(.actions)")].indexOf(cell);
1183
+ if (rowIndex < 0 || columnIndex < 0) return;
1184
+ const column = this.validColumns[columnIndex];
1185
+ if (!column || !columnInterceptsPaste(column)) return;
1186
+ event.preventDefault();
1187
+ event.stopPropagation();
1188
+ this.importTsvData(data, rowIndex, columnIndex);
1189
+ }
1190
+ /**
1191
+ * Apply a TSV grid starting at `[startRowIndex, startColumnIndex]`.
1192
+ * Skips non-textual columns (checkbox etc.) but still advances the column
1193
+ * cursor — same as Craft writing only into matching `textarea`/`input`s.
1194
+ */
1195
+ importTsvData(data, startRowIndex, startColumnIndex) {
1196
+ const grid = parseTsvClipboard(data);
1197
+ if (grid.length === 0) return;
1198
+ const columns = this.validColumns;
1199
+ if (columns.length === 0 || startColumnIndex >= columns.length) return;
1200
+ const next = this.internalRows.map((row) => ({ ...row }));
1201
+ let rowIndex = startRowIndex;
1202
+ let mutated = false;
1203
+ for (let lineIndex = 0; lineIndex < grid.length; lineIndex++) {
1204
+ if (rowIndex >= next.length) {
1205
+ if (!this.canAddRow(next.length)) break;
1206
+ const created = {
1207
+ _id: nextRowId(),
1208
+ ...this.newRowDefaults && typeof this.newRowDefaults === "object" ? this.newRowDefaults : {}
1209
+ };
1210
+ for (const column of columns) if (!(column.name in created)) created[column.name] = defaultValueForColumn(column);
1211
+ next.push(created);
1212
+ mutated = true;
1213
+ }
1214
+ const cells = grid[lineIndex] ?? [];
1215
+ const row = next[rowIndex];
1216
+ if (!row) break;
1217
+ let rowPatch = null;
1218
+ for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {
1219
+ const column = columns[startColumnIndex + cellIndex];
1220
+ if (!column) break;
1221
+ if (!columnAcceptsPasteImport(column)) continue;
1222
+ const value = cells[cellIndex] ?? "";
1223
+ if (row[column.name] === value) continue;
1224
+ rowPatch = rowPatch ?? {};
1225
+ rowPatch[column.name] = value;
1226
+ }
1227
+ if (rowPatch) {
1228
+ next[rowIndex] = {
1229
+ ...row,
1230
+ ...rowPatch
1231
+ };
1232
+ mutated = true;
1233
+ }
1234
+ rowIndex += 1;
1235
+ }
1236
+ if (!mutated) return;
1237
+ this.internalRows = next;
1238
+ this.syncGeneratedModesFromRows();
1239
+ this.emitChange();
1240
+ }
1083
1241
  moveRow(rowIndex, direction) {
1084
1242
  const target = rowIndex + direction;
1085
1243
  if (this.disabled || target < 0 || target >= this.internalRows.length) return;
@@ -1364,7 +1522,8 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
1364
1522
  const rowId = String(row._id);
1365
1523
  const rowMod = this.resolveRowModifier(row, rowIndex);
1366
1524
  const extraMenuItems = this.resolveRowMenuItems(row, rowIndex);
1367
- const showRowMenu = this.allowReorder || extraMenuItems.length > 0;
1525
+ const showRowMenu = this.allowReorder || this.allowInsert || extraMenuItems.length > 0;
1526
+ const insertDisabled = this.disabled || !this.canAddRow();
1368
1527
  return b`<tr
1369
1528
  data-row-id=${rowId}
1370
1529
  data-tone=${rowMod.tone || A}
@@ -1417,6 +1576,25 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
1417
1576
  ?disabled=${this.disabled}
1418
1577
  >${o(START_ELLIPSIS_ICON)}</pk-button>
1419
1578
  ${this.renderExtraMenuItems(row, rowIndex)}
1579
+ ${this.allowInsert ? b`
1580
+ <pk-dropdown-item
1581
+ ?disabled=${insertDisabled}
1582
+ @click=${() => {
1583
+ this.insertRowAt(rowIndex);
1584
+ }}
1585
+ >
1586
+ ${o(START_PLUS_ICON)}
1587
+ Insert above
1588
+ </pk-dropdown-item>
1589
+ <pk-dropdown-item
1590
+ ?disabled=${insertDisabled}
1591
+ @click=${() => {
1592
+ this.insertRowAt(rowIndex + 1);
1593
+ }}
1594
+ >
1595
+ ${o(START_PLUS_ICON)}
1596
+ Insert below
1597
+ </pk-dropdown-item>` : A}
1420
1598
  ${this.allowReorder ? b`
1421
1599
  <pk-dropdown-item
1422
1600
  ?disabled=${this.disabled || rowIndex === 0}
@@ -1460,6 +1638,7 @@ var PkEditableTable = class PkEditableTable extends PkFormAssociatedElement {
1460
1638
  @pk-change=${this.stopInnerControlEvent}
1461
1639
  @input=${this.stopInnerControlEvent}
1462
1640
  @change=${this.stopInnerControlEvent}
1641
+ @paste=${this.handleTablePaste}
1463
1642
  >
1464
1643
  <table class="et">
1465
1644
  <thead>
@@ -1517,6 +1696,15 @@ __decorate([n({
1517
1696
  reflect: true,
1518
1697
  attribute: "allow-reorder"
1519
1698
  })], PkEditableTable.prototype, "allowReorder", void 0);
1699
+ __decorate([n({
1700
+ type: Boolean,
1701
+ reflect: true,
1702
+ attribute: "allow-insert"
1703
+ })], PkEditableTable.prototype, "allowInsert", void 0);
1704
+ __decorate([n({
1705
+ type: Number,
1706
+ attribute: "max-rows"
1707
+ })], PkEditableTable.prototype, "maxRows", void 0);
1520
1708
  __decorate([n({ attribute: "add-row-label" })], PkEditableTable.prototype, "addRowLabel", void 0);
1521
1709
  __decorate([n({ attribute: "field-name" })], PkEditableTable.prototype, "fieldName", void 0);
1522
1710
  __decorate([n({ attribute: false })], PkEditableTable.prototype, "cellErrors", void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verbb/plugin-kit-web",
3
- "version": "2.0.13",
3
+ "version": "2.0.15",
4
4
  "description": "Plugin Kit web components (shadow DOM, Craft design system)",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -982,18 +982,18 @@
982
982
  },
983
983
  "peerDependencies": {
984
984
  "@floating-ui/dom": "^1.7.3",
985
- "@verbb/plugin-kit-core": "^2.0.13",
986
- "@verbb/plugin-kit-icons": "^2.0.13",
985
+ "@verbb/plugin-kit-core": "^2.0.15",
986
+ "@verbb/plugin-kit-icons": "^2.0.15",
987
987
  "lit": "^3.3.0"
988
988
  },
989
989
  "license": "MIT",
990
990
  "dependencies": {
991
991
  "@floating-ui/dom": "^1.7.3",
992
992
  "@tiptap/core": "^3.22.4",
993
- "@verbb/plugin-kit-codemirror-core": "2.0.13",
994
- "@verbb/plugin-kit-core": "^2.0.13",
995
- "@verbb/plugin-kit-icons": "^2.0.13",
996
- "@verbb/plugin-kit-tiptap-core": "^2.0.13",
993
+ "@verbb/plugin-kit-codemirror-core": "2.0.15",
994
+ "@verbb/plugin-kit-core": "^2.0.15",
995
+ "@verbb/plugin-kit-icons": "^2.0.15",
996
+ "@verbb/plugin-kit-tiptap-core": "^2.0.15",
997
997
  "composed-offset-position": "^0.0.6",
998
998
  "lit": "^3.3.0"
999
999
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"decorate-W02hmVTt.js","names":[],"sources":["../../src/base/styles.ts","../../src/base/shadow-reset.styles.ts","../../src/base/pk-element.ts"],"sourcesContent":["import { css, unsafeCSS, type CSSResultGroup } from 'lit';\n\nconst sharedStyleSheets = new Map<string, CSSStyleSheet>();\n\n/**\n * Share constructable stylesheets across component instances ( pattern).\n * Falls back to an injected `<style>` tag when adoptedStyleSheets aren't supported.\n */\nexport function adoptStyles(\n shadowRoot: ShadowRoot,\n styleResults: CSSResultGroup[],\n cacheKey?: string,\n): void {\n const cssText = styleResults\n .flatMap((result) => (Array.isArray(result) ? result : [result]))\n .map((result) => {\n if ('cssText' in result && typeof result.cssText === 'string') {\n return result.cssText;\n }\n\n return unsafeCSS(result).cssText;\n })\n .join('\\n');\n\n if (!('adoptedStyleSheets' in Document.prototype) || typeof CSSStyleSheet === 'undefined') {\n const styleKey = cacheKey ?? String(styleResults.length);\n\n if (!shadowRoot.querySelector(`style[data-pk-adopted-styles=\"${styleKey}\"]`)) {\n const style = document.createElement('style');\n style.dataset.pkAdoptedStyles = styleKey;\n style.textContent = cssText;\n shadowRoot.prepend(style);\n }\n\n return;\n }\n\n const key = cacheKey ?? cssText;\n let sheet = sharedStyleSheets.get(key);\n\n if (!sheet) {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(cssText);\n sharedStyleSheets.set(key, sheet);\n }\n\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, sheet];\n}\n\nexport const hostDisplayInlineBlock = css`\n @layer pk-component {\n :host {\n display: inline-block;\n vertical-align: middle;\n }\n }\n`;\n\nexport const focusRing = css`\n .pk-focus-ring:focus {\n outline: none;\n }\n\n .pk-focus-ring:focus-visible {\n box-shadow: var(--pk-shadow-focus);\n }\n`;\n","import { css } from 'lit';\n\n/**\n * Shadow-root baseline — box model + inherited typography inside every pk-* component.\n * Applied via PkElement.createRenderRoot(); does not replace per-component styles.\n */\nexport const shadowResetStyles = css`\n @layer pk-reset {\n :host {\n box-sizing: border-box;\n }\n\n :host *,\n :host *::before,\n :host *::after {\n box-sizing: border-box;\n }\n\n :host(:not([hidden])) {\n /* Prevent UA / CP margin on unstyled custom element hosts in light DOM. */\n margin: 0;\n }\n }\n`;\n","import { LitElement } from 'lit';\n\nimport { adoptStyles } from './styles.js';\nimport { shadowResetStyles } from './shadow-reset.styles.js';\n\nexport type PkElementErrorDetail = {\n tagName: string;\n message: string;\n stack?: string;\n};\n\ndeclare global {\n interface GlobalEventHandlersEventMap {\n 'pk-error': CustomEvent<PkElementErrorDetail>;\n }\n}\n\n/**\n * Base class for Plugin Kit web components.\n * Open shadow root; Lit adopts constructable stylesheets where supported.\n *\n * `performUpdate` is wrapped so a single control failure degrades inline instead of\n * taking down the whole CP surface (React error boundaries do not see Lit throws).\n */\nexport class PkElement extends LitElement {\n static override shadowRootOptions: ShadowRootInit = {\n mode: 'open',\n delegatesFocus: true,\n };\n\n /** When set, subclasses should skip normal render — base shows a minimal error shell. */\n protected pkRenderFailed = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Host marker for document/shadow peers (e.g. Tailwind preflight). Must not set\n // attributes in the constructor — CE rules forbid that on createElement().\n if (!this.hasAttribute('data-pk')) {\n this.setAttribute('data-pk', '');\n }\n }\n\n override createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n adoptStyles(root as ShadowRoot, [shadowResetStyles], 'pk-shadow-reset');\n return root;\n }\n\n override performUpdate(): void {\n if (this.pkRenderFailed) {\n return;\n }\n\n try {\n const result = super.performUpdate();\n\n // Lit deprecates returning a Promise from performUpdate — handle async render\n // failures without making this override async (avoids dev-mode update-queue bugs).\n // Lit may return void; keep a Promise guard for older async performUpdate paths.\n if ((result as unknown) instanceof Promise) {\n void (result as unknown as Promise<unknown>).catch((error: unknown) => {\n this.handleRenderFailure(error);\n });\n }\n } catch (error) {\n this.handleRenderFailure(error);\n }\n }\n\n protected handleRenderFailure(error: unknown): void {\n const err = error instanceof Error ? error : new Error(String(error));\n this.pkRenderFailed = true;\n\n this.dispatchEvent(\n new CustomEvent<PkElementErrorDetail>('pk-error', {\n detail: {\n tagName: this.localName || this.tagName.toLowerCase(),\n message: err.message,\n stack: err.stack,\n },\n bubbles: true,\n composed: true,\n }),\n );\n\n // Last-resort inline fallback — plain DOM so we do not recurse through Lit render().\n try {\n const root = this.renderRoot as ShadowRoot | HTMLElement | undefined;\n\n if (root) {\n root.textContent = '';\n const shell = document.createElement('div');\n shell.setAttribute('part', 'error');\n shell.setAttribute('role', 'alert');\n shell.textContent = 'This control failed to load.';\n root.appendChild(shell);\n }\n } catch {\n /* never throw from the error handler */\n }\n }\n}\n"],"mappings":";;AAEA,IAAM,oCAAoB,IAAI,KAA4B;;;;;AAM1D,SAAgB,YACZ,YACA,cACA,UACI;CACJ,MAAM,UAAU,aACX,SAAS,WAAY,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC,OAAO,CAAE,CAChE,KAAK,WAAW;AACb,MAAI,aAAa,UAAU,OAAO,OAAO,YAAY,SACjD,QAAO,OAAO;AAGlB,SAAO,UAAU,OAAO,CAAC;GAC3B,CACD,KAAK,KAAK;AAEf,KAAI,EAAE,wBAAwB,SAAS,cAAc,OAAO,kBAAkB,aAAa;EACvF,MAAM,WAAW,YAAY,OAAO,aAAa,OAAO;AAExD,MAAI,CAAC,WAAW,cAAc,iCAAiC,SAAS,IAAI,EAAE;GAC1E,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,SAAM,QAAQ,kBAAkB;AAChC,SAAM,cAAc;AACpB,cAAW,QAAQ,MAAM;;AAG7B;;CAGJ,MAAM,MAAM,YAAY;CACxB,IAAI,QAAQ,kBAAkB,IAAI,IAAI;AAEtC,KAAI,CAAC,OAAO;AACR,UAAQ,IAAI,eAAe;AAC3B,QAAM,YAAY,QAAQ;AAC1B,oBAAkB,IAAI,KAAK,MAAM;;AAGrC,YAAW,qBAAqB,CAAC,GAAG,WAAW,oBAAoB,MAAM;;AAG7E,IAAa,yBAAyB,GAAG;;;;;;;;AAShB,GAAG;;;;;;;;;;;;;;;ACpD5B,IAAa,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkBpC,IAAa,YAAb,cAA+B,WAAW;;;wBAOX;;;2BANyB;GAChD,MAAM;GACN,gBAAgB;GACnB;;CAKD,oBAAmC;AAC/B,QAAM,mBAAmB;AAGzB,MAAI,CAAC,KAAK,aAAa,UAAU,CAC7B,MAAK,aAAa,WAAW,GAAG;;CAIxC,mBAA4D;EACxD,MAAM,OAAO,MAAM,kBAAkB;AACrC,cAAY,MAAoB,CAAC,kBAAkB,EAAE,kBAAkB;AACvE,SAAO;;CAGX,gBAA+B;AAC3B,MAAI,KAAK,eACL;AAGJ,MAAI;GACA,MAAM,SAAS,MAAM,eAAe;AAKpC,OAAK,kBAA8B,QACzB,QAAuC,OAAO,UAAmB;AACnE,SAAK,oBAAoB,MAAM;KACjC;WAED,OAAO;AACZ,QAAK,oBAAoB,MAAM;;;CAIvC,oBAA8B,OAAsB;EAChD,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AACrE,OAAK,iBAAiB;AAEtB,OAAK,cACD,IAAI,YAAkC,YAAY;GAC9C,QAAQ;IACJ,SAAS,KAAK,aAAa,KAAK,QAAQ,aAAa;IACrD,SAAS,IAAI;IACb,OAAO,IAAI;IACd;GACD,SAAS;GACT,UAAU;GACb,CAAC,CACL;AAGD,MAAI;GACA,MAAM,OAAO,KAAK;AAElB,OAAI,MAAM;AACN,SAAK,cAAc;IACnB,MAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,cAAc;AACpB,SAAK,YAAY,MAAM;;UAEvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-button-group-D9hqSfb_.js","names":[],"sources":["../../src/components/button-group/pk-button-group.styles.ts","../../src/components/button-group/pk-button-group.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkButtonGroupStyles = css`\n @layer pk-component {\n :host {\n display: inline-flex;\n width: fit-content;\n vertical-align: middle;\n }\n\n .group {\n display: flex;\n position: relative;\n isolation: isolate;\n flex-wrap: nowrap;\n gap: 0;\n width: fit-content;\n max-width: 100%;\n align-items: stretch;\n }\n\n :host([orientation='horizontal']) .group {\n flex-direction: row;\n }\n\n :host([orientation='vertical']) .group {\n flex-direction: column;\n align-items: stretch;\n }\n\n :host([orientation='vertical']) ::slotted(pk-button),\n :host([orientation='vertical']) ::slotted(pk-toggle),\n :host([orientation='vertical']) ::slotted(pk-input),\n :host([orientation='vertical']) ::slotted(pk-input-group),\n :host([orientation='vertical']) ::slotted(.button-group-text),\n :host([orientation='vertical']) ::slotted(select.button-group-select) {\n align-self: stretch;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n @media (hover: hover) {\n .group > :hover,\n ::slotted(:hover) {\n z-index: 1;\n }\n }\n\n .group > :focus-visible,\n ::slotted(:focus-visible),\n ::slotted(:focus-within),\n ::slotted([aria-checked='true']),\n ::slotted([checked]) {\n position: relative;\n z-index: 2;\n }\n\n /* Flush join: filled controls sit edge-to-edge; outlined controls overlap 1px to collapse borders */\n :host([orientation='horizontal']) {\n --pk-bg-horizontal-indent: 0;\n --pk-bg-horizontal-indent-outlined: -1px;\n --pk-btn-group-gap: 1px;\n --pk-btn-group-divider-color-outline: var(--pk-color-slate-400);\n --pk-btn-group-divider-color-dashed: var(--pk-color-slate-500);\n }\n\n :host([orientation='vertical']) {\n --pk-bg-vertical-indent: 0;\n --pk-bg-vertical-indent-outlined: -1px;\n --pk-btn-group-gap: 1px;\n --pk-btn-group-divider-color-outline: var(--pk-color-slate-400);\n --pk-btn-group-divider-color-dashed: var(--pk-color-slate-500);\n }\n\n :host([separators][orientation='horizontal']) {\n --pk-bg-horizontal-indent: 0;\n }\n\n :host([separators][orientation='vertical']) {\n --pk-bg-vertical-indent: 0;\n }\n\n ::slotted([data-pk-group-orientation='horizontal']:not([data-pk-group-item-first]):not([data-pk-group-item-last])) {\n --pk-bg-start-start-radius: 0;\n --pk-bg-start-end-radius: 0;\n --pk-bg-end-start-radius: 0;\n --pk-bg-end-end-radius: 0;\n }\n\n ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-item-first]:not([data-pk-group-item-last])) {\n --pk-bg-start-end-radius: 0;\n --pk-bg-end-end-radius: 0;\n }\n\n ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-item-last]:not([data-pk-group-item-first])) {\n --pk-bg-start-start-radius: 0;\n --pk-bg-end-start-radius: 0;\n }\n\n ::slotted([data-pk-group-orientation='vertical']:not([data-pk-group-item-first]):not([data-pk-group-item-last])) {\n --pk-bg-start-start-radius: 0;\n --pk-bg-start-end-radius: 0;\n --pk-bg-end-start-radius: 0;\n --pk-bg-end-end-radius: 0;\n }\n\n ::slotted([data-pk-group-orientation='vertical'][data-pk-group-item-first]:not([data-pk-group-item-last])) {\n --pk-bg-end-start-radius: 0;\n --pk-bg-end-end-radius: 0;\n }\n\n ::slotted([data-pk-group-orientation='vertical'][data-pk-group-item-last]:not([data-pk-group-item-first])) {\n --pk-bg-start-start-radius: 0;\n --pk-bg-start-end-radius: 0;\n }\n\n :host([exclusive]) ::slotted(pk-button[aria-pressed='true']) {\n --pk-btn-fill: var(--pk-color-gray-500);\n --pk-btn-fill-hover: var(--pk-color-gray-550);\n --pk-btn-fill-active: var(--pk-color-gray-600);\n --pk-btn-on: var(--pk-color-white);\n }\n\n :host:has(::slotted(pk-button-group-separator)) {\n --pk-btn-group-separator-color: transparent;\n }\n\n ::slotted(pk-input),\n ::slotted(pk-input-group) {\n width: auto;\n flex: 0 1 auto;\n align-self: stretch;\n }\n\n ::slotted(pk-popover),\n ::slotted(pk-dropdown-menu) {\n display: inline-flex;\n align-self: auto;\n flex: 0 0 auto;\n }\n\n ::slotted(.button-group-text) {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n min-height: var(--pk-btn-height-default);\n padding: 0 0.625rem;\n border-width: 1px;\n border-style: solid;\n border-color: var(--pk-color-slate-400);\n background: var(--pk-color-gray-100);\n color: var(--pk-color-gray-700);\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-sm);\n font-weight: 500;\n line-height: var(--pk-line-height);\n box-sizing: border-box;\n white-space: nowrap;\n border-top-left-radius: var(--pk-bg-start-start-radius, var(--pk-radius-lg));\n border-top-right-radius: var(--pk-bg-start-end-radius, var(--pk-radius-lg));\n border-bottom-left-radius: var(--pk-bg-end-start-radius, var(--pk-radius-lg));\n border-bottom-right-radius: var(--pk-bg-end-end-radius, var(--pk-radius-lg));\n }\n\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-join]:not([data-pk-group-divider]).button-group-text),\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-join]:not([data-pk-group-divider])select.button-group-select),\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-join]:not([data-pk-group-divider])pk-input-group) {\n margin-inline-start: var(--pk-bg-horizontal-indent-outlined, 0);\n border-left-width: 0;\n }\n\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-join]:not([data-pk-group-divider]).button-group-text),\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-join]:not([data-pk-group-divider])select.button-group-select),\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-join]:not([data-pk-group-divider])pk-input-group) {\n margin-block-start: var(--pk-bg-vertical-indent-outlined, 0);\n border-top-width: 0;\n }\n\n ::slotted(select.button-group-select) {\n display: block;\n margin: 0;\n padding: 0 10px;\n border-width: 1px;\n border-style: solid;\n border-color: var(--pk-color-slate-400);\n background: var(--pk-color-white);\n color: var(--pk-color-gray-900);\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: 1.4;\n appearance: none;\n box-sizing: border-box;\n align-self: stretch;\n min-height: var(--pk-btn-height-default);\n height: var(--pk-btn-height-default);\n border-top-left-radius: var(--pk-bg-start-start-radius, var(--pk-radius-lg));\n border-top-right-radius: var(--pk-bg-start-end-radius, var(--pk-radius-lg));\n border-bottom-left-radius: var(--pk-bg-end-start-radius, var(--pk-radius-lg));\n border-bottom-right-radius: var(--pk-bg-end-end-radius, var(--pk-radius-lg));\n }\n\n ::slotted(pk-separator) {\n align-self: stretch;\n }\n\n ::slotted(pk-separator[orientation='vertical']),\n ::slotted(pk-button-group-separator) {\n height: auto;\n flex-shrink: 0;\n }\n\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-divider][data-pk-group-join].button-group-text),\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-divider][data-pk-group-join]select.button-group-select),\n :host([orientation='horizontal']) ::slotted([data-pk-group-orientation='horizontal'][data-pk-group-divider][data-pk-group-join]pk-input-group) {\n margin-inline-start: var(--pk-bg-horizontal-indent-outlined, 0);\n }\n\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-divider][data-pk-group-join].button-group-text),\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-divider][data-pk-group-join]select.button-group-select),\n :host([orientation='vertical']) ::slotted([data-pk-group-orientation='vertical'][data-pk-group-divider][data-pk-group-join]pk-input-group) {\n margin-block-start: var(--pk-bg-vertical-indent-outlined, 0);\n }\n\n :host([orientation='horizontal']) ::slotted(.button-group-text[data-pk-group-divider]),\n :host([orientation='horizontal']) ::slotted(select.button-group-select[data-pk-group-divider]),\n :host([orientation='horizontal']) ::slotted(pk-input-group[data-pk-group-divider]) {\n border-left-width: 1px;\n border-left-style: solid;\n border-left-color: var(--pk-btn-group-divider-color-outline, var(--pk-color-slate-400));\n box-shadow: none;\n }\n\n :host([orientation='vertical']) ::slotted(.button-group-text[data-pk-group-divider]),\n :host([orientation='vertical']) ::slotted(select.button-group-select[data-pk-group-divider]),\n :host([orientation='vertical']) ::slotted(pk-input-group[data-pk-group-divider]) {\n border-top-width: 1px;\n border-top-style: solid;\n border-top-color: var(--pk-btn-group-divider-color-outline, var(--pk-color-slate-400));\n box-shadow: none;\n }\n\n :host([orientation='horizontal']) ::slotted([data-pk-group-internal-trail].button-group-text),\n :host([orientation='horizontal']) ::slotted([data-pk-group-internal-trail].button-group-select),\n :host([orientation='horizontal']) ::slotted([data-pk-group-internal-trail]select.button-group-select),\n :host([orientation='horizontal']) ::slotted([data-pk-group-internal-trail]pk-input-group) {\n border-right-width: 0;\n }\n\n :host([orientation='vertical']) ::slotted([data-pk-group-internal-trail].button-group-text),\n :host([orientation='vertical']) ::slotted([data-pk-group-internal-trail].button-group-select),\n :host([orientation='vertical']) ::slotted([data-pk-group-internal-trail]select.button-group-select),\n :host([orientation='vertical']) ::slotted([data-pk-group-internal-trail]pk-input-group) {\n border-bottom-width: 0;\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport type { PropertyValues } from 'lit';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { pkButtonGroupStyles } from './pk-button-group.styles.js';\n\nexport type PkButtonGroupOrientation = 'horizontal' | 'vertical';\n\nconst GROUP_JOIN_ATTR = 'data-pk-group-join';\nconst GROUP_DIVIDER_ATTR = 'data-pk-group-divider';\nconst GROUP_ITEM_FIRST = 'data-pk-group-item-first';\nconst GROUP_ITEM_LAST = 'data-pk-group-item-last';\nconst GROUP_INTERNAL_TRAIL = 'data-pk-group-internal-trail';\nconst GROUP_BTN_LAST = 'data-pk-group-btn-last';\nconst GROUP_ORIENTATION_ATTR = 'data-pk-group-orientation';\nconst GROUP_SEPARATOR_TAGS = new Set(['PK-SEPARATOR', 'PK-BUTTON-GROUP-SEPARATOR']);\nconst OVERLAY_WRAPPER_TAGS = new Set(['PK-POPOVER', 'PK-DROPDOWN-MENU']);\n\n/** Boolean attribute defaulting to true — absent means on; `separators=\"false\"` opts out. */\nconst separatorsConverter = {\n fromAttribute(value: string | null): boolean {\n if (value === null) {\n return true;\n }\n\n return value !== 'false';\n },\n toAttribute(value: boolean): string | null {\n if (value) {\n return '';\n }\n\n return 'false';\n },\n};\n\nfunction isGroupSeparator(element: Element): boolean {\n return GROUP_SEPARATOR_TAGS.has(element.tagName);\n}\n\nfunction getLayoutTarget(element: Element): Element {\n if (OVERLAY_WRAPPER_TAGS.has(element.tagName)) {\n return element.querySelector('[slot=\"trigger\"]') ?? element;\n }\n\n return element;\n}\n\nfunction getLayoutTargets(element: Element): Element[] {\n if (OVERLAY_WRAPPER_TAGS.has(element.tagName)) {\n const trigger = getLayoutTarget(element);\n\n return trigger === element ? [element] : [element, trigger];\n }\n\n return [element];\n}\n\nfunction getCornerTargets(element: Element, surface: Element): Element[] {\n return element === surface ? [element] : [element, surface];\n}\n\nfunction collectSyncTargets(element: Element): Element[] {\n const surface = getLayoutTarget(element);\n\n return [...new Set([...getLayoutTargets(element), ...getCornerTargets(element, surface)])];\n}\n\nfunction clearLayoutAttrs(element: Element): void {\n for (const target of collectSyncTargets(element)) {\n target.removeAttribute(GROUP_JOIN_ATTR);\n target.removeAttribute(GROUP_DIVIDER_ATTR);\n target.removeAttribute(GROUP_ITEM_FIRST);\n target.removeAttribute(GROUP_ITEM_LAST);\n target.removeAttribute(GROUP_INTERNAL_TRAIL);\n target.removeAttribute(GROUP_BTN_LAST);\n target.removeAttribute(GROUP_ORIENTATION_ATTR);\n }\n}\n\nfunction isGroupTrigger(element: Element): boolean {\n const target = getLayoutTarget(element);\n\n return target.hasAttribute('group-trigger')\n || element.hasAttribute('group-trigger');\n}\n\nfunction splitSegments(items: Element[]): Element[][] {\n const segments: Element[][] = [];\n let current: Element[] = [];\n\n for (const item of items) {\n if (isGroupSeparator(item)) {\n if (current.length) {\n segments.push(current);\n }\n\n current = [];\n continue;\n }\n\n current.push(item);\n }\n\n if (current.length) {\n segments.push(current);\n }\n\n return segments;\n}\n\n/**\n * Visually groups related buttons — `pk-button-group` pattern (CSS var join, no JS).\n *\n * @slot - Buttons, toolbars, and overlay triggers\n *\n * @csspart base - Group container\n */\n@customElement('pk-button-group')\nexport class PkButtonGroup extends PkElement {\n static override styles = pkButtonGroupStyles;\n\n @property({ reflect: true })\n orientation: PkButtonGroupOrientation = 'horizontal';\n\n /**\n * Draw 1px dividers between adjacent controls (Craft default).\n * Set `separators=\"false\"` for flush join. Explicit `pk-button-group-separator` elements always work for segment splits.\n */\n @property({ type: Boolean, reflect: true, converter: separatorsConverter })\n separators = true;\n\n /**\n * Exclusive icon/text toggle styling — Craft `.btngroup--exclusive`.\n * Use with `pk-toggle` items for view-mode pickers.\n */\n @property({ type: Boolean, reflect: true })\n exclusive = false;\n\n /** Accessible label for the group — `pk-button-group.label`. */\n @property()\n label = '';\n\n @query('slot:not([name])')\n private defaultSlot!: HTMLSlotElement;\n\n override firstUpdated(): void {\n this.scheduleSyncGroupLayout();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('orientation')) {\n this.setAttribute('aria-orientation', this.orientation);\n this.scheduleSyncGroupLayout();\n }\n\n if (changed.has('label')) {\n if (this.label) {\n this.setAttribute('aria-label', this.label);\n } else {\n this.removeAttribute('aria-label');\n }\n }\n\n if (changed.has('separators') || changed.has('exclusive')) {\n this.scheduleSyncGroupLayout();\n }\n }\n\n private scheduleSyncGroupLayout(): void {\n this.syncGroupLayout();\n queueMicrotask(() => this.syncGroupLayout());\n }\n\n private handleSlotChange(): void {\n this.scheduleSyncGroupLayout();\n }\n\n /** Overlap-join adjacent items within each segment; 1px divider between joins when `separators` is on. */\n private syncGroupLayout(): void {\n const items = this.defaultSlot?.assignedElements({ flatten: true }) ?? [];\n const segments = splitSegments(items);\n\n for (const element of items) {\n clearLayoutAttrs(element);\n }\n\n for (const element of items) {\n for (const target of collectSyncTargets(element)) {\n target.setAttribute(GROUP_ORIENTATION_ATTR, this.orientation);\n }\n }\n\n for (let segmentIndex = 0; segmentIndex < segments.length; segmentIndex++) {\n const segment = segments[segmentIndex];\n const isFirstSegment = segmentIndex === 0;\n const isLastSegment = segmentIndex === segments.length - 1;\n\n for (let index = 0; index < segment.length; index++) {\n const element = segment[index];\n const surface = getLayoutTarget(element);\n const cornerTargets = getCornerTargets(element, surface);\n const isOnly = segment.length === 1;\n const isFirst = index === 0;\n const isLast = index === segment.length - 1;\n\n for (const target of cornerTargets) {\n if (isOnly) {\n if (isFirstSegment) {\n target.setAttribute(GROUP_ITEM_FIRST, '');\n }\n\n if (isLastSegment) {\n target.setAttribute(GROUP_ITEM_LAST, '');\n }\n } else {\n if (isFirst) {\n target.setAttribute(GROUP_ITEM_FIRST, '');\n }\n\n if (isLast) {\n target.setAttribute(GROUP_ITEM_LAST, '');\n }\n }\n }\n\n if (isFirst) {\n if (this.separators && !isLast) {\n for (const target of getLayoutTargets(element)) {\n target.setAttribute(GROUP_INTERNAL_TRAIL, '');\n }\n }\n\n continue;\n }\n\n for (const target of getLayoutTargets(element)) {\n target.setAttribute(GROUP_JOIN_ATTR, '');\n\n if (this.separators) {\n target.setAttribute(GROUP_DIVIDER_ATTR, '');\n }\n }\n\n if (this.separators && !isLast) {\n for (const target of getLayoutTargets(element)) {\n target.setAttribute(GROUP_INTERNAL_TRAIL, '');\n }\n }\n\n if (isGroupTrigger(element)) {\n surface.setAttribute(GROUP_BTN_LAST, '');\n }\n }\n }\n }\n\n override render() {\n return html`\n <div part=\"base\" class=\"group\" role=\"group\" aria-label=${this.label || nothing}>\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-button-group': PkButtonGroup;\n }\n}\n"],"mappings":";;;;AAEA,IAAa,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACOtC,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AACvB,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB,IAAI,IAAI,CAAC,gBAAgB,4BAA4B,CAAC;AACnF,IAAM,uBAAuB,IAAI,IAAI,CAAC,cAAc,mBAAmB,CAAC;;AAGxE,IAAM,sBAAsB;CACxB,cAAc,OAA+B;AACzC,MAAI,UAAU,KACV,QAAO;AAGX,SAAO,UAAU;;CAErB,YAAY,OAA+B;AACvC,MAAI,MACA,QAAO;AAGX,SAAO;;CAEd;AAED,SAAS,iBAAiB,SAA2B;AACjD,QAAO,qBAAqB,IAAI,QAAQ,QAAQ;;AAGpD,SAAS,gBAAgB,SAA2B;AAChD,KAAI,qBAAqB,IAAI,QAAQ,QAAQ,CACzC,QAAO,QAAQ,cAAc,qBAAmB,IAAI;AAGxD,QAAO;;AAGX,SAAS,iBAAiB,SAA6B;AACnD,KAAI,qBAAqB,IAAI,QAAQ,QAAQ,EAAE;EAC3C,MAAM,UAAU,gBAAgB,QAAQ;AAExC,SAAO,YAAY,UAAU,CAAC,QAAQ,GAAG,CAAC,SAAS,QAAQ;;AAG/D,QAAO,CAAC,QAAQ;;AAGpB,SAAS,iBAAiB,SAAkB,SAA6B;AACrE,QAAO,YAAY,UAAU,CAAC,QAAQ,GAAG,CAAC,SAAS,QAAQ;;AAG/D,SAAS,mBAAmB,SAA6B;CACrD,MAAM,UAAU,gBAAgB,QAAQ;AAExC,QAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,iBAAiB,QAAQ,EAAE,GAAG,iBAAiB,SAAS,QAAQ,CAAC,CAAC,CAAC;;AAG9F,SAAS,iBAAiB,SAAwB;AAC9C,MAAK,MAAM,UAAU,mBAAmB,QAAQ,EAAE;AAC9C,SAAO,gBAAgB,gBAAgB;AACvC,SAAO,gBAAgB,mBAAmB;AAC1C,SAAO,gBAAgB,iBAAiB;AACxC,SAAO,gBAAgB,gBAAgB;AACvC,SAAO,gBAAgB,qBAAqB;AAC5C,SAAO,gBAAgB,eAAe;AACtC,SAAO,gBAAgB,uBAAuB;;;AAItD,SAAS,eAAe,SAA2B;AAG/C,QAFe,gBAAgB,QAExB,CAAO,aAAa,gBAAgB,IACpC,QAAQ,aAAa,gBAAgB;;AAGhD,SAAS,cAAc,OAA+B;CAClD,MAAM,WAAwB,EAAE;CAChC,IAAI,UAAqB,EAAE;AAE3B,MAAK,MAAM,QAAQ,OAAO;AACtB,MAAI,iBAAiB,KAAK,EAAE;AACxB,OAAI,QAAQ,OACR,UAAS,KAAK,QAAQ;AAG1B,aAAU,EAAE;AACZ;;AAGJ,UAAQ,KAAK,KAAK;;AAGtB,KAAI,QAAQ,OACR,UAAS,KAAK,QAAQ;AAG1B,QAAO;;AAWJ,IAAA,gBAAA,MAAM,sBAAsB,UAAU;;;qBAID;oBAO3B;mBAOD;eAIJ;;;gBArBiB;;CA0BzB,eAA8B;AAC1B,OAAK,yBAAyB;;CAGlC,QAAiB,SAA+B;AAC5C,MAAI,QAAQ,IAAI,cAAc,EAAE;AAC5B,QAAK,aAAa,oBAAoB,KAAK,YAAY;AACvD,QAAK,yBAAyB;;AAGlC,MAAI,QAAQ,IAAI,QAAQ,CACpB,KAAI,KAAK,MACL,MAAK,aAAa,cAAc,KAAK,MAAM;MAE3C,MAAK,gBAAgB,aAAa;AAI1C,MAAI,QAAQ,IAAI,aAAa,IAAI,QAAQ,IAAI,YAAY,CACrD,MAAK,yBAAyB;;CAItC,0BAAwC;AACpC,OAAK,iBAAiB;AACtB,uBAAqB,KAAK,iBAAiB,CAAC;;CAGhD,mBAAiC;AAC7B,OAAK,yBAAyB;;;CAIlC,kBAAgC;EAC5B,MAAM,QAAQ,KAAK,aAAa,iBAAiB,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE;EACzE,MAAM,WAAW,cAAc,MAAM;AAErC,OAAK,MAAM,WAAW,MAClB,kBAAiB,QAAQ;AAG7B,OAAK,MAAM,WAAW,MAClB,MAAK,MAAM,UAAU,mBAAmB,QAAQ,CAC5C,QAAO,aAAa,wBAAwB,KAAK,YAAY;AAIrE,OAAK,IAAI,eAAe,GAAG,eAAe,SAAS,QAAQ,gBAAgB;GACvE,MAAM,UAAU,SAAS;GACzB,MAAM,iBAAiB,iBAAiB;GACxC,MAAM,gBAAgB,iBAAiB,SAAS,SAAS;AAEzD,QAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;IACjD,MAAM,UAAU,QAAQ;IACxB,MAAM,UAAU,gBAAgB,QAAQ;IACxC,MAAM,gBAAgB,iBAAiB,SAAS,QAAQ;IACxD,MAAM,SAAS,QAAQ,WAAW;IAClC,MAAM,UAAU,UAAU;IAC1B,MAAM,SAAS,UAAU,QAAQ,SAAS;AAE1C,SAAK,MAAM,UAAU,cACjB,KAAI,QAAQ;AACR,SAAI,eACA,QAAO,aAAa,kBAAkB,GAAG;AAG7C,SAAI,cACA,QAAO,aAAa,iBAAiB,GAAG;WAEzC;AACH,SAAI,QACA,QAAO,aAAa,kBAAkB,GAAG;AAG7C,SAAI,OACA,QAAO,aAAa,iBAAiB,GAAG;;AAKpD,QAAI,SAAS;AACT,SAAI,KAAK,cAAc,CAAC,OACpB,MAAK,MAAM,UAAU,iBAAiB,QAAQ,CAC1C,QAAO,aAAa,sBAAsB,GAAG;AAIrD;;AAGJ,SAAK,MAAM,UAAU,iBAAiB,QAAQ,EAAE;AAC5C,YAAO,aAAa,iBAAiB,GAAG;AAExC,SAAI,KAAK,WACL,QAAO,aAAa,oBAAoB,GAAG;;AAInD,QAAI,KAAK,cAAc,CAAC,OACpB,MAAK,MAAM,UAAU,iBAAiB,QAAQ,CAC1C,QAAO,aAAa,sBAAsB,GAAG;AAIrD,QAAI,eAAe,QAAQ,CACvB,SAAQ,aAAa,gBAAgB,GAAG;;;;CAMxD,SAAkB;AACd,SAAO,IAAI;qEACkD,KAAK,SAAS,QAAQ;oCACvD,KAAK,iBAAiB;;;;;YA1IrD,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,cAAA,WAAA,eAAA,KAAA,EAAA;YAO3B,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;CAAqB,CAAC,CAAA,EAAA,cAAA,WAAA,cAAA,KAAA,EAAA;YAO1E,SAAS;CAAE,MAAM;CAAS,SAAS;CAAM,CAAC,CAAA,EAAA,cAAA,WAAA,aAAA,KAAA,EAAA;YAI1C,UAAU,CAAA,EAAA,cAAA,WAAA,SAAA,KAAA,EAAA;YAGV,MAAM,mBAAmB,CAAA,EAAA,cAAA,WAAA,eAAA,KAAA,EAAA;4BAzB7B,cAAc,kBAAkB,CAAA,EAAA,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-button-group-separator-DG0CYaqc.js","names":[],"sources":["../../src/components/button-group/pk-button-group-separator.styles.ts","../../src/components/button-group/pk-button-group-separator.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const pkButtonGroupSeparatorStyles = css`\n @layer pk-component {\n :host {\n display: inline-block;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .separator {\n display: block;\n width: 1px;\n height: 100%;\n margin-block: 1px;\n background: var(--pk-btn-group-separator-color, transparent);\n }\n\n :host-context(pk-button-group[orientation='vertical']) {\n display: block;\n width: 100%;\n height: auto;\n }\n\n :host-context(pk-button-group[orientation='vertical']) .separator {\n width: 100%;\n height: 1px;\n margin-block: 1px;\n }\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { pkButtonGroupSeparatorStyles } from './pk-button-group-separator.styles.js';\n\nexport type PkButtonGroupSeparatorOrientation = 'horizontal' | 'vertical';\n\n/**\n * Vertical separator for button groups.\n *\n * @csspart base - Separator element\n */\n@customElement('pk-button-group-separator')\nexport class PkButtonGroupSeparator extends PkElement {\n static override styles = pkButtonGroupSeparatorStyles;\n\n @property({ reflect: true })\n orientation: PkButtonGroupSeparatorOrientation = 'vertical';\n\n override render() {\n return html`\n <div\n part=\"base\"\n class=\"separator pk-btn-group__separator\"\n role=\"separator\"\n aria-orientation=${this.orientation}\n data-orientation=${this.orientation}\n ></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-button-group-separator': PkButtonGroupSeparator;\n }\n}\n"],"mappings":";;;;AAEA,IAAa,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACYxC,IAAA,yBAAA,MAAM,+BAA+B,UAAU;;;qBAID;;;gBAHxB;;CAKzB,SAAkB;AACd,SAAO,IAAI;;;;;mCAKgB,KAAK,YAAY;mCACjB,KAAK,YAAY;;;;;YAV/C,SAAS,EAAE,SAAS,MAAM,CAAC,CAAA,EAAA,uBAAA,WAAA,eAAA,KAAA,EAAA;qCAJ/B,cAAc,4BAA4B,CAAA,EAAA,uBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-calendar-CoUil0F7.js","names":[],"sources":["../../src/utils/date.ts","../../src/utils/date-matchers.ts","../../src/utils/week-info.ts","../../src/components/calendar/pk-calendar.styles.ts","../../src/components/calendar/pk-calendar.ts"],"sourcesContent":["/** ISO date helpers — ported from `date-picker/internal/iso`. */\n\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function parseIsoDate(value: string | Date | null | undefined): Date | null {\n if (value == null || value === '') {\n return null;\n }\n\n // React/v1 DatePicker often passes a Date; never call string methods on it.\n if (value instanceof Date) {\n return coerceToDate(value);\n }\n\n if (typeof value !== 'string') {\n return null;\n }\n\n const match = ISO_DATE.exec(value.trim());\n\n if (!match) {\n return null;\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n\n if (month < 1 || month > 12 || day < 1 || day > 31) {\n return null;\n }\n\n const date = new Date(year, month - 1, day);\n\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {\n return null;\n }\n\n return date;\n}\n\nexport function formatIsoDate(date: Date | null | undefined): string {\n if (!date || Number.isNaN(date.getTime())) {\n return '';\n }\n\n const year = String(date.getFullYear()).padStart(4, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\nexport function coerceToDate(value: unknown): Date | null {\n if (value == null) {\n return null;\n }\n\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n return null;\n }\n\n return new Date(value.getFullYear(), value.getMonth(), value.getDate());\n }\n\n return parseIsoDate(String(value));\n}\n\nexport type DateRange = {\n from: Date | null;\n to: Date | null;\n};\n\nexport function parseRange(value: string | null | undefined): DateRange {\n if (!value) {\n return { from: null, to: null };\n }\n\n const parts = value.split('/');\n\n if (parts.length === 1) {\n return { from: parseIsoDate(parts[0]), to: null };\n }\n\n const from = parseIsoDate(parts[0]);\n const to = parseIsoDate(parts[1]);\n\n if (!from || !to) {\n return { from, to };\n }\n\n return from.getTime() <= to.getTime()\n ? { from, to }\n : { from: to, to: from };\n}\n\nexport function formatRange(range: DateRange | null | undefined): string {\n if (!range) {\n return '';\n }\n\n const { from, to } = range;\n\n if (!from && !to) {\n return '';\n }\n\n if (from && !to) {\n return formatIsoDate(from);\n }\n\n if (!from && to) {\n return formatIsoDate(to);\n }\n\n return `${formatIsoDate(from)}/${formatIsoDate(to)}`;\n}\n\n/**\n * Multi-date (\"multiple\" mode) serialization: a comma-separated list of ISO dates.\n * Always parsed/emitted deduped and sorted ascending so the stored value is stable\n * regardless of the order the user clicked days.\n */\nexport function parseDateList(value: string | null | undefined): Date[] {\n if (!value) {\n return [];\n }\n\n const seen = new Set<string>();\n const dates: Date[] = [];\n\n for (const part of value.split(',')) {\n const date = parseIsoDate(part.trim());\n\n if (!date) {\n continue;\n }\n\n const iso = formatIsoDate(date);\n\n if (seen.has(iso)) {\n continue;\n }\n\n seen.add(iso);\n dates.push(date);\n }\n\n dates.sort((a, b) => a.getTime() - b.getTime());\n\n return dates;\n}\n\nexport function formatDateList(dates: ReadonlyArray<Date | null | undefined>): string {\n const seen = new Set<string>();\n\n for (const date of dates) {\n const iso = formatIsoDate(date ?? null);\n\n if (iso) {\n seen.add(iso);\n }\n }\n\n return [...seen].sort().join(',');\n}\n\n/** Toggle a day in/out of a multi-date list, returning the new sorted CSV value. */\nexport function toggleDateInList(value: string | null | undefined, date: Date): string {\n const iso = formatIsoDate(date);\n\n if (!iso) {\n return value ?? '';\n }\n\n const existing = parseDateList(value);\n const next = existing.some((entry) => isSameDay(entry, date))\n ? existing.filter((entry) => !isSameDay(entry, date))\n : [...existing, date];\n\n return formatDateList(next);\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) {\n return false;\n }\n\n return a.getFullYear() === b.getFullYear()\n && a.getMonth() === b.getMonth()\n && a.getDate() === b.getDate();\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), lastDay));\n}\n\nexport function addYears(date: Date, years: number): Date {\n return addMonths(date, years * 12);\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function todayDate(): Date {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nexport function diffDays(a: Date, b: Date): number {\n const ms = a.getTime() - b.getTime();\n\n return Math.round(ms / 86_400_000);\n}\n\n/** ISO 8601 week number for the given date. */\nexport function isoWeekNumber(date: Date): number {\n const target = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const dayNum = (target.getDay() + 6) % 7;\n target.setDate(target.getDate() - dayNum + 3);\n\n const firstThursday = new Date(target.getFullYear(), 0, 4);\n const firstDayNum = (firstThursday.getDay() + 6) % 7;\n firstThursday.setDate(firstThursday.getDate() - firstDayNum + 3);\n\n return 1 + Math.round((target.getTime() - firstThursday.getTime()) / (7 * 86_400_000));\n}\n\nexport function formatDisplayDate(date: Date, locale?: string): string {\n return new Intl.DateTimeFormat(locale || undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(date);\n}\n","/** Date disabling matchers — ported from `date-picker/internal/matchers`. */\n\nimport {\n isSameDay,\n parseIsoDate,\n} from './date.js';\n\nexport type DisabledMatcherOptions = {\n min?: Date | null;\n max?: Date | null;\n disabledDates?: Date[];\n disabledDaysOfWeek?: number[];\n disablePast?: boolean;\n disableFuture?: boolean;\n today: Date;\n isDateDisabled?: (date: Date) => boolean;\n};\n\nexport function buildDisabledMatcher(options: DisabledMatcherOptions): (date: Date) => boolean {\n const {\n min,\n max,\n disabledDates = [],\n disabledDaysOfWeek = [],\n disablePast = false,\n disableFuture = false,\n today,\n isDateDisabled,\n } = options;\n\n const minTime = min?.getTime() ?? Number.NEGATIVE_INFINITY;\n const maxTime = max?.getTime() ?? Number.POSITIVE_INFINITY;\n const todayTime = today.getTime();\n const dayOfWeekSet = new Set(disabledDaysOfWeek);\n const dateTimeSet = new Set(disabledDates.map((date) => date.getTime()));\n\n return function isDisabled(date: Date): boolean {\n const time = date.getTime();\n\n if (time < minTime || time > maxTime) {\n return true;\n }\n\n if (disablePast && time < todayTime) {\n return true;\n }\n\n if (disableFuture && time > todayTime) {\n return true;\n }\n\n if (dayOfWeekSet.size && dayOfWeekSet.has(date.getDay())) {\n return true;\n }\n\n if (dateTimeSet.size && dateTimeSet.has(time)) {\n return true;\n }\n\n if (isDateDisabled?.(date)) {\n return true;\n }\n\n return false;\n };\n}\n\nexport function parseDisabledDates(value: string | string[] | Date[] | null | undefined): Date[] {\n if (value == null || value === '') {\n return [];\n }\n\n const list = Array.isArray(value) ? value : value.split(/\\s+/);\n const out: Date[] = [];\n\n for (const item of list) {\n if (item instanceof Date) {\n if (!Number.isNaN(item.getTime())) {\n out.push(new Date(item.getFullYear(), item.getMonth(), item.getDate()));\n }\n\n continue;\n }\n\n const parsed = parseIsoDate(String(item).trim());\n\n if (parsed) {\n out.push(parsed);\n }\n }\n\n return out;\n}\n\nconst WEEKDAY_NAMES = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n} as const;\n\nexport type WeekdayName = keyof typeof WEEKDAY_NAMES;\n\nexport function parseDaysOfWeek(value: string | null | undefined): number[] {\n if (value == null || value === '') {\n return [];\n }\n\n const tokens = String(value).toLowerCase().split(/\\s+/).filter(Boolean);\n const out = new Set<number>();\n\n for (const token of tokens) {\n if (token in WEEKDAY_NAMES) {\n out.add(WEEKDAY_NAMES[token as WeekdayName]);\n }\n }\n\n return [...out];\n}\n\nexport function includesDay(arr: Date[], target: Date): boolean {\n return arr.some((date) => isSameDay(date, target));\n}\n\nexport function anyDisabledInRange(\n start: Date,\n end: Date,\n isDisabled: (date: Date) => boolean,\n): boolean {\n const rangeStart = start.getTime() <= end.getTime() ? start : end;\n const rangeEnd = start.getTime() <= end.getTime() ? end : start;\n const cursor = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate());\n\n while (cursor.getTime() <= rangeEnd.getTime()) {\n if (isDisabled(cursor)) {\n return true;\n }\n\n cursor.setDate(cursor.getDate() + 1);\n }\n\n return false;\n}\n\nexport function allDisabledInRange(\n start: Date,\n end: Date,\n isDisabled: (date: Date) => boolean,\n): boolean {\n const rangeStart = start.getTime() <= end.getTime() ? start : end;\n const rangeEnd = start.getTime() <= end.getTime() ? end : start;\n const cursor = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate());\n\n while (cursor.getTime() <= rangeEnd.getTime()) {\n if (!isDisabled(cursor)) {\n return false;\n }\n\n cursor.setDate(cursor.getDate() + 1);\n }\n\n return true;\n}\n","/** Locale week info — ported from `date-picker/internal/week-info`. */\n\nexport type WeekdayName = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport type WeekInfo = {\n /** First day of the week (1=Monday … 7=Sunday, per Intl spec). */\n firstDay: number;\n /** Weekend day numbers (1=Monday … 7=Sunday). */\n weekend: number[];\n};\n\nconst SUNDAY_FIRST = new Set([\n 'US', 'CA', 'MX', 'BR', 'JP', 'PH', 'IL', 'AU', 'NZ', 'ZA',\n 'CO', 'VE', 'PE', 'EC', 'GT', 'HN', 'NI', 'SV', 'CR', 'PA',\n 'DO', 'PR', 'JM', 'TT', 'BS', 'BB', 'BZ', 'BO', 'BM', 'TW',\n 'HK', 'MO', 'SG', 'TH', 'ET', 'KE',\n]);\n\nconst SATURDAY_FIRST = new Set(['SA', 'AE', 'QA', 'KW', 'BH', 'OM', 'YE', 'JO', 'SY', 'IQ', 'EG', 'SD', 'DZ', 'LY']);\n\nconst FRI_SAT_WEEKEND = new Set([\n 'SA', 'AE', 'QA', 'KW', 'BH', 'OM', 'YE', 'JO', 'EG', 'SD',\n 'DZ', 'LY', 'SY', 'IQ', 'IL',\n]);\n\nfunction regionFromLocale(locale: string): string | null {\n try {\n const parsed = new Intl.Locale(locale);\n const region = parsed.maximize().region;\n\n return region ?? null;\n } catch {\n return null;\n }\n}\n\nfunction fallbackWeekInfo(locale: string): WeekInfo {\n const region = regionFromLocale(locale);\n let firstDay = 1;\n\n if (region && SUNDAY_FIRST.has(region)) {\n firstDay = 7;\n } else if (region && SATURDAY_FIRST.has(region)) {\n firstDay = 6;\n }\n\n const weekend = region && FRI_SAT_WEEKEND.has(region) ? [5, 6] : [6, 7];\n\n return { firstDay, weekend };\n}\n\nexport function getWeekInfo(locale: string): WeekInfo {\n try {\n const parsed = new Intl.Locale(locale) as Intl.Locale & {\n getWeekInfo?: () => WeekInfo;\n weekInfo?: WeekInfo;\n };\n\n const info = typeof parsed.getWeekInfo === 'function'\n ? parsed.getWeekInfo()\n : parsed.weekInfo;\n\n if (info && typeof info.firstDay === 'number' && Array.isArray(info.weekend)) {\n return { firstDay: info.firstDay, weekend: info.weekend };\n }\n } catch {\n // fall through\n }\n\n return fallbackWeekInfo(locale);\n}\n\n/** Convert Intl first day (1=Mon..7=Sun) to JS `Date.getDay()` (0=Sun..6=Sat). */\nexport function intlFirstDayToJsDay(intlFirstDay: number): number {\n return intlFirstDay === 7 ? 0 : intlFirstDay;\n}\n\nexport function intlWeekendToJsDays(intlWeekend: number[]): number[] {\n return intlWeekend.map(intlFirstDayToJsDay);\n}\n\nexport function resolveFirstDayOfWeek(\n attribute: 'auto' | WeekdayName,\n locale: string,\n): number {\n if (attribute !== 'auto') {\n const map: Record<WeekdayName, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6,\n };\n\n return map[attribute];\n }\n\n return intlFirstDayToJsDay(getWeekInfo(locale).firstDay);\n}\n","import { css } from 'lit';\n\nimport { iconStyles } from '../../base/icon.styles.js';\n\nexport const pkCalendarStyles = css`\n ${iconStyles}\n @layer pk-component {\n :host {\n display: inline-block;\n width: fit-content;\n max-width: 100%;\n color: var(--pk-color-gray-900);\n font-family: var(--pk-font-family);\n font-size: var(--pk-font-size-base);\n line-height: 1;\n --pk-date-cell-size: 1.75rem;\n --pk-date-cell-radius: 100%;\n --pk-date-gap: 0.25rem;\n --pk-date-column-min: var(--pk-date-cell-size);\n --pk-date-column-gap: 0;\n }\n\n :host([weekday-format='short']) {\n --pk-date-column-min: 2.125rem;\n --pk-date-column-gap: 0.125rem;\n }\n\n :host([weekday-format='long']) {\n --pk-date-column-min: 3.375rem;\n --pk-date-column-gap: 0.125rem;\n }\n\n :host([weekday-format='long']) .weekday {\n font-size: 0.7rem;\n }\n\n :host([size='xs']) {\n --pk-date-cell-size: 1.5rem;\n font-size: 11px;\n }\n\n :host([size='sm']) {\n --pk-date-cell-size: 1.625rem;\n font-size: 12px;\n }\n\n :host([size='lg']) {\n --pk-date-cell-size: 2rem;\n font-size: 14px;\n }\n\n :host([size='xl']) {\n --pk-date-cell-size: 2.25rem;\n font-size: 15px;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n pointer-events: none;\n }\n\n .base {\n display: flex;\n flex-direction: column;\n gap: var(--pk-date-gap);\n width: fit-content;\n padding: 0.5rem;\n border: var(--pk-calendar-border, var(--pk-input-border));\n border-radius: var(--pk-radius-md);\n background: var(--pk-calendar-background, var(--pk-color-white));\n }\n\n :host(:not([bordered])) {\n --pk-calendar-border: 0;\n --pk-calendar-background: transparent;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.25rem;\n min-height: var(--pk-date-cell-size);\n padding-inline: 0.125rem;\n }\n\n .title {\n flex: 1;\n margin: 0;\n padding: 0.25rem 0.5rem;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-900);\n font: inherit;\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n text-align: center;\n cursor: pointer;\n user-select: none;\n }\n\n .title:hover:not(:disabled) {\n background: var(--pk-color-slate-100);\n }\n\n .nav-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--pk-date-cell-size);\n height: var(--pk-date-cell-size);\n margin: 0;\n padding: 0.25rem;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-600);\n cursor: pointer;\n }\n\n .nav-button:hover:not(:disabled) {\n background: var(--pk-color-slate-100);\n color: var(--pk-color-gray-900);\n }\n\n .nav-button:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n .nav-button .icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n }\n\n .nav-button .icon svg {\n display: block;\n width: 12px;\n height: 12px;\n }\n\n .months {\n display: flex;\n gap: 1rem;\n }\n\n .month {\n display: flex;\n flex-direction: column;\n width: fit-content;\n min-width: calc(var(--pk-date-column-min) * 7 + var(--pk-date-column-gap) * 6);\n }\n\n :host([data-week-numbers]) .month {\n min-width: calc(\n var(--pk-date-cell-size) + var(--pk-date-column-gap) + var(--pk-date-column-min) * 7 + var(--pk-date-column-gap) * 6\n );\n }\n\n .month-label {\n margin-bottom: 0.5rem;\n font-size: 12px;\n font-weight: 500;\n text-align: center;\n color: var(--pk-color-gray-700);\n }\n\n .weekdays,\n .week {\n display: grid;\n grid-template-columns: repeat(7, minmax(var(--pk-date-column-min), 1fr));\n column-gap: var(--pk-date-column-gap);\n align-items: center;\n width: 100%;\n }\n\n :host([data-week-numbers]) .weekdays,\n :host([data-week-numbers]) .week {\n grid-template-columns: var(--pk-date-cell-size) repeat(7, minmax(var(--pk-date-column-min), 1fr));\n }\n\n .grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n margin-top: 0.2rem;\n }\n\n .weeknumber-header,\n .weeknumber {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--pk-date-cell-size);\n color: var(--pk-color-gray-500);\n font-size: 0.8rem;\n font-weight: 400;\n user-select: none;\n }\n\n .weekday {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: var(--pk-date-column-min);\n height: var(--pk-date-cell-size);\n padding-inline: 0.125rem;\n color: var(--pk-color-gray-500);\n font-size: 0.8rem;\n font-weight: 400;\n line-height: 1.1;\n text-align: center;\n white-space: nowrap;\n user-select: none;\n }\n\n .day,\n .day.is-placeholder {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n justify-self: center;\n width: var(--pk-date-cell-size);\n min-width: var(--pk-date-cell-size);\n max-width: var(--pk-date-cell-size);\n height: var(--pk-date-cell-size);\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: var(--pk-color-gray-900);\n font: inherit;\n font-size: 13px;\n font-weight: 400;\n line-height: 1;\n cursor: pointer;\n }\n\n .day.is-range-start,\n .day.is-range-end,\n .day.is-range-inner,\n .day.is-range-preview {\n justify-self: stretch;\n width: 100%;\n min-width: 0;\n max-width: none;\n }\n\n .day.is-range-start.is-range-end {\n justify-self: center;\n width: var(--pk-date-cell-size);\n min-width: var(--pk-date-cell-size);\n max-width: var(--pk-date-cell-size);\n }\n\n .day:focus-visible {\n outline: 2px solid var(--pk-color-blue-500);\n outline-offset: 1px;\n z-index: 1;\n }\n\n .day.is-outside {\n opacity: 0.6;\n }\n\n .day.is-disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n /* Day grid — circular today ring (fixed cell size, not column width) */\n .day.is-today:not(.is-range-start):not(.is-range-end):not(.is-range-inner)::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--pk-color-blue-500);\n border-radius: var(--pk-date-cell-radius);\n pointer-events: none;\n }\n\n .day.is-selected:not(.is-range-start):not(.is-range-end):not(.is-range-inner) {\n background: var(--pk-color-gray-200);\n border-radius: var(--pk-date-cell-radius);\n color: var(--pk-color-gray-900);\n font-weight: 400;\n }\n\n .day.is-range-start,\n .day.is-range-end {\n background: var(--pk-color-gray-200);\n color: var(--pk-color-gray-900);\n font-weight: 400;\n }\n\n .day.is-range-start.is-range-end {\n border-radius: var(--pk-date-cell-radius);\n }\n\n .day.is-range-start:not(.is-range-end) {\n border-radius: var(--pk-date-cell-radius) 0 0 var(--pk-date-cell-radius);\n }\n\n .day.is-range-end:not(.is-range-start) {\n border-radius: 0 var(--pk-date-cell-radius) var(--pk-date-cell-radius) 0;\n }\n\n .day.is-range-inner {\n background: var(--pk-color-gray-200);\n border-radius: 0;\n }\n\n .day.is-range-preview:not(.is-range-start):not(.is-range-end) {\n background: var(--pk-color-gray-200);\n opacity: 0.7;\n }\n\n .day.is-placeholder {\n visibility: hidden;\n pointer-events: none;\n }\n\n .live-region {\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 slot[name='footer']::slotted(*) {\n display: block;\n padding-top: 0.25rem;\n }\n\n .view-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(var(--pk-date-cell-size), 1fr));\n gap: 0.25rem;\n width: 100%;\n min-width: calc(var(--pk-date-column-min) * 7 + var(--pk-date-column-gap) * 6);\n }\n\n .view-row {\n display: contents;\n }\n\n .view-cell {\n display: contents;\n }\n\n .view-item {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: var(--pk-date-cell-size);\n margin: 0;\n padding: 0.375rem 0.5rem;\n border: 0;\n border-radius: var(--pk-radius-sm);\n background: transparent;\n color: var(--pk-color-gray-900);\n font: inherit;\n font-size: 13px;\n cursor: pointer;\n }\n\n .view-item.is-selected {\n background: var(--pk-color-gray-200);\n font-weight: 500;\n }\n\n /* Month/year grid — rectangular today outline */\n .view-item.is-today:not(.is-selected) {\n box-shadow: inset 0 0 0 1px var(--pk-color-blue-500);\n border-radius: var(--pk-radius-sm);\n }\n\n .view-item.is-disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .view-item:focus-visible {\n outline: 2px solid var(--pk-color-blue-500);\n outline-offset: 1px;\n }\n }\n`;\n","import { html, nothing } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { PropertyValues } from 'lit';\n\nimport { chevronLeft, chevronRight, renderIconHtml } from '../../icons/index.js';\nimport { PkElement } from '../../base/pk-element.js';\nimport { HasSlotController } from '../../internal/has-slot.js';\nimport {\n addDays,\n addMonths,\n addYears,\n coerceToDate,\n diffDays,\n formatDisplayDate,\n formatIsoDate,\n formatRange,\n isoWeekNumber,\n isSameDay,\n isSameMonth,\n parseDateList,\n parseIsoDate,\n parseRange,\n startOfMonth,\n todayDate,\n toggleDateInList,\n type DateRange,\n} from '../../utils/date.js';\nimport {\n allDisabledInRange,\n buildDisabledMatcher,\n parseDaysOfWeek,\n parseDisabledDates,\n} from '../../utils/date-matchers.js';\nimport {\n getWeekInfo,\n intlWeekendToJsDays,\n resolveFirstDayOfWeek,\n type WeekdayName,\n} from '../../utils/week-info.js';\nimport { pkCalendarStyles } from './pk-calendar.styles.js';\n\nexport type PkCalendarMode = 'single' | 'range' | 'multiple';\nexport type PkCalendarSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl';\nexport type PkCalendarFirstDayOfWeek = 'auto' | WeekdayName;\nexport type PkCalendarView = 'days' | 'months' | 'years';\nexport type PkCalendarPageBy = 'months' | 'single';\nexport type PkCalendarDayContent = (date: Date) => string | null;\n\nconst CHEVRON_LEFT = renderIconHtml(chevronLeft);\nconst CHEVRON_RIGHT = renderIconHtml(chevronRight);\n\ntype DayState = {\n date: Date;\n monthAnchor: Date;\n outside: boolean;\n today: boolean;\n weekend: boolean;\n disabled: boolean;\n selected: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n rangeInner: boolean;\n rangePreview: boolean;\n roving: boolean;\n};\n\n/**\n * Inline calendar grid — mirrors React `Calendar` ( `pk-date-picker` API).\n *\n * @slot previous-icon\n * @slot next-icon\n * @slot footer\n * @slot day-YYYY-MM-DD - Custom content for a specific day cell\n *\n * @event input - Value changes during interaction\n * @event change - User commits a new value\n * @event pk-focus-day - Focused day changed; `detail.date`\n * @event pk-view-change - View changed; `detail.view`, `detail.date`\n */\n@customElement('pk-calendar')\nexport class PkCalendar extends PkElement {\n static override styles = pkCalendarStyles;\n\n private readonly hasSlotController = new HasSlotController(this, 'footer', 'previous-icon', 'next-icon');\n\n @property({ reflect: true })\n mode: PkCalendarMode = 'single';\n\n @property({ reflect: true })\n size: PkCalendarSize = 'default';\n\n @property({ reflect: true })\n value = '';\n\n @property({ reflect: true })\n min = '';\n\n @property({ reflect: true })\n max = '';\n\n @property({ reflect: true })\n today = '';\n\n @property({ reflect: true })\n view: PkCalendarView = 'days';\n\n @property({ type: Number, reflect: true })\n months: 1 | 2 = 1;\n\n @property({ attribute: 'page-by', reflect: true })\n pageBy: PkCalendarPageBy = 'months';\n\n @property({ attribute: 'focused-date', reflect: true })\n focusedDate = '';\n\n @property({ attribute: 'first-day-of-week', reflect: true })\n firstDayOfWeek: PkCalendarFirstDayOfWeek = 'auto';\n\n @property({ attribute: 'with-outside-days', type: Boolean, reflect: true })\n withOutsideDays = true;\n\n @property({ attribute: 'with-week-numbers', type: Boolean, reflect: true })\n withWeekNumbers = false;\n\n @property({ attribute: 'weekday-format', reflect: true })\n weekdayFormat: 'narrow' | 'short' | 'long' = 'narrow';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** When false, omits the outer frame — use inside popovers (e.g. `pk-date-picker`). */\n @property({ type: Boolean, reflect: true })\n bordered = true;\n\n @property({ attribute: 'disabled-dates' })\n disabledDatesRaw = '';\n\n @property({ attribute: 'disabled-days-of-week', reflect: true })\n disabledDaysOfWeek = '';\n\n @property({ attribute: 'disable-past', type: Boolean, reflect: true })\n disablePast = false;\n\n @property({ attribute: 'disable-future', type: Boolean, reflect: true })\n disableFuture = false;\n\n @property({ attribute: 'min-range', type: Number })\n minRange = 0;\n\n @property({ attribute: 'max-range', type: Number })\n maxRange = 0;\n\n @property({ reflect: true })\n locale = '';\n\n @property({ attribute: false })\n isDateDisabled?: (date: Date) => boolean;\n\n @property({ attribute: false })\n dayContent?: PkCalendarDayContent;\n\n @state()\n private viewAnchor = startOfMonth(todayDate());\n\n @state()\n private rangeAnchor: Date | null = null;\n\n @state()\n private hoverDate: Date | null = null;\n\n @state()\n private liveAnnouncement = '';\n\n @state()\n private focusedMonth: number | null = null;\n\n @state()\n private focusedYear: number | null = null;\n\n @state()\n private daySlotNames: string[] = [];\n\n private childrenObserver?: MutationObserver;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncViewAnchor();\n this.syncCustomStates();\n this.updateDaySlots();\n this.childrenObserver = new MutationObserver(() => this.updateDaySlots());\n this.childrenObserver.observe(this, { childList: true, attributes: true, attributeFilter: ['slot'] });\n }\n\n override disconnectedCallback(): void {\n this.childrenObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n if (changed.has('value') || changed.has('focusedDate') || changed.has('mode')) {\n this.syncViewAnchor();\n }\n\n if (changed.has('disabled') || changed.has('readonly') || changed.has('mode') || changed.has('withWeekNumbers')) {\n this.syncCustomStates();\n }\n\n if (changed.has('view')) {\n this.emitViewChange();\n }\n\n super.willUpdate(changed);\n }\n\n private updateDaySlots(): void {\n const names = [...this.children]\n .map((child) => child.getAttribute('slot'))\n .filter((name): name is string => Boolean(name?.startsWith('day-')));\n\n if (names.join(',') !== this.daySlotNames.join(',')) {\n this.daySlotNames = names;\n }\n }\n\n private syncCustomStates(): void {\n this.toggleAttribute('data-range', this.mode === 'range');\n this.toggleAttribute('data-multiple', this.mode === 'multiple');\n this.toggleAttribute('data-week-numbers', this.withWeekNumbers);\n }\n\n private get resolvedLocale(): string {\n return this.locale || this.lang || document.documentElement.lang || 'en';\n }\n\n private get resolvedToday(): Date {\n return parseIsoDate(this.today) ?? todayDate();\n }\n\n /** Representative selected date used to anchor the view/focus across all modes. */\n private get primarySelectedDate(): Date | null {\n if (this.mode === 'single') {\n return parseIsoDate(this.value);\n }\n\n if (this.mode === 'multiple') {\n return parseDateList(this.value)[0] ?? null;\n }\n\n return parseRange(this.value).from;\n }\n\n private get resolvedFocusedDate(): Date {\n return parseIsoDate(this.focusedDate)\n ?? coerceToDate(this.primarySelectedDate)\n ?? this.resolvedToday;\n }\n\n private get isDisabledMatcher(): (date: Date) => boolean {\n return buildDisabledMatcher({\n min: parseIsoDate(this.min),\n max: parseIsoDate(this.max),\n disabledDates: parseDisabledDates(this.disabledDatesRaw),\n disabledDaysOfWeek: parseDaysOfWeek(this.disabledDaysOfWeek),\n disablePast: this.disablePast,\n disableFuture: this.disableFuture,\n today: this.resolvedToday,\n isDateDisabled: this.isDateDisabled,\n });\n }\n\n private get weekendDays(): Set<number> {\n return new Set(intlWeekendToJsDays(getWeekInfo(this.resolvedLocale).weekend));\n }\n\n private get pageStep(): number {\n return this.pageBy === 'single' ? 1 : this.months;\n }\n\n private get visibleMonthAnchors(): Date[] {\n const anchors = [this.viewAnchor];\n\n if (this.months === 2) {\n anchors.push(startOfMonth(addMonths(this.viewAnchor, 1)));\n }\n\n return anchors;\n }\n\n private syncViewAnchor(): void {\n const focus = this.resolvedFocusedDate;\n\n if (!this.visibleMonthAnchors.some((anchor) => isSameMonth(focus, anchor))) {\n this.viewAnchor = startOfMonth(focus);\n }\n }\n\n get valueAsDate(): Date | null {\n return this.mode === 'single' ? parseIsoDate(this.value) : null;\n }\n\n get valueAsRange(): DateRange {\n return parseRange(this.value);\n }\n\n /** Sorted, deduped selection for `multiple` mode (empty otherwise). */\n get valueAsDates(): Date[] {\n return this.mode === 'multiple' ? parseDateList(this.value) : [];\n }\n\n focus(options?: FocusOptions): void {\n const selector = this.view === 'days'\n ? '.day.is-roving'\n : this.view === 'months'\n ? '.view-item.is-roving'\n : '.view-item.is-roving';\n\n this.renderRoot.querySelector<HTMLButtonElement>(selector)?.focus(options);\n }\n\n goToDate(date: string | Date): void {\n const parsed = coerceToDate(date);\n\n if (!parsed) {\n return;\n }\n\n this.viewAnchor = startOfMonth(parsed);\n this.focusedDate = formatIsoDate(parsed);\n this.view = 'days';\n }\n\n goToToday(): void {\n this.goToDate(this.resolvedToday);\n }\n\n clear(): void {\n if (this.disabled || this.readonly) {\n return;\n }\n\n this.value = '';\n this.rangeAnchor = null;\n this.hoverDate = null;\n this.emitInput();\n this.emitChange();\n }\n\n private emitInput(): void {\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n }\n\n private emitChange(): void {\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n private emitFocusDay(date: Date): void {\n this.dispatchEvent(new CustomEvent('pk-focus-day', {\n detail: { date },\n bubbles: true,\n composed: true,\n }));\n }\n\n private emitViewChange(): void {\n this.dispatchEvent(new CustomEvent('pk-view-change', {\n detail: { view: this.view, date: this.resolvedFocusedDate },\n bubbles: true,\n composed: true,\n }));\n }\n\n private announce(message: string): void {\n this.liveAnnouncement = `${message}\\u200B`;\n }\n\n private setView(next: PkCalendarView): void {\n if (this.view === next) {\n return;\n }\n\n this.view = next;\n }\n\n private handlePrevious = (): void => {\n if (this.view === 'days') {\n this.viewAnchor = addMonths(this.viewAnchor, -this.pageStep);\n return;\n }\n\n if (this.view === 'months') {\n this.viewAnchor = addYears(this.viewAnchor, -1);\n return;\n }\n\n this.viewAnchor = addYears(this.viewAnchor, -12);\n };\n\n private handleNext = (): void => {\n if (this.view === 'days') {\n this.viewAnchor = addMonths(this.viewAnchor, this.pageStep);\n return;\n }\n\n if (this.view === 'months') {\n this.viewAnchor = addYears(this.viewAnchor, 1);\n return;\n }\n\n this.viewAnchor = addYears(this.viewAnchor, 12);\n };\n\n private handleTitleClick = (): void => {\n if (this.disabled) {\n return;\n }\n\n if (this.view === 'days') {\n this.setView('months');\n this.focusedMonth = this.resolvedFocusedDate.getMonth();\n return;\n }\n\n if (this.view === 'months') {\n this.setView('years');\n this.focusedYear = this.resolvedFocusedDate.getFullYear();\n }\n };\n\n private handleDayClick(date: Date, disabled: boolean): void {\n if (this.disabled || this.readonly || disabled) {\n return;\n }\n\n if (this.mode === 'single') {\n this.value = formatIsoDate(date);\n this.focusedDate = formatIsoDate(date);\n this.emitInput();\n this.emitChange();\n this.announce(formatDisplayDate(date, this.resolvedLocale));\n return;\n }\n\n if (this.mode === 'multiple') {\n // Each click toggles the day in/out of the set; the picker keeps the panel\n // open so several dates can be chosen before dismissing.\n const wasSelected = parseDateList(this.value).some((entry) => isSameDay(entry, date));\n this.value = toggleDateInList(this.value, date);\n this.focusedDate = formatIsoDate(date);\n this.emitInput();\n this.emitChange();\n this.announce(\n `${wasSelected ? 'Removed' : 'Added'} ${formatDisplayDate(date, this.resolvedLocale)}`,\n );\n return;\n }\n\n if (!this.rangeAnchor) {\n this.rangeAnchor = date;\n this.value = formatIsoDate(date);\n this.focusedDate = formatIsoDate(date);\n this.emitInput();\n return;\n }\n\n const from = this.rangeAnchor;\n const to = date;\n const ordered = from.getTime() <= to.getTime()\n ? { from, to }\n : { from: to, to: from };\n\n if (this.minRange > 0 && diffDays(ordered.to, ordered.from) + 1 < this.minRange) {\n this.announce(`Range must be at least ${this.minRange} days`);\n return;\n }\n\n if (this.maxRange > 0 && diffDays(ordered.to, ordered.from) + 1 > this.maxRange) {\n this.announce(`Range must be at most ${this.maxRange} days`);\n return;\n }\n\n this.value = formatRange(ordered);\n this.focusedDate = formatIsoDate(date);\n this.rangeAnchor = null;\n this.hoverDate = null;\n this.emitInput();\n this.emitChange();\n this.announce(`${formatDisplayDate(ordered.from, this.resolvedLocale)} – ${formatDisplayDate(ordered.to, this.resolvedLocale)}`);\n }\n\n private handleDayHover(date: Date): void {\n if (this.mode !== 'range' || !this.rangeAnchor) {\n return;\n }\n\n this.hoverDate = date;\n this.emitFocusDay(date);\n }\n\n private handleGridMouseLeave = (): void => {\n this.hoverDate = null;\n };\n\n private handleMonthPick(monthIndex: number): void {\n if (this.disabled || this.readonly) {\n return;\n }\n\n const next = new Date(this.viewAnchor.getFullYear(), monthIndex, 1);\n\n if (this.isMonthFullyDisabled(next)) {\n return;\n }\n\n this.viewAnchor = next;\n this.focusedDate = formatIsoDate(next);\n this.setView('days');\n }\n\n private handleYearPick(year: number): void {\n if (this.disabled || this.readonly) {\n return;\n }\n\n const next = new Date(year, this.viewAnchor.getMonth(), 1);\n\n if (this.isYearFullyDisabled(year)) {\n return;\n }\n\n this.viewAnchor = next;\n this.focusedDate = formatIsoDate(next);\n this.setView('months');\n this.focusedMonth = next.getMonth();\n }\n\n private handleDayKeyDown(event: KeyboardEvent, date: Date, disabled: boolean): void {\n if (disabled) {\n return;\n }\n\n let next: Date | null = null;\n\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(date, -1);\n break;\n case 'ArrowRight':\n next = addDays(date, 1);\n break;\n case 'ArrowUp':\n next = addDays(date, -7);\n break;\n case 'ArrowDown':\n next = addDays(date, 7);\n break;\n case 'PageUp':\n next = addMonths(date, -1);\n break;\n case 'PageDown':\n next = addMonths(date, 1);\n break;\n case 'Home':\n next = startOfMonth(date);\n break;\n case 'End':\n next = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.handleDayClick(date, disabled);\n return;\n case 'Escape':\n if (this.rangeAnchor) {\n event.preventDefault();\n this.rangeAnchor = null;\n this.hoverDate = null;\n this.requestUpdate();\n }\n\n return;\n default:\n return;\n }\n\n event.preventDefault();\n\n if (!next) {\n return;\n }\n\n this.focusedDate = formatIsoDate(next);\n\n if (!this.visibleMonthAnchors.some((anchor) => isSameMonth(next!, anchor))) {\n this.viewAnchor = startOfMonth(next);\n }\n\n this.emitFocusDay(next);\n this.requestUpdate();\n queueMicrotask(() => this.focus());\n }\n\n private isMonthFullyDisabled(monthStart: Date): boolean {\n const end = new Date(monthStart.getFullYear(), monthStart.getMonth() + 1, 0);\n return allDisabledInRange(monthStart, end, this.isDisabledMatcher);\n }\n\n private isYearFullyDisabled(year: number): boolean {\n const start = new Date(year, 0, 1);\n const end = new Date(year, 11, 31);\n return allDisabledInRange(start, end, this.isDisabledMatcher);\n }\n\n private formatWeekdayLabel(date: Date): string {\n if (this.weekdayFormat === 'narrow') {\n // Match react-day-picker cccccc — two-letter labels (Su, Mo, Tu…)\n const short = new Intl.DateTimeFormat(this.resolvedLocale, { weekday: 'short' }).format(date);\n return short.slice(0, 2);\n }\n\n return new Intl.DateTimeFormat(this.resolvedLocale, { weekday: this.weekdayFormat }).format(date);\n }\n\n private buildWeekdayLabels(): string[] {\n const firstDay = resolveFirstDayOfWeek(this.firstDayOfWeek, this.resolvedLocale);\n const labels: string[] = [];\n\n for (let index = 0; index < 7; index += 1) {\n const day = (firstDay + index) % 7;\n const date = new Date(2024, 0, day === 0 ? 7 : day);\n labels.push(this.formatWeekdayLabel(date));\n }\n\n return labels;\n }\n\n private buildMonthDays(monthAnchor: Date): Date[] {\n const firstDay = resolveFirstDayOfWeek(this.firstDayOfWeek, this.resolvedLocale);\n const monthStart = startOfMonth(monthAnchor);\n const offset = (monthStart.getDay() - firstDay + 7) % 7;\n const gridStart = addDays(monthStart, -offset);\n const days: Date[] = [];\n\n for (let index = 0; index < 42; index += 1) {\n days.push(addDays(gridStart, index));\n }\n\n return days;\n }\n\n private computeDayState(date: Date, monthAnchor: Date): DayState {\n const isDisabled = this.isDisabledMatcher(date);\n const range = parseRange(this.value);\n const selectedSingle = this.mode === 'single' && isSameDay(parseIsoDate(this.value), date);\n const selectedMultiple = this.mode === 'multiple'\n && parseDateList(this.value).some((entry) => isSameDay(entry, date));\n const rangeStart = this.mode === 'range' && isSameDay(range.from, date);\n const rangeEnd = this.mode === 'range' && isSameDay(range.to, date);\n const rangeInner = this.mode === 'range'\n && range.from\n && range.to\n && date.getTime() > range.from.getTime()\n && date.getTime() < range.to.getTime();\n\n let rangePreview = false;\n\n if (this.mode === 'range' && this.rangeAnchor && this.hoverDate) {\n const anchor = this.rangeAnchor;\n const hover = this.hoverDate;\n const start = anchor.getTime() <= hover.getTime() ? anchor : hover;\n const end = anchor.getTime() <= hover.getTime() ? hover : anchor;\n\n rangePreview = date.getTime() >= start.getTime() && date.getTime() <= end.getTime();\n }\n\n return {\n date,\n monthAnchor,\n outside: !isSameMonth(date, monthAnchor),\n today: isSameDay(date, this.resolvedToday),\n weekend: this.weekendDays.has(date.getDay()),\n disabled: isDisabled,\n selected: selectedSingle || selectedMultiple || rangeStart || rangeEnd,\n rangeStart,\n rangeEnd,\n rangeInner: Boolean(rangeInner),\n rangePreview,\n roving: isSameDay(date, this.resolvedFocusedDate),\n };\n }\n\n private renderDayContent(state: DayState) {\n const slotName = `day-${formatIsoDate(state.date)}`;\n\n if (this.daySlotNames.includes(slotName)) {\n return html`<slot name=${slotName}></slot>`;\n }\n\n const custom = this.dayContent?.(state.date);\n\n if (custom) {\n return unsafeHTML(custom);\n }\n\n return html`<span part=\"day-label\">${state.date.getDate()}</span>`;\n }\n\n private renderDay(state: DayState) {\n if (!this.withOutsideDays && state.outside) {\n return html`<span part=\"day-placeholder\" class=\"day is-placeholder\" aria-hidden=\"true\"></span>`;\n }\n\n const label = formatDisplayDate(state.date, this.resolvedLocale);\n\n return html`\n <button\n type=\"button\"\n part=\"day\"\n class=${classMap({\n day: true,\n 'is-outside': state.outside,\n 'is-today': state.today,\n 'is-weekend': state.weekend,\n 'is-disabled': state.disabled,\n 'is-selected': state.selected,\n 'is-range-start': state.rangeStart,\n 'is-range-end': state.rangeEnd,\n 'is-range-inner': state.rangeInner,\n 'is-range-preview': state.rangePreview,\n 'is-roving': state.roving,\n })}\n tabindex=${state.roving ? '0' : '-1'}\n ?disabled=${state.disabled}\n aria-label=${label}\n aria-selected=${state.selected ? 'true' : 'false'}\n aria-current=${state.today ? 'date' : nothing}\n @click=${() => this.handleDayClick(state.date, state.disabled)}\n @mouseenter=${() => this.handleDayHover(state.date)}\n @keydown=${(event: KeyboardEvent) => this.handleDayKeyDown(event, state.date, state.disabled)}\n >\n ${this.renderDayContent(state)}\n </button>\n `;\n }\n\n private getMonthWeeks(monthAnchor: Date): Date[][] {\n const days = this.buildMonthDays(monthAnchor);\n const weeks: Date[][] = [];\n\n for (let index = 0; index < days.length; index += 7) {\n weeks.push(days.slice(index, index + 7));\n }\n\n if (this.withOutsideDays) {\n return weeks;\n }\n\n return weeks.filter((week) => week.some((date) => isSameMonth(date, monthAnchor)));\n }\n\n private renderMonth(monthAnchor: Date, showLabel = false) {\n const weekdays = this.buildWeekdayLabels();\n const title = new Intl.DateTimeFormat(this.resolvedLocale, {\n month: 'long',\n year: 'numeric',\n }).format(monthAnchor);\n\n const weeks = this.getMonthWeeks(monthAnchor);\n\n return html`\n <div part=\"month\" class=\"month\">\n ${showLabel\n ? html`<div part=\"month-label\" class=\"month-label\">${title}</div>`\n : nothing}\n <div part=\"weekdays\" class=\"weekdays\" role=\"row\">\n ${this.withWeekNumbers\n ? html`<span part=\"weeknumbers\" class=\"weeknumber-header\" role=\"columnheader\">#</span>`\n : nothing}\n ${weekdays.map((weekday) => html`\n <span part=\"weekday\" class=\"weekday\" role=\"columnheader\">${weekday}</span>\n `)}\n </div>\n <div\n part=\"grid\"\n class=\"grid\"\n role=\"grid\"\n aria-label=${title}\n @mouseleave=${this.handleGridMouseLeave}\n >\n ${weeks.map((week) => html`\n <div part=\"week\" class=\"week\" role=\"row\">\n ${this.withWeekNumbers\n ? html`<span part=\"weeknumber\" class=\"weeknumber\" role=\"gridcell\">${isoWeekNumber(week[0])}</span>`\n : nothing}\n ${week.map((date) => this.renderDay(this.computeDayState(date, monthAnchor)))}\n </div>\n `)}\n </div>\n </div>\n `;\n }\n\n private renderViewRows(items: Array<ReturnType<typeof html>>) {\n const rows: Array<ReturnType<typeof html>> = [];\n\n for (let index = 0; index < items.length; index += 3) {\n rows.push(html`\n <div part=\"view-row\" class=\"view-row\" role=\"row\">\n ${items.slice(index, index + 3)}\n </div>\n `);\n }\n\n return rows;\n }\n\n private renderMonthsView() {\n const year = this.viewAnchor.getFullYear();\n const formatter = new Intl.DateTimeFormat(this.resolvedLocale, { month: 'long' });\n const selectedDate = this.primarySelectedDate;\n const selectedMonth = selectedDate?.getMonth();\n const rovingMonth = this.focusedMonth ?? this.resolvedFocusedDate.getMonth();\n const items = [];\n\n for (let monthIndex = 0; monthIndex < 12; monthIndex += 1) {\n const monthStart = new Date(year, monthIndex, 1);\n const disabled = this.isMonthFullyDisabled(monthStart);\n const selected = selectedMonth === monthIndex;\n const todayMonth = this.resolvedToday.getFullYear() === year && this.resolvedToday.getMonth() === monthIndex;\n const roving = rovingMonth === monthIndex;\n\n items.push(html`\n <div part=\"view-cell\" class=\"view-cell\" role=\"gridcell\">\n <button\n type=\"button\"\n part=\"view-item ${todayMonth ? 'view-item-today' : ''} ${selected ? 'view-item-selected' : ''} ${disabled ? 'view-item-disabled' : ''}\"\n class=${classMap({\n 'view-item': true,\n 'is-today': todayMonth,\n 'is-selected': selected,\n 'is-disabled': disabled,\n 'is-roving': roving,\n })}\n tabindex=${roving ? '0' : '-1'}\n ?disabled=${disabled}\n @click=${() => this.handleMonthPick(monthIndex)}\n >\n ${formatter.format(monthStart)}\n </button>\n </div>\n `);\n }\n\n return html`\n <div part=\"view-grid\" class=\"view-grid\" role=\"grid\">\n ${this.renderViewRows(items)}\n </div>\n `;\n }\n\n private renderYearsView() {\n const centerYear = this.viewAnchor.getFullYear();\n const decadeStart = Math.floor(centerYear / 12) * 12;\n const selectedDate = this.primarySelectedDate;\n const selectedYear = selectedDate?.getFullYear();\n const rovingYear = this.focusedYear ?? this.resolvedFocusedDate.getFullYear();\n const items = [];\n\n for (let offset = 0; offset < 12; offset += 1) {\n const year = decadeStart + offset;\n const disabled = this.isYearFullyDisabled(year);\n const selected = selectedYear === year;\n const todayYear = this.resolvedToday.getFullYear() === year;\n const roving = rovingYear === year;\n\n items.push(html`\n <div part=\"view-cell\" class=\"view-cell\" role=\"gridcell\">\n <button\n type=\"button\"\n part=\"view-item ${todayYear ? 'view-item-today' : ''} ${selected ? 'view-item-selected' : ''} ${disabled ? 'view-item-disabled' : ''}\"\n class=${classMap({\n 'view-item': true,\n 'is-today': todayYear,\n 'is-selected': selected,\n 'is-disabled': disabled,\n 'is-roving': roving,\n })}\n tabindex=${roving ? '0' : '-1'}\n ?disabled=${disabled}\n @click=${() => this.handleYearPick(year)}\n >\n ${year}\n </button>\n </div>\n `);\n }\n\n return html`\n <div part=\"view-grid\" class=\"view-grid\" role=\"grid\">\n ${this.renderViewRows(items)}\n </div>\n `;\n }\n\n private renderHeaderTitle() {\n if (this.view === 'months') {\n return String(this.viewAnchor.getFullYear());\n }\n\n if (this.view === 'years') {\n const centerYear = this.viewAnchor.getFullYear();\n const decadeStart = Math.floor(centerYear / 12) * 12;\n return `${decadeStart} – ${decadeStart + 11}`;\n }\n\n if (this.months === 2) {\n const first = new Intl.DateTimeFormat(this.resolvedLocale, { month: 'long', year: 'numeric' }).format(this.viewAnchor);\n const second = new Intl.DateTimeFormat(this.resolvedLocale, { month: 'long', year: 'numeric' }).format(addMonths(this.viewAnchor, 1));\n return `${first} – ${second}`;\n }\n\n return new Intl.DateTimeFormat(this.resolvedLocale, {\n month: 'long',\n year: 'numeric',\n }).format(this.viewAnchor);\n }\n\n override render() {\n const showDualLabels = this.view === 'days' && this.months === 2;\n\n return html`\n <div part=\"base\" class=\"base\">\n <div part=\"header\" class=\"header\">\n <button\n type=\"button\"\n part=\"previous\"\n class=\"nav-button\"\n aria-label=\"Previous\"\n ?disabled=${this.disabled}\n @click=${this.handlePrevious}\n >\n <slot name=\"previous-icon\">\n <span class=\"icon\" aria-hidden=\"true\">${unsafeSVG(CHEVRON_LEFT)}</span>\n </slot>\n </button>\n <button\n type=\"button\"\n part=\"title\"\n class=\"title\"\n ?disabled=${this.disabled}\n @click=${this.view === 'years' ? undefined : this.handleTitleClick}\n >\n ${this.renderHeaderTitle()}\n </button>\n <button\n type=\"button\"\n part=\"next\"\n class=\"nav-button\"\n aria-label=\"Next\"\n ?disabled=${this.disabled}\n @click=${this.handleNext}\n >\n <slot name=\"next-icon\">\n <span class=\"icon\" aria-hidden=\"true\">${unsafeSVG(CHEVRON_RIGHT)}</span>\n </slot>\n </button>\n </div>\n\n <div part=\"months\" class=\"months\">\n ${this.view === 'days'\n ? this.visibleMonthAnchors.map((anchor) => this.renderMonth(anchor, showDualLabels))\n : this.view === 'months'\n ? this.renderMonthsView()\n : this.renderYearsView()}\n </div>\n\n ${this.hasSlotController.test('footer')\n ? html`<div part=\"footer\"><slot name=\"footer\"></slot></div>`\n : nothing}\n\n <div class=\"live-region\" aria-live=\"polite\" aria-atomic=\"true\">\n ${this.liveAnnouncement}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-calendar': PkCalendar;\n }\n}\n"],"mappings":"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"}