@verbb/plugin-kit-web 2.0.16 → 2.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +3 -3
  3. package/custom-elements.json +19620 -19410
  4. package/dist/chunks/{pk-autocomplete-kOT0Zlld.js → pk-autocomplete-IFL-u-RF.js} +2 -2
  5. package/dist/chunks/{pk-autocomplete-kOT0Zlld.js.map → pk-autocomplete-IFL-u-RF.js.map} +1 -1
  6. package/dist/chunks/{pk-combobox-Dn7UJ_CV.js → pk-combobox-CL9En0J-.js} +2 -2
  7. package/dist/chunks/{pk-combobox-Dn7UJ_CV.js.map → pk-combobox-CL9En0J-.js.map} +1 -1
  8. package/dist/chunks/pk-copy-button-BVaOLtYG.js.map +1 -1
  9. package/dist/chunks/{pk-date-picker-DfIvmoZ1.js → pk-date-picker-BEAd4Ngl.js} +2 -2
  10. package/dist/chunks/{pk-date-picker-DfIvmoZ1.js.map → pk-date-picker-BEAd4Ngl.js.map} +1 -1
  11. package/dist/chunks/pk-dialog-VMQqLW1f.js.map +1 -1
  12. package/dist/chunks/{pk-dropdown-item-BZQS87U0.js → pk-dropdown-item-D9OaG5o-.js} +8 -4
  13. package/dist/chunks/pk-dropdown-item-D9OaG5o-.js.map +1 -0
  14. package/dist/chunks/{pk-dropdown-menu-D60p2-9X.js → pk-dropdown-menu-DW1wI8xQ.js} +5 -3
  15. package/dist/chunks/pk-dropdown-menu-DW1wI8xQ.js.map +1 -0
  16. package/dist/chunks/{pk-editable-table-BQ47MXpu.js → pk-editable-table-BoqfveXO.js} +7 -7
  17. package/dist/chunks/pk-editable-table-BoqfveXO.js.map +1 -0
  18. package/dist/chunks/{pk-image-browser-BXFDfch3.js → pk-image-browser-DwiCFOIG.js} +3 -3
  19. package/dist/chunks/pk-image-browser-DwiCFOIG.js.map +1 -0
  20. package/dist/chunks/pk-input-CF_icEtR.js.map +1 -1
  21. package/dist/chunks/{pk-input-group-CWdoVhkH.js → pk-input-group-BLqKPnfc.js} +2 -2
  22. package/dist/chunks/{pk-input-group-CWdoVhkH.js.map → pk-input-group-BLqKPnfc.js.map} +1 -1
  23. package/dist/chunks/{pk-popover-KSIOYlbs.js → pk-popover-D3jkHfwB.js} +2 -2
  24. package/dist/chunks/pk-popover-D3jkHfwB.js.map +1 -0
  25. package/dist/chunks/{pk-popup-B9AgBC2V.js → pk-popup-B65tZMQH.js} +23 -1
  26. package/dist/chunks/pk-popup-B65tZMQH.js.map +1 -0
  27. package/dist/chunks/{pk-select-DQtORz-v.js → pk-select-CdQdhnZN.js} +2 -2
  28. package/dist/chunks/{pk-select-DQtORz-v.js.map → pk-select-CdQdhnZN.js.map} +1 -1
  29. package/dist/chunks/{pk-time-picker-DLUBYLFo.js → pk-time-picker-CebRqydV.js} +2 -2
  30. package/dist/chunks/{pk-time-picker-DLUBYLFo.js.map → pk-time-picker-CebRqydV.js.map} +1 -1
  31. package/dist/chunks/{pk-tiptap-content-BwkqYVJb.js → pk-tiptap-content-CL8smjGi.js} +5 -2
  32. package/dist/chunks/{pk-tiptap-content-BwkqYVJb.js.map → pk-tiptap-content-CL8smjGi.js.map} +1 -1
  33. package/dist/chunks/{pk-tiptap-editor-De8UUTis.js → pk-tiptap-editor-CTz-yfHL.js} +327 -11
  34. package/dist/chunks/pk-tiptap-editor-CTz-yfHL.js.map +1 -0
  35. package/dist/chunks/{pk-tooltip-Cmmc0916.js → pk-tooltip--QBV6puX.js} +2 -2
  36. package/dist/chunks/{pk-tooltip-Cmmc0916.js.map → pk-tooltip--QBV6puX.js.map} +1 -1
  37. package/dist/chunks/{register-posLyX3U.js → register-aJw-9RWi.js} +14 -14
  38. package/dist/chunks/{register-posLyX3U.js.map → register-aJw-9RWi.js.map} +1 -1
  39. package/dist/components/autocomplete/pk-autocomplete.js +1 -1
  40. package/dist/components/autocomplete.js +1 -1
  41. package/dist/components/combobox/pk-combobox.js +1 -1
  42. package/dist/components/combobox.js +1 -1
  43. package/dist/components/connect/pk-connect-oauth.d.ts +1 -1
  44. package/dist/components/connect/pk-connect-oauth.js.map +1 -1
  45. package/dist/components/copy-button/pk-copy-button.d.ts +1 -1
  46. package/dist/components/date-picker/pk-date-picker.js +1 -1
  47. package/dist/components/date-picker.js +1 -1
  48. package/dist/components/dialog/pk-dialog.d.ts +1 -1
  49. package/dist/components/dropdown-menu/pk-dropdown-item.d.ts +3 -1
  50. package/dist/components/dropdown-menu/pk-dropdown-item.d.ts.map +1 -1
  51. package/dist/components/dropdown-menu/pk-dropdown-item.js +1 -1
  52. package/dist/components/dropdown-menu/pk-dropdown-item.styles.d.ts.map +1 -1
  53. package/dist/components/dropdown-menu/pk-dropdown-menu.js +1 -1
  54. package/dist/components/dropdown-menu/pk-dropdown-menu.styles.d.ts.map +1 -1
  55. package/dist/components/dropdown-menu.js +2 -2
  56. package/dist/components/editable-table/pk-editable-table.d.ts +1 -1
  57. package/dist/components/editable-table/pk-editable-table.d.ts.map +1 -1
  58. package/dist/components/editable-table/pk-editable-table.js +1 -1
  59. package/dist/components/editable-table.js +1 -1
  60. package/dist/components/image-browser/pk-image-browser.d.ts +1 -1
  61. package/dist/components/image-browser/pk-image-browser.js +1 -1
  62. package/dist/components/image-browser.js +1 -1
  63. package/dist/components/input/pk-input.d.ts +2 -2
  64. package/dist/components/input-group/pk-input-group.d.ts +2 -2
  65. package/dist/components/input-group/pk-input-group.d.ts.map +1 -1
  66. package/dist/components/input-group/pk-input-group.js +1 -1
  67. package/dist/components/input-group.js +1 -1
  68. package/dist/components/popover/pk-popover.d.ts +2 -2
  69. package/dist/components/popover/pk-popover.js +1 -1
  70. package/dist/components/popover.js +1 -1
  71. package/dist/components/popup/pk-popup.d.ts +4 -0
  72. package/dist/components/popup/pk-popup.d.ts.map +1 -1
  73. package/dist/components/popup/pk-popup.js +1 -1
  74. package/dist/components/popup.js +1 -1
  75. package/dist/components/select/pk-select.js +1 -1
  76. package/dist/components/select.js +1 -1
  77. package/dist/components/time-picker/pk-time-picker.js +1 -1
  78. package/dist/components/time-picker.js +1 -1
  79. package/dist/components/tiptap/pk-tiptap-content.d.ts.map +1 -1
  80. package/dist/components/tiptap/pk-tiptap-content.js +1 -1
  81. package/dist/components/tiptap/pk-tiptap-editor.d.ts +11 -1
  82. package/dist/components/tiptap/pk-tiptap-editor.d.ts.map +1 -1
  83. package/dist/components/tiptap/pk-tiptap-editor.js +1 -1
  84. package/dist/components/tiptap/pk-tiptap-editor.styles.d.ts.map +1 -1
  85. package/dist/components/tiptap/tiptap-toolbar.d.ts +1 -0
  86. package/dist/components/tiptap/tiptap-toolbar.d.ts.map +1 -1
  87. package/dist/components/tiptap-content.js +1 -1
  88. package/dist/components/tiptap-editor.js +1 -1
  89. package/dist/components/tooltip/pk-tooltip.js +1 -1
  90. package/dist/components/tooltip.js +1 -1
  91. package/dist/index.js +14 -14
  92. package/dist/register.js +14 -14
  93. package/dist-loader/chunks/{option-filter-Z7bomRrK.js → option-filter-Bc5aNNT0.js} +1 -1
  94. package/dist-loader/chunks/{pk-button-dngp-vOd.js → pk-button-saBDszJV.js} +1 -1
  95. package/dist-loader/chunks/{pk-calendar-BE4HRfCq.js → pk-calendar-BrF8i3dW.js} +2 -2
  96. package/dist-loader/chunks/{pk-combobox-DMBKXPLB.js → pk-combobox-Cpx0w1KV.js} +6 -6
  97. package/dist-loader/chunks/{pk-date-picker-wntQmeIM.js → pk-date-picker-DEoiTOxN.js} +5 -5
  98. package/dist-loader/chunks/{pk-dialog-B6lzsRur.js → pk-dialog-C6aaPokv.js} +2 -2
  99. package/dist-loader/chunks/{pk-dropdown-item-DJ5TeF1r.js → pk-dropdown-item-D8RrwjxL.js} +9 -5
  100. package/dist-loader/chunks/pk-dropdown-label-Cg32UgRe.js +51 -0
  101. package/dist-loader/chunks/{pk-dropdown-menu-B87bsdlI.js → pk-dropdown-menu-CAHCltlX.js} +4 -2
  102. package/dist-loader/chunks/{pk-field-D_SNOJpl.js → pk-field-V7JOy26T.js} +2 -2
  103. package/dist-loader/chunks/{pk-icon-B5ob3JdK.js → pk-icon-Bph-EBqp.js} +1 -1
  104. package/dist-loader/chunks/{pk-option-Cc6QWw-0.js → pk-option-BrDMERSl.js} +2 -2
  105. package/dist-loader/chunks/{pk-popup-BooGjXgH.js → pk-popup-CrxxR-Hb.js} +23 -1
  106. package/dist-loader/chunks/{pk-select-BG8qPsBd.js → pk-select-Dok-JdSe.js} +5 -5
  107. package/dist-loader/chunks/{pk-time-picker-CDVFNhN7.js → pk-time-picker-h5Wgd4a_.js} +4 -4
  108. package/dist-loader/chunks/{pk-tooltip-BS2dNLOS.js → pk-tooltip-Dd_Q0Bn5.js} +1 -1
  109. package/dist-loader/chunks/{render-BKfL_WRl.js → render-Bnzcxfss.js} +1 -1
  110. package/dist-loader/chunks/{svg-BiAlXtCn.js → svg-Bz-bXZn7.js} +7 -1
  111. package/dist-loader/chunks/{tiptap-Db7MTUH1.js → tiptap-CgXkiK8d.js} +283 -13
  112. package/dist-loader/chunks/{tiptap.styles-BFGP4eTV.js → tiptap.styles-C0E1NpSx.js} +222 -3
  113. package/dist-loader/components/autocomplete/autocomplete.js +6 -6
  114. package/dist-loader/components/button/button.js +1 -1
  115. package/dist-loader/components/calendar/calendar.js +1 -1
  116. package/dist-loader/components/code-editor/code-editor.js +5 -5
  117. package/dist-loader/components/combobox/combobox.js +1 -1
  118. package/dist-loader/components/connect/connect-oauth.js +3 -3
  119. package/dist-loader/components/connect/connect.js +5 -5
  120. package/dist-loader/components/copy-button/copy-button.js +3 -3
  121. package/dist-loader/components/date-picker/date-picker.js +1 -1
  122. package/dist-loader/components/dialog/dialog.js +1 -1
  123. package/dist-loader/components/dropdown-menu/dropdown-item.js +1 -1
  124. package/dist-loader/components/dropdown-menu/dropdown-label.js +1 -50
  125. package/dist-loader/components/dropdown-menu/dropdown-menu.js +1 -1
  126. package/dist-loader/components/editable-table/editable-table.js +11 -11
  127. package/dist-loader/components/field/field.js +1 -1
  128. package/dist-loader/components/icon/icon.js +2 -2
  129. package/dist-loader/components/image-browser/image-browser.js +5 -5
  130. package/dist-loader/components/input-group/input-group.js +1 -1
  131. package/dist-loader/components/lightswitch/lightswitch.js +1 -1
  132. package/dist-loader/components/popover/popover.js +2 -2
  133. package/dist-loader/components/popup/popup.js +1 -1
  134. package/dist-loader/components/select/option.js +1 -1
  135. package/dist-loader/components/select/select.js +1 -1
  136. package/dist-loader/components/status/status.js +1 -1
  137. package/dist-loader/components/time-picker/time-picker.js +1 -1
  138. package/dist-loader/components/tiptap/tiptap-content.js +6 -3
  139. package/dist-loader/components/tiptap/tiptap-editor.js +332 -16
  140. package/dist-loader/components/tiptap/tiptap-input.js +2 -2
  141. package/dist-loader/components/tooltip/tooltip.js +1 -1
  142. package/package.json +11 -8
  143. package/dist/chunks/pk-dropdown-item-BZQS87U0.js.map +0 -1
  144. package/dist/chunks/pk-dropdown-menu-D60p2-9X.js.map +0 -1
  145. package/dist/chunks/pk-editable-table-BQ47MXpu.js.map +0 -1
  146. package/dist/chunks/pk-image-browser-BXFDfch3.js.map +0 -1
  147. package/dist/chunks/pk-popover-KSIOYlbs.js.map +0 -1
  148. package/dist/chunks/pk-popup-B9AgBC2V.js.map +0 -1
  149. package/dist/chunks/pk-tiptap-editor-De8UUTis.js.map +0 -1
  150. /package/dist-loader/chunks/{floating-ui-DU6GNott.js → floating-ui-Cj0imr6d.js} +0 -0
  151. /package/dist-loader/chunks/{pk-connect.styles-Bfgwu0VH.js → pk-connect.styles-k61snd3X.js} +0 -0
  152. /package/dist-loader/chunks/{pk-lightswitch-DRxY8511.js → pk-lightswitch-m23Cy3_D.js} +0 -0
  153. /package/dist-loader/chunks/{pk-status-D3ArH2ui.js → pk-status-D2g_77m_.js} +0 -0
  154. /package/dist-loader/chunks/{popup-pointer-caPc8kwB.js → popup-pointer-Ck28WdVP.js} +0 -0
  155. /package/dist-loader/chunks/{sync-listbox-separators-Dk_E_IVa.js → sync-listbox-separators-Ch5krDUs.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { l as n, m as i, p as b, s as e, u as customElement } from "../../chunks/lit-DpLik9Rf.js";
2
2
  import { c as __decorate, l as PkElement } from "../../chunks/pk-base-CyzwylQ7.js";
3
- import { k as Editor } from "../../chunks/tiptap-Db7MTUH1.js";
4
- import { A as createTiptapExtensions, i as createVariableTagDomNodeView, k as valueToContent, t as tiptapContentProseMirrorStyles } from "../../chunks/tiptap.styles-BFGP4eTV.js";
3
+ import { A as Editor } from "../../chunks/tiptap-CgXkiK8d.js";
4
+ import { i as createVariableTagDomNodeView, j as createTiptapExtensions, k as valueToContent, t as tiptapContentProseMirrorStyles } from "../../chunks/tiptap.styles-C0E1NpSx.js";
5
5
  //#region src/components/tiptap/pk-tiptap-content.styles.ts
6
6
  var pkTiptapContentStyles = i`
7
7
  @layer pk-component {
@@ -47,7 +47,10 @@ var PkTiptapContent = class PkTiptapContent extends PkElement {
47
47
  mountEditor() {
48
48
  this.editor = new Editor({
49
49
  element: this.editorMount,
50
- extensions: createTiptapExtensions({ variableTagNodeView: createVariableTagDomNodeView() }),
50
+ extensions: createTiptapExtensions({
51
+ variableTagNodeView: createVariableTagDomNodeView(),
52
+ surface: "content"
53
+ }),
51
54
  content: valueToContent(this.value),
52
55
  editable: false
53
56
  });
@@ -1,20 +1,21 @@
1
1
  import { n as uniqueId } from "../../chunks/pk-a11y-CjB4-U-R.js";
2
2
  import { a as o, c as r, f as A, l as n, m as i, p as b, s as e, u as customElement } from "../../chunks/lit-DpLik9Rf.js";
3
3
  import { c as __decorate, i as PkFormAssociatedElement, n as formControlStyles } from "../../chunks/pk-base-CyzwylQ7.js";
4
- import { A as heading, D as h4, E as h3, F as link, G as table, H as strikethrough, I as listOl, J as underline, K as textSlash, L as listUl, N as italic, O as h5, R as minus, T as h2, U as subscript, V as quoteRight, W as superscript, a as alignRight, c as arrowRotateRight, d as bold, f as bracketsCurly, h as chevronDown, i as alignLeft, j as highlighter, k as h6, n as alignCenter, q as triangleExclamation, r as alignJustify, s as arrowRotateLeft, w as h1, x as fileDashedLine, y as code, z as paragraph } from "../../chunks/svg-BiAlXtCn.js";
5
- import "../../chunks/pk-button-dngp-vOd.js";
4
+ import { A as heading, D as h4, E as h3, F as link, G as superscript, H as smallCaps, I as listOl, J as triangleExclamation, K as table, L as listUl, N as italic, O as h5, R as minus, T as h2, U as strikethrough, V as quoteRight, W as subscript, Y as underline, a as alignRight, c as arrowRotateRight, d as bold, f as bracketsCurly, h as chevronDown, i as alignLeft, j as highlighter, k as h6, n as alignCenter, q as textSlash, r as alignJustify, s as arrowRotateLeft, w as h1, x as fileDashedLine, y as code, z as paragraph } from "../../chunks/svg-Bz-bXZn7.js";
5
+ import "../../chunks/pk-button-saBDszJV.js";
6
6
  import { t as MirrorValidator } from "../../chunks/mirror-validator-C5XrXPaq.js";
7
7
  import "../../chunks/pk-checkbox-B3d4nkBx.js";
8
8
  import "../../chunks/pk-input-BhU0PiCk.js";
9
- import { M as posToDOMRect, j as getMarkRange, k as Editor } from "../../chunks/tiptap-Db7MTUH1.js";
10
- import { A as createTiptapExtensions, D as getFatalTiptapContentError, O as normalizeContentArray, S as openCraftElementLinkSelector, _ as getLinkOpenInNewTab, a as getToolbarGroupDefaultIcon, b as getCraftLinkOptions, c as isFormattingToolbarPreset, d as parseToolbarConfig, f as runToolbarButton, g as getLinkEditState, h as applyLinkToEditor, i as createVariableTagDomNodeView, k as valueToContent, l as isHeadingsOnlyToolbarPreset, m as isTiptapButtonActive, o as getToolbarGroupMenuItems, p as toolbarIncludesButton, r as tiptapProseMirrorStyles, s as getToolbarGroupTriggerState, u as isToolbarButtonActive, v as getSelectedText, x as getLinkOptionsElementSiteId, y as unsetLinkFromEditor } from "../../chunks/tiptap.styles-BFGP4eTV.js";
11
- import { n as renderIconHtml } from "../../chunks/render-BKfL_WRl.js";
12
- import "../../chunks/pk-field-D_SNOJpl.js";
13
- import "../../chunks/pk-dialog-B6lzsRur.js";
14
- import "../../chunks/pk-dropdown-item-DJ5TeF1r.js";
15
- import "../../chunks/pk-dropdown-menu-B87bsdlI.js";
9
+ import { A as Editor, N as getMarkRange, P as posToDOMRect } from "../../chunks/tiptap-CgXkiK8d.js";
10
+ import { A as resolveTiptapTextStyleToolbarConfig, D as getFatalTiptapContentError, N as getRegisteredTiptapToolbarControl, O as normalizeContentArray, S as openCraftElementLinkSelector, _ as getLinkOpenInNewTab, a as getToolbarGroupDefaultIcon, b as getCraftLinkOptions, c as isFormattingToolbarPreset, d as parseToolbarConfig, f as runToolbarButton, g as getLinkEditState, h as applyLinkToEditor, i as createVariableTagDomNodeView, j as createTiptapExtensions, k as valueToContent, l as isHeadingsOnlyToolbarPreset, m as isTiptapButtonActive, o as getToolbarGroupMenuItems, p as toolbarIncludesButton, r as tiptapProseMirrorStyles, s as getToolbarGroupTriggerState, u as isToolbarButtonActive, v as getSelectedText, x as getLinkOptionsElementSiteId, y as unsetLinkFromEditor } from "../../chunks/tiptap.styles-C0E1NpSx.js";
11
+ import { n as renderIconHtml } from "../../chunks/render-Bnzcxfss.js";
12
+ import "../../chunks/pk-field-V7JOy26T.js";
13
+ import "../../chunks/pk-dialog-C6aaPokv.js";
14
+ import "../../chunks/pk-dropdown-item-D8RrwjxL.js";
15
+ import "../../chunks/pk-dropdown-label-Cg32UgRe.js";
16
+ import "../../chunks/pk-dropdown-menu-CAHCltlX.js";
16
17
  import "../dropdown-menu/dropdown-separator.js";
17
- import "../../chunks/pk-tooltip-BS2dNLOS.js";
18
+ import "../../chunks/pk-tooltip-Dd_Q0Bn5.js";
18
19
  //#region src/components/tiptap/tiptap-editor-host.ts
19
20
  function serializeTiptapDocumentContent(content) {
20
21
  return JSON.stringify(normalizeContentArray(content));
@@ -117,6 +118,7 @@ var TOOLBAR_ICONS = {
117
118
  strikethrough: renderIconHtml(strikethrough),
118
119
  subscript: renderIconHtml(subscript),
119
120
  superscript: renderIconHtml(superscript),
121
+ "small-caps": renderIconHtml(smallCaps),
120
122
  code: renderIconHtml(bracketsCurly),
121
123
  "code-block": renderIconHtml(code),
122
124
  highlight: renderIconHtml(highlighter),
@@ -150,6 +152,11 @@ var TOOLBAR_LABELS = {
150
152
  strikethrough: "Strikethrough",
151
153
  subscript: "Subscript",
152
154
  superscript: "Superscript",
155
+ "small-caps": "Small caps",
156
+ "font-family": "Font family",
157
+ "font-size": "Font size",
158
+ "text-color": "Text and background color",
159
+ "line-height": "Line height",
153
160
  code: "Inline code",
154
161
  "code-block": "Code block",
155
162
  highlight: "Highlight",
@@ -176,11 +183,15 @@ var TOOLBAR_LABELS = {
176
183
  redo: "Redo"
177
184
  };
178
185
  function getToolbarMenuItemLabel(buttonName) {
179
- return TOOLBAR_LABELS[buttonName] ?? buttonName;
186
+ return TOOLBAR_LABELS[buttonName] ?? getRegisteredTiptapToolbarControl(buttonName)?.label ?? buttonName;
187
+ }
188
+ function getToolbarButtonIcon(buttonName) {
189
+ const registeredIcon = getRegisteredTiptapToolbarControl(buttonName)?.icon;
190
+ return TOOLBAR_ICONS[buttonName] ?? (registeredIcon ? renderIconHtml(registeredIcon) : void 0);
180
191
  }
181
192
  /** Prefix icon for `pk-dropdown-item` — SVG must carry `slot="prefix"` directly. */
182
193
  function createToolbarPrefixIcon(buttonName) {
183
- const iconHtml = TOOLBAR_ICONS[buttonName];
194
+ const iconHtml = getToolbarButtonIcon(buttonName);
184
195
  if (!iconHtml) return null;
185
196
  const template = document.createElement("template");
186
197
  template.innerHTML = iconHtml.trim();
@@ -311,6 +322,136 @@ var pkTiptapEditorStyles = i`
311
322
  letter-spacing: 0.02em;
312
323
  }
313
324
 
325
+ .toolbar-btn--text-style {
326
+ max-width: 9rem;
327
+ padding-inline: 0.5rem;
328
+ }
329
+
330
+ .toolbar-btn__text-style-value {
331
+ overflow: hidden;
332
+ font-size: var(--pk-font-size-xs);
333
+ line-height: 1;
334
+ text-overflow: ellipsis;
335
+ white-space: nowrap;
336
+ }
337
+
338
+ .toolbar-btn--color .toolbar-btn__text-style-value {
339
+ min-width: 1rem;
340
+ border-bottom: 2px solid var(--text-style-trigger-color, currentColor);
341
+ color: var(--text-style-trigger-color, currentColor);
342
+ font-weight: 700;
343
+ text-align: center;
344
+ }
345
+
346
+ pk-dropdown-menu.text-style-palette::part(panel) {
347
+ display: grid;
348
+ grid-template-columns: repeat(5, 2rem);
349
+ gap: 0.625rem 0.75rem;
350
+ width: max-content;
351
+ min-width: 0;
352
+ padding: 1rem;
353
+ }
354
+
355
+ .text-style-palette__label {
356
+ grid-column: 1 / -1;
357
+ color: var(--pk-color-gray-900);
358
+ }
359
+
360
+ .text-style-palette__label::part(label) {
361
+ padding: 0 0 0.125rem;
362
+ font-size: var(--pk-font-size-base);
363
+ font-weight: 600;
364
+ }
365
+
366
+ .text-style-palette__label--highlight {
367
+ margin-top: 0.375rem;
368
+ }
369
+
370
+ .text-style-palette__option {
371
+ width: 2rem;
372
+ height: 2rem;
373
+ --pk-dropdown-item-gap: 0;
374
+ --pk-dropdown-item-icon-size: 1.625rem;
375
+ }
376
+
377
+ .text-style-palette__option::part(item) {
378
+ justify-content: center;
379
+ width: 2rem;
380
+ height: 2rem;
381
+ min-height: 0;
382
+ padding: 0;
383
+ border-radius: 50%;
384
+ background: transparent;
385
+ }
386
+
387
+ .text-style-palette__option:hover::part(item),
388
+ .text-style-palette__option:focus-within::part(item),
389
+ .text-style-palette__option[data-highlighted]::part(item),
390
+ .text-style-palette__option[checked]::part(item) {
391
+ background: transparent;
392
+ }
393
+
394
+ .text-style-palette__option::part(prefix) {
395
+ width: 1.625rem;
396
+ height: 1.625rem;
397
+ }
398
+
399
+ .text-style-palette__option::part(label) {
400
+ position: absolute;
401
+ }
402
+
403
+ .text-style-palette__option::part(check) {
404
+ display: none;
405
+ }
406
+
407
+ .text-style-palette__swatch {
408
+ display: inline-flex;
409
+ align-items: center;
410
+ justify-content: center;
411
+ width: 1.625rem;
412
+ height: 1.625rem;
413
+ box-sizing: border-box;
414
+ border: 1px solid rgba(15, 23, 42, 0.16);
415
+ border-radius: 50%;
416
+ }
417
+
418
+ /* Keep the state treatment concentric with the slotted swatch. The
419
+ dropdown item's shadow button is wider than its prefix in some hosts. */
420
+ .text-style-palette__option:hover .text-style-palette__swatch,
421
+ .text-style-palette__option:focus-within .text-style-palette__swatch,
422
+ .text-style-palette__option[data-highlighted] .text-style-palette__swatch,
423
+ .text-style-palette__option[checked] .text-style-palette__swatch {
424
+ box-shadow: 0 0 0 0.25rem var(--pk-color-slate-100);
425
+ }
426
+
427
+ .text-style-palette__swatch--text {
428
+ border-color: var(--text-style-swatch, rgba(15, 23, 42, 0.35));
429
+ color: var(--text-style-swatch, #1f2937);
430
+ font-size: var(--pk-font-size-base);
431
+ font-weight: 500;
432
+ line-height: 1;
433
+ }
434
+
435
+ .text-style-palette__swatch--highlight {
436
+ background: var(--text-style-swatch, #fff);
437
+ }
438
+
439
+ .text-style-palette__accessible-label {
440
+ position: absolute;
441
+ width: 1px;
442
+ height: 1px;
443
+ padding: 0;
444
+ margin: -1px;
445
+ overflow: hidden;
446
+ clip: rect(0, 0, 0, 0);
447
+ white-space: nowrap;
448
+ border: 0;
449
+ }
450
+
451
+ .text-style-palette pk-tooltip {
452
+ display: contents;
453
+ }
454
+
314
455
  /* Full toolbar replace (slot=toolbar on host when hasCustomToolbar). */
315
456
  .toolbar ::slotted([slot='toolbar']) {
316
457
  display: contents;
@@ -445,6 +586,7 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
445
586
  this._value = null;
446
587
  this.buttons = "bold,italic";
447
588
  this.toolbar = null;
589
+ this.textStyleOptions = null;
448
590
  this.linkOptions = null;
449
591
  this.rows = 4;
450
592
  this.placeholder = "";
@@ -621,6 +763,7 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
621
763
  });
622
764
  queueMicrotask(() => {
623
765
  this.attachSelectionListeners();
766
+ this.requestUpdate();
624
767
  });
625
768
  }
626
769
  attachSelectionListeners() {
@@ -837,7 +980,7 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
837
980
  return id;
838
981
  }
839
982
  getToolbarButtonLabel(buttonName) {
840
- return TOOLBAR_LABELS[buttonName] ?? buttonName;
983
+ return TOOLBAR_LABELS[buttonName] ?? getRegisteredTiptapToolbarControl(buttonName)?.label ?? buttonName;
841
984
  }
842
985
  renderToolbarTooltip(buttonId, label) {
843
986
  if (!this.toolbarTooltips) return A;
@@ -847,7 +990,9 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
847
990
  }
848
991
  renderToolbarButton(buttonName) {
849
992
  const editor = this.host.editor;
850
- const icon = TOOLBAR_ICONS[buttonName];
993
+ const registered = getRegisteredTiptapToolbarControl(buttonName);
994
+ if (registered?.isVisible && (!editor || !registered.isVisible(editor))) return A;
995
+ const icon = getToolbarButtonIcon(buttonName);
851
996
  const label = this.getToolbarButtonLabel(buttonName);
852
997
  const buttonId = this.getToolbarButtonId(buttonName);
853
998
  const active = editor ? isTiptapButtonActive(editor, buttonName) : false;
@@ -868,6 +1013,152 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
868
1013
  </div>
869
1014
  `;
870
1015
  }
1016
+ get textStyleToolbarConfig() {
1017
+ return resolveTiptapTextStyleToolbarConfig(this.textStyleOptions);
1018
+ }
1019
+ getTextStyleValue(attribute) {
1020
+ const value = this.host.editor?.getAttributes("textStyle")[attribute];
1021
+ return typeof value === "string" && value ? value : null;
1022
+ }
1023
+ setTextStyleValue(attribute, value) {
1024
+ const editor = this.host.editor;
1025
+ if (!editor) return;
1026
+ const chain = editor.chain().focus();
1027
+ switch (attribute) {
1028
+ case "fontFamily":
1029
+ value ? chain.setFontFamily(value).run() : chain.unsetFontFamily().run();
1030
+ break;
1031
+ case "fontSize":
1032
+ value ? chain.setFontSize(value).run() : chain.unsetFontSize().run();
1033
+ break;
1034
+ case "color":
1035
+ value ? chain.setColor(value).run() : chain.unsetColor().run();
1036
+ break;
1037
+ case "backgroundColor":
1038
+ value ? chain.setBackgroundColor(value).run() : chain.unsetBackgroundColor().run();
1039
+ break;
1040
+ case "lineHeight":
1041
+ value ? chain.setLineHeight(value).run() : chain.unsetLineHeight().run();
1042
+ break;
1043
+ }
1044
+ }
1045
+ getTextStyleOptionLabel(options, value) {
1046
+ return options.find((option) => option.value === value)?.label ?? options.find((option) => option.value === null)?.label ?? "Default";
1047
+ }
1048
+ renderTextStyleOptions(attribute, options) {
1049
+ const currentValue = this.getTextStyleValue(attribute);
1050
+ return options.map((option) => b`
1051
+ <pk-dropdown-item
1052
+ type="radio"
1053
+ radio-group=${attribute}
1054
+ value=${option.value ?? ""}
1055
+ ?checked=${option.value === currentValue}
1056
+ @click=${() => this.setTextStyleValue(attribute, option.value)}
1057
+ >
1058
+ ${option.label}
1059
+ </pk-dropdown-item>
1060
+ `);
1061
+ }
1062
+ renderTextStylePaletteOptions(attribute, options, idPrefix) {
1063
+ const currentValue = this.getTextStyleValue(attribute);
1064
+ const isTextColor = attribute === "color";
1065
+ return options.map((option, index) => {
1066
+ const optionId = `${idPrefix}-${attribute}-${index}`;
1067
+ const accessibleLabel = option.value ? `${option.label} ${isTextColor ? "text" : "highlight"}` : isTextColor ? "Default text color" : "No highlight";
1068
+ return b`
1069
+ <pk-dropdown-item
1070
+ id=${optionId}
1071
+ class="text-style-palette__option"
1072
+ type="radio"
1073
+ radio-group=${attribute}
1074
+ value=${option.value ?? ""}
1075
+ ?checked=${option.value === currentValue}
1076
+ @click=${() => this.setTextStyleValue(attribute, option.value)}
1077
+ >
1078
+ <span
1079
+ slot="start"
1080
+ class="text-style-palette__swatch ${isTextColor ? "text-style-palette__swatch--text" : "text-style-palette__swatch--highlight"}"
1081
+ style=${option.value ? `--text-style-swatch:${option.value}` : ""}
1082
+ data-empty=${option.value === null ? "" : A}
1083
+ aria-hidden="true"
1084
+ >${isTextColor ? "A" : A}</span>
1085
+ <span class="text-style-palette__accessible-label">${accessibleLabel}</span>
1086
+ </pk-dropdown-item>
1087
+ ${this.toolbarTooltips ? b`
1088
+ <pk-tooltip for=${optionId} content=${accessibleLabel} placement="top"></pk-tooltip>
1089
+ ` : A}
1090
+ `;
1091
+ });
1092
+ }
1093
+ handleTextStylePaletteKeyDown(event) {
1094
+ const delta = {
1095
+ ArrowLeft: -1,
1096
+ ArrowRight: 1,
1097
+ ArrowUp: -5,
1098
+ ArrowDown: 5
1099
+ }[event.key];
1100
+ if (!delta) return;
1101
+ const menu = event.currentTarget;
1102
+ const item = event.composedPath().find((node) => node instanceof HTMLElement && node.localName === "pk-dropdown-item" && node.classList.contains("text-style-palette__option"));
1103
+ const items = menu.getItems().filter((candidate) => candidate.classList.contains("text-style-palette__option"));
1104
+ const index = item ? items.indexOf(item) : -1;
1105
+ if (index === -1) return;
1106
+ const target = items[Math.max(0, Math.min(index + delta, items.length - 1))];
1107
+ event.preventDefault();
1108
+ event.stopPropagation();
1109
+ target?.focusControl();
1110
+ }
1111
+ renderTextStyleToolbar(buttonName) {
1112
+ const config = this.textStyleToolbarConfig;
1113
+ const buttonId = this.getToolbarButtonId(buttonName);
1114
+ const triggerColor = buttonName === "text-color" ? this.getTextStyleValue("color") : null;
1115
+ let triggerLabel = "";
1116
+ let menuContent = A;
1117
+ if (buttonName === "font-family") {
1118
+ triggerLabel = this.getTextStyleOptionLabel(config.fontFamilies, this.getTextStyleValue("fontFamily"));
1119
+ menuContent = b`${this.renderTextStyleOptions("fontFamily", config.fontFamilies)}`;
1120
+ } else if (buttonName === "font-size") {
1121
+ triggerLabel = this.getTextStyleOptionLabel(config.fontSizes, this.getTextStyleValue("fontSize"));
1122
+ menuContent = b`${this.renderTextStyleOptions("fontSize", config.fontSizes)}`;
1123
+ } else if (buttonName === "line-height") {
1124
+ triggerLabel = this.getTextStyleOptionLabel(config.lineHeights, this.getTextStyleValue("lineHeight"));
1125
+ menuContent = b`${this.renderTextStyleOptions("lineHeight", config.lineHeights)}`;
1126
+ } else {
1127
+ triggerLabel = "A";
1128
+ menuContent = b`
1129
+ <pk-dropdown-label class="text-style-palette__label">Text color</pk-dropdown-label>
1130
+ ${this.renderTextStylePaletteOptions("color", config.textColors, buttonId)}
1131
+ <pk-dropdown-label class="text-style-palette__label text-style-palette__label--highlight">Highlight color</pk-dropdown-label>
1132
+ ${this.renderTextStylePaletteOptions("backgroundColor", config.backgroundColors, buttonId)}
1133
+ `;
1134
+ }
1135
+ const label = this.getToolbarButtonLabel(buttonName);
1136
+ return b`
1137
+ <div class="toolbar-item">
1138
+ <button
1139
+ id=${buttonId}
1140
+ type="button"
1141
+ class="toolbar-btn toolbar-btn--menu toolbar-btn--text-style ${buttonName === "text-color" ? "toolbar-btn--color" : ""}"
1142
+ aria-label=${label}
1143
+ aria-haspopup="menu"
1144
+ ?disabled=${this.disabled || this.readonly}
1145
+ style=${triggerColor ? `--text-style-trigger-color:${triggerColor}` : ""}
1146
+ >
1147
+ <span class="toolbar-btn__text-style-value">${triggerLabel}</span>
1148
+ <span class="toolbar-btn__chevron">${o(TOOLBAR_CHEVRON_HTML)}</span>
1149
+ </button>
1150
+ ${this.renderToolbarTooltip(buttonId, label)}
1151
+ <pk-dropdown-menu
1152
+ for=${buttonId}
1153
+ placement="bottom-start"
1154
+ class=${buttonName === "text-color" ? "text-style-palette" : ""}
1155
+ @keydown=${buttonName === "text-color" ? this.handleTextStylePaletteKeyDown : A}
1156
+ >
1157
+ ${menuContent}
1158
+ </pk-dropdown-menu>
1159
+ </div>
1160
+ `;
1161
+ }
871
1162
  handleCraftLink(config) {
872
1163
  const editor = this.host.editor;
873
1164
  if (!editor) return;
@@ -897,7 +1188,7 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
897
1188
  return b`<span class="toolbar-separator" aria-hidden="true"></span>`;
898
1189
  }
899
1190
  renderGroupTriggerContent(group, triggerLabel, iconName) {
900
- const icon = TOOLBAR_ICONS[iconName];
1191
+ const icon = getToolbarButtonIcon(iconName);
901
1192
  if (Boolean(group.label) && triggerLabel) return b`
902
1193
  <span class="toolbar-btn__trigger-label">${triggerLabel}</span>
903
1194
  <span class="toolbar-btn__chevron">${o(TOOLBAR_CHEVRON_HTML)}</span>
@@ -916,7 +1207,12 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
916
1207
  isActive: false,
917
1208
  icon: group.icon ?? getToolbarGroupDefaultIcon(group)
918
1209
  };
919
- const menuItems = getToolbarGroupMenuItems(group);
1210
+ const menuItems = getToolbarGroupMenuItems(group).filter((entry) => {
1211
+ if (entry.type === "separator") return true;
1212
+ const control = getRegisteredTiptapToolbarControl(entry.name);
1213
+ return !control?.isVisible || Boolean(editor && control.isVisible(editor));
1214
+ });
1215
+ if (!menuItems.some((entry) => entry.type === "item")) return A;
920
1216
  const tooltipLabel = group.label ?? (isHeadingsOnlyToolbarPreset(group.preset) ? "Headings" : isFormattingToolbarPreset(group.preset) ? "Formatting" : group.preset === "lists" ? "Lists" : group.preset === "align" ? "Alignment" : "More");
921
1217
  return b`
922
1218
  <div class="toolbar-item">
@@ -958,6 +1254,12 @@ var PkTiptapEditor = class PkTiptapEditor extends PkFormAssociatedElement {
958
1254
  if (node.type === "separator") return this.renderToolbarSeparator();
959
1255
  if (node.type === "group") return this.renderToolbarGroup(node.group, `group-${index}`);
960
1256
  if (node.name === "link") return this.renderLinkToolbarButton();
1257
+ if ([
1258
+ "font-family",
1259
+ "font-size",
1260
+ "text-color",
1261
+ "line-height"
1262
+ ].includes(node.name)) return this.renderTextStyleToolbar(node.name);
961
1263
  return this.renderToolbarButton(node.name);
962
1264
  }
963
1265
  renderDefaultToolbar() {
@@ -1051,6 +1353,20 @@ __decorate([n({
1051
1353
  }
1052
1354
  }
1053
1355
  })], PkTiptapEditor.prototype, "toolbar", void 0);
1356
+ __decorate([n({
1357
+ attribute: "text-style-options",
1358
+ converter: {
1359
+ fromAttribute: (value) => {
1360
+ if (!value) return null;
1361
+ try {
1362
+ return JSON.parse(value);
1363
+ } catch {
1364
+ return null;
1365
+ }
1366
+ },
1367
+ toAttribute: (value) => value ? JSON.stringify(value) : null
1368
+ }
1369
+ })], PkTiptapEditor.prototype, "textStyleOptions", void 0);
1054
1370
  __decorate([n({ attribute: "link-options" })], PkTiptapEditor.prototype, "linkOptions", void 0);
1055
1371
  __decorate([n({ attribute: "link-selector-storage-key-prefix" })], PkTiptapEditor.prototype, "linkSelectorStorageKeyPrefix", void 0);
1056
1372
  __decorate([n({ type: Number })], PkTiptapEditor.prototype, "rows", void 0);
@@ -1,8 +1,8 @@
1
1
  import { c as r, l as n, m as i, p as b, s as e, u as customElement } from "../../chunks/lit-DpLik9Rf.js";
2
2
  import { c as __decorate, i as PkFormAssociatedElement, n as formControlStyles } from "../../chunks/pk-base-CyzwylQ7.js";
3
3
  import { t as MirrorValidator } from "../../chunks/mirror-validator-C5XrXPaq.js";
4
- import { k as Editor } from "../../chunks/tiptap-Db7MTUH1.js";
5
- import { C as contentToValue, E as valueToContent, T as flattenVariableOptions, i as createVariableTagDomNodeView, j as createTiptapInputExtensions, n as tiptapInputProseMirrorStyles, w as dedupeVariableOptions } from "../../chunks/tiptap.styles-BFGP4eTV.js";
4
+ import { A as Editor } from "../../chunks/tiptap-CgXkiK8d.js";
5
+ import { C as contentToValue, E as valueToContent, M as createTiptapInputExtensions, T as flattenVariableOptions, i as createVariableTagDomNodeView, n as tiptapInputProseMirrorStyles, w as dedupeVariableOptions } from "../../chunks/tiptap.styles-C0E1NpSx.js";
6
6
  //#region src/components/tiptap/pk-tiptap-input.styles.ts
7
7
  var pkTiptapInputStyles = i`
8
8
  @layer pk-component {
@@ -1,2 +1,2 @@
1
- import { t as PkTooltip } from "../../chunks/pk-tooltip-BS2dNLOS.js";
1
+ import { t as PkTooltip } from "../../chunks/pk-tooltip-Dd_Q0Bn5.js";
2
2
  export { PkTooltip };
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@verbb/plugin-kit-web",
3
- "version": "2.0.16",
3
+ "version": "2.0.17",
4
+ "repository": {
5
+ "url": "git+https://github.com/verbb/plugin-kit.git"
6
+ },
4
7
  "description": "Plugin Kit web components (shadow DOM, Craft design system)",
5
8
  "type": "module",
6
9
  "types": "dist/index.d.ts",
@@ -1024,18 +1027,18 @@
1024
1027
  },
1025
1028
  "peerDependencies": {
1026
1029
  "@floating-ui/dom": "^1.7.3",
1027
- "@verbb/plugin-kit-core": "^2.0.16",
1028
- "@verbb/plugin-kit-icons": "^2.0.16",
1030
+ "@verbb/plugin-kit-core": "^2.0.17",
1031
+ "@verbb/plugin-kit-icons": "^2.0.17",
1029
1032
  "lit": "^3.3.0"
1030
1033
  },
1031
1034
  "license": "MIT",
1032
1035
  "dependencies": {
1033
1036
  "@floating-ui/dom": "^1.7.3",
1034
- "@tiptap/core": "^3.22.4",
1035
- "@verbb/plugin-kit-codemirror-core": "2.0.16",
1036
- "@verbb/plugin-kit-core": "^2.0.16",
1037
- "@verbb/plugin-kit-icons": "^2.0.16",
1038
- "@verbb/plugin-kit-tiptap-core": "^2.0.16",
1037
+ "@tiptap/core": "3.22.4",
1038
+ "@verbb/plugin-kit-codemirror-core": "2.0.17",
1039
+ "@verbb/plugin-kit-core": "^2.0.17",
1040
+ "@verbb/plugin-kit-icons": "^2.0.17",
1041
+ "@verbb/plugin-kit-tiptap-core": "^2.0.17",
1039
1042
  "composed-offset-position": "^0.0.6",
1040
1043
  "lit": "^3.3.0"
1041
1044
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"pk-dropdown-item-BZQS87U0.js","names":[],"sources":["../../src/components/dropdown-menu/dropdown-menu-size.styles.ts","../../src/components/dropdown-menu/pk-dropdown-item.styles.ts","../../src/components/dropdown-menu/pk-dropdown-item.ts"],"sourcesContent":["import { css } from 'lit';\n\nconst dropdownMenuSizeTokens = {\n default: css`\n --pk-dropdown-item-padding-block: 8px;\n --pk-dropdown-item-padding-inline: 12px;\n --pk-dropdown-item-gap: 0.625rem;\n --pk-dropdown-item-font-size: var(--pk-font-size-base);\n --pk-dropdown-item-line-height: 1.5;\n --pk-dropdown-item-icon-size: 12px;\n --pk-dropdown-label-padding-inline: 12px;\n --pk-dropdown-label-font-size: 13px;\n --pk-dropdown-details-font-size: var(--pk-font-size-sm);\n `,\n xs: css`\n --pk-dropdown-item-padding-block: 3px;\n --pk-dropdown-item-padding-inline: 8px;\n --pk-dropdown-item-gap: 0.375rem;\n --pk-dropdown-item-font-size: 12px;\n --pk-dropdown-item-line-height: 1.5;\n --pk-dropdown-item-icon-size: 10px;\n --pk-dropdown-label-padding-inline: 8px;\n --pk-dropdown-label-font-size: 11px;\n --pk-dropdown-details-font-size: 11px;\n `,\n sm: css`\n --pk-dropdown-item-padding-block: 4px;\n --pk-dropdown-item-padding-inline: 10px;\n --pk-dropdown-item-gap: 0.4375rem;\n --pk-dropdown-item-font-size: 13px;\n --pk-dropdown-item-line-height: 1.5;\n --pk-dropdown-item-icon-size: 12px;\n --pk-dropdown-label-padding-inline: 10px;\n --pk-dropdown-label-font-size: 11px;\n --pk-dropdown-details-font-size: 12px;\n `,\n lg: css`\n --pk-dropdown-item-padding-block: 10px;\n --pk-dropdown-item-padding-inline: 14px;\n --pk-dropdown-item-gap: 0.75rem;\n --pk-dropdown-item-font-size: 16px;\n --pk-dropdown-item-line-height: 1.5;\n --pk-dropdown-item-icon-size: 14px;\n --pk-dropdown-label-padding-inline: 14px;\n --pk-dropdown-label-font-size: 14px;\n --pk-dropdown-details-font-size: var(--pk-font-size-sm);\n `,\n xl: css`\n --pk-dropdown-item-padding-block: 12px;\n --pk-dropdown-item-padding-inline: 16px;\n --pk-dropdown-item-gap: 0.75rem;\n --pk-dropdown-item-font-size: 18px;\n --pk-dropdown-item-line-height: 1.5;\n --pk-dropdown-item-icon-size: 16px;\n --pk-dropdown-label-padding-inline: 16px;\n --pk-dropdown-label-font-size: 15px;\n --pk-dropdown-details-font-size: var(--pk-font-size-base);\n `,\n} as const;\n\n/** Size tokens on `pk-dropdown-menu` — cascades to light-DOM menu children. */\nexport const dropdownMenuHostSizeStyles = css`\n @layer pk-component {\n :host {\n ${dropdownMenuSizeTokens.default}\n }\n\n :host([size='xs']) {\n ${dropdownMenuSizeTokens.xs}\n }\n\n :host([size='sm']) {\n ${dropdownMenuSizeTokens.sm}\n }\n\n :host([size='lg']) {\n ${dropdownMenuSizeTokens.lg}\n }\n\n :host([size='xl']) {\n ${dropdownMenuSizeTokens.xl}\n }\n }\n`;\n\n/**\n * Size tokens on popup panels.\n * Do not include bare `:host` here; importing this in `pk-dropdown-item`\n * would reset every item back to the default size.\n */\nexport const dropdownMenuPanelSizeStyles = css`\n @layer pk-component {\n .panel[data-size='default'],\n .submenu-panel[data-size='default'] {\n ${dropdownMenuSizeTokens.default}\n }\n\n .panel[data-size='xs'],\n .submenu-panel[data-size='xs'] {\n ${dropdownMenuSizeTokens.xs}\n }\n\n .panel[data-size='sm'],\n .submenu-panel[data-size='sm'] {\n ${dropdownMenuSizeTokens.sm}\n }\n\n .panel[data-size='lg'],\n .submenu-panel[data-size='lg'] {\n ${dropdownMenuSizeTokens.lg}\n }\n\n .panel[data-size='xl'],\n .submenu-panel[data-size='xl'] {\n ${dropdownMenuSizeTokens.xl}\n }\n }\n`;\n\n/** @deprecated Use dropdownMenuHostSizeStyles + dropdownMenuPanelSizeStyles. */\nexport const dropdownMenuSizeStyles = css`\n ${dropdownMenuHostSizeStyles}\n ${dropdownMenuPanelSizeStyles}\n`;\n","import { css } from 'lit';\n\nimport { popupContentAnimationStyles } from '../../styles/popup-content-animation.styles.js';\nimport { dropdownMenuPanelSizeStyles } from './dropdown-menu-size.styles.js';\n\nexport const pkDropdownItemStyles = [\n popupContentAnimationStyles,\n dropdownMenuPanelSizeStyles,\n css`\n @layer pk-component {\n :host {\n display: block;\n position: relative;\n /*\n * Slotted label text inherits from this host (light DOM), not from\n * shadow .item — pin size-token metrics so Craft CP / Tailwind /\n * bare hosts all get the same item rhythm.\n */\n font-size: var(--pk-dropdown-item-font-size, var(--pk-font-size-base));\n line-height: var(--pk-dropdown-item-line-height, 1.5);\n color: var(--text-color, var(--pk-color-gray-700));\n }\n\n .item {\n display: flex;\n align-items: center;\n gap: var(--pk-dropdown-item-gap, 0.625rem);\n width: 100%;\n margin: 0;\n padding: var(--pk-dropdown-item-padding-block, 8px) var(--pk-dropdown-item-padding-inline, 12px);\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: var(--pk-dropdown-item-font-size, var(--pk-font-size-base));\n /* Explicit — do not let font:inherit re-leak page line-height. */\n line-height: var(--pk-dropdown-item-line-height, 1.5);\n font-weight: normal;\n text-align: left;\n white-space: nowrap;\n cursor: default;\n user-select: none;\n outline: none;\n box-sizing: border-box;\n }\n\n .item:hover:not([disabled]):not([aria-disabled='true']),\n :host([data-highlighted]) .item,\n :host([submenu-open]) .item {\n background: var(--pk-color-slate-100);\n }\n\n .item:focus-visible {\n background: var(--pk-color-slate-100);\n }\n\n .item[aria-disabled='true'] {\n pointer-events: none;\n opacity: 0.5;\n }\n\n .label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .prefix {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--pk-dropdown-item-icon-size, 12px);\n height: var(--pk-dropdown-item-icon-size, 12px);\n line-height: 0;\n }\n\n .prefix--empty {\n display: none;\n }\n\n .prefix ::slotted(*) {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--pk-dropdown-item-icon-size, 12px);\n height: var(--pk-dropdown-item-icon-size, 12px);\n /* Kill pk-icon text-baseline nudge inside the padded flex row. */\n vertical-align: 0;\n }\n\n .prefix ::slotted(svg),\n .prefix ::slotted(*) svg,\n .prefix ::slotted(.pk-dropdown-item__prefix-icon) {\n display: block;\n width: var(--pk-dropdown-item-icon-size, 12px) !important;\n height: var(--pk-dropdown-item-icon-size, 12px) !important;\n max-width: var(--pk-dropdown-item-icon-size, 12px);\n max-height: var(--pk-dropdown-item-icon-size, 12px);\n flex-shrink: 0;\n pointer-events: none;\n }\n\n .details {\n margin-left: auto;\n color: var(--pk-color-gray-500);\n font-size: var(--pk-dropdown-details-font-size, var(--pk-font-size-sm));\n letter-spacing: 0.04em;\n }\n\n .details:empty {\n display: none;\n }\n\n .check {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n color: var(--pk-color-gray-700);\n }\n\n .check svg {\n display: block;\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n pointer-events: none;\n }\n\n .submenu-icon {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 1rem;\n color: var(--pk-color-gray-700);\n }\n\n .submenu-icon svg {\n display: block;\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n pointer-events: none;\n }\n\n .check {\n opacity: 0;\n }\n\n :host([checked]) .check {\n opacity: 1;\n }\n\n :host([type='checkbox']) .check,\n :host([type='radio']) .check {\n margin-left: auto;\n }\n\n :host([type='checkbox'][checked]) .check,\n :host([type='radio'][checked]) .check {\n opacity: 1;\n }\n\n .submenu-icon:empty {\n display: none;\n }\n\n :host([destructive]) .item {\n color: var(--pk-color-error);\n }\n\n :host([destructive]) .item:hover:not([disabled]):not([aria-disabled='true']),\n :host([destructive]) .item:focus-visible {\n color: var(--pk-color-error);\n }\n\n .submenu-panel {\n width: max-content;\n min-width: 8rem;\n overflow: hidden;\n padding: 4px 0;\n border-radius: var(--pk-radius-md);\n background: var(--pk-color-white);\n box-shadow: var(--pk-shadow-popup);\n /* Match root menu panel — Craft body text, not gray-900. */\n color: var(--text-color, var(--pk-color-gray-700));\n }\n\n .submenu-panel ::slotted(pk-dropdown-item),\n .submenu-panel ::slotted(pk-dropdown-separator),\n .submenu-panel ::slotted(pk-dropdown-label) {\n display: block;\n }\n\n .submenu-panel[hidden] {\n display: none !important;\n }\n }\n`,\n];\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from '../../decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { check, chevronRight } from '@verbb/plugin-kit-icons';\n\nimport { PkElement } from '../../base/pk-element.js';\nimport { HasSlotController } from '../../internal/has-slot.js';\nimport { renderIconHtml } from '../../icons/render.js';\nimport {\n syncPopupPlacementAnimation,\n waitForPopupReposition,\n} from '../../utils/popup-placement-animation.js';\nimport { pkDropdownItemStyles } from './pk-dropdown-item.styles.js';\n\nconst CHECK_ICON = renderIconHtml(check);\nconst SUBMENU_ICON = renderIconHtml(chevronRight);\n\nexport type PkDropdownItemType = 'normal' | 'checkbox' | 'radio';\n\ntype PkDropdownMenuSize = 'xs' | 'sm' | 'default' | 'lg' | 'xl';\n\n/**\n * Dropdown menu item — use inside `pk-dropdown-menu`.\n *\n * @slot - Item label\n * @slot start - Leading icon (preferred; matches pk-button)\n * @slot prefix - Alias for `start` (legacy)\n * @slot details - Trailing shortcut text\n * @slot submenu - Nested menu items (`pk-dropdown-item`, separators, labels)\n *\n * @csspart item - Menu item button\n * @csspart prefix - Leading icon wrapper (hidden when empty)\n */\n@customElement('pk-dropdown-item')\nexport class PkDropdownItem extends PkElement {\n static override styles = pkDropdownItemStyles;\n\n @property()\n value = '';\n\n @property({ reflect: true })\n type: PkDropdownItemType = 'normal';\n\n @property({ attribute: 'radio-group' })\n radioGroup = '';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n destructive = false;\n\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n @property({ attribute: 'submenu-open', type: Boolean, reflect: true })\n submenuOpen = false;\n\n /**\n * Roving highlight index for keyboard nav (`active`).\n * Visual chrome uses `:focus-visible` / hover — not this flag — so mouse-open\n * does not paint the first item selected (initial open).\n */\n @property({ type: Boolean })\n active = false;\n\n @state()\n private submenuAnimated = false;\n\n @query('.submenu-panel')\n private submenuPanelElement!: HTMLDivElement;\n\n @query('pk-popup')\n private submenuPopupElement!: HTMLElement;\n\n private readonly hasSlotController = new HasSlotController(this, 'submenu', 'details', 'start', 'prefix');\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncRole();\n this.syncSubmenuAria();\n this.addEventListener('click', this.handleHostClick);\n // Bind mouseenter on the host — covers the whole row, not just the button.\n this.addEventListener('mouseenter', this.handleMouseEnter);\n }\n\n override disconnectedCallback(): void {\n this.removeEventListener('click', this.handleHostClick);\n this.removeEventListener('mouseenter', this.handleMouseEnter);\n this.closeSubmenu();\n super.disconnectedCallback();\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('type') || changed.has('checked')) {\n this.syncRole();\n }\n\n if (changed.has('submenuOpen') || changed.size === 0) {\n this.syncSubmenuAria();\n }\n\n // Keyboard / external callers set `submenuOpen`; mouse path goes through openSubmenu().\n if (changed.has('submenuOpen')) {\n if (this.submenuOpen) {\n this.ensureSubmenuSurface();\n } else {\n this.submenuAnimated = false;\n }\n }\n }\n\n /** Light-DOM `slot=\"submenu\"` — public for menu keyboard (`hasSubmenu`). */\n hasSubmenu(): boolean {\n return this.hasSlotController.test('submenu');\n }\n\n private syncSubmenuAria(): void {\n const hasSubmenu = this.hasSubmenu();\n\n if (hasSubmenu) {\n this.setAttribute('aria-haspopup', 'menu');\n } else {\n this.removeAttribute('aria-haspopup');\n }\n\n this.setAttribute('aria-expanded', hasSubmenu && this.submenuOpen ? 'true' : 'false');\n }\n\n focusControl(): void {\n this.shadowRoot?.querySelector<HTMLButtonElement>('.item')?.focus({ preventScroll: true });\n }\n\n /** Callers `item.focus()` — route into the shadow control button. */\n override focus(options?: FocusOptions): void {\n const button = this.shadowRoot?.querySelector<HTMLButtonElement>('.item');\n\n if (button) {\n button.focus(options);\n return;\n }\n\n super.focus(options);\n }\n\n /** Public for menu leave-detection (`submenuElement`). */\n get submenuElement(): HTMLDivElement | null {\n return this.submenuPanelElement ?? null;\n }\n\n closeSubmenu(): void {\n this.submenuAnimated = false;\n this.submenuOpen = false;\n }\n\n /**\n * Opens the nested submenu panel (mouse + keyboard).\n * notify parent first so siblings close, then set `submenuOpen`.\n */\n openSubmenu(): void {\n if (!this.hasSubmenu() || this.disabled || !this.isConnected) {\n return;\n }\n\n this.notifyParentOfOpening();\n this.submenuOpen = true;\n }\n\n /** `notifyParentOfOpening` — sibling close + bubble to the menu. */\n private notifyParentOfOpening(): void {\n this.dispatchEvent(new CustomEvent('pk-submenu-open', {\n bubbles: true,\n composed: true,\n detail: { item: this },\n }));\n\n const parent = this.parentElement;\n\n if (!parent) {\n return;\n }\n\n // Same slot + same light-DOM parent = siblings (top-level or nested submenu).\n for (const el of parent.children) {\n if (\n el !== this\n && el instanceof PkDropdownItem\n && el.getAttribute('slot') === this.getAttribute('slot')\n && el.submenuOpen\n ) {\n el.submenuOpen = false;\n }\n }\n }\n\n private ensureSubmenuSurface(): void {\n if (!this.hasSubmenu() || this.disabled) {\n return;\n }\n\n this.submenuAnimated = true;\n\n void this.updateComplete.then(() => {\n if (!this.submenuOpen || !this.submenuPanelElement) {\n return;\n }\n\n this.submenuPanelElement.hidden = false;\n syncPopupPlacementAnimation(this.submenuPanelElement, 'right-start');\n\n void waitForPopupReposition(this.submenuPopupElement, 'right-start').then((placement) => {\n syncPopupPlacementAnimation(this.submenuPanelElement, placement);\n });\n });\n }\n\n private syncRole(): void {\n if (this.type === 'checkbox') {\n this.setAttribute('role', 'menuitemcheckbox');\n this.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n return;\n }\n\n if (this.type === 'radio') {\n this.setAttribute('role', 'menuitemradio');\n this.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n return;\n }\n\n this.setAttribute('role', 'menuitem');\n this.removeAttribute('aria-checked');\n }\n\n /** `handleMouseEnter` — open on hover; siblings close via notify. */\n private handleMouseEnter = (): void => {\n if (!this.hasSubmenu() || this.disabled) {\n return;\n }\n\n this.notifyParentOfOpening();\n this.submenuOpen = true;\n };\n\n /** Host has `role=\"menuitem\"` — block disabled activation; selection is handled by `pk-dropdown-menu`. */\n private handleHostClick = (event: Event): void => {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n\n private handleClick(event: Event): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n\n if (this.hasSubmenu()) {\n event.preventDefault();\n this.openSubmenu();\n }\n }\n\n override render() {\n const hasSubmenu = this.hasSubmenu();\n const showCheck = this.type === 'checkbox' || this.type === 'radio';\n // Prefer start (button parity); prefix kept as legacy alias.\n const hasLeadingIcon = this.hasSlotController.test('start') || this.hasSlotController.test('prefix');\n\n return html`\n <button\n part=\"item\"\n type=\"button\"\n class=\"item\"\n ?disabled=${this.disabled}\n aria-disabled=${this.disabled ? 'true' : nothing}\n @click=${this.handleClick}\n >\n <span\n part=\"prefix\"\n class=${hasLeadingIcon ? 'prefix' : 'prefix prefix--empty'}\n >\n <slot name=\"start\"></slot>\n <slot name=\"prefix\"></slot>\n </span>\n <span class=\"label\"><slot></slot></span>\n <span class=\"details\"><slot name=\"details\"></slot></span>\n ${showCheck ? html`<span class=\"check\" aria-hidden=\"true\">${unsafeSVG(CHECK_ICON)}</span>` : nothing}\n ${hasSubmenu ? html`<span class=\"submenu-icon\" aria-hidden=\"true\">${unsafeSVG(SUBMENU_ICON)}</span>` : nothing}\n </button>\n ${hasSubmenu ? html`\n <pk-popup\n .active=${this.submenuOpen}\n .anchor=${this}\n placement=\"right-start\"\n .distance=${0}\n .skidding=${-4}\n flip\n shift\n hover-bridge\n style=\"--pk-popup-z-index: 1001\"\n >\n <div\n part=\"submenu\"\n class=\"submenu-panel pk-popup-content\"\n role=\"menu\"\n data-size=${resolveMenuSize(this)}\n ?hidden=${!this.submenuOpen}\n data-open=${this.submenuAnimated ? '' : nothing}\n aria-orientation=\"vertical\"\n >\n <slot name=\"submenu\"></slot>\n </div>\n </pk-popup>\n ` : nothing}\n `;\n }\n}\n\nfunction resolveMenuSize(item: PkDropdownItem): PkDropdownMenuSize {\n const panelSize = item.parentElement?.getAttribute('data-size');\n\n if (panelSize === 'xs' || panelSize === 'sm' || panelSize === 'default' || panelSize === 'lg' || panelSize === 'xl') {\n return panelSize;\n }\n\n const menu = item.closest('pk-dropdown-menu');\n const menuSize = menu?.getAttribute('size');\n\n if (menuSize === 'xs' || menuSize === 'sm' || menuSize === 'lg' || menuSize === 'xl') {\n return menuSize;\n }\n\n return 'default';\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'pk-dropdown-item': PkDropdownItem;\n }\n}\n"],"mappings":"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"}