@templatical/editor 0.27.4 → 0.27.5

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 (100) hide show
  1. package/dist/{AiFeatureMenu-DVQrznsN.js → AiFeatureMenu-YE9qqElA.js} +1 -1
  2. package/dist/{BlockPreviewCanvas-D9eC04OA.js → BlockPreviewCanvas-CF7r-mw4.js} +1 -1
  3. package/dist/{CloudHeaderExtras-DX0j3CJ3.js → CloudHeaderExtras-msYo6uhq.js} +4 -4
  4. package/dist/{CollaboratorBar-BZ-JCjdM.js → CollaboratorBar-D1Tx8cds.js} +1 -1
  5. package/dist/{ColorPicker-j0TQu5lE.js → ColorPicker-BNfy9BdG.js} +1 -1
  6. package/dist/{CountdownToolbar-UPdwNvVI.js → CountdownToolbar-D-o_hwsO.js} +3 -3
  7. package/dist/{MergeTagSuggestion-DGha0WRp.js → MergeTagSuggestion-DflUPfkT.js} +2 -2
  8. package/dist/{NumberWithSuffix-D9mPtMJB.js → NumberWithSuffix-DZAktKby.js} +1 -1
  9. package/dist/{ParagraphEditor-C9-jQ5zP.js → ParagraphEditor-CoN76ofC.js} +16 -16
  10. package/dist/{RestoreVersionDialog-Ds6gEF5u.js → RestoreVersionDialog-DUXGp-Nw.js} +2 -2
  11. package/dist/{RichTextEditorContent-CO1se6ln.js → RichTextEditorContent-DxicfnPf.js} +1 -1
  12. package/dist/{SaveBlockDialog-DJIcncsU.js → SaveBlockDialog-D0B9SKf9.js} +13 -13
  13. package/dist/{SavedBlocksBrowserModal-BUhhkGEb.js → SavedBlocksBrowserModal-vdci8i18.js} +5 -5
  14. package/dist/{SavedBlocksPanels-DBfPz4iB.js → SavedBlocksPanels-CTmlYwIT.js} +1 -1
  15. package/dist/{SavedBlocksPickBar-D9NsfzCB.js → SavedBlocksPickBar-DMtV1UKQ.js} +1 -1
  16. package/dist/{TestEmailModal-DARwBqpV.js → TestEmailModal-4pHgNCmg.js} +4 -4
  17. package/dist/{TestEmailPanel-BkgAew1S.js → TestEmailPanel-kp84Z0hs.js} +1 -1
  18. package/dist/{TitleEditor-BWLwZh84.js → TitleEditor-BdRlIm67.js} +6 -6
  19. package/dist/{TplModal-CJLs8as_.js → TplModal-CUV1Sd-2.js} +1 -1
  20. package/dist/{VersionHistoryPanels-s45U7XY-.js → VersionHistoryPanels-dyV9JP5G.js} +1 -1
  21. package/dist/{VersionPreviewBanner-BIy95B34.js → VersionPreviewBanner-Bb1cnMZ3.js} +1 -1
  22. package/dist/{blockTypeIcons-BjUkQsAe.js → blockTypeIcons-B13kXe55.js} +1 -1
  23. package/dist/bundle-stats.json +6 -6
  24. package/dist/cdn/chunks/{AiFeatureMenu-BhtNkpIq.js → AiFeatureMenu-CS62uVuh.js} +2 -2
  25. package/dist/cdn/chunks/{AiFeatureMenu-BhtNkpIq.js.map → AiFeatureMenu-CS62uVuh.js.map} +1 -1
  26. package/dist/cdn/chunks/{BlockPreviewCanvas-Bt7fFzIQ.js → BlockPreviewCanvas-DcCqg909.js} +2 -2
  27. package/dist/cdn/chunks/{BlockPreviewCanvas-Bt7fFzIQ.js.map → BlockPreviewCanvas-DcCqg909.js.map} +1 -1
  28. package/dist/cdn/chunks/{CloudHeaderExtras-CScGpeLl.js → CloudHeaderExtras-d_8bZemh.js} +5 -5
  29. package/dist/cdn/chunks/CloudHeaderExtras-d_8bZemh.js.map +1 -0
  30. package/dist/cdn/chunks/{CollaboratorBar-BH1lM_Ta.js → CollaboratorBar-CpHDWa9D.js} +2 -2
  31. package/dist/cdn/chunks/{CollaboratorBar-BH1lM_Ta.js.map → CollaboratorBar-CpHDWa9D.js.map} +1 -1
  32. package/dist/cdn/chunks/{ColorPicker-d4kY7WWd.js → ColorPicker-QPBbkWAs.js} +2 -2
  33. package/dist/cdn/chunks/{ColorPicker-d4kY7WWd.js.map → ColorPicker-QPBbkWAs.js.map} +1 -1
  34. package/dist/cdn/chunks/{CountdownToolbar-BRDbI1mM.js → CountdownToolbar-CMJVzd97.js} +4 -4
  35. package/dist/cdn/chunks/{CountdownToolbar-BRDbI1mM.js.map → CountdownToolbar-CMJVzd97.js.map} +1 -1
  36. package/dist/cdn/chunks/{MergeTagSuggestion-DhllqTA3.js → MergeTagSuggestion-Df7jcLpS.js} +2 -2
  37. package/dist/cdn/chunks/{MergeTagSuggestion-DhllqTA3.js.map → MergeTagSuggestion-Df7jcLpS.js.map} +1 -1
  38. package/dist/cdn/chunks/{NumberWithSuffix-mm6AfIv4.js → NumberWithSuffix-DNBrbl4H.js} +2 -2
  39. package/dist/cdn/chunks/{NumberWithSuffix-mm6AfIv4.js.map → NumberWithSuffix-DNBrbl4H.js.map} +1 -1
  40. package/dist/cdn/chunks/{ParagraphEditor-BgeeE0Gj.js → ParagraphEditor-CbP_rcqb.js} +17 -17
  41. package/dist/cdn/chunks/{ParagraphEditor-BgeeE0Gj.js.map → ParagraphEditor-CbP_rcqb.js.map} +1 -1
  42. package/dist/cdn/chunks/{RestoreVersionDialog-tfoAQAeP.js → RestoreVersionDialog-DYI-M27i.js} +3 -3
  43. package/dist/cdn/chunks/{RestoreVersionDialog-tfoAQAeP.js.map → RestoreVersionDialog-DYI-M27i.js.map} +1 -1
  44. package/dist/cdn/chunks/{RichTextEditorContent-DvLBtUcW.js → RichTextEditorContent-C-kbbKaq.js} +2 -2
  45. package/dist/cdn/chunks/{RichTextEditorContent-DvLBtUcW.js.map → RichTextEditorContent-C-kbbKaq.js.map} +1 -1
  46. package/dist/cdn/chunks/{SaveBlockDialog-D67K2lHn.js → SaveBlockDialog-BBwDyRpC.js} +14 -14
  47. package/dist/cdn/chunks/{SaveBlockDialog-D67K2lHn.js.map → SaveBlockDialog-BBwDyRpC.js.map} +1 -1
  48. package/dist/cdn/chunks/{SavedBlocksBrowserModal-BxVR-yDt.js → SavedBlocksBrowserModal-B_zqSoWl.js} +5 -5
  49. package/dist/cdn/chunks/{SavedBlocksBrowserModal-BxVR-yDt.js.map → SavedBlocksBrowserModal-B_zqSoWl.js.map} +1 -1
  50. package/dist/cdn/chunks/{SavedBlocksPanels-VkKCO0uY.js → SavedBlocksPanels-B_XNxwzs.js} +2 -2
  51. package/dist/cdn/chunks/{SavedBlocksPanels-VkKCO0uY.js.map → SavedBlocksPanels-B_XNxwzs.js.map} +1 -1
  52. package/dist/cdn/chunks/{SavedBlocksPickBar-BJHQDgUT.js → SavedBlocksPickBar-C3BP5941.js} +2 -2
  53. package/dist/cdn/chunks/{SavedBlocksPickBar-BJHQDgUT.js.map → SavedBlocksPickBar-C3BP5941.js.map} +1 -1
  54. package/dist/cdn/chunks/{TestEmailModal-CEBFCevy.js → TestEmailModal-CnoOTm5c.js} +5 -5
  55. package/dist/cdn/chunks/{TestEmailModal-CEBFCevy.js.map → TestEmailModal-CnoOTm5c.js.map} +1 -1
  56. package/dist/cdn/chunks/{TestEmailPanel-C35nqIIl.js → TestEmailPanel-BcvY4bL7.js} +2 -2
  57. package/dist/cdn/chunks/{TestEmailPanel-C35nqIIl.js.map → TestEmailPanel-BcvY4bL7.js.map} +1 -1
  58. package/dist/cdn/chunks/{TitleEditor-c2aQCyds.js → TitleEditor-5Ytpa9n2.js} +7 -7
  59. package/dist/cdn/chunks/{TitleEditor-c2aQCyds.js.map → TitleEditor-5Ytpa9n2.js.map} +1 -1
  60. package/dist/cdn/chunks/{TplModal-DSTVZKuI.js → TplModal-pGADKFOL.js} +2 -2
  61. package/dist/cdn/chunks/{TplModal-DSTVZKuI.js.map → TplModal-pGADKFOL.js.map} +1 -1
  62. package/dist/cdn/chunks/{VersionHistoryPanels-CvWySHUE.js → VersionHistoryPanels-CSryv5rE.js} +2 -2
  63. package/dist/cdn/chunks/{VersionHistoryPanels-CvWySHUE.js.map → VersionHistoryPanels-CSryv5rE.js.map} +1 -1
  64. package/dist/cdn/chunks/{VersionPreviewBanner-CBVDWnhq.js → VersionPreviewBanner-C4mr6y2u.js} +2 -2
  65. package/dist/cdn/chunks/{VersionPreviewBanner-CBVDWnhq.js.map → VersionPreviewBanner-C4mr6y2u.js.map} +1 -1
  66. package/dist/cdn/chunks/{extensions-Byo2sA1r.js → extensions-P0lpi6k8.js} +3 -3
  67. package/dist/cdn/chunks/{extensions-Byo2sA1r.js.map → extensions-P0lpi6k8.js.map} +1 -1
  68. package/dist/cdn/chunks/{src-BAWlZu4B.js → src-DNhD7a2v.js} +2 -2
  69. package/dist/cdn/chunks/{src-BAWlZu4B.js.map → src-DNhD7a2v.js.map} +1 -1
  70. package/dist/cdn/chunks/{styleConstants-9oK5kn21.js → styleConstants-C_YAPdQS.js} +8 -8
  71. package/dist/cdn/chunks/{styleConstants-9oK5kn21.js.map → styleConstants-C_YAPdQS.js.map} +1 -1
  72. package/dist/cdn/chunks/{tiptap-DmpGap5g.js → tiptap-DWeSx_P8.js} +1012 -987
  73. package/dist/cdn/chunks/tiptap-DWeSx_P8.js.map +1 -0
  74. package/dist/cdn/chunks/{useEditorCore-D84laTMj.js → useEditorCore-DTpSiO4S.js} +3 -3
  75. package/dist/cdn/chunks/{useEditorCore-D84laTMj.js.map → useEditorCore-DTpSiO4S.js.map} +1 -1
  76. package/dist/cdn/editor.css +1 -1
  77. package/dist/cdn/editor.js +776 -780
  78. package/dist/cdn/editor.js.map +1 -1
  79. package/dist/{dist-Ck9roB6K.js → dist-BLVvhIFj.js} +2 -2
  80. package/dist/{dist-DMJRSouD.js → dist-C145btxT.js} +255 -250
  81. package/dist/{dist-C27SeFL5.js → dist-CLc1cpN2.js} +2 -2
  82. package/dist/{dist-M7m1lYRe.js → dist-CQQNoHxz.js} +2 -2
  83. package/dist/{dist-g6cbzhZW.js → dist-CclsUQ7r.js} +2 -2
  84. package/dist/{dist-CYx-E82k.js → dist-CgXIMxZc.js} +2 -2
  85. package/dist/dist-D-ulkdvF.js +5 -0
  86. package/dist/{dist-BImfm-46.js → dist-D4Jb08yv.js} +2 -2
  87. package/dist/{dist-ChYLhoJ4.js → dist-DUn6jY0n.js} +35 -18
  88. package/dist/{dist-DfpeSdmE.js → dist-Dx-KOuOj.js} +2 -2
  89. package/dist/{dist-C08jiemd.js → dist-Dz7KUOSg.js} +2 -2
  90. package/dist/dist-Kf9u4ULN.js +5 -0
  91. package/dist/{extensions-BV9qfsYr.js → extensions-DWp4eXoE.js} +3 -3
  92. package/dist/style.css +1 -1
  93. package/dist/{styleConstants-9oK5kn21.js → styleConstants-C_YAPdQS.js} +7 -7
  94. package/dist/templatical-editor.js +939 -943
  95. package/dist/{useEditorCore-D7Gz7_CW.js → useEditorCore--_kmTxxX.js} +2 -2
  96. package/package.json +20 -20
  97. package/dist/cdn/chunks/CloudHeaderExtras-CScGpeLl.js.map +0 -1
  98. package/dist/cdn/chunks/tiptap-DmpGap5g.js.map +0 -1
  99. package/dist/dist-6YJAWMuf.js +0 -5
  100. package/dist/dist-8vlm9kfO.js +0 -5
@@ -2677,7 +2677,7 @@ var wi = ["innerHTML"], Ti = /* @__PURE__ */ L({
2677
2677
  viewport: {}
2678
2678
  },
2679
2679
  setup(e) {
2680
- let t = e, n = y(() => import("./ParagraphEditor-C9-jQ5zP.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content);
2680
+ let t = e, n = y(() => import("./ParagraphEditor-CoN76ofC.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content);
2681
2681
  return (t, l) => (O(), S("div", {
2682
2682
  ref_key: "blockRef",
2683
2683
  ref: i,
@@ -2917,7 +2917,7 @@ var Wi = /* @__PURE__ */ L({
2917
2917
  viewport: {}
2918
2918
  },
2919
2919
  setup(e) {
2920
- let t = e, n = y(() => import("./TitleEditor-BWLwZh84.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content), l = F(() => {
2920
+ let t = e, n = y(() => import("./TitleEditor-BdRlIm67.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content), l = F(() => {
2921
2921
  let e = {
2922
2922
  fontSize: `${Ie[t.block.level]}px`,
2923
2923
  textAlign: t.block.textAlign
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@templatical/editor",
3
3
  "description": "Vue 3 visual drag-and-drop email editor powered by Templatical",
4
- "version": "0.27.4",
4
+ "version": "0.27.5",
5
5
  "bugs": "https://github.com/templatical/sdk/issues",
6
6
  "devDependencies": {
7
7
  "@lucide/vue": "^1.32.0",
8
- "@tiptap/core": "^3.30.1",
9
- "@tiptap/extension-color": "^3.30.1",
10
- "@tiptap/extension-font-family": "^3.30.1",
11
- "@tiptap/extension-highlight": "^3.30.1",
12
- "@tiptap/extension-link": "^3.30.1",
13
- "@tiptap/extension-subscript": "^3.30.1",
14
- "@tiptap/extension-superscript": "^3.30.1",
15
- "@tiptap/extension-text-align": "^3.30.1",
16
- "@tiptap/extension-text-style": "^3.30.1",
17
- "@tiptap/extension-underline": "^3.30.1",
18
- "@tiptap/starter-kit": "^3.30.1",
19
- "@tiptap/suggestion": "^3.30.1",
20
- "@tiptap/vue-3": "^3.30.1",
8
+ "@tiptap/core": "^3.30.2",
9
+ "@tiptap/extension-color": "^3.30.2",
10
+ "@tiptap/extension-font-family": "^3.30.2",
11
+ "@tiptap/extension-highlight": "^3.30.2",
12
+ "@tiptap/extension-link": "^3.30.2",
13
+ "@tiptap/extension-subscript": "^3.30.2",
14
+ "@tiptap/extension-superscript": "^3.30.2",
15
+ "@tiptap/extension-text-align": "^3.30.2",
16
+ "@tiptap/extension-text-style": "^3.30.2",
17
+ "@tiptap/extension-underline": "^3.30.2",
18
+ "@tiptap/starter-kit": "^3.30.2",
19
+ "@tiptap/suggestion": "^3.30.2",
20
+ "@tiptap/vue-3": "^3.30.2",
21
21
  "@vitejs/plugin-vue": "^6.0.8",
22
22
  "@vue/test-utils": "^2.4.11",
23
23
  "@vueuse/core": "^14.4.0",
@@ -33,9 +33,9 @@
33
33
  "vue": "^3.5.41",
34
34
  "vue-draggable-plus": "^0.6.1",
35
35
  "vue-tsc": "^3.3.10",
36
- "@templatical/core": "0.27.4",
37
- "@templatical/quality": "0.27.4",
38
- "@templatical/types": "0.27.4"
36
+ "@templatical/core": "0.27.5",
37
+ "@templatical/types": "0.27.5",
38
+ "@templatical/quality": "0.27.5"
39
39
  },
40
40
  "exports": {
41
41
  ".": {
@@ -63,9 +63,9 @@
63
63
  "license": "SEE LICENSE IN LICENSE",
64
64
  "module": "./dist/templatical-editor.js",
65
65
  "peerDependencies": {
66
- "@templatical/media-library": "0.27.4",
67
- "@templatical/quality": "0.27.4",
68
- "@templatical/renderer": "0.27.4"
66
+ "@templatical/media-library": "0.27.5",
67
+ "@templatical/quality": "0.27.5",
68
+ "@templatical/renderer": "0.27.5"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
71
  "@templatical/renderer": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"CloudHeaderExtras-CScGpeLl.js","names":[],"sources":["../../../src/cloud/components/CloudHeaderExtras.vue","../../../src/cloud/components/CloudHeaderExtras.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { defineAsyncComponent } from \"vue\";\nimport { Sparkles } from \"@lucide/vue\";\n\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { CloudAttachment } from \"../runtime\";\n\nconst CollaboratorBar = defineAsyncComponent(\n () => import(\"./CollaboratorBar.vue\"),\n);\nconst AiFeatureMenu = defineAsyncComponent(() => import(\"./AiFeatureMenu.vue\"));\n\n/**\n * The Cloud-only header controls, filled into `EditorHeader`'s three\n * `*-extras` slots.\n *\n * One component with a `part` prop rather than three: the three regions share\n * this file's lazy chunk, so a Cloud session pays one round-trip for all of them\n * and an OSS session pays none.\n *\n * The plan-usage readout and the AI button live here rather than in the shared\n * header because they render **cloud-chunk** strings; OSS translators never see\n * them. Comments are deliberately not here: that feature is shared and\n * provider-backed, so its trigger and its strings belong to the shared header and\n * the OSS chunk.\n */\ndefineProps<{\n part: \"left\" | \"center\" | \"right\";\n cloud: CloudAttachment;\n}>();\n\nconst { t: cloudT, format: cloudFormat } = useCloudI18nStrict();\n</script>\n\n<template>\n <!-- Left: templates used / allowed. A plan *limit*, not a templates concern,\n which is why it sits here and its string stays in the cloud chunk. -->\n <span\n v-if=\"part === 'left' && cloud.featureFlags.templateLimit.value !== null\"\n data-testid=\"cloud-template-usage\"\n class=\"tpl:text-xs tpl:opacity-60 tpl:text-[var(--tpl-text-muted)]\"\n >\n {{\n cloudFormat(cloudT.header.templatesUsed, {\n used: cloud.featureFlags.templateCount.value,\n max: cloud.featureFlags.templateLimit.value,\n })\n }}\n </span>\n\n <!-- Center: who else is in the template right now. -->\n <CollaboratorBar\n v-else-if=\"\n part === 'center' &&\n cloud.collaboration &&\n cloud.isCollaborationEnabled.value\n \"\n :collaborators=\"cloud.collaboration.collaborators.value\"\n :is-connected=\"cloud.websocket.isConnected.value\"\n />\n\n <!-- Right: AI — after the shared header's Comments button and before the\n test-email button, so the shared header is a superset of the OSS one rather\n than a rearrangement. -->\n <template v-else-if=\"part === 'right'\">\n <div\n v-if=\"\n cloud.featureFlags.canUseAiGeneration.value &&\n cloud.featureFlags.hasTemplateSaved.value\n \"\n :ref=\"\n (el) => (cloud.panelState.aiMenuRef.value = el as HTMLElement | null)\n \"\n class=\"tpl:relative\"\n >\n <button\n type=\"button\"\n data-testid=\"ai-menu-trigger\"\n :aria-expanded=\"cloud.panelState.aiMenuOpen.value\"\n class=\"tpl-ai-btn tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:border-none tpl:px-4 tpl:py-2 tpl:text-sm tpl:font-semibold tpl:whitespace-nowrap tpl:transition-all tpl:duration-200\"\n :class=\"\n cloud.panelState.aiButtonActive.value\n ? 'tpl-ai-btn--active'\n : 'tpl-ai-btn--idle'\n \"\n @click.stop=\"cloud.panelState.toggleAiMenu\"\n >\n <Sparkles :size=\"16\" :stroke-width=\"2\" class=\"tpl-ai-btn-icon\" />\n {{ cloudT.aiChat.button }}\n </button>\n <Transition\n enter-active-class=\"tpl:transition-all tpl:ease-out\"\n enter-from-class=\"tpl:scale-95 tpl:opacity-0\"\n enter-to-class=\"tpl:scale-100 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-100 tpl:ease-in\"\n leave-from-class=\"tpl:scale-100 tpl:opacity-100\"\n leave-to-class=\"tpl:scale-95 tpl:opacity-0\"\n >\n <div\n v-if=\"cloud.panelState.aiMenuOpen.value\"\n class=\"tpl:absolute tpl:right-0 tpl:top-full tpl:z-50 tpl:mt-1 tpl:origin-top-right\"\n >\n <AiFeatureMenu\n :active-feature=\"cloud.panelState.activeAiFeature.value\"\n @select=\"cloud.panelState.handleAiFeatureSelect\"\n />\n </div>\n </Transition>\n </div>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { defineAsyncComponent } from \"vue\";\nimport { Sparkles } from \"@lucide/vue\";\n\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { CloudAttachment } from \"../runtime\";\n\nconst CollaboratorBar = defineAsyncComponent(\n () => import(\"./CollaboratorBar.vue\"),\n);\nconst AiFeatureMenu = defineAsyncComponent(() => import(\"./AiFeatureMenu.vue\"));\n\n/**\n * The Cloud-only header controls, filled into `EditorHeader`'s three\n * `*-extras` slots.\n *\n * One component with a `part` prop rather than three: the three regions share\n * this file's lazy chunk, so a Cloud session pays one round-trip for all of them\n * and an OSS session pays none.\n *\n * The plan-usage readout and the AI button live here rather than in the shared\n * header because they render **cloud-chunk** strings; OSS translators never see\n * them. Comments are deliberately not here: that feature is shared and\n * provider-backed, so its trigger and its strings belong to the shared header and\n * the OSS chunk.\n */\ndefineProps<{\n part: \"left\" | \"center\" | \"right\";\n cloud: CloudAttachment;\n}>();\n\nconst { t: cloudT, format: cloudFormat } = useCloudI18nStrict();\n</script>\n\n<template>\n <!-- Left: templates used / allowed. A plan *limit*, not a templates concern,\n which is why it sits here and its string stays in the cloud chunk. -->\n <span\n v-if=\"part === 'left' && cloud.featureFlags.templateLimit.value !== null\"\n data-testid=\"cloud-template-usage\"\n class=\"tpl:text-xs tpl:opacity-60 tpl:text-[var(--tpl-text-muted)]\"\n >\n {{\n cloudFormat(cloudT.header.templatesUsed, {\n used: cloud.featureFlags.templateCount.value,\n max: cloud.featureFlags.templateLimit.value,\n })\n }}\n </span>\n\n <!-- Center: who else is in the template right now. -->\n <CollaboratorBar\n v-else-if=\"\n part === 'center' &&\n cloud.collaboration &&\n cloud.isCollaborationEnabled.value\n \"\n :collaborators=\"cloud.collaboration.collaborators.value\"\n :is-connected=\"cloud.websocket.isConnected.value\"\n />\n\n <!-- Right: AI — after the shared header's Comments button and before the\n test-email button, so the shared header is a superset of the OSS one rather\n than a rearrangement. -->\n <template v-else-if=\"part === 'right'\">\n <div\n v-if=\"\n cloud.featureFlags.canUseAiGeneration.value &&\n cloud.featureFlags.hasTemplateSaved.value\n \"\n :ref=\"\n (el) => (cloud.panelState.aiMenuRef.value = el as HTMLElement | null)\n \"\n class=\"tpl:relative\"\n >\n <button\n type=\"button\"\n data-testid=\"ai-menu-trigger\"\n :aria-expanded=\"cloud.panelState.aiMenuOpen.value\"\n class=\"tpl-ai-btn tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:border-none tpl:px-4 tpl:py-2 tpl:text-sm tpl:font-semibold tpl:whitespace-nowrap tpl:transition-all tpl:duration-200\"\n :class=\"\n cloud.panelState.aiButtonActive.value\n ? 'tpl-ai-btn--active'\n : 'tpl-ai-btn--idle'\n \"\n @click.stop=\"cloud.panelState.toggleAiMenu\"\n >\n <Sparkles :size=\"16\" :stroke-width=\"2\" class=\"tpl-ai-btn-icon\" />\n {{ cloudT.aiChat.button }}\n </button>\n <Transition\n enter-active-class=\"tpl:transition-all tpl:ease-out\"\n enter-from-class=\"tpl:scale-95 tpl:opacity-0\"\n enter-to-class=\"tpl:scale-100 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-100 tpl:ease-in\"\n leave-from-class=\"tpl:scale-100 tpl:opacity-100\"\n leave-to-class=\"tpl:scale-95 tpl:opacity-0\"\n >\n <div\n v-if=\"cloud.panelState.aiMenuOpen.value\"\n class=\"tpl:absolute tpl:right-0 tpl:top-full tpl:z-50 tpl:mt-1 tpl:origin-top-right\"\n >\n <AiFeatureMenu\n :active-feature=\"cloud.panelState.activeAiFeature.value\"\n @select=\"cloud.panelState.handleAiFeatureSelect\"\n />\n </div>\n </Transition>\n </div>\n </template>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAOA,IAAM,IAAkB,QAChB,OAAO,gCACf,GACM,IAAgB,QAA2B,OAAO,8BAAsB,GAqBxE,EAAE,GAAG,GAAQ,QAAQ,MAAgB,EAAmB;mBAOpD,EAAA,SAAI,UAAe,EAAA,MAAM,aAAa,cAAc,UAAK,QADjE,EAAA,GAAA,EAWO,QAXP,GAWO,EALH,EAAA,CAAA,CAAW,CAAC,EAAA,CAAA,CAAM,CAAC,OAAO,eAAa;GAAkB,MAAA,EAAA,MAAM,aAAa,cAAc;GAAoB,KAAA,EAAA,MAAM,aAAa,cAAc;EAS/H,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,SAAI,YAAuB,EAAA,MAAM,iBAAuB,EAAA,MAAM,uBAAuB,SADzG,EAAA,GAAA,EAQE,EAAA,CAAA,GAAA;;GAFC,eAAe,EAAA,MAAM,cAAc,cAAc;GACjD,gBAAc,EAAA,MAAM,UAAU,YAAY;EAMxB,GAAA,MAAA,GAAA,CAAA,iBAAA,cAAA,CAAA,KAAA,EAAA,SAAI,WAAzB,EAAA,GAAA,EA6CW,GAAA,EAAA,KAAA,EAAA,GAAA,CA3CQ,EAAA,MAAM,aAAa,mBAAmB,SAAiB,EAAA,MAAM,aAAa,iBAAiB,SAD5G,EAAA,GAAA,EA2CM,OAAA;;GAtCH,MAAe,MAAQ,EAAA,MAAM,WAAW,UAAU,QAAQ;GAG3D,OAAM;EAEN,GAAA,CAAA,EAcS,UAAA;GAbP,MAAK;GACL,eAAY;GACX,iBAAe,EAAA,MAAM,WAAW,WAAW;GAC5C,OAAK,EAAA,CAAC,wNACa,EAAA,MAAM,WAAW,eAAe,QAAA,uBAAA,kBAAA,CAAA;GAKlD,SAAK,AAAA,EAAA,OAAA,GAAO,GAAA,MAAA,EAAA,MAAM,WAAW,gBAAjB,EAAA,MAAM,WAAW,aAAY,GAAA,CAAA,GAAA,CAAA,MAAA,CAAA;EAE1C,GAAA,CAAA,EAAiE,EAAA,CAAA,GAAA;GAAtD,MAAM;GAAK,gBAAc;GAAG,OAAM;EAAoB,CAAA,GAAA,EAAA,MACjE,EAAG,EAAA,CAAA,CAAM,CAAC,OAAO,MAAM,GAAA,CAAA,CAAA,GAAA,IAAA,CAAA,GAEzB,EAiBa,GAAA;GAhBX,sBAAmB;GACnB,oBAAiB;GACjB,kBAAe;GACf,sBAAmB;GACnB,oBAAiB;GACjB,kBAAe;;GAEf,SAAA,QAQM,CAPE,EAAA,MAAM,WAAW,WAAW,SADpC,EAAA,GAAA,EAQM,OARN,GAQM,CAJJ,EAGE,EAAA,CAAA,GAAA;IAFC,kBAAgB,EAAA,MAAM,WAAW,gBAAgB;IACjD,UAAQ,EAAA,MAAM,WAAW"}