@templatical/editor 0.10.2 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/{AiChatSidebar-BMwpZx-6.js → AiChatSidebar-Djjqrmoh.js} +13 -13
  2. package/dist/{AiFeatureMenu-xgaIGUCo.js → AiFeatureMenu-DR56EYbL.js} +7 -7
  3. package/dist/{BlockIssueBadge-3kNs6WoD.js → BlockIssueBadge-ySMhwDRR.js} +5 -5
  4. package/dist/{CloudEditor-Dm9hiaui.js → CloudEditor-BLlRKq5D.js} +19 -19
  5. package/dist/{CollaboratorBar-Cz_evoU4.js → CollaboratorBar-BlXmZrIj.js} +4 -4
  6. package/dist/{CommentsSidebar-jFZj_CTo.js → CommentsSidebar-XcYtqAn8.js} +12 -12
  7. package/dist/{CountdownBlock-S-SCyVye.js → CountdownBlock-sAAv3BHE.js} +3 -3
  8. package/dist/{CountdownToolbar-Ckdo-3P-.js → CountdownToolbar-CUvqPILZ.js} +3 -3
  9. package/dist/{DesignReferenceSidebar-B9QNPZNV.js → DesignReferenceSidebar-B0Upq2MY.js} +9 -9
  10. package/dist/{IssuesPanel-_E_fbSM8.js → IssuesPanel-BvcqQ0ec.js} +8 -8
  11. package/dist/{LoadingTrack-BZ5KJyZ_.js → LoadingTrack-e67FA0NP.js} +1 -1
  12. package/dist/{ModuleBrowserModal-BB22urqi.js → ModuleBrowserModal-BdOB1Lbt.js} +10 -10
  13. package/dist/{ModulePreviewCanvas-CH5OdXv8.js → ModulePreviewCanvas-BeglLfBF.js} +3 -3
  14. package/dist/{NumberWithSuffix-BHDXHMpo.js → NumberWithSuffix-Cb7HI_yW.js} +3 -3
  15. package/dist/{ParagraphEditor-BmY7LLgN.js → ParagraphEditor-4Wrd3nnB.js} +23 -23
  16. package/dist/{RichTextEditorContent-COijbaWp.js → RichTextEditorContent-D-uKzBDa.js} +6 -6
  17. package/dist/{SaveModuleDialog-D5WN-je_.js → SaveModuleDialog-ueFhCVWN.js} +7 -7
  18. package/dist/{SnapshotHistory-BQ55Rhri.js → SnapshotHistory-DNuw_gCY.js} +9 -9
  19. package/dist/{TemplateScoringPanel-Dhf_Qgr7.js → TemplateScoringPanel-bkIhEokb.js} +14 -14
  20. package/dist/{TestEmailModal-DH_Viz_m.js → TestEmailModal-Tg30-itu.js} +5 -5
  21. package/dist/{TitleEditor-Dn613K8o.js → TitleEditor-CY8QWbEw.js} +12 -12
  22. package/dist/{TplModal-Dxa3rhHI.js → TplModal-D338Vv9U.js} +4 -4
  23. package/dist/{blockTypeIcons-CrcSCTD6.js → blockTypeIcons-CYoPwoH9.js} +2 -2
  24. package/dist/bundle-stats.json +6 -6
  25. package/dist/cdn/chunks/{AiFeatureMenu-CCsgxyN9.js → AiFeatureMenu-DRWRoPdh.js} +3 -3
  26. package/dist/cdn/chunks/{AiFeatureMenu-CCsgxyN9.js.map → AiFeatureMenu-DRWRoPdh.js.map} +1 -1
  27. package/dist/cdn/chunks/{BlockIssueBadge-Lc3NWFV8.js → BlockIssueBadge-D2ApLp61.js} +3 -3
  28. package/dist/cdn/chunks/{BlockIssueBadge-Lc3NWFV8.js.map → BlockIssueBadge-D2ApLp61.js.map} +1 -1
  29. package/dist/cdn/chunks/{CloudEditor-KkwvBhyt.js → CloudEditor-gvOOuXac.js} +8 -8
  30. package/dist/cdn/chunks/{CloudEditor-KkwvBhyt.js.map → CloudEditor-gvOOuXac.js.map} +1 -1
  31. package/dist/cdn/chunks/{CollaboratorBar-BGIGiFSm.js → CollaboratorBar-BZK3R383.js} +4 -4
  32. package/dist/cdn/chunks/{CollaboratorBar-BGIGiFSm.js.map → CollaboratorBar-BZK3R383.js.map} +1 -1
  33. package/dist/cdn/chunks/{CountdownBlock-gqnpxKp_.js → CountdownBlock-DU5YmjFP.js} +3 -3
  34. package/dist/cdn/chunks/{CountdownBlock-gqnpxKp_.js.map → CountdownBlock-DU5YmjFP.js.map} +1 -1
  35. package/dist/cdn/chunks/{CountdownToolbar-xHpaWQE2.js → CountdownToolbar-C1nlFm4e.js} +4 -4
  36. package/dist/cdn/chunks/{CountdownToolbar-xHpaWQE2.js.map → CountdownToolbar-C1nlFm4e.js.map} +1 -1
  37. package/dist/cdn/chunks/{IssuesPanel-DHTTHu65.js → IssuesPanel-R3M60NTk.js} +4 -4
  38. package/dist/cdn/chunks/{IssuesPanel-DHTTHu65.js.map → IssuesPanel-R3M60NTk.js.map} +1 -1
  39. package/dist/cdn/chunks/{ModuleBrowserModal-DDTjrKph.js → ModuleBrowserModal-DMithQu8.js} +6 -6
  40. package/dist/cdn/chunks/{ModuleBrowserModal-DDTjrKph.js.map → ModuleBrowserModal-DMithQu8.js.map} +1 -1
  41. package/dist/cdn/chunks/{ModulePreviewCanvas-DeFq0hVi.js → ModulePreviewCanvas-BNKbV_c2.js} +3 -3
  42. package/dist/cdn/chunks/{ModulePreviewCanvas-DeFq0hVi.js.map → ModulePreviewCanvas-BNKbV_c2.js.map} +1 -1
  43. package/dist/cdn/chunks/{NumberWithSuffix-D4wtmU9O.js → NumberWithSuffix-C5zNn3Oc.js} +3 -3
  44. package/dist/cdn/chunks/{NumberWithSuffix-D4wtmU9O.js.map → NumberWithSuffix-C5zNn3Oc.js.map} +1 -1
  45. package/dist/cdn/chunks/{ParagraphEditor-CwY8GeWa.js → ParagraphEditor-H136qVNI.js} +17 -17
  46. package/dist/cdn/chunks/{ParagraphEditor-CwY8GeWa.js.map → ParagraphEditor-H136qVNI.js.map} +1 -1
  47. package/dist/cdn/chunks/{RichTextEditorContent-C_bMURGF.js → RichTextEditorContent-BxW6vSck.js} +3 -3
  48. package/dist/cdn/chunks/{RichTextEditorContent-C_bMURGF.js.map → RichTextEditorContent-BxW6vSck.js.map} +1 -1
  49. package/dist/cdn/chunks/{SaveModuleDialog-DEi8PSP6.js → SaveModuleDialog-BaiynUWb.js} +3 -3
  50. package/dist/cdn/chunks/{SaveModuleDialog-DEi8PSP6.js.map → SaveModuleDialog-BaiynUWb.js.map} +1 -1
  51. package/dist/cdn/chunks/{TitleEditor-Betpo8AZ.js → TitleEditor-BBsR46vE.js} +9 -9
  52. package/dist/cdn/chunks/{TitleEditor-Betpo8AZ.js.map → TitleEditor-BBsR46vE.js.map} +1 -1
  53. package/dist/cdn/chunks/{blockTypeIcons-Xz6OBq3U.js → blockTypeIcons-CX05RINM.js} +3 -3
  54. package/dist/cdn/chunks/{blockTypeIcons-Xz6OBq3U.js.map → blockTypeIcons-CX05RINM.js.map} +1 -1
  55. package/dist/cdn/chunks/{draggable-BTGr7_-X.js → draggable-iAb7QVJo.js} +30 -23
  56. package/dist/cdn/chunks/draggable-iAb7QVJo.js.map +1 -0
  57. package/dist/cdn/chunks/{extensions-D_j4UWxi.js → extensions-2LuW8PHB.js} +4 -4
  58. package/dist/cdn/chunks/{extensions-D_j4UWxi.js.map → extensions-2LuW8PHB.js.map} +1 -1
  59. package/dist/cdn/chunks/{features-A28DQtjE.js → features-CxHQG9xr.js} +15 -13
  60. package/dist/cdn/chunks/{features-A28DQtjE.js.map → features-CxHQG9xr.js.map} +1 -1
  61. package/dist/cdn/chunks/{icons-C9D3N0-J.js → icons-DrsFvnNP.js} +2 -2
  62. package/dist/cdn/chunks/{icons-C9D3N0-J.js.map → icons-DrsFvnNP.js.map} +1 -1
  63. package/dist/cdn/chunks/{media-library-CH1Wx5wP.js → media-library-CDXkfBa7.js} +5 -5
  64. package/dist/cdn/chunks/{media-library-CH1Wx5wP.js.map → media-library-CDXkfBa7.js.map} +1 -1
  65. package/dist/cdn/chunks/{quality-D4NeyFej.js → quality-HR87TCZc.js} +2 -2
  66. package/dist/cdn/chunks/{quality-D4NeyFej.js.map → quality-HR87TCZc.js.map} +1 -1
  67. package/dist/cdn/chunks/{renderer-BQnGfLhL.js → renderer-Dh5WdraW.js} +3 -3
  68. package/dist/cdn/chunks/{renderer-BQnGfLhL.js.map → renderer-Dh5WdraW.js.map} +1 -1
  69. package/dist/cdn/chunks/{src-BkKEyLw1.js → src-fyYLC_tY.js} +5 -5
  70. package/dist/cdn/chunks/{src-BkKEyLw1.js.map → src-fyYLC_tY.js.map} +1 -1
  71. package/dist/cdn/chunks/{styles-BDVaiw3K.js → styles-NhU45rEI.js} +10 -10
  72. package/dist/cdn/chunks/styles-NhU45rEI.js.map +1 -0
  73. package/dist/cdn/chunks/{tiptap-P5abGB13.js → tiptap-CfnwT9a8.js} +3010 -2975
  74. package/dist/cdn/chunks/tiptap-CfnwT9a8.js.map +1 -0
  75. package/dist/cdn/editor.css +1 -1
  76. package/dist/cdn/editor.js +7 -7
  77. package/dist/{check-KooI2jyS.js → check-B4oiQEsJ.js} +1 -1
  78. package/dist/{chevron-down-mnlFgueW.js → chevron-down-BrL7CDST.js} +1 -1
  79. package/dist/{circle-alert-D89_hB8j.js → circle-alert-Ddf06I0D.js} +1 -1
  80. package/dist/{clock-BaadyUrg.js → clock-CbIkIHL5.js} +1 -1
  81. package/dist/{cloud-D-FScaHx.js → cloud-Dom4EH5Z.js} +1 -1
  82. package/dist/{createLucideIcon-D-6fpD2L.js → createLucideIcon-Bn5l6hkC.js} +3 -3
  83. package/dist/{dist-Drp5bNAu.js → dist-B6B8IO1W.js} +2 -2
  84. package/dist/{dist-DaajG7Fo.js → dist-BRvZBY6r.js} +2 -2
  85. package/dist/{dist-zInT3Lf6.js → dist-BShwEwPy.js} +2138 -2103
  86. package/dist/dist-BVKpiz3S.js +5 -0
  87. package/dist/{dist-C1WcikEF.js → dist-BdIM5Jt8.js} +2 -2
  88. package/dist/{dist-Dnqx5UF3.js → dist-BhZo8-eC.js} +3 -3
  89. package/dist/dist-BzeOnbU8.js +5 -0
  90. package/dist/{dist-BttO3Zdx.js → dist-Ctv43HTN.js} +2 -2
  91. package/dist/{dist-b52vYHb5.js → dist-DDB4TfTY.js} +2 -2
  92. package/dist/{dist-XA2i70J5.js → dist-DS9NXb20.js} +2 -2
  93. package/dist/{dist-CjULgTep.js → dist-DbGsZrPu.js} +6 -6
  94. package/dist/{dist-sqf7pq5q.js → dist-ZiEahccA.js} +2 -2
  95. package/dist/{dist-cl33Ip6W.js → dist-cT52Hh9L.js} +3 -3
  96. package/dist/{extensions-DA-w1gVg.js → extensions-CqrSpX_i.js} +6 -6
  97. package/dist/{image-up-DjwfAom6.js → image-up-D3KvvHLf.js} +1 -1
  98. package/dist/{info-Db3HlTr8.js → info-RwcI2EUD.js} +1 -1
  99. package/dist/{keys-BjmL5YCT.js → keys-DSm2p8zn.js} +1 -1
  100. package/dist/{list-checks-BlAB0X8a.js → list-checks-ruqK9lCo.js} +1 -1
  101. package/dist/{loader-circle-EVqyIxjU.js → loader-circle-D4SXJ8eQ.js} +1 -1
  102. package/dist/{message-circle-BuI5pBVG.js → message-circle-p9UiFyS7.js} +1 -1
  103. package/dist/{refresh-cw-C2vM_6zQ.js → refresh-cw-C8HbO4hg.js} +1 -1
  104. package/dist/{scan-line-AUIh_SHI.js → scan-line-CmPIMm63.js} +1 -1
  105. package/dist/{send-nrbwF7xg.js → send-DacXlri3.js} +1 -1
  106. package/dist/{shield-check-B55Ozmva.js → shield-check-BdrHnTnJ.js} +1 -1
  107. package/dist/{sparkles-oh1NUSFq.js → sparkles-tT7wcus5.js} +1 -1
  108. package/dist/style.css +1 -1
  109. package/dist/{styles-Byhh107n.js → styles-BmZWc8sc.js} +27 -27
  110. package/dist/templatical-editor.js +5 -5
  111. package/dist/{text-align-start-B2MqzZwU.js → text-align-start-DaSSBZVi.js} +1 -1
  112. package/dist/{trash-2-DH8RBwAx.js → trash-2-B0uIJOwX.js} +1 -1
  113. package/dist/{triangle-alert-BQHjCt3B.js → triangle-alert-FLQWRf-c.js} +1 -1
  114. package/dist/{useAliveFlag-B_b9ubwD.js → useAliveFlag-DlVvpZxc.js} +1 -1
  115. package/dist/{useCloudI18n-BHCrmQgj.js → useCloudI18n-Lh0xWlQ4.js} +2 -2
  116. package/dist/{useEditorCore-BEgc3KFu.js → useEditorCore-CMukR8kX.js} +21 -19
  117. package/dist/{useI18n-Bb9-ha9X.js → useI18n-CNEz8RK7.js} +2 -2
  118. package/dist/{useMergeTag-HykzEtBn.js → useMergeTag-C54tabTK.js} +2 -2
  119. package/dist/usePopoverRoot-dvg2XFmj.js +8 -0
  120. package/dist/{vue.runtime.esm-bundler-MzYCkFSH.js → vue.runtime.esm-bundler-mPytWZFh.js} +32 -25
  121. package/dist/{x-DgCCENgP.js → x-BROzFhGs.js} +1 -1
  122. package/package.json +21 -21
  123. package/dist/cdn/chunks/draggable-BTGr7_-X.js.map +0 -1
  124. package/dist/cdn/chunks/styles-BDVaiw3K.js.map +0 -1
  125. package/dist/cdn/chunks/tiptap-P5abGB13.js.map +0 -1
  126. package/dist/dist-Df4eV6Zi.js +0 -5
  127. package/dist/dist-WJ1fVd5b.js +0 -5
  128. package/dist/usePopoverRoot-BZDkRRry.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"TitleEditor-Betpo8AZ.js","names":[],"sources":["../../../src/components/blocks/TitleEditor.vue","../../../src/components/blocks/TitleEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables\";\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\nimport type { TitleBlock as TitleBlockType } from \"@templatical/types\";\nimport { Bold, Italic, Link, LoaderCircle, ScanLine } from \"@lucide/vue\";\nimport { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n MERGE_TAG_PICKER_KEY,\n} from \"../../keys\";\nimport RichTextLinkDialog from \"./RichTextLinkDialog.vue\";\nimport RichTextEditorContent from \"./RichTextEditorContent.vue\";\n\nconst props = defineProps<{\n block: TitleBlockType;\n toolbarPosition: { top: number; left: number };\n}>();\n\nconst emit = defineEmits<{\n (e: \"done\"): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverRoot = usePopoverRoot();\n// Hide the floating toolbar while the built-in merge tag picker modal is\n// open — see ParagraphToolbar.vue for the same rationale.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\n\nconst { t } = useI18n();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"TitleEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { MergeTagNode, MergeTagSuggestion, LogicMergeTagNode },\n ] = await Promise.all([\n import(\"@tiptap/vue-3\"),\n import(\"@tiptap/starter-kit\"),\n import(\"@tiptap/extension-link\"),\n import(\"../../extensions\"),\n ]);\n\n return {\n TiptapEditor,\n EC,\n extensions: [\n StarterKit.configure({\n heading: false,\n codeBlock: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n strike: false,\n }),\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n MergeTagNode.configure({ mergeTags, syntax }),\n LogicMergeTagNode.configure({ syntax }),\n ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\n <div\n :data-tpl-theme=\"tplUiTheme\"\n role=\"toolbar\"\n :aria-label=\"t.titleEditor.toolbar\"\n class=\"tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2 tpl:shadow-lg\"\n :style=\"{\n ...themeStyles,\n top: `${toolbarPosition.top}px`,\n left: `${toolbarPosition.left}px`,\n transform: 'translateY(-100%)',\n }\"\n >\n <template v-if=\"!isLoading && editor\">\n <!-- Bold -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('bold'),\n }\"\n :aria-label=\"t.titleEditor.bold\"\n :title=\"t.titleEditor.bold\"\n @click=\"editor?.chain().focus().toggleBold().run()\"\n >\n <Bold :size=\"16\" :stroke-width=\"2.5\" />\n </button>\n <!-- Italic -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('italic'),\n }\"\n :aria-label=\"t.titleEditor.italic\"\n :title=\"t.titleEditor.italic\"\n @click=\"editor?.chain().focus().toggleItalic().run()\"\n >\n <Italic :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Link -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('link'),\n }\"\n :aria-label=\"t.titleEditor.addLink\"\n :title=\"t.titleEditor.addLink\"\n @click=\"openLinkDialog\"\n >\n <Link :size=\"16\" :stroke-width=\"2\" />\n </button>\n <!-- Add Merge Tag -->\n <span\n v-if=\"canRequestMergeTag\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"canRequestMergeTag\"\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"handleAddMergeTag\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\n <template v-else>\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]\"\n >\n <LoaderCircle class=\"tpl-spinner\" :size=\"14\" :stroke-width=\"2\" />\n {{ t.errors.editorLoading }}\n </div>\n </template>\n </div>\n </Teleport>\n\n <RichTextEditorContent\n :editor=\"editor\"\n :editor-content=\"EditorContent\"\n :is-loading=\"isLoading\"\n :init-error=\"initError\"\n @retry=\"retry\"\n />\n\n <RichTextLinkDialog\n :visible=\"showLinkDialog\"\n :is-editing-link=\"editor?.isActive('link') ?? false\"\n v-model:dialog-ref=\"linkDialogRef\"\n v-model:link-url=\"linkUrl\"\n @close=\"closeLinkDialog\"\n @insert=\"insertLink\"\n @remove=\"removeLink\"\n @keydown=\"handleLinkKeydown\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables\";\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\nimport type { TitleBlock as TitleBlockType } from \"@templatical/types\";\nimport { Bold, Italic, Link, LoaderCircle, ScanLine } from \"@lucide/vue\";\nimport { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n MERGE_TAG_PICKER_KEY,\n} from \"../../keys\";\nimport RichTextLinkDialog from \"./RichTextLinkDialog.vue\";\nimport RichTextEditorContent from \"./RichTextEditorContent.vue\";\n\nconst props = defineProps<{\n block: TitleBlockType;\n toolbarPosition: { top: number; left: number };\n}>();\n\nconst emit = defineEmits<{\n (e: \"done\"): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverRoot = usePopoverRoot();\n// Hide the floating toolbar while the built-in merge tag picker modal is\n// open — see ParagraphToolbar.vue for the same rationale.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\n\nconst { t } = useI18n();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"TitleEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { MergeTagNode, MergeTagSuggestion, LogicMergeTagNode },\n ] = await Promise.all([\n import(\"@tiptap/vue-3\"),\n import(\"@tiptap/starter-kit\"),\n import(\"@tiptap/extension-link\"),\n import(\"../../extensions\"),\n ]);\n\n return {\n TiptapEditor,\n EC,\n extensions: [\n StarterKit.configure({\n heading: false,\n codeBlock: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n strike: false,\n }),\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n MergeTagNode.configure({ mergeTags, syntax }),\n LogicMergeTagNode.configure({ syntax }),\n ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\n <div\n :data-tpl-theme=\"tplUiTheme\"\n role=\"toolbar\"\n :aria-label=\"t.titleEditor.toolbar\"\n class=\"tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2 tpl:shadow-lg\"\n :style=\"{\n ...themeStyles,\n top: `${toolbarPosition.top}px`,\n left: `${toolbarPosition.left}px`,\n transform: 'translateY(-100%)',\n }\"\n >\n <template v-if=\"!isLoading && editor\">\n <!-- Bold -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('bold'),\n }\"\n :aria-label=\"t.titleEditor.bold\"\n :title=\"t.titleEditor.bold\"\n @click=\"editor?.chain().focus().toggleBold().run()\"\n >\n <Bold :size=\"16\" :stroke-width=\"2.5\" />\n </button>\n <!-- Italic -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('italic'),\n }\"\n :aria-label=\"t.titleEditor.italic\"\n :title=\"t.titleEditor.italic\"\n @click=\"editor?.chain().focus().toggleItalic().run()\"\n >\n <Italic :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Link -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('link'),\n }\"\n :aria-label=\"t.titleEditor.addLink\"\n :title=\"t.titleEditor.addLink\"\n @click=\"openLinkDialog\"\n >\n <Link :size=\"16\" :stroke-width=\"2\" />\n </button>\n <!-- Add Merge Tag -->\n <span\n v-if=\"canRequestMergeTag\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"canRequestMergeTag\"\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"handleAddMergeTag\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\n <template v-else>\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]\"\n >\n <LoaderCircle class=\"tpl-spinner\" :size=\"14\" :stroke-width=\"2\" />\n {{ t.errors.editorLoading }}\n </div>\n </template>\n </div>\n </Teleport>\n\n <RichTextEditorContent\n :editor=\"editor\"\n :editor-content=\"EditorContent\"\n :is-loading=\"isLoading\"\n :init-error=\"initError\"\n @retry=\"retry\"\n />\n\n <RichTextLinkDialog\n :visible=\"showLinkDialog\"\n :is-editing-link=\"editor?.isActive('link') ?? false\"\n v-model:dialog-ref=\"linkDialogRef\"\n v-model:link-url=\"linkUrl\"\n @close=\"closeLinkDialog\"\n @insert=\"insertLink\"\n @remove=\"removeLink\"\n @keydown=\"handleLinkKeydown\"\n />\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TitleEditor-BBsR46vE.js","names":[],"sources":["../../../src/components/blocks/TitleEditor.vue","../../../src/components/blocks/TitleEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables\";\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\nimport type { TitleBlock as TitleBlockType } from \"@templatical/types\";\nimport { Bold, Italic, Link, LoaderCircle, ScanLine } from \"@lucide/vue\";\nimport { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n MERGE_TAG_PICKER_KEY,\n} from \"../../keys\";\nimport RichTextLinkDialog from \"./RichTextLinkDialog.vue\";\nimport RichTextEditorContent from \"./RichTextEditorContent.vue\";\n\nconst props = defineProps<{\n block: TitleBlockType;\n toolbarPosition: { top: number; left: number };\n}>();\n\nconst emit = defineEmits<{\n (e: \"done\"): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverRoot = usePopoverRoot();\n// Hide the floating toolbar while the built-in merge tag picker modal is\n// open — see ParagraphToolbar.vue for the same rationale.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\n\nconst { t } = useI18n();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"TitleEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { MergeTagNode, MergeTagSuggestion, LogicMergeTagNode },\n ] = await Promise.all([\n import(\"@tiptap/vue-3\"),\n import(\"@tiptap/starter-kit\"),\n import(\"@tiptap/extension-link\"),\n import(\"../../extensions\"),\n ]);\n\n return {\n TiptapEditor,\n EC,\n extensions: [\n StarterKit.configure({\n heading: false,\n codeBlock: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n strike: false,\n }),\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n MergeTagNode.configure({ mergeTags, syntax }),\n LogicMergeTagNode.configure({ syntax }),\n ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\n <div\n :data-tpl-theme=\"tplUiTheme\"\n role=\"toolbar\"\n :aria-label=\"t.titleEditor.toolbar\"\n class=\"tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2 tpl:shadow-lg\"\n :style=\"{\n ...themeStyles,\n top: `${toolbarPosition.top}px`,\n left: `${toolbarPosition.left}px`,\n transform: 'translateY(-100%)',\n }\"\n >\n <template v-if=\"!isLoading && editor\">\n <!-- Bold -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('bold'),\n }\"\n :aria-label=\"t.titleEditor.bold\"\n :title=\"t.titleEditor.bold\"\n @click=\"editor?.chain().focus().toggleBold().run()\"\n >\n <Bold :size=\"16\" :stroke-width=\"2.5\" />\n </button>\n <!-- Italic -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('italic'),\n }\"\n :aria-label=\"t.titleEditor.italic\"\n :title=\"t.titleEditor.italic\"\n @click=\"editor?.chain().focus().toggleItalic().run()\"\n >\n <Italic :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Link -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('link'),\n }\"\n :aria-label=\"t.titleEditor.addLink\"\n :title=\"t.titleEditor.addLink\"\n @click=\"openLinkDialog\"\n >\n <Link :size=\"16\" :stroke-width=\"2\" />\n </button>\n <!-- Add Merge Tag -->\n <span\n v-if=\"canRequestMergeTag\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"canRequestMergeTag\"\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"handleAddMergeTag\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\n <template v-else>\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]\"\n >\n <LoaderCircle class=\"tpl-spinner\" :size=\"14\" :stroke-width=\"2\" />\n {{ t.errors.editorLoading }}\n </div>\n </template>\n </div>\n </Teleport>\n\n <RichTextEditorContent\n :editor=\"editor\"\n :editor-content=\"EditorContent\"\n :is-loading=\"isLoading\"\n :init-error=\"initError\"\n @retry=\"retry\"\n />\n\n <RichTextLinkDialog\n :visible=\"showLinkDialog\"\n :is-editing-link=\"editor?.isActive('link') ?? false\"\n v-model:dialog-ref=\"linkDialogRef\"\n v-model:link-url=\"linkUrl\"\n @close=\"closeLinkDialog\"\n @insert=\"insertLink\"\n @remove=\"removeLink\"\n @keydown=\"handleLinkKeydown\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables\";\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\nimport type { TitleBlock as TitleBlockType } from \"@templatical/types\";\nimport { Bold, Italic, Link, LoaderCircle, ScanLine } from \"@lucide/vue\";\nimport { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n MERGE_TAG_PICKER_KEY,\n} from \"../../keys\";\nimport RichTextLinkDialog from \"./RichTextLinkDialog.vue\";\nimport RichTextEditorContent from \"./RichTextEditorContent.vue\";\n\nconst props = defineProps<{\n block: TitleBlockType;\n toolbarPosition: { top: number; left: number };\n}>();\n\nconst emit = defineEmits<{\n (e: \"done\"): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverRoot = usePopoverRoot();\n// Hide the floating toolbar while the built-in merge tag picker modal is\n// open — see ParagraphToolbar.vue for the same rationale.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\n\nconst { t } = useI18n();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"TitleEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { MergeTagNode, MergeTagSuggestion, LogicMergeTagNode },\n ] = await Promise.all([\n import(\"@tiptap/vue-3\"),\n import(\"@tiptap/starter-kit\"),\n import(\"@tiptap/extension-link\"),\n import(\"../../extensions\"),\n ]);\n\n return {\n TiptapEditor,\n EC,\n extensions: [\n StarterKit.configure({\n heading: false,\n codeBlock: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n strike: false,\n }),\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n MergeTagNode.configure({ mergeTags, syntax }),\n LogicMergeTagNode.configure({ syntax }),\n ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\n <div\n :data-tpl-theme=\"tplUiTheme\"\n role=\"toolbar\"\n :aria-label=\"t.titleEditor.toolbar\"\n class=\"tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2 tpl:shadow-lg\"\n :style=\"{\n ...themeStyles,\n top: `${toolbarPosition.top}px`,\n left: `${toolbarPosition.left}px`,\n transform: 'translateY(-100%)',\n }\"\n >\n <template v-if=\"!isLoading && editor\">\n <!-- Bold -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('bold'),\n }\"\n :aria-label=\"t.titleEditor.bold\"\n :title=\"t.titleEditor.bold\"\n @click=\"editor?.chain().focus().toggleBold().run()\"\n >\n <Bold :size=\"16\" :stroke-width=\"2.5\" />\n </button>\n <!-- Italic -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('italic'),\n }\"\n :aria-label=\"t.titleEditor.italic\"\n :title=\"t.titleEditor.italic\"\n @click=\"editor?.chain().focus().toggleItalic().run()\"\n >\n <Italic :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Link -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('link'),\n }\"\n :aria-label=\"t.titleEditor.addLink\"\n :title=\"t.titleEditor.addLink\"\n @click=\"openLinkDialog\"\n >\n <Link :size=\"16\" :stroke-width=\"2\" />\n </button>\n <!-- Add Merge Tag -->\n <span\n v-if=\"canRequestMergeTag\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"canRequestMergeTag\"\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"handleAddMergeTag\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\n <template v-else>\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]\"\n >\n <LoaderCircle class=\"tpl-spinner\" :size=\"14\" :stroke-width=\"2\" />\n {{ t.errors.editorLoading }}\n </div>\n </template>\n </div>\n </Teleport>\n\n <RichTextEditorContent\n :editor=\"editor\"\n :editor-content=\"EditorContent\"\n :is-loading=\"isLoading\"\n :init-error=\"initError\"\n @retry=\"retry\"\n />\n\n <RichTextLinkDialog\n :visible=\"showLinkDialog\"\n :is-editing-link=\"editor?.isActive('link') ?? false\"\n v-model:dialog-ref=\"linkDialogRef\"\n v-model:link-url=\"linkUrl\"\n @close=\"closeLinkDialog\"\n @insert=\"insertLink\"\n @remove=\"removeLink\"\n @keydown=\"handleLinkKeydown\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Tt as e, bt as t, ft as n, gt as r, lt as i } from "./features-A28DQtjE.js";
2
- import { D as a, E as o, J as s, P as c, U as l, a as u, j as d, w as f } from "./icons-C9D3N0-J.js";
1
+ import { Tt as e, bt as t, ft as n, gt as r, lt as i } from "./features-CxHQG9xr.js";
2
+ import { D as a, E as o, J as s, P as c, U as l, a as u, j as d, w as f } from "./icons-DrsFvnNP.js";
3
3
  //#region src/utils/blockTypeIcons.ts
4
4
  var p = {
5
5
  section: s,
@@ -19,4 +19,4 @@ var p = {
19
19
  //#endregion
20
20
  export { p as t };
21
21
 
22
- //# sourceMappingURL=blockTypeIcons-Xz6OBq3U.js.map
22
+ //# sourceMappingURL=blockTypeIcons-CX05RINM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"blockTypeIcons-Xz6OBq3U.js","names":[],"sources":["../../../src/utils/blockTypeIcons.ts"],"sourcesContent":["import {\n Code,\n Columns3,\n Heading,\n Image,\n Minus,\n MoveVertical,\n Navigation,\n Pilcrow,\n Play,\n RectangleHorizontal,\n Share2,\n Table,\n Timer,\n} from \"@lucide/vue\";\nimport type { Component } from \"vue\";\n\nexport const blockTypeIcons: Record<string, Component> = {\n section: Columns3,\n title: Heading,\n paragraph: Pilcrow,\n image: Image,\n button: RectangleHorizontal,\n divider: Minus,\n video: Play,\n social: Share2,\n menu: Navigation,\n table: Table,\n spacer: MoveVertical,\n countdown: Timer,\n html: Code,\n};\n"],"mappings":";;;AAiBA,IAAa,IAA4C;CACvD,SAAS;CACT,OAAO;CACP,WAAW;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;CACX,MAAM;AACR"}
1
+ {"version":3,"file":"blockTypeIcons-CX05RINM.js","names":[],"sources":["../../../src/utils/blockTypeIcons.ts"],"sourcesContent":["import {\n Code,\n Columns3,\n Heading,\n Image,\n Minus,\n MoveVertical,\n Navigation,\n Pilcrow,\n Play,\n RectangleHorizontal,\n Share2,\n Table,\n Timer,\n} from \"@lucide/vue\";\nimport type { Component } from \"vue\";\n\nexport const blockTypeIcons: Record<string, Component> = {\n section: Columns3,\n title: Heading,\n paragraph: Pilcrow,\n image: Image,\n button: RectangleHorizontal,\n divider: Minus,\n video: Play,\n social: Share2,\n menu: Navigation,\n table: Table,\n spacer: MoveVertical,\n countdown: Timer,\n html: Code,\n};\n"],"mappings":";;;AAiBA,IAAa,IAA4C;CACvD,SAAS;CACT,OAAO;CACP,WAAW;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;CACX,MAAM;AACR"}
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.pnpm/@vue+shared@3.5.35/node_modules/@vue/shared/dist/shared.esm-bundler.js
1
+ //#region ../../node_modules/.pnpm/@vue+shared@3.5.38/node_modules/@vue/shared/dist/shared.esm-bundler.js
2
2
  // @__NO_SIDE_EFFECTS__
3
3
  function e(e) {
4
4
  let t = /* @__PURE__ */ Object.create(null);
@@ -900,25 +900,26 @@ function vn(e, n, i = t) {
900
900
  if (s && n) {
901
901
  let e = n;
902
902
  n = (...t) => {
903
- e(...t), S();
903
+ let n = e(...t);
904
+ return S(), n;
904
905
  };
905
906
  }
906
907
  let C = b ? Array(e.length).fill(mn) : mn, w = (e) => {
907
908
  if (!(!(m.flags & 1) || !m.dirty && !e)) if (n) {
908
- let e = m.run();
909
- if (o || y || (b ? e.some((e, t) => k(e, C[t])) : k(e, C))) {
909
+ let t = m.run();
910
+ if (e || o || y || (b ? t.some((e, t) => k(e, C[t])) : k(t, C))) {
910
911
  _ && _();
911
- let t = gn;
912
+ let e = gn;
912
913
  gn = m;
913
914
  try {
914
- let t = [
915
- e,
915
+ let e = [
916
+ t,
916
917
  C === mn ? void 0 : b && C[0] === mn ? [] : C,
917
918
  v
918
919
  ];
919
- C = e, f ? f(n, 3, t) : n(...t);
920
+ C = t, f ? f(n, 3, e) : n(...e);
920
921
  } finally {
921
- gn = t;
922
+ gn = e;
922
923
  }
923
924
  }
924
925
  } else m.run();
@@ -946,7 +947,7 @@ function yn(e, t = Infinity, n) {
946
947
  return e;
947
948
  }
948
949
  //#endregion
949
- //#region ../../node_modules/.pnpm/@vue+runtime-core@3.5.35/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js
950
+ //#region ../../node_modules/.pnpm/@vue+runtime-core@3.5.38/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js
950
951
  function bn(e, t, n, r) {
951
952
  try {
952
953
  return r ? e(...r) : e();
@@ -1534,18 +1535,24 @@ function Br(e) {
1534
1535
  l = null, Sn(t, e, 13, !r);
1535
1536
  };
1536
1537
  if (s && e.suspense || po) return p().then((t) => () => Vr(t, e)).catch((e) => (t(e), () => r ? z(r, { error: e }) : null));
1537
- let a = /* @__PURE__ */ Xt(!1), c = /* @__PURE__ */ Xt(), d = /* @__PURE__ */ Xt(!!i);
1538
- return i && setTimeout(() => {
1539
- d.value = !1;
1540
- }, i), o != null && setTimeout(() => {
1541
- if (!a.value && !c.value) {
1538
+ let a = /* @__PURE__ */ Xt(!1), c = /* @__PURE__ */ Xt(), d = /* @__PURE__ */ Xt(!!i), f, m;
1539
+ return ei(() => {
1540
+ f != null && clearTimeout(f), m != null && clearTimeout(m);
1541
+ }), i && (m = setTimeout(() => {
1542
+ e.isUnmounted || (d.value = !1);
1543
+ }, i)), o != null && (f = setTimeout(() => {
1544
+ if (!e.isUnmounted && !a.value && !c.value) {
1542
1545
  let e = /* @__PURE__ */ Error(`Async component timed out after ${o}ms.`);
1543
1546
  t(e), c.value = e;
1544
1547
  }
1545
- }, o), p().then(() => {
1546
- a.value = !0, e.parent && Hr(e.parent.vnode) && e.parent.update();
1547
- }).catch((e) => {
1548
- t(e), c.value = e;
1548
+ }, o)), p().then(() => {
1549
+ e.isUnmounted || (a.value = !0, e.parent && Hr(e.parent.vnode) && e.parent.update());
1550
+ }).catch((n) => {
1551
+ if (e.isUnmounted) {
1552
+ l = null;
1553
+ return;
1554
+ }
1555
+ t(n), c.value = n;
1549
1556
  }), () => {
1550
1557
  if (a.value && u) return Vr(u, e);
1551
1558
  if (c.value && r) return z(r, { error: c.value });
@@ -1955,8 +1962,8 @@ function zi(e, n, r = t) {
1955
1962
  set(e) {
1956
1963
  let s = r.set ? r.set(e) : e;
1957
1964
  if (!k(s, l) && !(u !== t && k(e, u))) return;
1958
- let f = i.vnode.props;
1959
- f && (n in f || a in f || o in f) && (`onUpdate:${n}` in f || `onUpdate:${a}` in f || `onUpdate:${o}` in f) || (l = e, c()), i.emit(`update:${n}`, s), k(e, s) && k(e, u) && !k(s, d) && c(), u = e, d = s;
1965
+ let f = i.vnode.props, p = !!(f && (n in f || a in f || o in f) && (`onUpdate:${n}` in f || `onUpdate:${a}` in f || `onUpdate:${o}` in f));
1966
+ p || (l = e, c()), i.emit(`update:${n}`, s), k(e, u) && (k(e, s) && !k(s, d) || p && u !== t && !k(s, l)) && c(), u = e, d = s;
1960
1967
  }
1961
1968
  };
1962
1969
  });
@@ -2965,7 +2972,7 @@ function Eo(e, t, n) {
2965
2972
  La(1);
2966
2973
  }
2967
2974
  }
2968
- var Do = "3.5.35", Oo = void 0, ko = typeof window < "u" && window.trustedTypes;
2975
+ var Do = "3.5.38", Oo = void 0, ko = typeof window < "u" && window.trustedTypes;
2969
2976
  if (ko) try {
2970
2977
  Oo = /* @__PURE__ */ ko.createPolicy("vue", { createHTML: (e) => e });
2971
2978
  } catch {}
@@ -4813,4 +4820,4 @@ var Vu = [
4813
4820
  //#endregion
4814
4821
  export { Zt as $, Xr as A, Xn as B, Eo as C, to as D, yi as E, fi as F, Ee as G, Un as H, oi as I, De as J, F as K, ci as L, Pa as M, Gn as N, jn as O, di as P, Vt as Q, zi as R, oo as S, Kn as T, pn as U, Hn as V, on as W, Bt as X, Rt as Y, Xt as Z, Xa as _, Rs as a, vn as at, Br as b, Gs as c, Se as ct, pr as d, P as et, To as f, za as g, Za as h, Ys as i, I as it, ei as j, $r as k, Us as l, Ba as m, Vo as n, tn as nt, Ls as o, me as ot, Ga as p, qt as q, Xs as r, en as rt, is as s, le as st, Hu as t, un as tt, ka as u, Ya as v, qn as w, jr as x, z as y, Qn as z };
4815
4822
 
4816
- //# sourceMappingURL=draggable-BTGr7_-X.js.map
4823
+ //# sourceMappingURL=draggable-iAb7QVJo.js.map