@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.
Files changed (59) hide show
  1. package/dist/{AiChatSidebar-XBj5Rw2l.js → AiChatSidebar-busJk9hm.js} +1 -1
  2. package/dist/{AiFeatureMenu-my1mZ9DL.js → AiFeatureMenu-DLGv_-pj.js} +3 -3
  3. package/dist/{CloudEditor-BVjgKwq3.js → CloudEditor-BDnHd6Um.js} +176 -197
  4. package/dist/{CollaboratorBar-BZq_Gv38.js → CollaboratorBar-Dv3l52vC.js} +2 -2
  5. package/dist/{CommentsSidebar-D9oxqO6l.js → CommentsSidebar-4tjp0VU5.js} +2 -2
  6. package/dist/{DesignReferenceSidebar-CyHq4SWt.js → DesignReferenceSidebar-CmwXvltV.js} +55 -54
  7. package/dist/{ModuleBrowserModal-Cus2Hdwl.js → ModuleBrowserModal-lrk3Fr0H.js} +6 -6
  8. package/dist/{ModulePreviewCanvas-DaByXKY_.js → ModulePreviewCanvas-BcBJLnwL.js} +3 -3
  9. package/dist/ParagraphEditor-DH8cSC6m.js +625 -0
  10. package/dist/{RichTextEditorContent-BRpjJ6SV.js → RichTextEditorContent-CQqodi7p.js} +3 -3
  11. package/dist/{SaveModuleDialog-BIZBQrd8.js → SaveModuleDialog-Bmzi72td.js} +4 -4
  12. package/dist/{SnapshotHistory-Ds1-QNbx.js → SnapshotHistory-AEgi9Xsn.js} +2 -2
  13. package/dist/{TemplateScoringPanel-C8XSk_Ys.js → TemplateScoringPanel-CTgMtc0-.js} +2 -2
  14. package/dist/{TestEmailModal-CCVfaFgV.js → TestEmailModal-Dpq1is9S.js} +3 -3
  15. package/dist/{TitleEditor-V4qaEULF.js → TitleEditor-CLcDdcWI.js} +7 -7
  16. package/dist/{TplModal-LT3FXlgs.js → TplModal-CGzRjR96.js} +2 -2
  17. package/dist/{blockTypeIcons-BujoY5Dl.js → blockTypeIcons-BpPTqcok.js} +1 -1
  18. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js +3 -0
  19. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js.map +1 -0
  20. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js +2 -0
  21. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js.map +1 -0
  22. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js +3 -0
  23. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js.map +1 -0
  24. package/dist/cdn/chunks/{extensions-BfjbWqOx.js → extensions-ea_ewKUl.js} +2 -2
  25. package/dist/cdn/chunks/{extensions-BfjbWqOx.js.map → extensions-ea_ewKUl.js.map} +1 -1
  26. package/dist/cdn/chunks/styleConstants-CNejCb-L.js +2 -0
  27. package/dist/cdn/chunks/{styleConstants-UTJ94gco.js.map → styleConstants-CNejCb-L.js.map} +1 -1
  28. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js +2 -0
  29. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js.map +1 -0
  30. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js +2 -0
  31. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js.map +1 -0
  32. package/dist/cdn/editor.js +1 -1
  33. package/dist/cdn/editor.js.map +1 -1
  34. package/dist/{dist-DNjZKe2Z.js → dist-DmpMJbmZ.js} +1 -1
  35. package/dist/{extensions-BA4NshZQ.js → extensions-CKM99njP.js} +3 -3
  36. package/dist/{i18n-ikyi28RU.js → i18n-CJsFtdbZ.js} +1 -1
  37. package/dist/keys-Dwa2PmdD.js +10 -0
  38. package/dist/{styleConstants-CgtFM9hQ.js → styleConstants-D4SOZGBV.js} +53 -2
  39. package/dist/{styles-hQgJKM4i.js → styles-DSw1VNU3.js} +592 -592
  40. package/dist/templatical-editor.css +1 -1
  41. package/dist/templatical-editor.js +5 -5
  42. package/dist/templatical-editor.umd.cjs +59 -59
  43. package/dist/{useEditorCore-DVp5qmtC.js → useEditorCore-Cc4RCwWq.js} +907 -903
  44. package/dist/{useI18n-DzH4KXDk.js → useI18n-DUirdXEX.js} +2 -2
  45. package/dist/{useMergeTag-D9zQVE-e.js → useMergeTag-DVnlvPYJ.js} +2 -2
  46. package/package.json +2 -2
  47. package/dist/ParagraphEditor-BSyk5B6S.js +0 -670
  48. package/dist/cdn/chunks/ParagraphEditor-BkJQO-ZW.js +0 -3
  49. package/dist/cdn/chunks/ParagraphEditor-BkJQO-ZW.js.map +0 -1
  50. package/dist/cdn/chunks/RichTextEditorContent-UGQorJm_.js +0 -2
  51. package/dist/cdn/chunks/RichTextEditorContent-UGQorJm_.js.map +0 -1
  52. package/dist/cdn/chunks/TitleEditor-CC3Adjai.js +0 -3
  53. package/dist/cdn/chunks/TitleEditor-CC3Adjai.js.map +0 -1
  54. package/dist/cdn/chunks/styleConstants-UTJ94gco.js +0 -2
  55. package/dist/cdn/chunks/useEditorCore-DRhPKq_z.js +0 -2
  56. package/dist/cdn/chunks/useEditorCore-DRhPKq_z.js.map +0 -1
  57. package/dist/cdn/chunks/useMergeTag-CBSlcqnk.js +0 -2
  58. package/dist/cdn/chunks/useMergeTag-CBSlcqnk.js.map +0 -1
  59. package/dist/keys-8B5MFafK.js +0 -4
@@ -1,7 +1,7 @@
1
- import { b as e } from "./useEditorCore-DVp5qmtC.js";
2
- import { C as t, x as n } from "./keys-8B5MFafK.js";
3
- import { t as r } from "./useI18n-DzH4KXDk.js";
4
- import { a as i, i as a, n as o, r as s, t as c } from "./RichTextEditorContent-BRpjJ6SV.js";
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-DNjZKe2Z.js").then((e) => e.r),
30
+ import("./dist-DmpMJbmZ.js").then((e) => e.r),
31
31
  import("./dist-DysAFIPy.js"),
32
32
  import("./dist-Bu7veieH.js"),
33
- import("./extensions-BA4NshZQ.js")
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-DVp5qmtC.js";
2
- import { C as t } from "./keys-8B5MFafK.js";
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-DVp5qmtC.js";
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{d as v,f as y,m as b,n as x,p as S,t as C}from"./useMergeTag-CBSlcqnk.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:S}=C(),{t:w}=x(),T=u(()=>b(v.node.attrs.value,S)),E=u(()=>y(v.node.attrs.value,S)),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:b(e,S)?y(e,S):``}),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(!b(e.attrs.value,this.options.syntax))return[`span`,{},e.attrs.value];let n=y(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(!b(r,this.options.syntax))return;let i=y(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(!b(r,this.options.syntax))return;let i=y(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=S(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=S(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=S(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-BfjbWqOx.js.map
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":"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"}
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-UTJ94gco.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// 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,EAAqB,UAErB,EAA0B"}
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