@templatical/editor 0.0.2 → 0.0.3
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.
- package/dist/{AiChatSidebar-XBj5Rw2l.js → AiChatSidebar-busJk9hm.js} +1 -1
- package/dist/{AiFeatureMenu-my1mZ9DL.js → AiFeatureMenu-DLGv_-pj.js} +3 -3
- package/dist/{CloudEditor-BVjgKwq3.js → CloudEditor-BDnHd6Um.js} +176 -197
- package/dist/{CollaboratorBar-BZq_Gv38.js → CollaboratorBar-Dv3l52vC.js} +2 -2
- package/dist/{CommentsSidebar-D9oxqO6l.js → CommentsSidebar-4tjp0VU5.js} +2 -2
- package/dist/{DesignReferenceSidebar-CyHq4SWt.js → DesignReferenceSidebar-CmwXvltV.js} +55 -54
- package/dist/{ModuleBrowserModal-Cus2Hdwl.js → ModuleBrowserModal-lrk3Fr0H.js} +6 -6
- package/dist/{ModulePreviewCanvas-DaByXKY_.js → ModulePreviewCanvas-BcBJLnwL.js} +3 -3
- package/dist/ParagraphEditor-DH8cSC6m.js +625 -0
- package/dist/{RichTextEditorContent-BRpjJ6SV.js → RichTextEditorContent-CQqodi7p.js} +3 -3
- package/dist/{SaveModuleDialog-BIZBQrd8.js → SaveModuleDialog-Bmzi72td.js} +4 -4
- package/dist/{SnapshotHistory-Ds1-QNbx.js → SnapshotHistory-AEgi9Xsn.js} +2 -2
- package/dist/{TemplateScoringPanel-C8XSk_Ys.js → TemplateScoringPanel-CTgMtc0-.js} +2 -2
- package/dist/{TestEmailModal-CCVfaFgV.js → TestEmailModal-Dpq1is9S.js} +3 -3
- package/dist/{TitleEditor-V4qaEULF.js → TitleEditor-CLcDdcWI.js} +7 -7
- package/dist/{TplModal-LT3FXlgs.js → TplModal-CGzRjR96.js} +2 -2
- package/dist/{blockTypeIcons-BujoY5Dl.js → blockTypeIcons-BpPTqcok.js} +1 -1
- package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js +3 -0
- package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js.map +1 -0
- package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js +2 -0
- package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js.map +1 -0
- package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js +3 -0
- package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js.map +1 -0
- package/dist/cdn/chunks/{extensions-BfjbWqOx.js → extensions-ea_ewKUl.js} +2 -2
- package/dist/cdn/chunks/{extensions-BfjbWqOx.js.map → extensions-ea_ewKUl.js.map} +1 -1
- package/dist/cdn/chunks/styleConstants-CNejCb-L.js +2 -0
- package/dist/cdn/chunks/{styleConstants-UTJ94gco.js.map → styleConstants-CNejCb-L.js.map} +1 -1
- package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js +2 -0
- package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js.map +1 -0
- package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js +2 -0
- package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js.map +1 -0
- package/dist/cdn/editor.js +1 -1
- package/dist/cdn/editor.js.map +1 -1
- package/dist/{dist-DNjZKe2Z.js → dist-DmpMJbmZ.js} +1 -1
- package/dist/{extensions-BA4NshZQ.js → extensions-CKM99njP.js} +3 -3
- package/dist/{i18n-ikyi28RU.js → i18n-CJsFtdbZ.js} +1 -1
- package/dist/keys-Dwa2PmdD.js +10 -0
- package/dist/{styleConstants-CgtFM9hQ.js → styleConstants-D4SOZGBV.js} +53 -2
- package/dist/{styles-hQgJKM4i.js → styles-DSw1VNU3.js} +592 -592
- package/dist/templatical-editor.css +1 -1
- package/dist/templatical-editor.js +5 -5
- package/dist/templatical-editor.umd.cjs +59 -59
- package/dist/{useEditorCore-DVp5qmtC.js → useEditorCore-Cc4RCwWq.js} +907 -903
- package/dist/{useI18n-DzH4KXDk.js → useI18n-DUirdXEX.js} +2 -2
- package/dist/{useMergeTag-D9zQVE-e.js → useMergeTag-DVnlvPYJ.js} +2 -2
- package/package.json +2 -2
- package/dist/ParagraphEditor-BSyk5B6S.js +0 -670
- package/dist/cdn/chunks/ParagraphEditor-BkJQO-ZW.js +0 -3
- package/dist/cdn/chunks/ParagraphEditor-BkJQO-ZW.js.map +0 -1
- package/dist/cdn/chunks/RichTextEditorContent-UGQorJm_.js +0 -2
- package/dist/cdn/chunks/RichTextEditorContent-UGQorJm_.js.map +0 -1
- package/dist/cdn/chunks/TitleEditor-CC3Adjai.js +0 -3
- package/dist/cdn/chunks/TitleEditor-CC3Adjai.js.map +0 -1
- package/dist/cdn/chunks/styleConstants-UTJ94gco.js +0 -2
- package/dist/cdn/chunks/useEditorCore-DRhPKq_z.js +0 -2
- package/dist/cdn/chunks/useEditorCore-DRhPKq_z.js.map +0 -1
- package/dist/cdn/chunks/useMergeTag-CBSlcqnk.js +0 -2
- package/dist/cdn/chunks/useMergeTag-CBSlcqnk.js.map +0 -1
- package/dist/keys-8B5MFafK.js +0 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { b as e } from "./useEditorCore-
|
|
2
|
-
import { C as t, x as n } from "./keys-
|
|
3
|
-
import { t as r } from "./useI18n-
|
|
4
|
-
import { a as i, i as a, n as o, r as s, t as c } from "./RichTextEditorContent-
|
|
1
|
+
import { b as e } from "./useEditorCore-Cc4RCwWq.js";
|
|
2
|
+
import { C as t, x as n } from "./keys-Dwa2PmdD.js";
|
|
3
|
+
import { t as r } from "./useI18n-DUirdXEX.js";
|
|
4
|
+
import { a as i, i as a, n as o, r as s, t as c } from "./RichTextEditorContent-CQqodi7p.js";
|
|
5
5
|
import { t as l } from "./loader-circle-BTQQxC3l.js";
|
|
6
6
|
import { t as u } from "./scan-line-7lZPfOdm.js";
|
|
7
7
|
import { Fragment as d, Teleport as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as _, createVNode as v, defineComponent as y, inject as b, isRef as x, normalizeClass as S, normalizeStyle as C, openBlock as w, toDisplayString as T, unref as E } from "vue";
|
|
@@ -20,17 +20,17 @@ var D = { class: "tpl-text-editor-wrapper tpl:relative" }, O = ["data-tpl-theme"
|
|
|
20
20
|
},
|
|
21
21
|
emits: ["done"],
|
|
22
22
|
setup(y, { emit: P }) {
|
|
23
|
-
let F = y, I = P, L = b(n), R = b(t), { t: z } = r(), { editor: B, EditorContent: V, isLoading: H, initError: U, retry: W, showLinkDialog: G, linkUrl: K, linkDialogRef: q, mergeTagEnabled: J, openLinkDialog: Y, insertLink: X, removeLink: Z, closeLinkDialog: Q, handleLinkKeydown: te, handleAddMergeTag: $ } = e({
|
|
23
|
+
let F = y, I = P, L = b(n, null), R = b(t, null), { t: z } = r(), { editor: B, EditorContent: V, isLoading: H, initError: U, retry: W, showLinkDialog: G, linkUrl: K, linkDialogRef: q, mergeTagEnabled: J, openLinkDialog: Y, insertLink: X, removeLink: Z, closeLinkDialog: Q, handleLinkKeydown: te, handleAddMergeTag: $ } = e({
|
|
24
24
|
blockId: () => F.block.id,
|
|
25
25
|
blockContent: () => F.block.content,
|
|
26
26
|
onDone: () => I("done"),
|
|
27
27
|
editorName: "TitleEditor",
|
|
28
28
|
async loadExtensions({ mergeTags: e, syntax: t }) {
|
|
29
29
|
let [{ Editor: n, EditorContent: r }, { default: i }, { default: a }, { MergeTagNode: o, LogicMergeTagNode: s }] = await Promise.all([
|
|
30
|
-
import("./dist-
|
|
30
|
+
import("./dist-DmpMJbmZ.js").then((e) => e.r),
|
|
31
31
|
import("./dist-DysAFIPy.js"),
|
|
32
32
|
import("./dist-Bu7veieH.js"),
|
|
33
|
-
import("./extensions-
|
|
33
|
+
import("./extensions-CKM99njP.js")
|
|
34
34
|
]);
|
|
35
35
|
return {
|
|
36
36
|
TiptapEditor: n,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { w as e } from "./useEditorCore-
|
|
2
|
-
import { C as t } from "./keys-
|
|
1
|
+
import { w as e } from "./useEditorCore-Cc4RCwWq.js";
|
|
2
|
+
import { C as t } from "./keys-Dwa2PmdD.js";
|
|
3
3
|
import { Teleport as n, Transition as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createVNode as l, defineComponent as u, inject as d, openBlock as f, ref as p, renderSlot as m, unref as h, withCtx as g, withModifiers as _ } from "vue";
|
|
4
4
|
//#region src/cloud/components/TplModal.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var v = ["data-tpl-theme"], y = /* @__PURE__ */ u({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as e, E as t, M as n, O as r, k as i } from "./useEditorCore-
|
|
1
|
+
import { D as e, E as t, M as n, O as r, k as i } from "./useEditorCore-Cc4RCwWq.js";
|
|
2
2
|
import { n as a } from "./_plugin-vue_export-helper-B1-bu7yR.js";
|
|
3
3
|
var o = a("columns-3", [
|
|
4
4
|
["rect", {
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunks/dist-BKSzrf0L.js","chunks/tiptap-Cya4P9CN.js","chunks/icons-vmLJTaJk.js","chunks/draggable-ClUwYCFL.js","chunks/rolldown-runtime-BakkzWXw.js","chunks/dist-B5JI9nIg.js","chunks/dist-0UheN8rK.js","chunks/dist-55mmbGQ9.js","chunks/dist-BL8c5gYQ.js","chunks/dist-DxZbPJYt.js","chunks/dist-B93vLKhU.js","chunks/dist-BDt3FJvj.js","chunks/dist-BJRuFHmi.js","chunks/dist-B31mxKyP.js","chunks/dist-CYThWMP5.js","chunks/extensions-ea_ewKUl.js","chunks/useMergeTag-DVOz1v9p.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{E as e,F as t,G as n,K as r,W as i,c as a,d as o,f as s,g as c,h as l,m as u,p as d,q as f,s as p,u as m,w as h,y as g}from"./draggable-ClUwYCFL.js";import{_,a as v,c as y,d as b,f as x,g as S,h as C,i as ee,l as w,m as T,n as te,o as ne,p as re,r as E,s as D,u as O}from"./icons-vmLJTaJk.js";import{c as k,d as A,i as j,n as M,u as N}from"./useMergeTag-DVOz1v9p.js";import{n as P,r as F,t as I}from"./useEditorCore-CwuxQuvh.js";import{a as ie,i as ae,r as L}from"./styleConstants-CNejCb-L.js";import{n as R,t as z}from"./RichTextEditorContent-BUD9veXd.js";var B={class:`tpl:relative`},V=[`aria-label`,`title`],H={key:0,class:`tpl-emoji-picker tpl:absolute tpl:top-full tpl:left-0 tpl:z-10 tpl:mt-2 tpl:w-72 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-2 tpl:shadow-lg`},U={class:`tpl:mb-1.5 tpl:text-[10px] tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase`},W={class:`tpl:grid tpl:grid-cols-10 tpl:gap-0.5`},G=[`onClick`],K=c({__name:`EmojiPickerDropdown`,emits:[`insert`],setup(t,{emit:r}){let a=r,{categories:o,isOpen:c,toggle:u}=P(),{t:g}=M();return(t,r)=>(h(),d(`div`,B,[m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":i(c)}]),"aria-label":i(g).paragraphEditor.insertEmoji,title:i(g).paragraphEditor.insertEmoji,onClick:r[0]||=(...e)=>i(u)&&i(u)(...e)},[l(i(w),{size:16,"stroke-width":2})],10,V),i(c)?(h(),d(`div`,H,[(h(!0),d(p,null,e(i(o),t=>(h(),d(`div`,{key:t.key,class:`tpl:mb-2 tpl:last:mb-0`},[m(`div`,U,f(i(g).emoji[t.key]),1),m(`div`,W,[(h(!0),d(p,null,e(t.emojis,e=>(h(),d(`button`,{key:e,type:`button`,class:`tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:border-none tpl:bg-transparent tpl:text-base tpl:transition-all tpl:duration-100 tpl:hover:scale-125 tpl:hover:bg-[var(--tpl-bg-active)]`,onClick:t=>a(`insert`,e)},f(e),9,G))),128))])]))),128))])):s(``,!0)]))}}),q=[`data-tpl-theme`,`aria-label`],J={class:`tpl:flex tpl:items-center tpl:gap-1`},oe=[`value`,`aria-label`,`title`],se={value:``},ce=[`value`],le=[`value`,`aria-label`,`title`],ue={value:``},Y=[`value`],de={class:`tpl:relative`},fe=[`value`,`aria-label`,`title`],pe={class:`tpl:relative`},me=[`value`,`aria-label`,`title`],he=[`aria-label`,`title`],ge=[`aria-label`,`title`],_e=[`aria-label`,`title`],ve=[`aria-label`,`title`],ye=[`aria-label`,`title`],be=[`aria-label`,`title`],xe=[`aria-label`,`title`],Se={class:`tpl:flex tpl:items-center tpl:gap-1`},Ce=[`aria-label`,`title`],we=[`aria-label`,`title`],Te=[`aria-label`,`title`],Ee=[`aria-label`,`title`],De=[`aria-label`,`title`],Oe=[`value`,`title`],ke=[`value`],Ae=[`value`,`title`],je=[`value`],Me=[`aria-label`,`title`],Ne={key:0,class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`},Pe=[`aria-label`,`title`],Fe={key:1,class:`tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]`},X=c({__name:`ParagraphToolbar`,props:{editor:{},toolbarPosition:{},isLoading:{type:Boolean},mergeTagEnabled:{type:Boolean}},emits:[`open-link-dialog`,`add-merge-tag`],setup(t,{emit:c}){let w=t,P=c,F=g(k,null),I=g(N,null),R=A(j,`ParagraphToolbar`),{t:z}=M(),B=R.fonts;function V(e){w.editor?.chain().focus().insertContent(e).run()}function H(){return w.editor?.getAttributes(`textStyle`).fontFamily||``}function U(){return w.editor?.getAttributes(`textStyle`).fontSize||``}function W(){return w.editor?.getAttributes(`textStyle`).color||``}function G(e){e?w.editor?.chain().focus().setFontFamily(e).run():w.editor?.chain().focus().unsetFontFamily().run()}function X(e){e?w.editor?.chain().focus().setFontSize(e).run():w.editor?.chain().focus().unsetFontSize().run()}function Z(e){e?w.editor?.chain().focus().setColor(e).run():w.editor?.chain().focus().unsetColor().run()}function Q(){return w.editor?.getAttributes(`paragraph`).lineHeight||``}function Ie(e){e?w.editor?.chain().focus().setLineHeight(e).run():w.editor?.chain().focus().unsetLineHeight().run()}function Le(){return w.editor?.getAttributes(`textStyle`).letterSpacing||``}function Re(e){e&&e!==`normal`?w.editor?.chain().focus().setLetterSpacing(e).run():w.editor?.chain().focus().unsetLetterSpacing().run()}function $(){return w.editor?.getAttributes(`highlight`).color||``}function ze(e){e?w.editor?.chain().focus().setHighlight({color:e}).run():w.editor?.chain().focus().unsetHighlight().run()}return(c,g)=>(h(),o(a,{to:`body`},[m(`div`,{"data-tpl-theme":i(I),role:`toolbar`,"aria-label":i(z).paragraphEditor.toolbar,class:`tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex 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`,style:r({...i(F),top:`${t.toolbarPosition.top}px`,left:`${t.toolbarPosition.left}px`,transform:`translateY(-100%)`,flexDirection:`column`})},[!t.isLoading&&t.editor?(h(),d(p,{key:0},[m(`div`,J,[m(`select`,{class:`tpl:h-8 tpl:w-32 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none`,value:H(),"aria-label":i(z).paragraphEditor.fontFamily,title:i(z).paragraphEditor.fontFamily,onChange:g[0]||=e=>G(e.target.value)},[m(`option`,se,f(i(z).paragraphEditor.defaultFont),1),(h(!0),d(p,null,e(i(B),e=>(h(),d(`option`,{key:e.value,value:e.value},f(e.label),9,ce))),128))],40,oe),m(`select`,{class:`tpl:h-8 tpl:w-20 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none`,value:U(),"aria-label":i(z).paragraphEditor.fontSize,title:i(z).paragraphEditor.fontSize,onChange:g[1]||=e=>X(e.target.value)},[m(`option`,ue,f(i(z).paragraphEditor.defaultSize),1),(h(!0),d(p,null,e(i(L),e=>(h(),d(`option`,{key:e,value:e},f(e),9,Y))),128))],40,le),g[20]||=m(`span`,{class:`tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`div`,de,[m(`input`,{type:`color`,class:`tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-1`,value:W()||i(`#000000`),"aria-label":i(z).paragraphEditor.textColor,title:i(z).paragraphEditor.textColor,onInput:g[2]||=e=>Z(e.target.value)},null,40,fe)]),m(`div`,pe,[m(`input`,{type:`color`,class:`tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:p-1`,style:r({backgroundColor:$()||`var(--tpl-bg)`}),value:$()||i(`#ffff00`),"aria-label":i(z).paragraphEditor.highlightColor,title:i(z).paragraphEditor.highlightColor,onInput:g[3]||=e=>ze(e.target.value)},null,44,me)]),g[21]||=m(`span`,{class:`tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`bold`)}]),"aria-label":i(z).paragraphEditor.bold,title:i(z).paragraphEditor.bold,onClick:g[4]||=e=>t.editor?.chain().focus().toggleBold().run()},[l(i(_),{size:16,"stroke-width":2.5})],10,he),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`italic`)}]),"aria-label":i(z).paragraphEditor.italic,title:i(z).paragraphEditor.italic,onClick:g[5]||=e=>t.editor?.chain().focus().toggleItalic().run()},[l(i(S),{size:16,"stroke-width":2})],10,ge),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`underline`)}]),"aria-label":i(z).paragraphEditor.underline,title:i(z).paragraphEditor.underline,onClick:g[6]||=e=>t.editor?.chain().focus().toggleUnderline().run()},[l(i(te),{size:16,"stroke-width":2})],10,_e),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`strike`)}]),"aria-label":i(z).paragraphEditor.strikethrough,title:i(z).paragraphEditor.strikethrough,onClick:g[7]||=e=>t.editor?.chain().focus().toggleStrike().run()},[l(i(y),{size:16,"stroke-width":2})],10,ve),g[22]||=m(`span`,{class:`tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`subscript`)}]),"aria-label":i(z).paragraphEditor.subscript,title:i(z).paragraphEditor.subscript,onClick:g[8]||=e=>t.editor?.chain().focus().toggleSubscript().run()},[l(i(D),{size:16,"stroke-width":2})],10,ye),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`superscript`)}]),"aria-label":i(z).paragraphEditor.superscript,title:i(z).paragraphEditor.superscript,onClick:g[9]||=e=>t.editor?.chain().focus().toggleSuperscript().run()},[l(i(ne),{size:16,"stroke-width":2})],10,be),g[23]||=m(`span`,{class:`tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`link`)}]),"aria-label":i(z).paragraphEditor.addLink,title:i(z).paragraphEditor.addLink,onClick:g[10]||=e=>P(`open-link-dialog`)},[l(i(C),{size:16,"stroke-width":2})],10,xe)]),m(`div`,Se,[m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`bulletList`)}]),"aria-label":i(z).paragraphEditor.bulletList,title:i(z).paragraphEditor.bulletList,onClick:g[11]||=e=>t.editor?.chain().focus().toggleBulletList().run()},[l(i(re),{size:16,"stroke-width":2})],10,Ce),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive(`orderedList`)}]),"aria-label":i(z).paragraphEditor.numberedList,title:i(z).paragraphEditor.numberedList,onClick:g[12]||=e=>t.editor?.chain().focus().toggleOrderedList().run()},[l(i(T),{size:16,"stroke-width":2})],10,we),g[26]||=m(`span`,{class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive({textAlign:`left`})}]),"aria-label":i(z).paragraphEditor.alignLeft,title:i(z).paragraphEditor.alignLeft,onClick:g[13]||=e=>t.editor?.chain().focus().setTextAlign(`left`).run()},[l(i(E),{size:16,"stroke-width":2})],10,Te),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive({textAlign:`center`})}]),"aria-label":i(z).paragraphEditor.alignCenter,title:i(z).paragraphEditor.alignCenter,onClick:g[14]||=e=>t.editor?.chain().focus().setTextAlign(`center`).run()},[l(i(v),{size:16,"stroke-width":2})],10,Ee),m(`button`,{type:`button`,class:n([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":t.editor?.isActive({textAlign:`right`})}]),"aria-label":i(z).paragraphEditor.alignRight,title:i(z).paragraphEditor.alignRight,onClick:g[15]||=e=>t.editor?.chain().focus().setTextAlign(`right`).run()},[l(i(ee),{size:16,"stroke-width":2})],10,De),g[27]||=m(`span`,{class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`select`,{class:`tpl:h-8 tpl:w-16 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-1 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none`,value:Q(),title:i(z).paragraphEditor.lineHeight,onChange:g[16]||=e=>Ie(e.target.value)},[g[24]||=m(`option`,{value:``},`LH`,-1),(h(!0),d(p,null,e(i(ie),e=>(h(),d(`option`,{key:e,value:e},f(e),9,ke))),128))],40,Oe),m(`select`,{class:`tpl:h-8 tpl:w-20 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-1 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none`,value:Le(),title:i(z).paragraphEditor.letterSpacing,onChange:g[17]||=e=>Re(e.target.value)},[g[25]||=m(`option`,{value:``},`LS`,-1),(h(!0),d(p,null,e(i(ae),e=>(h(),d(`option`,{key:e.value,value:e.value},f(e.label),9,je))),128))],40,Ae),g[28]||=m(`span`,{class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),m(`button`,{type:`button`,class:`tpl-text-toolbar-btn`,"aria-label":i(z).paragraphEditor.clearFormatting,title:i(z).paragraphEditor.clearFormatting,onClick:g[18]||=e=>t.editor?.chain().focus().clearNodes().unsetAllMarks().run()},[l(i(b),{size:16,"stroke-width":2})],8,Me),g[29]||=m(`span`,{class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),l(K,{onInsert:V}),t.mergeTagEnabled?(h(),d(`span`,Ne)):s(``,!0),t.mergeTagEnabled?(h(),d(`button`,{key:1,type:`button`,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)]`,"aria-label":i(z).mergeTag.add,title:i(z).mergeTag.add,onClick:g[19]||=e=>P(`add-merge-tag`)},[l(i(O),{size:16,"stroke-width":2}),u(` `+f(i(z).mergeTag.add),1)],8,Pe)):s(``,!0)])],64)):(h(),d(`div`,Fe,[l(i(x),{class:`tpl-spinner`,size:14,"stroke-width":2}),u(` `+f(i(z).errors.editorLoading),1)]))],12,q)]))}}),Z={class:`tpl-text-editor-wrapper tpl:relative`},Q=c({__name:`ParagraphEditor`,props:{block:{},toolbarPosition:{}},emits:[`done`],setup(e,{emit:n}){let r=e,a=n,{editor:o,EditorContent:s,isLoading:c,initError:u,retry:f,showLinkDialog:p,linkUrl:m,linkDialogRef:g,mergeTagEnabled:_,openLinkDialog:v,insertLink:y,removeLink:b,closeLinkDialog:x,handleLinkKeydown:S,handleAddMergeTag:C}=I({blockId:()=>r.block.id,blockContent:()=>r.block.content,onDone:()=>a(`done`),editorName:`ParagraphEditor`,async loadExtensions({mergeTags:e,syntax:t}){let[{Editor:n,EditorContent:r},{default:i},{default:a},{default:o},{default:s},{default:c},{default:l},{TextStyle:u},{default:d},{default:f},{default:p},{MergeTagNode:m,LogicMergeTagNode:h,FontSize:g,LineHeight:_,LetterSpacing:v}]=await Promise.all([F(()=>import(`./dist-BKSzrf0L.js`),__vite__mapDeps([0,1,2,3,4])),F(()=>import(`./dist-B5JI9nIg.js`),__vite__mapDeps([5,1,2,3,4])),F(()=>import(`./dist-0UheN8rK.js`),__vite__mapDeps([6,1,2,3,4])),F(()=>import(`./dist-55mmbGQ9.js`),__vite__mapDeps([7,1,2,3,4])),F(()=>import(`./dist-BL8c5gYQ.js`),__vite__mapDeps([8,1,2,3,4])),F(()=>import(`./dist-DxZbPJYt.js`),__vite__mapDeps([9,1,2,3,4])),F(()=>import(`./dist-B93vLKhU.js`),__vite__mapDeps([10,1,2,3,4])),F(()=>import(`./dist-BDt3FJvj.js`),__vite__mapDeps([11,1,2,3,4])),F(()=>import(`./dist-BJRuFHmi.js`),__vite__mapDeps([12,1,2,3,4])),F(()=>import(`./dist-B31mxKyP.js`),__vite__mapDeps([13,1,2,3,4])),F(()=>import(`./dist-CYThWMP5.js`),__vite__mapDeps([14,1,2,3,4])),F(()=>import(`./extensions-ea_ewKUl.js`),__vite__mapDeps([15,2,3,4,1,16]))]);return{TiptapEditor:n,EC:r,extensions:[i.configure({heading:!1,codeBlock:!1,blockquote:!1,horizontalRule:!1}),o,s,c,a.configure({openOnClick:!1,HTMLAttributes:{target:`_blank`,rel:`noopener noreferrer`}}),l.configure({types:[`paragraph`]}),u,d,f,p.configure({multicolor:!0}),g,_,v,m.configure({mergeTags:e,syntax:t}),h.configure({syntax:t})]}}});return(n,r)=>(h(),d(`div`,Z,[l(X,{editor:i(o),"toolbar-position":e.toolbarPosition,"is-loading":i(c),"merge-tag-enabled":i(_),onOpenLinkDialog:i(v),onAddMergeTag:i(C)},null,8,[`editor`,`toolbar-position`,`is-loading`,`merge-tag-enabled`,`onOpenLinkDialog`,`onAddMergeTag`]),l(z,{editor:i(o),"editor-content":i(s),"is-loading":i(c),"init-error":i(u),onRetry:i(f)},null,8,[`editor`,`editor-content`,`is-loading`,`init-error`,`onRetry`]),l(R,{visible:i(p),"is-editing-link":i(o)?.isActive(`link`)??!1,"dialog-ref":i(g),"onUpdate:dialogRef":r[0]||=e=>t(g)?g.value=e:null,"link-url":i(m),"onUpdate:linkUrl":r[1]||=e=>t(m)?m.value=e:null,onClose:i(x),onInsert:i(y),onRemove:i(b),onKeydown:i(S)},null,8,[`visible`,`is-editing-link`,`dialog-ref`,`link-url`,`onClose`,`onInsert`,`onRemove`,`onKeydown`])]))}});export{Q as default};
|
|
3
|
+
//# sourceMappingURL=ParagraphEditor-CCtWbGDv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/blocks/EmojiPickerDropdown.vue","../../../src/components/blocks/ParagraphToolbar.vue","../../../src/components/blocks/ParagraphEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useEmoji, useI18n } from \"../../composables\";\nimport { Smile } from \"@lucide/vue\";\n\nconst emit = defineEmits<{\n (e: \"insert\", emoji: string): void;\n}>();\n\nconst {\n categories: emojiCategories,\n isOpen: showEmojiPicker,\n toggle: toggleEmojiPicker,\n} = useEmoji();\n\nconst { t } = useI18n();\n</script>\n\n<template>\n <div class=\"tpl:relative\">\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': showEmojiPicker,\n }\"\n :aria-label=\"t.paragraphEditor.insertEmoji\"\n :title=\"t.paragraphEditor.insertEmoji\"\n @click=\"toggleEmojiPicker\"\n >\n <Smile :size=\"16\" :stroke-width=\"2\" />\n </button>\n <div\n v-if=\"showEmojiPicker\"\n class=\"tpl-emoji-picker tpl:absolute tpl:top-full tpl:left-0 tpl:z-10 tpl:mt-2 tpl:w-72 tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-2 tpl:shadow-lg\"\n >\n <div\n v-for=\"category in emojiCategories\"\n :key=\"category.key\"\n class=\"tpl:mb-2 tpl:last:mb-0\"\n >\n <div\n class=\"tpl:mb-1.5 tpl:text-[10px] tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase\"\n >\n {{ t.emoji[category.key] }}\n </div>\n <div class=\"tpl:grid tpl:grid-cols-10 tpl:gap-0.5\">\n <button\n v-for=\"emoji in category.emojis\"\n :key=\"emoji\"\n type=\"button\"\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:border-none tpl:bg-transparent tpl:text-base tpl:transition-all tpl:duration-100 tpl:hover:scale-125 tpl:hover:bg-[var(--tpl-bg-active)]\"\n @click=\"emit('insert', emoji)\"\n >\n {{ emoji }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport EmojiPickerDropdown from \"./EmojiPickerDropdown.vue\";\nimport { useI18n } from \"../../composables\";\nimport type { Editor } from \"@tiptap/core\";\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n Bold,\n Italic,\n Link,\n List,\n ListOrdered,\n LoaderCircle,\n RemoveFormatting,\n ScanLine,\n Strikethrough,\n Subscript,\n Superscript,\n Underline,\n} from \"@lucide/vue\";\nimport { inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n FONTS_MANAGER_KEY,\n requireInject,\n} from \"../../keys\";\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_HIGHLIGHT_COLOR,\n FONT_SIZE_OPTIONS,\n LINE_HEIGHT_OPTIONS,\n LETTER_SPACING_OPTIONS,\n} from \"../../constants/styleConstants\";\n\nconst props = defineProps<{\n editor: Editor | null;\n toolbarPosition: { top: number; left: number };\n isLoading: boolean;\n mergeTagEnabled: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"open-link-dialog\"): void;\n (e: \"add-merge-tag\"): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst fontsManager = requireInject(FONTS_MANAGER_KEY, \"ParagraphToolbar\");\n\nconst { t } = useI18n();\n\nconst fontFamilies = fontsManager.fonts;\n\nfunction insertEmoji(emoji: string): void {\n props.editor?.chain().focus().insertContent(emoji).run();\n}\n\nfunction getCurrentFontFamily(): string {\n return (props.editor?.getAttributes(\"textStyle\").fontFamily as string) || \"\";\n}\n\nfunction getCurrentFontSize(): string {\n return (props.editor?.getAttributes(\"textStyle\").fontSize as string) || \"\";\n}\n\nfunction getCurrentColor(): string {\n return (props.editor?.getAttributes(\"textStyle\").color as string) || \"\";\n}\n\nfunction setFontFamily(family: string): void {\n if (family) {\n props.editor?.chain().focus().setFontFamily(family).run();\n } else {\n props.editor?.chain().focus().unsetFontFamily().run();\n }\n}\n\nfunction setFontSize(size: string): void {\n if (size) {\n props.editor?.chain().focus().setFontSize(size).run();\n } else {\n props.editor?.chain().focus().unsetFontSize().run();\n }\n}\n\nfunction setColor(color: string): void {\n if (color) {\n props.editor?.chain().focus().setColor(color).run();\n } else {\n props.editor?.chain().focus().unsetColor().run();\n }\n}\n\nfunction getCurrentLineHeight(): string {\n return (props.editor?.getAttributes(\"paragraph\").lineHeight as string) || \"\";\n}\n\nfunction setLineHeight(value: string): void {\n if (value) {\n props.editor?.chain().focus().setLineHeight(value).run();\n } else {\n props.editor?.chain().focus().unsetLineHeight().run();\n }\n}\n\nfunction getCurrentLetterSpacing(): string {\n return (\n (props.editor?.getAttributes(\"textStyle\").letterSpacing as string) || \"\"\n );\n}\n\nfunction setLetterSpacing(value: string): void {\n if (value && value !== \"normal\") {\n props.editor?.chain().focus().setLetterSpacing(value).run();\n } else {\n props.editor?.chain().focus().unsetLetterSpacing().run();\n }\n}\n\nfunction getCurrentHighlight(): string {\n return (props.editor?.getAttributes(\"highlight\").color as string) || \"\";\n}\n\nfunction setHighlight(color: string): void {\n if (color) {\n props.editor?.chain().focus().setHighlight({ color }).run();\n } else {\n props.editor?.chain().focus().unsetHighlight().run();\n }\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :data-tpl-theme=\"tplUiTheme\"\n role=\"toolbar\"\n :aria-label=\"t.paragraphEditor.toolbar\"\n class=\"tpl tpl-text-toolbar tpl:fixed tpl:z-popover tpl:flex 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 flexDirection: 'column',\n }\"\n >\n <template v-if=\"!isLoading && editor\">\n <!-- Row 1: Font family, Font size, Text color, Bold/Italic/Underline/Strikethrough -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-1\">\n <select\n class=\"tpl:h-8 tpl:w-32 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none\"\n :value=\"getCurrentFontFamily()\"\n :aria-label=\"t.paragraphEditor.fontFamily\"\n :title=\"t.paragraphEditor.fontFamily\"\n @change=\"setFontFamily(($event.target as HTMLSelectElement).value)\"\n >\n <option value=\"\">{{ t.paragraphEditor.defaultFont }}</option>\n <option\n v-for=\"font in fontFamilies\"\n :key=\"font.value\"\n :value=\"font.value\"\n >\n {{ font.label }}\n </option>\n </select>\n <select\n class=\"tpl:h-8 tpl:w-20 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none\"\n :value=\"getCurrentFontSize()\"\n :aria-label=\"t.paragraphEditor.fontSize\"\n :title=\"t.paragraphEditor.fontSize\"\n @change=\"setFontSize(($event.target as HTMLSelectElement).value)\"\n >\n <option value=\"\">{{ t.paragraphEditor.defaultSize }}</option>\n <option v-for=\"size in FONT_SIZE_OPTIONS\" :key=\"size\" :value=\"size\">\n {{ size }}\n </option>\n </select>\n <span\n class=\"tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <div class=\"tpl:relative\">\n <input\n type=\"color\"\n class=\"tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-1\"\n :value=\"getCurrentColor() || DEFAULT_TEXT_COLOR\"\n :aria-label=\"t.paragraphEditor.textColor\"\n :title=\"t.paragraphEditor.textColor\"\n @input=\"setColor(($event.target as HTMLInputElement).value)\"\n />\n </div>\n <div class=\"tpl:relative\">\n <input\n type=\"color\"\n class=\"tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:p-1\"\n :style=\"{\n backgroundColor: getCurrentHighlight() || 'var(--tpl-bg)',\n }\"\n :value=\"getCurrentHighlight() || DEFAULT_HIGHLIGHT_COLOR\"\n :aria-label=\"t.paragraphEditor.highlightColor\"\n :title=\"t.paragraphEditor.highlightColor\"\n @input=\"setHighlight(($event.target as HTMLInputElement).value)\"\n />\n </div>\n <span\n class=\"tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Bold/Italic/Underline/Strikethrough -->\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.paragraphEditor.bold\"\n :title=\"t.paragraphEditor.bold\"\n @click=\"editor?.chain().focus().toggleBold().run()\"\n >\n <Bold :size=\"16\" :stroke-width=\"2.5\" />\n </button>\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.paragraphEditor.italic\"\n :title=\"t.paragraphEditor.italic\"\n @click=\"editor?.chain().focus().toggleItalic().run()\"\n >\n <Italic :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('underline'),\n }\"\n :aria-label=\"t.paragraphEditor.underline\"\n :title=\"t.paragraphEditor.underline\"\n @click=\"editor?.chain().focus().toggleUnderline().run()\"\n >\n <Underline :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('strike'),\n }\"\n :aria-label=\"t.paragraphEditor.strikethrough\"\n :title=\"t.paragraphEditor.strikethrough\"\n @click=\"editor?.chain().focus().toggleStrike().run()\"\n >\n <Strikethrough :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n aria-hidden=\"true\"\n ></span>\n <!-- Subscript/Superscript -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('subscript'),\n }\"\n :aria-label=\"t.paragraphEditor.subscript\"\n :title=\"t.paragraphEditor.subscript\"\n @click=\"editor?.chain().focus().toggleSubscript().run()\"\n >\n <Subscript :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('superscript'),\n }\"\n :aria-label=\"t.paragraphEditor.superscript\"\n :title=\"t.paragraphEditor.superscript\"\n @click=\"editor?.chain().focus().toggleSuperscript().run()\"\n >\n <Superscript :size=\"16\" :stroke-width=\"2\" />\n </button>\n <span\n class=\"tpl:mx-1 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.paragraphEditor.addLink\"\n :title=\"t.paragraphEditor.addLink\"\n @click=\"emit('open-link-dialog')\"\n >\n <Link :size=\"16\" :stroke-width=\"2\" />\n </button>\n </div>\n <!-- Row 2: Lists, Alignment, LH, LS, Clear, Emoji, Merge tags -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-1\">\n <!-- Lists -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('bulletList'),\n }\"\n :aria-label=\"t.paragraphEditor.bulletList\"\n :title=\"t.paragraphEditor.bulletList\"\n @click=\"editor?.chain().focus().toggleBulletList().run()\"\n >\n <List :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive('orderedList'),\n }\"\n :aria-label=\"t.paragraphEditor.numberedList\"\n :title=\"t.paragraphEditor.numberedList\"\n @click=\"editor?.chain().focus().toggleOrderedList().run()\"\n >\n <ListOrdered :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 <!-- Alignment -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive({\n textAlign: 'left',\n }),\n }\"\n :aria-label=\"t.paragraphEditor.alignLeft\"\n :title=\"t.paragraphEditor.alignLeft\"\n @click=\"editor?.chain().focus().setTextAlign('left').run()\"\n >\n <AlignLeft :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive({\n textAlign: 'center',\n }),\n }\"\n :aria-label=\"t.paragraphEditor.alignCenter\"\n :title=\"t.paragraphEditor.alignCenter\"\n @click=\"editor?.chain().focus().setTextAlign('center').run()\"\n >\n <AlignCenter :size=\"16\" :stroke-width=\"2\" />\n </button>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{\n 'tpl-text-toolbar-btn--active': editor?.isActive({\n textAlign: 'right',\n }),\n }\"\n :aria-label=\"t.paragraphEditor.alignRight\"\n :title=\"t.paragraphEditor.alignRight\"\n @click=\"editor?.chain().focus().setTextAlign('right').run()\"\n >\n <AlignRight :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 <!-- Line Height -->\n <select\n class=\"tpl:h-8 tpl:w-16 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-1 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none\"\n :value=\"getCurrentLineHeight()\"\n :title=\"t.paragraphEditor.lineHeight\"\n @change=\"setLineHeight(($event.target as HTMLSelectElement).value)\"\n >\n <option value=\"\">LH</option>\n <option v-for=\"lh in LINE_HEIGHT_OPTIONS\" :key=\"lh\" :value=\"lh\">\n {{ lh }}\n </option>\n </select>\n <!-- Letter Spacing -->\n <select\n class=\"tpl:h-8 tpl:w-20 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-1 tpl:text-xs tpl:text-[var(--tpl-text)] tpl:outline-none\"\n :value=\"getCurrentLetterSpacing()\"\n :title=\"t.paragraphEditor.letterSpacing\"\n @change=\"\n setLetterSpacing(($event.target as HTMLSelectElement).value)\n \"\n >\n <option value=\"\">LS</option>\n <option\n v-for=\"ls in LETTER_SPACING_OPTIONS\"\n :key=\"ls.value\"\n :value=\"ls.value\"\n >\n {{ ls.label }}\n </option>\n </select>\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 <!-- Clear Formatting -->\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :aria-label=\"t.paragraphEditor.clearFormatting\"\n :title=\"t.paragraphEditor.clearFormatting\"\n @click=\"editor?.chain().focus().clearNodes().unsetAllMarks().run()\"\n >\n <RemoveFormatting :size=\"16\" :stroke-width=\"2\" />\n </button>\n <!-- Emoji Picker -->\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 <EmojiPickerDropdown @insert=\"insertEmoji\" />\n <!-- Add Merge Tag -->\n <span\n v-if=\"mergeTagEnabled\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"mergeTagEnabled\"\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.add\"\n :title=\"t.mergeTag.add\"\n @click=\"emit('add-merge-tag')\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.add }}\n </button>\n </div>\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</template>\n","<script setup lang=\"ts\">\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport type { ParagraphBlock as ParagraphBlockType } from \"@templatical/types\";\nimport ParagraphToolbar from \"./ParagraphToolbar.vue\";\nimport RichTextLinkDialog from \"./RichTextLinkDialog.vue\";\nimport RichTextEditorContent from \"./RichTextEditorContent.vue\";\n\nconst props = defineProps<{\n block: ParagraphBlockType;\n toolbarPosition: { top: number; left: number };\n}>();\n\nconst emit = defineEmits<{\n (e: \"done\"): void;\n}>();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n mergeTagEnabled,\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: \"ParagraphEditor\",\n async loadExtensions({ mergeTags, syntax }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { default: UnderlineExt },\n { default: SubscriptExt },\n { default: SuperscriptExt },\n { default: TextAlign },\n { TextStyle },\n { default: Color },\n { default: FontFamily },\n { default: Highlight },\n { MergeTagNode, LogicMergeTagNode, FontSize, LineHeight, LetterSpacing },\n ] = await Promise.all([\n import(\"@tiptap/vue-3\"),\n import(\"@tiptap/starter-kit\"),\n import(\"@tiptap/extension-link\"),\n import(\"@tiptap/extension-underline\"),\n import(\"@tiptap/extension-subscript\"),\n import(\"@tiptap/extension-superscript\"),\n import(\"@tiptap/extension-text-align\"),\n import(\"@tiptap/extension-text-style\"),\n import(\"@tiptap/extension-color\"),\n import(\"@tiptap/extension-font-family\"),\n import(\"@tiptap/extension-highlight\"),\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 }),\n UnderlineExt,\n SubscriptExt,\n SuperscriptExt,\n LinkExt.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n TextAlign.configure({ types: [\"paragraph\"] }),\n TextStyle,\n Color,\n FontFamily,\n Highlight.configure({ multicolor: true }),\n FontSize,\n LineHeight,\n LetterSpacing,\n MergeTagNode.configure({ mergeTags, syntax }),\n LogicMergeTagNode.configure({ syntax }),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <ParagraphToolbar\n :editor=\"editor\"\n :toolbar-position=\"toolbarPosition\"\n :is-loading=\"isLoading\"\n :merge-tag-enabled=\"mergeTagEnabled\"\n @open-link-dialog=\"openLinkDialog\"\n @add-merge-tag=\"handleAddMergeTag\"\n />\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"],"file":"ParagraphEditor-CCtWbGDv.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{D as e,K as t,M as n,O as r,W as i,b as a,c as o,d as s,f as c,g as l,h as u,i as d,m as f,o as p,p as m,q as h,u as g,w as _,y as v}from"./draggable-ClUwYCFL.js";import{t as y}from"./icons-vmLJTaJk.js";import{c as b,n as x,u as S}from"./useMergeTag-DVOz1v9p.js";var C=[`data-tpl-theme`],w={class:`tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-5 tpl:py-4`},T={id:`tpl-link-dialog-title`,class:`tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]`},E=[`aria-label`],D={class:`tpl:p-5`},O={class:`tpl:mb-4 tpl:last:mb-0`},k={class:`tpl:mb-1.5 tpl:block tpl:text-xs tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase`},A=[`placeholder`],j={class:`tpl:flex tpl:items-center tpl:justify-between tpl:border-t tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)] tpl:px-5 tpl:py-4`},M={class:`tpl:ml-auto tpl:flex tpl:gap-2`},N=l({__name:`RichTextLinkDialog`,props:a({visible:{type:Boolean},isEditingLink:{type:Boolean}},{linkUrl:{required:!0},linkUrlModifiers:{},dialogRef:{required:!0},dialogRefModifiers:{}}),emits:a([`close`,`insert`,`remove`,`keydown`],[`update:linkUrl`,`update:dialogRef`]),setup(e,{emit:a}){let l=r(e,`linkUrl`),f=r(e,`dialogRef`),N=a,P=v(b,null),F=v(S,null),{t:I}=x();return(r,a)=>(_(),s(o,{to:`body`},[e.visible?(_(),m(`div`,{key:0,"data-tpl-theme":i(F),class:`tpl tpl-link-dialog tpl:fixed tpl:inset-0 tpl:z-modal tpl:flex tpl:items-center tpl:justify-center`,style:t(i(P)),onClick:a[6]||=p(e=>N(`close`),[`self`])},[g(`div`,{ref:e=>f.value=e,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`tpl-link-dialog-title`,class:`tpl:w-[400px] tpl:overflow-hidden tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:shadow-lg`},[g(`div`,w,[g(`h4`,T,h(e.isEditingLink?i(I).linkDialog.editLink:i(I).linkDialog.insertLink),1),g(`button`,{type:`button`,"aria-label":i(I).linkDialog.cancel,class:`tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:border-none tpl:bg-transparent tpl:p-0 tpl:text-[var(--tpl-text-muted)] tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]`,onClick:a[0]||=e=>N(`close`)},[u(i(y),{size:16,"stroke-width":2})],8,E)]),g(`div`,D,[g(`div`,O,[g(`label`,k,h(i(I).linkDialog.urlLabel),1),n(g(`input`,{"onUpdate:modelValue":a[1]||=e=>l.value=e,type:`url`,class:`tpl:w-full tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2.5 tpl:text-sm tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:outline-none tpl:placeholder:text-[var(--tpl-text-dim)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[0_0_0_3px_var(--tpl-primary-light)]`,placeholder:i(I).linkDialog.urlPlaceholder,autofocus:``,onKeydown:a[2]||=e=>N(`keydown`,e)},null,40,A),[[d,l.value]])])]),g(`div`,j,[e.isEditingLink?(_(),m(`button`,{key:0,type:`button`,class:`tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-danger)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-danger)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-danger-light)]`,onClick:a[3]||=e=>N(`remove`)},h(i(I).linkDialog.removeLink),1)):c(``,!0),g(`div`,M,[g(`button`,{type:`button`,class:`tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-text-muted)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]`,onClick:a[4]||=e=>N(`close`)},h(i(I).linkDialog.cancel),1),g(`button`,{type:`button`,class:`tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border-none tpl:bg-[var(--tpl-primary)] tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-primary-hover)] tpl:text-[var(--tpl-bg)]`,onClick:a[5]||=e=>N(`insert`)},h(e.isEditingLink?i(I).linkDialog.updateLink:i(I).linkDialog.insertLink),1)])])],512)],12,C)):c(``,!0)]))}}),P={key:0,class:`tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2`},F={class:`tpl:animate-pulse tpl:text-[var(--tpl-text-dim)]`},I={key:1,class:`tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:p-2 tpl:text-center tpl:text-xs tpl:border-[var(--tpl-danger)] tpl:text-[var(--tpl-text-muted)]`},L=l({__name:`RichTextEditorContent`,props:{editor:{},editorContent:{},isLoading:{type:Boolean},initError:{}},emits:[`retry`],setup(t,{emit:n}){let r=n,{t:a}=x();return(n,o)=>t.isLoading?(_(),m(`div`,P,[g(`div`,F,h(i(a).errors.editorLoading),1)])):t.initError?(_(),m(`div`,I,[f(h(i(a).errors.editorLoadFailed)+` `,1),g(`button`,{class:`tpl:ml-1 tpl:cursor-pointer tpl:border-none tpl:bg-transparent tpl:p-0 tpl:underline tpl:text-[var(--tpl-primary)]`,onClick:o[0]||=e=>r(`retry`)},h(i(a).errors.retry),1)])):t.editorContent&&t.editor?(_(),s(e(t.editorContent),{key:2,editor:t.editor,class:`tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2`},null,8,[`editor`])):c(``,!0)}});export{N as n,L as t};
|
|
2
|
+
//# sourceMappingURL=RichTextEditorContent-BUD9veXd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextEditorContent-BUD9veXd.js","names":[],"sources":["../../../src/components/blocks/RichTextLinkDialog.vue","../../../src/components/blocks/RichTextLinkDialog.vue","../../../src/components/blocks/RichTextEditorContent.vue","../../../src/components/blocks/RichTextEditorContent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { X } from \"@lucide/vue\";\nimport { inject } from \"vue\";\nimport { THEME_STYLES_KEY, UI_THEME_KEY } from \"../../keys\";\n\ndefineProps<{\n visible: boolean;\n isEditingLink: boolean;\n}>();\n\nconst linkUrl = defineModel<string>(\"linkUrl\", { required: true });\nconst dialogRef = defineModel<HTMLElement | null>(\"dialogRef\", {\n required: true,\n});\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"insert\"): void;\n (e: \"remove\"): void;\n (e: \"keydown\", event: KeyboardEvent): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\n\nconst { t } = useI18n();\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-link-dialog tpl:fixed tpl:inset-0 tpl:z-modal tpl:flex tpl:items-center tpl:justify-center\"\n :style=\"themeStyles\"\n @click.self=\"emit('close')\"\n >\n <div\n :ref=\"(el) => (dialogRef = el as HTMLElement | null)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tpl-link-dialog-title\"\n class=\"tpl:w-[400px] tpl:overflow-hidden tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:shadow-lg\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-5 tpl:py-4\"\n >\n <h4\n id=\"tpl-link-dialog-title\"\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{\n isEditingLink ? t.linkDialog.editLink : t.linkDialog.insertLink\n }}\n </h4>\n <button\n type=\"button\"\n :aria-label=\"t.linkDialog.cancel\"\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:border-none tpl:bg-transparent tpl:p-0 tpl:text-[var(--tpl-text-muted)] tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]\"\n @click=\"emit('close')\"\n >\n <X :size=\"16\" :stroke-width=\"2\" />\n </button>\n </div>\n <div class=\"tpl:p-5\">\n <div class=\"tpl:mb-4 tpl:last:mb-0\">\n <label\n class=\"tpl:mb-1.5 tpl:block tpl:text-xs tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase\"\n >{{ t.linkDialog.urlLabel }}</label\n >\n <input\n v-model=\"linkUrl\"\n type=\"url\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2.5 tpl:text-sm tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:outline-none tpl:placeholder:text-[var(--tpl-text-dim)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[0_0_0_3px_var(--tpl-primary-light)]\"\n :placeholder=\"t.linkDialog.urlPlaceholder\"\n autofocus\n @keydown=\"emit('keydown', $event)\"\n />\n </div>\n </div>\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-t tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)] tpl:px-5 tpl:py-4\"\n >\n <button\n v-if=\"isEditingLink\"\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-danger)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-danger)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-danger-light)]\"\n @click=\"emit('remove')\"\n >\n {{ t.linkDialog.removeLink }}\n </button>\n <div class=\"tpl:ml-auto tpl:flex tpl:gap-2\">\n <button\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-text-muted)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]\"\n @click=\"emit('close')\"\n >\n {{ t.linkDialog.cancel }}\n </button>\n <button\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border-none tpl:bg-[var(--tpl-primary)] tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-primary-hover)] tpl:text-[var(--tpl-bg)]\"\n @click=\"emit('insert')\"\n >\n {{\n isEditingLink\n ? t.linkDialog.updateLink\n : t.linkDialog.insertLink\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { X } from \"@lucide/vue\";\nimport { inject } from \"vue\";\nimport { THEME_STYLES_KEY, UI_THEME_KEY } from \"../../keys\";\n\ndefineProps<{\n visible: boolean;\n isEditingLink: boolean;\n}>();\n\nconst linkUrl = defineModel<string>(\"linkUrl\", { required: true });\nconst dialogRef = defineModel<HTMLElement | null>(\"dialogRef\", {\n required: true,\n});\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"insert\"): void;\n (e: \"remove\"): void;\n (e: \"keydown\", event: KeyboardEvent): void;\n}>();\n\nconst themeStyles = inject(THEME_STYLES_KEY, null);\nconst tplUiTheme = inject(UI_THEME_KEY, null);\n\nconst { t } = useI18n();\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-link-dialog tpl:fixed tpl:inset-0 tpl:z-modal tpl:flex tpl:items-center tpl:justify-center\"\n :style=\"themeStyles\"\n @click.self=\"emit('close')\"\n >\n <div\n :ref=\"(el) => (dialogRef = el as HTMLElement | null)\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"tpl-link-dialog-title\"\n class=\"tpl:w-[400px] tpl:overflow-hidden tpl:rounded-lg tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:shadow-lg\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-5 tpl:py-4\"\n >\n <h4\n id=\"tpl-link-dialog-title\"\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{\n isEditingLink ? t.linkDialog.editLink : t.linkDialog.insertLink\n }}\n </h4>\n <button\n type=\"button\"\n :aria-label=\"t.linkDialog.cancel\"\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:border-none tpl:bg-transparent tpl:p-0 tpl:text-[var(--tpl-text-muted)] tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]\"\n @click=\"emit('close')\"\n >\n <X :size=\"16\" :stroke-width=\"2\" />\n </button>\n </div>\n <div class=\"tpl:p-5\">\n <div class=\"tpl:mb-4 tpl:last:mb-0\">\n <label\n class=\"tpl:mb-1.5 tpl:block tpl:text-xs tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase\"\n >{{ t.linkDialog.urlLabel }}</label\n >\n <input\n v-model=\"linkUrl\"\n type=\"url\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:px-3 tpl:py-2.5 tpl:text-sm tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:outline-none tpl:placeholder:text-[var(--tpl-text-dim)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[0_0_0_3px_var(--tpl-primary-light)]\"\n :placeholder=\"t.linkDialog.urlPlaceholder\"\n autofocus\n @keydown=\"emit('keydown', $event)\"\n />\n </div>\n </div>\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-t tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)] tpl:px-5 tpl:py-4\"\n >\n <button\n v-if=\"isEditingLink\"\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-danger)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-danger)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-danger-light)]\"\n @click=\"emit('remove')\"\n >\n {{ t.linkDialog.removeLink }}\n </button>\n <div class=\"tpl:ml-auto tpl:flex tpl:gap-2\">\n <button\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-transparent tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:text-[var(--tpl-text-muted)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-hover)] tpl:hover:text-[var(--tpl-text)]\"\n @click=\"emit('close')\"\n >\n {{ t.linkDialog.cancel }}\n </button>\n <button\n type=\"button\"\n class=\"tpl:inline-flex tpl:cursor-pointer tpl:items-center tpl:rounded-md tpl:border-none tpl:bg-[var(--tpl-primary)] tpl:px-4 tpl:py-2 tpl:text-[13px] tpl:font-medium tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-primary-hover)] tpl:text-[var(--tpl-bg)]\"\n @click=\"emit('insert')\"\n >\n {{\n isEditingLink\n ? t.linkDialog.updateLink\n : t.linkDialog.insertLink\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { Editor } from \"@tiptap/vue-3\";\nimport type { Component } from \"vue\";\n\ndefineProps<{\n editor: Editor | null;\n editorContent: Component | null;\n isLoading: boolean;\n initError: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"retry\"): void;\n}>();\n\nconst { t } = useI18n();\n</script>\n\n<template>\n <div\n v-if=\"isLoading\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2\"\n >\n <div class=\"tpl:animate-pulse tpl:text-[var(--tpl-text-dim)]\">\n {{ t.errors.editorLoading }}\n </div>\n </div>\n <div\n v-else-if=\"initError\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:p-2 tpl:text-center tpl:text-xs tpl:border-[var(--tpl-danger)] tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.errors.editorLoadFailed }}\n <button\n class=\"tpl:ml-1 tpl:cursor-pointer tpl:border-none tpl:bg-transparent tpl:p-0 tpl:underline tpl:text-[var(--tpl-primary)]\"\n @click=\"emit('retry')\"\n >\n {{ t.errors.retry }}\n </button>\n </div>\n <component\n :is=\"editorContent\"\n v-else-if=\"editorContent && editor\"\n :editor=\"editor as Editor\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { Editor } from \"@tiptap/vue-3\";\nimport type { Component } from \"vue\";\n\ndefineProps<{\n editor: Editor | null;\n editorContent: Component | null;\n isLoading: boolean;\n initError: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"retry\"): void;\n}>();\n\nconst { t } = useI18n();\n</script>\n\n<template>\n <div\n v-if=\"isLoading\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2\"\n >\n <div class=\"tpl:animate-pulse tpl:text-[var(--tpl-text-dim)]\">\n {{ t.errors.editorLoading }}\n </div>\n </div>\n <div\n v-else-if=\"initError\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:p-2 tpl:text-center tpl:text-xs tpl:border-[var(--tpl-danger)] tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.errors.editorLoadFailed }}\n <button\n class=\"tpl:ml-1 tpl:cursor-pointer tpl:border-none tpl:bg-transparent tpl:p-0 tpl:underline tpl:text-[var(--tpl-primary)]\"\n @click=\"emit('retry')\"\n >\n {{ t.errors.retry }}\n </button>\n </div>\n <component\n :is=\"editorContent\"\n v-else-if=\"editorContent && editor\"\n :editor=\"editor as Editor\"\n class=\"tpl-text-editable tpl:min-h-[1.5em] tpl:rounded tpl:border tpl:border-dashed tpl:border-[var(--tpl-primary)] tpl:p-2\"\n />\n</template>\n"],"mappings":"msCAWA,IAAM,EAAU,EAAmB,EAAC,UAA8B,CAC5D,EAAY,EAA+B,EAAC,YAEhD,CAEI,EAAO,EAOP,EAAc,EAAO,EAAkB,KAAK,CAC5C,EAAa,EAAO,EAAc,KAAK,CAEvC,CAAE,KAAM,GAAS,mBAIrB,EAqFW,EAAA,CArFD,GAAG,OAAM,CAAA,CAET,EAAA,SAAA,GAAA,CADR,EAmFM,MAAA,OAjFH,iBAAgB,EAAA,EAAU,CAC3B,MAAM,qGACL,MAAK,EAAE,EAAA,EAAW,CAAA,CAClB,QAAK,AAAA,EAAA,KAAA,EAAA,GAAO,EAAI,QAAA,CAAA,CAAA,OAAA,CAAA,GAEjB,EA2EM,MAAA,CA1EH,IAAM,GAAQ,EAAA,MAAY,EAC3B,KAAK,SACL,aAAW,OACX,kBAAgB,wBAChB,MAAM,oIAEN,EAmBM,MAnBN,EAmBM,CAhBJ,EAOK,KAPL,EAOK,EAFD,EAAA,cAAgB,EAAA,EAAC,CAAC,WAAW,SAAW,EAAA,EAAC,CAAC,WAAW,WAAU,CAAA,EAAA,CAGnE,EAOS,SAAA,CANP,KAAK,SACJ,aAAY,EAAA,EAAC,CAAC,WAAW,OAC1B,MAAM,yOACL,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,QAAA,GAEZ,EAAkC,EAAA,EAAA,CAAA,CAA9B,KAAM,GAAK,eAAc,YAGjC,EAeM,MAfN,EAeM,CAdJ,EAaM,MAbN,EAaM,CAZJ,EAGC,QAHD,EAGC,EADK,EAAA,EAAC,CAAC,WAAW,SAAQ,CAAA,EAAA,CAAA,EAE3B,EAOE,QAAA,mCANgB,MAAA,EAChB,KAAK,MACL,MAAM,oVACL,YAAa,EAAA,EAAC,CAAC,WAAW,eAC3B,UAAA,GACC,UAAO,AAAA,EAAA,KAAA,GAAE,EAAI,UAAY,EAAM,iBALvB,EAAA,MAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAStB,EA+BM,MA/BN,EA+BM,CA3BI,EAAA,eAAA,GAAA,CADR,EAOS,SAAA,OALP,KAAK,SACL,MAAM,4RACL,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,SAAA,IAET,EAAA,EAAC,CAAC,WAAW,WAAU,CAAA,EAAA,EAAA,EAAA,GAAA,GAAA,CAE5B,EAmBM,MAnBN,EAmBM,CAlBJ,EAMS,SAAA,CALP,KAAK,SACL,MAAM,6TACL,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,QAAA,IAET,EAAA,EAAC,CAAC,WAAW,OAAM,CAAA,EAAA,CAExB,EAUS,SAAA,CATP,KAAK,SACL,MAAM,wQACL,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,SAAA,IAGV,EAAA,cAAkC,EAAA,EAAC,CAAC,WAAW,WAA+B,EAAA,EAAC,CAAC,WAAW,WAAU,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,ojBE9FrH,IAAM,EAAO,EAIP,CAAE,KAAM,GAAS,cAKb,EAAA,WAAA,GAAA,CADR,EAOM,MAPN,EAOM,CAHJ,EAEM,MAFN,EAEM,EADD,EAAA,EAAC,CAAC,OAAO,cAAa,CAAA,EAAA,CAAA,CAAA,EAIhB,EAAA,WAAA,GAAA,CADb,EAWM,MAXN,EAWM,CAAA,EAAA,EAPD,EAAA,EAAC,CAAC,OAAO,iBAAgB,CAAG,IAC/B,EAAA,CAAA,EAKS,SAAA,CAJP,MAAM,qHACL,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,QAAA,IAET,EAAA,EAAC,CAAC,OAAO,MAAK,CAAA,EAAA,CAAA,CAAA,EAKR,EAAA,eAAiB,EAAA,QAAA,GAAA,CAF9B,EAKE,EAJK,EAAA,cAAa,CAAA,OAEjB,OAAQ,EAAA,OACT,MAAM"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunks/dist-BKSzrf0L.js","chunks/tiptap-Cya4P9CN.js","chunks/icons-vmLJTaJk.js","chunks/draggable-ClUwYCFL.js","chunks/rolldown-runtime-BakkzWXw.js","chunks/dist-B5JI9nIg.js","chunks/dist-0UheN8rK.js","chunks/extensions-ea_ewKUl.js","chunks/useMergeTag-DVOz1v9p.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{F as e,G as t,K as n,W as r,c as i,d as a,f as o,g as s,h as c,m as l,p as u,q as d,s as f,u as p,w as m,y as h}from"./draggable-ClUwYCFL.js";import{_ as g,f as _,g as v,h as y,u as b}from"./icons-vmLJTaJk.js";import{c as x,n as S,u as C}from"./useMergeTag-DVOz1v9p.js";import{r as w,t as T}from"./useEditorCore-CwuxQuvh.js";import{n as E,t as ee}from"./RichTextEditorContent-BUD9veXd.js";var D={class:`tpl-text-editor-wrapper tpl:relative`},O=[`data-tpl-theme`,`aria-label`],k=[`aria-label`,`title`],A=[`aria-label`,`title`],j=[`aria-label`,`title`],M={key:0,class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`},N=[`aria-label`,`title`],P={key:1,class:`tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]`},F=s({__name:`TitleEditor`,props:{block:{},toolbarPosition:{}},emits:[`done`],setup(s,{emit:F}){let I=s,L=F,R=h(x,null),z=h(C,null),{t:B}=S(),{editor:V,EditorContent:H,isLoading:U,initError:W,retry:G,showLinkDialog:K,linkUrl:q,linkDialogRef:J,mergeTagEnabled:Y,openLinkDialog:X,insertLink:Z,removeLink:Q,closeLinkDialog:te,handleLinkKeydown:ne,handleAddMergeTag:$}=T({blockId:()=>I.block.id,blockContent:()=>I.block.content,onDone:()=>L(`done`),editorName:`TitleEditor`,async loadExtensions({mergeTags:e,syntax:t}){let[{Editor:n,EditorContent:r},{default:i},{default:a},{MergeTagNode:o,LogicMergeTagNode:s}]=await Promise.all([w(()=>import(`./dist-BKSzrf0L.js`),__vite__mapDeps([0,1,2,3,4])),w(()=>import(`./dist-B5JI9nIg.js`),__vite__mapDeps([5,1,2,3,4])),w(()=>import(`./dist-0UheN8rK.js`),__vite__mapDeps([6,1,2,3,4])),w(()=>import(`./extensions-ea_ewKUl.js`),__vite__mapDeps([7,2,3,4,1,8]))]);return{TiptapEditor:n,EC:r,extensions:[i.configure({heading:!1,codeBlock:!1,blockquote:!1,horizontalRule:!1,bulletList:!1,orderedList:!1,listItem:!1,strike:!1}),a.configure({openOnClick:!1,HTMLAttributes:{target:`_blank`,rel:`noopener noreferrer`}}),o.configure({mergeTags:e,syntax:t}),s.configure({syntax:t})]}}});return(h,x)=>(m(),u(`div`,D,[(m(),a(i,{to:`body`},[p(`div`,{"data-tpl-theme":r(z),role:`toolbar`,"aria-label":r(B).titleEditor.toolbar,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`,style:n({...r(R),top:`${s.toolbarPosition.top}px`,left:`${s.toolbarPosition.left}px`,transform:`translateY(-100%)`})},[!r(U)&&r(V)?(m(),u(f,{key:0},[p(`button`,{type:`button`,class:t([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":r(V)?.isActive(`bold`)}]),"aria-label":r(B).titleEditor.bold,title:r(B).titleEditor.bold,onClick:x[0]||=e=>r(V)?.chain().focus().toggleBold().run()},[c(r(g),{size:16,"stroke-width":2.5})],10,k),p(`button`,{type:`button`,class:t([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":r(V)?.isActive(`italic`)}]),"aria-label":r(B).titleEditor.italic,title:r(B).titleEditor.italic,onClick:x[1]||=e=>r(V)?.chain().focus().toggleItalic().run()},[c(r(v),{size:16,"stroke-width":2})],10,A),x[6]||=p(`span`,{class:`tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]`,"aria-hidden":`true`},null,-1),p(`button`,{type:`button`,class:t([`tpl-text-toolbar-btn`,{"tpl-text-toolbar-btn--active":r(V)?.isActive(`link`)}]),"aria-label":r(B).titleEditor.addLink,title:r(B).titleEditor.addLink,onClick:x[2]||=(...e)=>r(X)&&r(X)(...e)},[c(r(y),{size:16,"stroke-width":2})],10,j),r(Y)?(m(),u(`span`,M)):o(``,!0),r(Y)?(m(),u(`button`,{key:1,type:`button`,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)]`,"aria-label":r(B).mergeTag.add,title:r(B).mergeTag.add,onClick:x[3]||=(...e)=>r($)&&r($)(...e)},[c(r(b),{size:16,"stroke-width":2}),l(` `+d(r(B).mergeTag.add),1)],8,N)):o(``,!0)],64)):(m(),u(`div`,P,[c(r(_),{class:`tpl-spinner`,size:14,"stroke-width":2}),l(` `+d(r(B).errors.editorLoading),1)]))],12,O)])),c(ee,{editor:r(V),"editor-content":r(H),"is-loading":r(U),"init-error":r(W),onRetry:r(G)},null,8,[`editor`,`editor-content`,`is-loading`,`init-error`,`onRetry`]),c(E,{visible:r(K),"is-editing-link":r(V)?.isActive(`link`)??!1,"dialog-ref":r(J),"onUpdate:dialogRef":x[4]||=t=>e(J)?J.value=t:null,"link-url":r(q),"onUpdate:linkUrl":x[5]||=t=>e(q)?q.value=t:null,onClose:r(te),onInsert:r(Z),onRemove:r(Q),onKeydown:r(ne)},null,8,[`visible`,`is-editing-link`,`dialog-ref`,`link-url`,`onClose`,`onInsert`,`onRemove`,`onKeydown`])]))}});export{F as default};
|
|
3
|
+
//# sourceMappingURL=TitleEditor-e_UTyxjd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../src/components/blocks/TitleEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables\";\nimport { useRichTextEditor } from \"../../composables/useRichTextEditor\";\nimport type { TitleBlock as TitleBlockType } from \"@templatical/types\";\nimport { Bold, Italic, Link, LoaderCircle, ScanLine } from \"@lucide/vue\";\nimport { inject } from \"vue\";\nimport { THEME_STYLES_KEY, UI_THEME_KEY } 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);\n\nconst { t } = useI18n();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n mergeTagEnabled,\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({ mergeTags, syntax }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { MergeTagNode, 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 ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <Teleport to=\"body\">\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=\"mergeTagEnabled\"\n class=\"tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]\"\n ></span>\n <button\n v-if=\"mergeTagEnabled\"\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.add\"\n :title=\"t.mergeTag.add\"\n @click=\"handleAddMergeTag\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.add }}\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"],"file":"TitleEditor-e_UTyxjd.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{G as e,K as t,M as n,W as r,a as i,d as a,f as o,g as s,i as c,j as l,l as u,o as d,p as f,q as p,u as m,w as h,x as g,z as _}from"./draggable-ClUwYCFL.js";import"./icons-vmLJTaJk.js";import{
|
|
2
|
-
//# sourceMappingURL=extensions-
|
|
1
|
+
import{G as e,K as t,M as n,W as r,a as i,d as a,f as o,g as s,i as c,j as l,l as u,o as d,p as f,q as p,u as m,w as h,x as g,z as _}from"./draggable-ClUwYCFL.js";import"./icons-vmLJTaJk.js";import{f as v,h as y,m as b,n as x,p as S,t as C}from"./useMergeTag-DVOz1v9p.js";import{H as w,J as T,On as E,W as D,Z as O,a as k,c as A}from"./tiptap-Cya4P9CN.js";var j=w.create({name:`fontSize`,addOptions(){return{types:[`textStyle`]}},addGlobalAttributes(){return[{types:this.options.types,attributes:{fontSize:{default:null,parseHTML:e=>e.style.fontSize?.replace(/['"]+/g,``)||null,renderHTML:e=>e.fontSize?{style:`font-size: ${e.fontSize}`}:{}}}}]},addCommands(){return{setFontSize:e=>({chain:t})=>t().setMark(`textStyle`,{fontSize:e}).run(),unsetFontSize:()=>({chain:e})=>e().setMark(`textStyle`,{fontSize:null}).removeEmptyTextStyle().run()}}}),M=w.create({name:`letterSpacing`,addOptions(){return{types:[`textStyle`]}},addGlobalAttributes(){return[{types:this.options.types,attributes:{letterSpacing:{default:null,parseHTML:e=>e.style.letterSpacing?.replace(/['"]+/g,``)||null,renderHTML:e=>e.letterSpacing?{style:`letter-spacing: ${e.letterSpacing}`}:{}}}}]},addCommands(){return{setLetterSpacing:e=>({chain:t})=>t().setMark(`textStyle`,{letterSpacing:e}).run(),unsetLetterSpacing:()=>({chain:e})=>e().setMark(`textStyle`,{letterSpacing:null}).removeEmptyTextStyle().run()}}}),N=w.create({name:`lineHeight`,addOptions(){return{types:[`paragraph`],defaultLineHeight:`1.5`}},addGlobalAttributes(){return[{types:this.options.types,attributes:{lineHeight:{default:null,parseHTML:e=>e.style.lineHeight||null,renderHTML:e=>e.lineHeight?{style:`line-height: ${e.lineHeight}`}:{}}}}]},addCommands(){return{setLineHeight:e=>({commands:t})=>this.options.types.every(n=>t.updateAttributes(n,{lineHeight:e})),unsetLineHeight:()=>({commands:e})=>this.options.types.every(t=>e.resetAttributes(t,`lineHeight`))}}}),P=[`aria-label`,`data-tooltip`,`onKeydown`],F=[`aria-label`,`onKeydown`],I=[`aria-label`],L=s({__name:`LogicMergeTagNodeView`,props:{node:{},editor:{},getPos:{type:Function},deleteNode:{type:Function},updateAttributes:{type:Function}},setup(s){let v=s,{syntax:b}=C(),{t:w}=x(),T=u(()=>y(v.node.attrs.value,b)),E=u(()=>S(v.node.attrs.value,b)),D=_(!1),O=_(``),A=_(null),j=!1;function M(){O.value=v.node.attrs.value,j=!1,D.value=!0,g(()=>{A.value?.focus(),A.value?.select()})}function N(){if(j)return;j=!0;let e=O.value.trim();if(!e){D.value=!1;return}e!==v.node.attrs.value&&v.updateAttributes({value:e,keyword:y(e,b)?S(e,b):``}),D.value=!1}function L(e){e.key===`Enter`?(e.preventDefault(),N()):e.key===`Escape`&&(D.value=!1)}return(u,g)=>(h(),a(r(k),{as:`span`,class:e(T.value?`tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none`:``),style:t(T.value?`background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);`:``),contenteditable:`false`},{default:l(()=>[D.value?n((h(),f(`input`,{key:0,ref_key:`inputRef`,ref:A,"onUpdate:modelValue":g[0]||=e=>O.value=e,type:`text`,class:`tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]`,onBlur:N,onKeydown:L},null,544)),[[c,O.value]]):T.value?(h(),f(`span`,{key:1,role:`button`,tabindex:`0`,"aria-label":r(w).mergeTag.editValue,class:`tpl-tooltip tpl:cursor-pointer`,"data-tooltip":s.node.attrs.value,onClick:d(M,[`stop`]),onKeydown:[i(d(M,[`stop`]),[`enter`]),i(d(M,[`prevent`,`stop`]),[`space`])]},p(E.value),41,P)):(h(),f(`span`,{key:2,role:`button`,tabindex:`0`,"aria-label":r(w).mergeTag.editValue,onClick:d(M,[`stop`]),onKeydown:[i(d(M,[`stop`]),[`enter`]),i(d(M,[`prevent`,`stop`]),[`space`])]},p(s.node.attrs.value),41,F)),T.value?(h(),f(`button`,{key:3,type:`button`,"aria-label":r(w).mergeTag.deleteMergeTag,class:`tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]`,contenteditable:`false`,onClick:g[1]||=d((...e)=>s.deleteNode&&s.deleteNode(...e),[`stop`,`prevent`])},[...g[2]||=[m(`svg`,{width:`10`,height:`10`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"aria-hidden":`true`},[m(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),m(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,I)):o(``,!0)]),_:1},8,[`class`,`style`]))}});function R(e,t){let{selection:n}=e.state,{$from:r,$to:i}=n,a=!1;return e.state.doc.nodesBetween(r.pos,i.pos,e=>{if(e.type.name===t)return a=!0,!1}),!!(a||r.pos>0&&r.nodeBefore?.type.name===t||r.nodeAfter?.type.name===t)}function z(e){return A(e)}var B=T.create({name:`logicMergeTagNode`,group:`inline`,inline:!0,atom:!0,addOptions(){return{syntax:v.liquid}},addAttributes(){return{value:{default:``,parseHTML:e=>e.getAttribute(`data-logic-merge-tag`)||``},keyword:{default:``,parseHTML:e=>e.getAttribute(`data-keyword`)||e.textContent||``}}},parseHTML(){return[{tag:`span[data-logic-merge-tag]`}]},renderHTML({node:e,HTMLAttributes:t}){if(!y(e.attrs.value,this.options.syntax))return[`span`,{},e.attrs.value];let n=S(e.attrs.value,this.options.syntax);return[`span`,E(t,{"data-logic-merge-tag":e.attrs.value,"data-keyword":n}),n]},addNodeView(){return z(L)},addKeyboardShortcuts(){return{Backspace:()=>R(this.editor,this.name),Delete:()=>R(this.editor,this.name)}},addInputRules(){return[new D({find:RegExp(this.options.syntax.logic.source+`$`,``),handler:({state:e,range:t,match:n})=>{let r=n[0];if(!y(r,this.options.syntax))return;let i=S(r,this.options.syntax),a=this.type.create({value:r,keyword:i});e.tr.replaceWith(t.from,t.to,a)}})]},addPasteRules(){return[new O({find:new RegExp(this.options.syntax.logic.source,`g`),handler:({state:e,range:t,match:n})=>{let r=n[0];if(!y(r,this.options.syntax))return;let i=S(r,this.options.syntax),a=this.type.create({value:r,keyword:i});e.tr.replaceWith(t.from,t.to,a)}})]}}),V=[`aria-label`,`data-tooltip`,`onKeydown`],H=[`aria-label`],U=s({__name:`MergeTagNodeView`,props:{node:{},deleteNode:{type:Function},updateAttributes:{type:Function}},setup(e){let t=e,{getMergeTagLabel:o}=C(),{t:s}=x(),v=u(()=>o(t.node.attrs.value)),y=_(!1),b=_(``),S=_(null);function w(){b.value=t.node.attrs.value,y.value=!0,g(()=>{S.value?.focus(),S.value?.select()})}function T(){let e=b.value.trim();e&&e!==t.node.attrs.value&&t.updateAttributes({value:e,label:o(e)}),y.value=!1}function E(e){e.key===`Enter`?(e.preventDefault(),T()):e.key===`Escape`&&(y.value=!1)}return(t,o)=>(h(),a(r(k),{as:`span`,class:`tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]`,style:{"background-color":`color-mix(in srgb, var(--tpl-primary) 20%, transparent)`},contenteditable:`false`},{default:l(()=>[y.value?n((h(),f(`input`,{key:0,ref_key:`inputRef`,ref:S,"onUpdate:modelValue":o[0]||=e=>b.value=e,type:`text`,class:`tpl:w-32 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]`,onBlur:T,onKeydown:E},null,544)),[[c,b.value]]):(h(),f(`span`,{key:1,role:`button`,tabindex:`0`,"aria-label":r(s).mergeTag.editValue,class:`tpl-tooltip tpl:cursor-pointer`,"data-tooltip":e.node.attrs.value,onClick:d(w,[`stop`]),onKeydown:[i(d(w,[`stop`]),[`enter`]),i(d(w,[`prevent`,`stop`]),[`space`])]},p(v.value),41,V)),m(`button`,{type:`button`,"aria-label":r(s).mergeTag.deleteMergeTag,class:`tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]`,contenteditable:`false`,onClick:o[1]||=d((...t)=>e.deleteNode&&e.deleteNode(...t),[`stop`,`prevent`])},[...o[2]||=[m(`svg`,{width:`10`,height:`10`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"aria-hidden":`true`},[m(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),m(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,H)]),_:1}))}}),W=T.create({name:`mergeTagNode`,group:`inline`,inline:!0,atom:!0,addOptions(){return{mergeTags:[],syntax:v.liquid}},addAttributes(){return{label:{default:``,parseHTML:e=>e.getAttribute(`data-label`)||e.textContent||``},value:{default:``,parseHTML:e=>e.getAttribute(`data-merge-tag`)||``}}},parseHTML(){return[{tag:`span[data-merge-tag]`}]},renderHTML({node:e,HTMLAttributes:t}){let n=b(e.attrs.value,this.options.mergeTags);return[`span`,E(t,{"data-merge-tag":e.attrs.value,"data-label":n}),n]},addNodeView(){return z(U)},addCommands(){return{insertMergeTag:e=>({commands:t})=>t.insertContent({type:this.name,attrs:e})}},addKeyboardShortcuts(){return{Backspace:()=>R(this.editor,this.name),Delete:()=>R(this.editor,this.name)}},addInputRules(){return[new D({find:RegExp(this.options.syntax.value.source+`$`,``),handler:({state:e,range:t,match:n})=>{let r=n[0],i=b(r,this.options.mergeTags),a=this.type.create({label:i,value:r});e.tr.replaceWith(t.from,t.to,a)}})]},addPasteRules(){return[new O({find:new RegExp(this.options.syntax.value.source,`g`),handler:({state:e,range:t,match:n})=>{let r=n[0],i=b(r,this.options.mergeTags),a=this.type.create({label:i,value:r});e.tr.replaceWith(t.from,t.to,a)}})]}});export{j as FontSize,M as LetterSpacing,N as LineHeight,B as LogicMergeTagNode,W as MergeTagNode};
|
|
2
|
+
//# sourceMappingURL=extensions-ea_ewKUl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions-BfjbWqOx.js","names":[],"sources":["../../../src/extensions/FontSize.ts","../../../src/extensions/LetterSpacing.ts","../../../src/extensions/LineHeight.ts","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/isNodeSelected.ts","../../../src/extensions/renderVueNodeView.ts","../../../src/extensions/LogicMergeTagNode.ts","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNode.ts"],"sourcesContent":["import { Extension } from \"@tiptap/core\";\n\nexport interface FontSizeOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (size: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { fontSize: size }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LetterSpacingOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n letterSpacing: {\n setLetterSpacing: (spacing: string) => ReturnType;\n unsetLetterSpacing: () => ReturnType;\n };\n }\n}\n\nexport const LetterSpacing = Extension.create<LetterSpacingOptions>({\n name: \"letterSpacing\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n letterSpacing: {\n default: null,\n parseHTML: (element) =>\n element.style.letterSpacing?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.letterSpacing) {\n return {};\n }\n return {\n style: `letter-spacing: ${attributes.letterSpacing}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLetterSpacing:\n (spacing: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { letterSpacing: spacing }).run();\n },\n unsetLetterSpacing:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { letterSpacing: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LineHeightOptions {\n types: string[];\n defaultLineHeight: string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType;\n unsetLineHeight: () => ReturnType;\n };\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: \"lineHeight\",\n\n addOptions() {\n return {\n types: [\"paragraph\"],\n defaultLineHeight: \"1.5\",\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) => element.style.lineHeight || null,\n renderHTML: (attributes) => {\n if (!attributes.lineHeight) {\n return {};\n }\n return {\n style: `line-height: ${attributes.lineHeight}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { lineHeight }),\n );\n },\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, \"lineHeight\"),\n );\n },\n };\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import type { Editor } from \"@tiptap/core\";\n\n/**\n * Checks whether a TipTap node of the given type is selected, or if the cursor\n * is immediately adjacent to one (for Backspace/Delete handling).\n *\n * Shared by MergeTagNode and LogicMergeTagNode keyboard shortcuts.\n */\nexport function isNodeSelected(editor: Editor, nodeTypeName: string): boolean {\n const { selection } = editor.state;\n const { $from, $to } = selection;\n\n // Check if selection contains a node of this type\n let found = false;\n editor.state.doc.nodesBetween($from.pos, $to.pos, (node) => {\n if (node.type.name === nodeTypeName) {\n found = true;\n return false;\n }\n });\n\n if (found) {\n return true;\n }\n\n // Check if cursor is right after the node (for Backspace)\n if ($from.pos > 0 && $from.nodeBefore?.type.name === nodeTypeName) {\n return true;\n }\n\n // Check if cursor is right before the node (for Delete)\n if ($from.nodeAfter?.type.name === nodeTypeName) {\n return true;\n }\n\n return false;\n}\n","import type { Component } from \"vue\";\nimport { VueNodeViewRenderer } from \"@tiptap/vue-3\";\n\n/**\n * Typed wrapper for VueNodeViewRenderer that handles the known type mismatch\n * between Vue SFC default exports and TipTap's expected component type.\n */\nexport function renderVueNodeView(component: Component) {\n return VueNodeViewRenderer(\n component as Parameters<typeof VueNodeViewRenderer>[0],\n );\n}\n","import LogicMergeTagNodeView from \"./LogicMergeTagNodeView.vue\";\nimport type { SyntaxPreset } from \"@templatical/types\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface LogicMergeTagNodeOptions {\n syntax: SyntaxPreset;\n}\n\nexport const LogicMergeTagNode = Node.create<LogicMergeTagNodeOptions>({\n name: \"logicMergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n value: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-logic-merge-tag\") || \"\",\n },\n keyword: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-keyword\") || element.textContent || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-logic-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n if (!isLogicMergeTagValue(node.attrs.value, this.options.syntax)) {\n return [\"span\", {}, node.attrs.value];\n }\n\n const keyword = getLogicMergeTagKeyword(\n node.attrs.value,\n this.options.syntax,\n );\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-logic-merge-tag\": node.attrs.value,\n \"data-keyword\": keyword,\n }),\n keyword,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(LogicMergeTagNodeView);\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.logic.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.logic.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-32 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-32 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import MergeTagNodeView from \"./MergeTagNodeView.vue\";\nimport type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport { getMergeTagLabel, SYNTAX_PRESETS } from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface MergeTagNodeOptions {\n mergeTags: MergeTag[];\n syntax: SyntaxPreset;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n mergeTagNode: {\n insertMergeTag: (attrs: MergeTag) => ReturnType;\n };\n }\n}\n\nexport const MergeTagNode = Node.create<MergeTagNodeOptions>({\n name: \"mergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n mergeTags: [],\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n label: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-label\") || element.textContent || \"\",\n },\n value: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-merge-tag\") || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const label = getMergeTagLabel(node.attrs.value, this.options.mergeTags);\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-merge-tag\": node.attrs.value,\n \"data-label\": label,\n }),\n label,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(MergeTagNodeView);\n },\n\n addCommands() {\n return {\n insertMergeTag:\n (attrs: MergeTag) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.value.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags);\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.value.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags);\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n"],"mappings":"oWAeA,IAAa,EAAW,EAAU,OAAwB,CACxD,KAAM,WAEN,YAAa,CACX,MAAO,CACL,MAAO,CAAC,YAAY,CACrB,EAGH,qBAAsB,CACpB,MAAO,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,SAAU,CACR,QAAS,KACT,UAAY,GACV,EAAQ,MAAM,UAAU,QAAQ,SAAU,GAAG,EAAI,KACnD,WAAa,GACN,EAAW,SAGT,CACL,MAAO,cAAc,EAAW,WACjC,CAJQ,EAAE,CAMd,CACF,CACF,CACF,EAGH,aAAc,CACZ,MAAO,CACL,YACG,IACA,CAAE,WACM,GAAO,CAAC,QAAQ,YAAa,CAAE,SAAU,EAAM,CAAC,CAAC,KAAK,CAEjE,mBAEG,CAAE,WACM,GAAO,CACX,QAAQ,YAAa,CAAE,SAAU,KAAM,CAAC,CACxC,sBAAsB,CACtB,KAAK,CAEb,EAEJ,CAAC,CCjDW,EAAgB,EAAU,OAA6B,CAClE,KAAM,gBAEN,YAAa,CACX,MAAO,CACL,MAAO,CAAC,YAAY,CACrB,EAGH,qBAAsB,CACpB,MAAO,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,cAAe,CACb,QAAS,KACT,UAAY,GACV,EAAQ,MAAM,eAAe,QAAQ,SAAU,GAAG,EAAI,KACxD,WAAa,GACN,EAAW,cAGT,CACL,MAAO,mBAAmB,EAAW,gBACtC,CAJQ,EAAE,CAMd,CACF,CACF,CACF,EAGH,aAAc,CACZ,MAAO,CACL,iBACG,IACA,CAAE,WACM,GAAO,CAAC,QAAQ,YAAa,CAAE,cAAe,EAAS,CAAC,CAAC,KAAK,CAEzE,wBAEG,CAAE,WACM,GAAO,CACX,QAAQ,YAAa,CAAE,cAAe,KAAM,CAAC,CAC7C,sBAAsB,CACtB,KAAK,CAEb,EAEJ,CAAC,CChDW,EAAa,EAAU,OAA0B,CAC5D,KAAM,aAEN,YAAa,CACX,MAAO,CACL,MAAO,CAAC,YAAY,CACpB,kBAAmB,MACpB,EAGH,qBAAsB,CACpB,MAAO,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,WAAY,CACV,QAAS,KACT,UAAY,GAAY,EAAQ,MAAM,YAAc,KACpD,WAAa,GACN,EAAW,WAGT,CACL,MAAO,gBAAgB,EAAW,aACnC,CAJQ,EAAE,CAMd,CACF,CACF,CACF,EAGH,aAAc,CACZ,MAAO,CACL,cACG,IACA,CAAE,cACM,KAAK,QAAQ,MAAM,MAAO,GAC/B,EAAS,iBAAiB,EAAM,CAAE,aAAY,CAAC,CAChD,CAEL,qBAEG,CAAE,cACM,KAAK,QAAQ,MAAM,MAAO,GAC/B,EAAS,gBAAgB,EAAM,aAAa,CAC7C,CAEN,EAEJ,CAAC,qPCvDF,IAAM,EAAQ,EAaR,CAAE,UAAW,GAAa,CAC1B,CAAE,KAAM,GAAS,CAEjB,EAAU,MACd,EAAqB,EAAM,KAAK,MAAM,MAAO,EAAO,CACrD,CACK,EAAiB,MACrB,EAAwB,EAAM,KAAK,MAAM,MAAO,EAAO,CACxD,CAEK,EAAY,EAAI,GAAM,CACtB,EAAY,EAAI,GAAG,CACnB,EAAW,EAA6B,KAAK,CAC/C,EAAU,GAEd,SAAS,GAAqB,CAC5B,EAAU,MAAQ,EAAM,KAAK,MAAM,MACnC,EAAU,GACV,EAAU,MAAQ,GAClB,MAAe,CACb,EAAS,OAAO,OAAO,CACvB,EAAS,OAAO,QAAQ,EACxB,CAGJ,SAAS,GAAsB,CAC7B,GAAI,EACF,OAEF,EAAU,GAEV,IAAM,EAAW,EAAU,MAAM,MAAM,CACvC,GAAI,CAAC,EAAU,CACb,EAAU,MAAQ,GAClB,OAGE,IAAa,EAAM,KAAK,MAAM,OAChC,EAAM,iBAAiB,CACrB,MAAO,EACP,QAAS,EAAqB,EAAU,EAAM,CAC1C,EAAwB,EAAU,EAAM,CACxC,GACL,CAAC,CAEJ,EAAU,MAAQ,GAGpB,SAAS,EAAc,EAA4B,CAC7C,EAAM,MAAQ,SAChB,EAAM,gBAAgB,CACtB,GAAe,EACN,EAAM,MAAQ,WACvB,EAAU,MAAQ,sBAMpB,EAuEkB,EAAA,EAAA,CAAA,CAtEhB,GAAG,OACF,MAAK,EAAS,EAAA,MAAA,4MAAA,GAAA,CAKd,MAAK,EAAS,EAAA,MAAA,yIAAA,GAAA,CAKf,gBAAgB,wBAWd,CAPM,EAAA,MAAA,GAAA,GAAA,CADR,EAQE,QAAA,eANI,WAAJ,IAAI,oCACc,MAAA,EAClB,KAAK,OACL,MAAM,4KACL,OAAM,EACN,UAAS,kBAJD,EAAA,MAAS,CAAA,CAAA,CAQP,EAAA,OAAA,GAAA,CADb,EAYO,OAAA,OAVL,KAAK,SACL,SAAS,IACR,aAAY,EAAA,EAAC,CAAC,SAAS,UACxB,MAAM,iCACL,eAAc,EAAA,KAAK,MAAM,MACzB,QAAK,EAAO,EAAY,CAAA,OAAA,CAAA,CACxB,UAAO,CAAA,EAAA,EAAa,EAAY,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EACJ,EAAY,CAAA,UAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,IAEtC,EAAA,MAAc,CAAA,GAAA,EAAA,GAAA,GAAA,CAGnB,EAUO,OAAA,OARL,KAAK,SACL,SAAS,IACR,aAAY,EAAA,EAAC,CAAC,SAAS,UACvB,QAAK,EAAO,EAAY,CAAA,OAAA,CAAA,CACxB,UAAO,CAAA,EAAA,EAAa,EAAY,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EACJ,EAAY,CAAA,UAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,IAEtC,EAAA,KAAK,MAAM,MAAK,CAAA,GAAA,EAAA,EAGb,EAAA,OAAA,GAAA,CADR,EAoBS,SAAA,OAlBP,KAAK,SACJ,aAAY,EAAA,EAAC,CAAC,SAAS,eACxB,MAAM,oPACN,gBAAgB,QACf,QAAK,AAAA,EAAA,KAAA,GAAA,GAAA,IAAe,EAAA,YAAA,EAAA,WAAA,GAAA,EAAU,CAAA,CAAA,OAAA,UAAA,CAAA,cAE/B,EAWM,MAAA,CAVJ,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,eAAa,IACb,cAAY,SAEZ,EAAsC,OAAA,CAAhC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,OAC/B,EAAsC,OAAA,CAAhC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,6DE/IvC,SAAgB,EAAe,EAAgB,EAA+B,CAC5E,GAAM,CAAE,aAAc,EAAO,MACvB,CAAE,QAAO,OAAQ,EAGnB,EAAQ,GAsBZ,OArBA,EAAO,MAAM,IAAI,aAAa,EAAM,IAAK,EAAI,IAAM,GAAS,CAC1D,GAAI,EAAK,KAAK,OAAS,EAErB,MADA,GAAQ,GACD,IAET,CAYF,GAVI,GAKA,EAAM,IAAM,GAAK,EAAM,YAAY,KAAK,OAAS,GAKjD,EAAM,WAAW,KAAK,OAAS,GCxBrC,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EACL,EACD,CCKH,IAAa,EAAoB,EAAK,OAAiC,CACrE,KAAM,oBAEN,MAAO,SAEP,OAAQ,GAER,KAAM,GAEN,YAAa,CACX,MAAO,CACL,OAAQ,EAAe,OACxB,EAGH,eAAgB,CACd,MAAO,CACL,MAAO,CACL,QAAS,GACT,UAAY,GACV,EAAQ,aAAa,uBAAuB,EAAI,GACnD,CACD,QAAS,CACP,QAAS,GACT,UAAY,GACV,EAAQ,aAAa,eAAe,EAAI,EAAQ,aAAe,GAClE,CACF,EAGH,WAAY,CACV,MAAO,CACL,CACE,IAAK,6BACN,CACF,EAGH,WAAW,CAAE,OAAM,kBAAkB,CACnC,GAAI,CAAC,EAAqB,EAAK,MAAM,MAAO,KAAK,QAAQ,OAAO,CAC9D,MAAO,CAAC,OAAQ,EAAE,CAAE,EAAK,MAAM,MAAM,CAGvC,IAAM,EAAU,EACd,EAAK,MAAM,MACX,KAAK,QAAQ,OACd,CAED,MAAO,CACL,OACA,EAAgB,EAAgB,CAC9B,uBAAwB,EAAK,MAAM,MACnC,eAAgB,EACjB,CAAC,CACF,EACD,EAGH,aAAc,CACZ,OAAO,EAAkB,EAAsB,EAGjD,sBAAuB,CACrB,MAAO,CACL,cAAiB,EAAe,KAAK,OAAQ,KAAK,KAAK,CACvD,WAAc,EAAe,KAAK,OAAQ,KAAK,KAAK,CACrD,EAGH,eAAgB,CAGd,MAAO,CACL,IAAI,EAAU,CACZ,KAJmB,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAS,IAAK,GAAG,CAKrE,SAAU,CAAE,QAAO,QAAO,WAAY,CACpC,IAAM,EAAY,EAAM,GACxB,GAAI,CAAC,EAAqB,EAAW,KAAK,QAAQ,OAAO,CACvD,OAGF,IAAM,EAAU,EACd,EACA,KAAK,QAAQ,OACd,CAEK,EAAO,KAAK,KAAK,OAAO,CAC5B,MAAO,EACP,UACD,CAAC,CAEF,EAAM,GAAG,YAAY,EAAM,KAAM,EAAM,GAAI,EAAK,EAEnD,CAAC,CACH,EAGH,eAAgB,CAGd,MAAO,CACL,IAAI,EAAU,CACZ,KAJe,IAAI,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAQ,IAAI,CAKhE,SAAU,CAAE,QAAO,QAAO,WAAY,CACpC,IAAM,EAAY,EAAM,GACxB,GAAI,CAAC,EAAqB,EAAW,KAAK,QAAQ,OAAO,CACvD,OAGF,IAAM,EAAU,EACd,EACA,KAAK,QAAQ,OACd,CAEK,EAAO,KAAK,KAAK,OAAO,CAC5B,MAAO,EACP,UACD,CAAC,CAEF,EAAM,GAAG,YAAY,EAAM,KAAM,EAAM,GAAI,EAAK,EAEnD,CAAC,CACH,EAEJ,CAAC,kLCrIF,IAAM,EAAQ,EAWR,CAAE,oBAAqB,GAAa,CACpC,CAAE,KAAM,GAAS,CAEjB,EAAe,MAAe,EAAiB,EAAM,KAAK,MAAM,MAAM,CAAC,CAEvE,EAAY,EAAI,GAAM,CACtB,EAAY,EAAI,GAAG,CACnB,EAAW,EAA6B,KAAK,CAEnD,SAAS,GAAqB,CAC5B,EAAU,MAAQ,EAAM,KAAK,MAAM,MACnC,EAAU,MAAQ,GAClB,MAAe,CACb,EAAS,OAAO,OAAO,CACvB,EAAS,OAAO,QAAQ,EACxB,CAGJ,SAAS,GAAsB,CAC7B,IAAM,EAAW,EAAU,MAAM,MAAM,CACnC,GAAY,IAAa,EAAM,KAAK,MAAM,OAE5C,EAAM,iBAAiB,CACrB,MAAO,EACP,MAAO,EAAiB,EAAS,CAClC,CAAC,CAEJ,EAAU,MAAQ,GAGpB,SAAS,EAAc,EAA4B,CAC7C,EAAM,MAAQ,SAChB,EAAM,gBAAgB,CACtB,GAAe,EACN,EAAM,MAAQ,WACvB,EAAU,MAAQ,sBAMpB,EAoDkB,EAAA,EAAA,CAAA,CAnDhB,GAAG,OACH,MAAM,sMACN,MAAA,CAAA,mBAAA,0DAEC,CACD,gBAAgB,wBAWd,CAPM,EAAA,MAAA,GAAA,GAAA,CADR,EAQE,QAAA,eANI,WAAJ,IAAI,oCACc,MAAA,EAClB,KAAK,OACL,MAAM,4JACL,OAAM,EACN,UAAS,kBAJD,EAAA,MAAS,CAAA,CAAA,EAAA,GAAA,CAOpB,EAYO,OAAA,OAVL,KAAK,SACL,SAAS,IACR,aAAY,EAAA,EAAC,CAAC,SAAS,UACxB,MAAM,iCACL,eAAc,EAAA,KAAK,MAAM,MACzB,QAAK,EAAO,EAAY,CAAA,OAAA,CAAA,CACxB,UAAO,CAAA,EAAA,EAAa,EAAY,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EACJ,EAAY,CAAA,UAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,IAEtC,EAAA,MAAY,CAAA,GAAA,EAAA,EAEjB,EAmBS,SAAA,CAlBP,KAAK,SACJ,aAAY,EAAA,EAAC,CAAC,SAAS,eACxB,MAAM,oPACN,gBAAgB,QACf,QAAK,AAAA,EAAA,KAAA,GAAA,GAAA,IAAe,EAAA,YAAA,EAAA,WAAA,GAAA,EAAU,CAAA,CAAA,OAAA,UAAA,CAAA,cAE/B,EAWM,MAAA,CAVJ,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,eAAa,IACb,cAAY,SAEZ,EAAsC,OAAA,CAAhC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,OAC/B,EAAsC,OAAA,CAAhC,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,+BEvF1B,EAAe,EAAK,OAA4B,CAC3D,KAAM,eAEN,MAAO,SAEP,OAAQ,GAER,KAAM,GAEN,YAAa,CACX,MAAO,CACL,UAAW,EAAE,CACb,OAAQ,EAAe,OACxB,EAGH,eAAgB,CACd,MAAO,CACL,MAAO,CACL,QAAS,GACT,UAAY,GACV,EAAQ,aAAa,aAAa,EAAI,EAAQ,aAAe,GAChE,CACD,MAAO,CACL,QAAS,GACT,UAAY,GAAY,EAAQ,aAAa,iBAAiB,EAAI,GACnE,CACF,EAGH,WAAY,CACV,MAAO,CACL,CACE,IAAK,uBACN,CACF,EAGH,WAAW,CAAE,OAAM,kBAAkB,CACnC,IAAM,EAAQ,EAAiB,EAAK,MAAM,MAAO,KAAK,QAAQ,UAAU,CAExE,MAAO,CACL,OACA,EAAgB,EAAgB,CAC9B,iBAAkB,EAAK,MAAM,MAC7B,aAAc,EACf,CAAC,CACF,EACD,EAGH,aAAc,CACZ,OAAO,EAAkB,EAAiB,EAG5C,aAAc,CACZ,MAAO,CACL,eACG,IACA,CAAE,cACM,EAAS,cAAc,CAC5B,KAAM,KAAK,KACX,QACD,CAAC,CAEP,EAGH,sBAAuB,CACrB,MAAO,CACL,cAAiB,EAAe,KAAK,OAAQ,KAAK,KAAK,CACvD,WAAc,EAAe,KAAK,OAAQ,KAAK,KAAK,CACrD,EAGH,eAAgB,CAGd,MAAO,CACL,IAAI,EAAU,CACZ,KAJmB,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAS,IAAK,GAAG,CAKrE,SAAU,CAAE,QAAO,QAAO,WAAY,CACpC,IAAM,EAAY,EAAM,GAClB,EAAQ,EAAiB,EAAW,KAAK,QAAQ,UAAU,CAE3D,EAAO,KAAK,KAAK,OAAO,CAC5B,QACA,MAAO,EACR,CAAC,CAEF,EAAM,GAAG,YAAY,EAAM,KAAM,EAAM,GAAI,EAAK,EAEnD,CAAC,CACH,EAGH,eAAgB,CAGd,MAAO,CACL,IAAI,EAAU,CACZ,KAJe,IAAI,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAQ,IAAI,CAKhE,SAAU,CAAE,QAAO,QAAO,WAAY,CACpC,IAAM,EAAY,EAAM,GAClB,EAAQ,EAAiB,EAAW,KAAK,QAAQ,UAAU,CAE3D,EAAO,KAAK,KAAK,OAAO,CAC5B,QACA,MAAO,EACR,CAAC,CAEF,EAAM,GAAG,YAAY,EAAM,KAAM,EAAM,GAAI,EAAK,EAEnD,CAAC,CACH,EAEJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"extensions-ea_ewKUl.js","names":[],"sources":["../../../src/extensions/FontSize.ts","../../../src/extensions/LetterSpacing.ts","../../../src/extensions/LineHeight.ts","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/isNodeSelected.ts","../../../src/extensions/renderVueNodeView.ts","../../../src/extensions/LogicMergeTagNode.ts","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNode.ts"],"sourcesContent":["import { Extension } from \"@tiptap/core\";\n\nexport interface FontSizeOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (size: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { fontSize: size }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LetterSpacingOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n letterSpacing: {\n setLetterSpacing: (spacing: string) => ReturnType;\n unsetLetterSpacing: () => ReturnType;\n };\n }\n}\n\nexport const LetterSpacing = Extension.create<LetterSpacingOptions>({\n name: \"letterSpacing\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n letterSpacing: {\n default: null,\n parseHTML: (element) =>\n element.style.letterSpacing?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.letterSpacing) {\n return {};\n }\n return {\n style: `letter-spacing: ${attributes.letterSpacing}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLetterSpacing:\n (spacing: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { letterSpacing: spacing }).run();\n },\n unsetLetterSpacing:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { letterSpacing: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LineHeightOptions {\n types: string[];\n defaultLineHeight: string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType;\n unsetLineHeight: () => ReturnType;\n };\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: \"lineHeight\",\n\n addOptions() {\n return {\n types: [\"paragraph\"],\n defaultLineHeight: \"1.5\",\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) => element.style.lineHeight || null,\n renderHTML: (attributes) => {\n if (!attributes.lineHeight) {\n return {};\n }\n return {\n style: `line-height: ${attributes.lineHeight}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { lineHeight }),\n );\n },\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, \"lineHeight\"),\n );\n },\n };\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import type { Editor } from \"@tiptap/core\";\n\n/**\n * Checks whether a TipTap node of the given type is selected, or if the cursor\n * is immediately adjacent to one (for Backspace/Delete handling).\n *\n * Shared by MergeTagNode and LogicMergeTagNode keyboard shortcuts.\n */\nexport function isNodeSelected(editor: Editor, nodeTypeName: string): boolean {\n const { selection } = editor.state;\n const { $from, $to } = selection;\n\n // Check if selection contains a node of this type\n let found = false;\n editor.state.doc.nodesBetween($from.pos, $to.pos, (node) => {\n if (node.type.name === nodeTypeName) {\n found = true;\n return false;\n }\n });\n\n if (found) {\n return true;\n }\n\n // Check if cursor is right after the node (for Backspace)\n if ($from.pos > 0 && $from.nodeBefore?.type.name === nodeTypeName) {\n return true;\n }\n\n // Check if cursor is right before the node (for Delete)\n if ($from.nodeAfter?.type.name === nodeTypeName) {\n return true;\n }\n\n return false;\n}\n","import type { Component } from \"vue\";\nimport { VueNodeViewRenderer } from \"@tiptap/vue-3\";\n\n/**\n * Typed wrapper for VueNodeViewRenderer that handles the known type mismatch\n * between Vue SFC default exports and TipTap's expected component type.\n */\nexport function renderVueNodeView(component: Component) {\n return VueNodeViewRenderer(\n component as Parameters<typeof VueNodeViewRenderer>[0],\n );\n}\n","import LogicMergeTagNodeView from \"./LogicMergeTagNodeView.vue\";\nimport type { SyntaxPreset } from \"@templatical/types\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface LogicMergeTagNodeOptions {\n syntax: SyntaxPreset;\n}\n\nexport const LogicMergeTagNode = Node.create<LogicMergeTagNodeOptions>({\n name: \"logicMergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n value: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-logic-merge-tag\") || \"\",\n },\n keyword: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-keyword\") || element.textContent || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-logic-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n if (!isLogicMergeTagValue(node.attrs.value, this.options.syntax)) {\n return [\"span\", {}, node.attrs.value];\n }\n\n const keyword = getLogicMergeTagKeyword(\n node.attrs.value,\n this.options.syntax,\n );\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-logic-merge-tag\": node.attrs.value,\n \"data-keyword\": keyword,\n }),\n keyword,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(LogicMergeTagNodeView);\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.logic.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.logic.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-32 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-32 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all hover:tpl:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import MergeTagNodeView from \"./MergeTagNodeView.vue\";\nimport type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport { getMergeTagLabel, SYNTAX_PRESETS } from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface MergeTagNodeOptions {\n mergeTags: MergeTag[];\n syntax: SyntaxPreset;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n mergeTagNode: {\n insertMergeTag: (attrs: MergeTag) => ReturnType;\n };\n }\n}\n\nexport const MergeTagNode = Node.create<MergeTagNodeOptions>({\n name: \"mergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n mergeTags: [],\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n label: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-label\") || element.textContent || \"\",\n },\n value: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-merge-tag\") || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const label = getMergeTagLabel(node.attrs.value, this.options.mergeTags);\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-merge-tag\": node.attrs.value,\n \"data-label\": label,\n }),\n label,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(MergeTagNodeView);\n },\n\n addCommands() {\n return {\n insertMergeTag:\n (attrs: MergeTag) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.value.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags);\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.value.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags);\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=[`10px`,`12px`,`14px`,`16px`,`18px`,`20px`,`24px`,`28px`,`32px`,`36px`,`48px`,`64px`],t=[`1`,`1.2`,`1.4`,`1.5`,`1.6`,`1.8`,`2`,`2.5`],n=[{label:`Normal`,value:`normal`},{label:`-0.5px`,value:`-0.5px`},{label:`0.5px`,value:`0.5px`},{label:`1px`,value:`1px`},{label:`1.5px`,value:`1.5px`},{label:`2px`,value:`2px`},{label:`3px`,value:`3px`}],r=`#000000`,i=`#ffff00`;export{t as a,n as i,r as n,e as r,i as t};
|
|
2
|
+
//# sourceMappingURL=styleConstants-CNejCb-L.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styleConstants-
|
|
1
|
+
{"version":3,"file":"styleConstants-CNejCb-L.js","names":[],"sources":["../../../src/constants/styleConstants.ts"],"sourcesContent":["export const labelClass =\n \"tpl:block tpl:mb-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-text-muted)]\";\n\nexport const inputClass =\n \"tpl:w-full tpl:h-10 tpl:px-3.5 tpl:py-1.5 tpl:text-sm tpl:border tpl:rounded-[var(--tpl-radius-sm)] tpl:shadow-xs tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:border-[var(--tpl-border)] tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] tpl:outline-none focus:tpl:border-[var(--tpl-primary)] focus:tpl:shadow-[var(--tpl-ring)] placeholder:tpl:text-[var(--tpl-text-dim)]\";\n\nexport const inputGroupInputClass =\n \"tpl:w-full tpl:h-10 tpl:px-3.5 tpl:py-1.5 tpl:text-sm tpl:border tpl:rounded-l-[var(--tpl-radius-sm)] tpl:rounded-r-none tpl:border-r-0 tpl:shadow-xs tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:border-[var(--tpl-border)] tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] tpl:outline-none focus:tpl:border-[var(--tpl-primary)] focus:tpl:shadow-[var(--tpl-ring)] placeholder:tpl:text-[var(--tpl-text-dim)]\";\n\nexport const inputSuffixClass =\n \"tpl:flex tpl:items-center tpl:px-2.5 tpl:text-xs tpl:border tpl:border-l-0 tpl:text-[var(--tpl-text-dim)] tpl:bg-[var(--tpl-bg-hover)] tpl:border-[var(--tpl-border)] tpl:rounded-r-[var(--tpl-radius-sm)]\";\n\nexport const colorInputClass =\n \"tpl:w-10 tpl:shrink-0 tpl:h-10 tpl:p-0.5 tpl:border tpl:rounded-[var(--tpl-radius-sm)] tpl:cursor-pointer tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\";\n\nexport const colorTextClass =\n \"tpl:flex-1 tpl:h-10 tpl:px-3.5 tpl:py-1.5 tpl:text-xs tpl:font-mono tpl:border tpl:rounded-[var(--tpl-radius-sm)] tpl:shadow-xs tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:border-[var(--tpl-border)] tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] tpl:outline-none focus:tpl:border-[var(--tpl-primary)] focus:tpl:shadow-[var(--tpl-ring)]\";\n\nexport const btnClass =\n \"tpl:flex-1 tpl:px-2.5 tpl:py-[7px] tpl:text-sm tpl:font-medium tpl:cursor-pointer tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-sm)] tpl:text-[var(--tpl-text-muted)] tpl:bg-transparent tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] hover:tpl:bg-[var(--tpl-bg-hover)] hover:tpl:text-[var(--tpl-text)]\";\n\nexport const btnActiveClass =\n \"tpl:flex-1 tpl:px-2.5 tpl:py-[7px] tpl:text-sm tpl:font-medium tpl:cursor-pointer tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-sm)] tpl:text-[var(--tpl-primary)] tpl:bg-[var(--tpl-primary-light)]\";\n\nexport const cardClass =\n \"tpl:rounded-[var(--tpl-radius)] tpl:bg-[var(--tpl-bg-elevated)] tpl:p-4 tpl:border tpl:border-[var(--tpl-border)] tpl:transition-colors tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] hover:tpl:bg-[var(--tpl-bg-hover)]\";\n\nexport const outlineBtnClass =\n \"tpl:px-3 tpl:py-1.5 tpl:text-sm tpl:font-medium tpl:border tpl:cursor-pointer tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:text-[var(--tpl-primary)] tpl:bg-transparent tpl:border-[var(--tpl-primary)] tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] hover:tpl:bg-[var(--tpl-primary)] hover:tpl:text-[var(--tpl-bg)]\";\n\nexport const headerBtnClass =\n \"tpl-btn tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3.5 tpl:py-2 tpl:text-sm tpl:font-medium tpl:whitespace-nowrap tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)] hover:tpl:bg-[var(--tpl-primary)] hover:tpl:text-[var(--tpl-bg)] tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\";\n\n// Rich text toolbar presets\nexport const FONT_SIZE_OPTIONS = [\n \"10px\",\n \"12px\",\n \"14px\",\n \"16px\",\n \"18px\",\n \"20px\",\n \"24px\",\n \"28px\",\n \"32px\",\n \"36px\",\n \"48px\",\n \"64px\",\n];\n\nexport const LINE_HEIGHT_OPTIONS = [\n \"1\",\n \"1.2\",\n \"1.4\",\n \"1.5\",\n \"1.6\",\n \"1.8\",\n \"2\",\n \"2.5\",\n];\n\nexport const LETTER_SPACING_OPTIONS = [\n { label: \"Normal\", value: \"normal\" },\n { label: \"-0.5px\", value: \"-0.5px\" },\n { label: \"0.5px\", value: \"0.5px\" },\n { label: \"1px\", value: \"1px\" },\n { label: \"1.5px\", value: \"1.5px\" },\n { label: \"2px\", value: \"2px\" },\n { label: \"3px\", value: \"3px\" },\n];\n\n// Default color constants\nexport const DEFAULT_TEXT_COLOR = \"#000000\";\nexport const DEFAULT_BG_COLOR = \"#ffffff\";\nexport const DEFAULT_HIGHLIGHT_COLOR = \"#ffff00\";\nexport const DEFAULT_TABLE_ROW_BG = \"#f2f2f2\";\n"],"mappings":"AAkCA,IAAa,EAAoB,CAC/B,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACD,CAEY,EAAsB,CACjC,IACA,MACA,MACA,MACA,MACA,MACA,IACA,MACD,CAEY,EAAyB,CACpC,CAAE,MAAO,SAAU,MAAO,SAAU,CACpC,CAAE,MAAO,SAAU,MAAO,SAAU,CACpC,CAAE,MAAO,QAAS,MAAO,QAAS,CAClC,CAAE,MAAO,MAAO,MAAO,MAAO,CAC9B,CAAE,MAAO,QAAS,MAAO,QAAS,CAClC,CAAE,MAAO,MAAO,MAAO,MAAO,CAC9B,CAAE,MAAO,MAAO,MAAO,MAAO,CAC/B,CAGY,EAAqB,UAErB,EAA0B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./rolldown-runtime-BakkzWXw.js";import{B as e,F as t,L as n,P as r,S as i,U as a,V as o,W as s,k as c,l,t as u,y as d,z as f}from"./draggable-ClUwYCFL.js";import"./icons-vmLJTaJk.js";import{r as p,t as m}from"./useMergeTag-DVOz1v9p.js";function h(e,t){return r()?(n(e,t),!0):!1}var g=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;var _=Object.prototype.toString,v=e=>_.call(e)===`[object Object]`;function y(e){return Array.isArray(e)?e:[e]}function b(t,n,r={}){let{immediate:i=!0,immediateCallback:s=!1}=r,c=o(!1),l;function u(){l&&=(clearTimeout(l),void 0)}function d(){c.value=!1,u()}function f(...e){s&&t(),u(),c.value=!0,l=setTimeout(()=>{c.value=!1,l=void 0,t(...e)},a(n))}return i&&(c.value=!0,g&&f()),h(d),{isPending:e(c),start:f,stop:d}}function x(e=!1,n={}){let{truthyValue:r=!0,falsyValue:i=!1}=n,s=t(e),c=o(e);function l(e){if(arguments.length)return c.value=e,c.value;{let e=a(r);return c.value=c.value===e?a(i):e,c.value}}return s?l:[c,l]}function S(e,t,n){return c(e,t,{...n,immediate:!0})}var C=g?window:void 0;function w(e){let t=a(e);return t?.$el??t}function T(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=l(()=>{let t=y(a(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return S(()=>[n.value?.map(e=>w(e))??[C].filter(e=>e!=null),y(a(n.value?e[1]:e[0])),y(s(n.value?e[2]:e[1])),a(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=v(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}var E=`modulepreload`,D=function(e){return`/`+e},O={},k=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=D(t,n),t in O)return;O[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:E,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},A=`a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function j(e,t){let r=null,i=null;function a(){return e.value?Array.from(e.value.querySelectorAll(A)).filter(e=>e.offsetParent!==null):[]}function o(e){if(e.key!==`Tab`)return;let t=a();if(t.length===0)return;let n=t[0],r=t[t.length-1];e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus())}function s(){r=document.activeElement,requestAnimationFrame(()=>{let t=a();t.length>0&&(e.value?.querySelector(`[autofocus], input:not([disabled])`)??t[0]).focus()}),i=T(e,`keydown`,o)}function l(){i?.(),i=null,r&&r.focus&&(r.focus(),r=null)}let u=c([t,e],([e,t])=>{e&&t?s():l()},{flush:`post`});n(()=>{u(),l()})}function M(){let[e,t]=x(!1),n=o([]);c(e,async e=>{if(e&&n.value.length===0){let{emojiCategories:e}=await k(async()=>{let{emojiCategories:e}=await import(`./emojiData-6fVLNqeH.js`);return{emojiCategories:e}},[]);n.value=e}});function r(){t()}function i(){e.value=!1}return{categories:n,isOpen:e,toggle:r,close:i}}function N(e){let t=f(!1),n=f(``),r=f(null);j(r,t);function i(){n.value=e.value?.getAttributes(`link`).href||``,t.value=!0}function a(){if(n.value){let t=n.value.startsWith(`http`)?n.value:`https://${n.value}`;e.value?.chain().focus().extendMarkRange(`link`).setLink({href:t}).run()}s()}function o(){e.value?.chain().focus().extendMarkRange(`link`).unsetLink().run(),s()}function s(){t.value=!1,n.value=``}function c(e){e.key===`Enter`?(e.preventDefault(),a()):e.key===`Escape`&&s()}return{showLinkDialog:t,linkUrl:n,linkDialogRef:r,openLinkDialog:i,insertLink:a,removeLink:o,closeLinkDialog:s,handleLinkKeydown:c}}function P(e){let t=d(p,null),{mergeTags:n,isEnabled:r,isRequesting:a,requestMergeTag:s,syntax:l}=m(),u=o(null),{showLinkDialog:h,linkUrl:g,linkDialogRef:_,openLinkDialog:v,insertLink:y,removeLink:x,closeLinkDialog:S,handleLinkKeydown:C}=N(u),{start:w,stop:E}=b(()=>u.value?.commands.focus(`end`),0,{immediate:!1}),D=o(null),O=f(!0),k=f(null);async function A(){k.value=null,O.value=!0;try{let{TiptapEditor:r,EC:i,extensions:a}=await e.loadExtensions({mergeTags:n,syntax:l});D.value=i;let o=new Map;a.forEach((e,t)=>o.set(e.name,t)),u.value=new r({extensions:a.filter((e,t)=>o.get(e.name)===t),content:e.blockContent(),editable:!0,onUpdate:({editor:n})=>{t&&t.updateBlock(e.blockId(),{content:n.getHTML()})}}),O.value=!1,w()}catch(t){console.error(`[${e.editorName??`RichTextEditor`}] Failed to initialize TipTap editor:`,t),k.value=t instanceof Error?t.message:`Failed to load editor`,O.value=!1}}function j(){u.value?.destroy(),u.value=null,A()}A();let M=c(()=>e.blockContent(),e=>{u.value&&u.value.getHTML()!==e&&u.value.commands.setContent(e,{emitUpdate:!1})});function P(t){if(a.value)return;let n=t.target;e.onClickOutsideSideEffect?.(n),!(n.closest(`.tpl-text-editor-wrapper`)||n.closest(`.tpl-text-toolbar`)||n.closest(`.tpl-link-dialog`))&&e.onDone()}T(document,`mousedown`,P),i(()=>{M(),E(),u.value?.destroy()});async function F(){let e=await s();e&&u.value?u.value.chain().focus().insertMergeTag({label:e.label,value:e.value}).run():u.value?.commands.focus()}return{editor:u,EditorContent:D,isLoading:O,initError:k,retry:j,showLinkDialog:h,linkUrl:g,linkDialogRef:_,mergeTags:n,mergeTagEnabled:r,isRequestingMergeTag:a,syntax:l,openLinkDialog:v,insertLink:y,removeLink:x,closeLinkDialog:S,handleLinkKeydown:C,handleAddMergeTag:F}}u();export{M as n,k as r,P as t};
|
|
2
|
+
//# sourceMappingURL=useEditorCore-CwuxQuvh.js.map
|