@templatical/editor 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/{AiChatSidebar-busJk9hm.js → AiChatSidebar-CjfhTZwo.js} +1 -1
  2. package/dist/{AiFeatureMenu-DLGv_-pj.js → AiFeatureMenu-K44aZa_P.js} +3 -3
  3. package/dist/CloudEditor-DFyuRxUV.js +926 -0
  4. package/dist/{CollaboratorBar-Dv3l52vC.js → CollaboratorBar-BuCEcdbB.js} +25 -21
  5. package/dist/{CommentsSidebar-4tjp0VU5.js → CommentsSidebar-2lcqMfIP.js} +2 -2
  6. package/dist/{DesignReferenceSidebar-CmwXvltV.js → DesignReferenceSidebar-CNMu4Zrx.js} +2 -2
  7. package/dist/{ModuleBrowserModal-lrk3Fr0H.js → ModuleBrowserModal-CvQ0xyQf.js} +6 -6
  8. package/dist/{ModulePreviewCanvas-BcBJLnwL.js → ModulePreviewCanvas-Be2B3Y07.js} +2 -2
  9. package/dist/ParagraphEditor-CcMPnbDr.js +652 -0
  10. package/dist/{RichTextEditorContent-CQqodi7p.js → RichTextEditorContent-CHJlh7HJ.js} +8 -4
  11. package/dist/{SaveModuleDialog-Bmzi72td.js → SaveModuleDialog-BaaeH5Xm.js} +5 -5
  12. package/dist/{SnapshotHistory-AEgi9Xsn.js → SnapshotHistory-BPfjiuu1.js} +2 -2
  13. package/dist/{TemplateScoringPanel-CTgMtc0-.js → TemplateScoringPanel-D58A23Vq.js} +3 -3
  14. package/dist/{TestEmailModal-Dpq1is9S.js → TestEmailModal-DIAlB3e_.js} +3 -3
  15. package/dist/{TitleEditor-CLcDdcWI.js → TitleEditor-D9DPjQkX.js} +7 -7
  16. package/dist/{TplModal-CGzRjR96.js → TplModal-CmTSvCY-.js} +2 -2
  17. package/dist/{blockTypeIcons-BpPTqcok.js → blockTypeIcons-D1RTWOkx.js} +1 -1
  18. package/dist/cdn/chunks/AiChatSidebar-CmPTbTFG.js +2 -0
  19. package/dist/cdn/chunks/AiFeatureMenu-lxVm1RjH.js +59 -0
  20. package/dist/cdn/chunks/AiFeatureMenu-lxVm1RjH.js.map +1 -0
  21. package/dist/cdn/chunks/CloudEditor-Bmp5IlWi.js +900 -0
  22. package/dist/cdn/chunks/CloudEditor-Bmp5IlWi.js.map +1 -0
  23. package/dist/cdn/chunks/CollaboratorBar-D2PKtlOw.js +51 -0
  24. package/dist/cdn/chunks/CollaboratorBar-D2PKtlOw.js.map +1 -0
  25. package/dist/cdn/chunks/CommentsSidebar-BOelj4Ca.js +2 -0
  26. package/dist/cdn/chunks/DesignReferenceSidebar-Bf6rg0A7.js +2 -0
  27. package/dist/cdn/chunks/ModuleBrowserModal-CxDXzkKS.js +195 -0
  28. package/dist/cdn/chunks/ModuleBrowserModal-CxDXzkKS.js.map +1 -0
  29. package/dist/cdn/chunks/ModulePreviewCanvas-DEfHampA.js +107 -0
  30. package/dist/cdn/chunks/ModulePreviewCanvas-DEfHampA.js.map +1 -0
  31. package/dist/cdn/chunks/ParagraphEditor-DHdu6lb3.js +503 -0
  32. package/dist/cdn/chunks/ParagraphEditor-DHdu6lb3.js.map +1 -0
  33. package/dist/cdn/chunks/RichTextEditorContent-DWUzizsC.js +106 -0
  34. package/dist/cdn/chunks/RichTextEditorContent-DWUzizsC.js.map +1 -0
  35. package/dist/cdn/chunks/SaveModuleDialog-DVna2xUl.js +119 -0
  36. package/dist/cdn/chunks/SaveModuleDialog-DVna2xUl.js.map +1 -0
  37. package/dist/cdn/chunks/SnapshotHistory-BFF2SsTN.js +2 -0
  38. package/dist/cdn/chunks/TemplateScoringPanel-gi8wc_m7.js +2 -0
  39. package/dist/cdn/chunks/TestEmailModal-Qtd6aC-6.js +2 -0
  40. package/dist/cdn/chunks/TitleEditor-DDf_OcHS.js +166 -0
  41. package/dist/cdn/chunks/TitleEditor-DDf_OcHS.js.map +1 -0
  42. package/dist/cdn/chunks/_rolldown_dynamic_import_helper-DMEI4TQ3.js +9 -0
  43. package/dist/cdn/chunks/blockTypeIcons-BnobReQm.js +22 -0
  44. package/dist/cdn/chunks/blockTypeIcons-BnobReQm.js.map +1 -0
  45. package/dist/cdn/chunks/de-BB3dgVOc.js +700 -0
  46. package/dist/cdn/chunks/de-BB3dgVOc.js.map +1 -0
  47. package/dist/cdn/chunks/de-BvYD17KT.js +89 -0
  48. package/dist/cdn/chunks/de-BvYD17KT.js.map +1 -0
  49. package/dist/cdn/chunks/dist-B6AUkMyh.js +2 -0
  50. package/dist/cdn/chunks/dist-B878xb_62.js +457 -0
  51. package/dist/cdn/chunks/dist-B878xb_62.js.map +1 -0
  52. package/dist/cdn/chunks/dist-Bf1Op9A1.js +2 -0
  53. package/dist/cdn/chunks/dist-BkETaOfw.js +2 -0
  54. package/dist/cdn/chunks/dist-CJcMnY7o.js +2 -0
  55. package/dist/cdn/chunks/dist-CWsl6S1K.js +2 -0
  56. package/dist/cdn/chunks/dist-CllLxIMQ.js +2 -0
  57. package/dist/cdn/chunks/dist-Cs0wFwdw.js +2 -0
  58. package/dist/cdn/chunks/dist-DLWHlekl.js +2 -0
  59. package/dist/cdn/chunks/dist-DS3_HVpX.js +2 -0
  60. package/dist/cdn/chunks/dist-DTXopj1a.js +2 -0
  61. package/dist/cdn/chunks/dist-DnwLoNLm.js +2 -0
  62. package/dist/cdn/chunks/draggable-BQNU47zu.js +11544 -0
  63. package/dist/cdn/chunks/{draggable-ClUwYCFL.js.map → draggable-BQNU47zu.js.map} +1 -1
  64. package/dist/cdn/chunks/emojiData-BVEJHcNH.js +19 -0
  65. package/dist/cdn/chunks/{emojiData-6fVLNqeH.js.map → emojiData-BVEJHcNH.js.map} +1 -1
  66. package/dist/cdn/chunks/en-CpotcOPr.js +89 -0
  67. package/dist/cdn/chunks/en-CpotcOPr.js.map +1 -0
  68. package/dist/cdn/chunks/en-DeDcpnoS.js +700 -0
  69. package/dist/cdn/chunks/en-DeDcpnoS.js.map +1 -0
  70. package/dist/cdn/chunks/extensions-B_kcV0tK.js +419 -0
  71. package/dist/cdn/chunks/{extensions-ea_ewKUl.js.map → extensions-B_kcV0tK.js.map} +1 -1
  72. package/dist/cdn/chunks/features-ofOGnSC0.js +6700 -0
  73. package/dist/cdn/chunks/features-ofOGnSC0.js.map +1 -0
  74. package/dist/cdn/chunks/icons-bIb7PBOE.js +653 -0
  75. package/dist/cdn/chunks/icons-bIb7PBOE.js.map +1 -0
  76. package/dist/cdn/chunks/liquid.browser-C1VIYISn.js +3272 -0
  77. package/dist/cdn/chunks/liquid.browser-C1VIYISn.js.map +1 -0
  78. package/dist/cdn/chunks/media-library-BIYzV2Y2.js +6005 -0
  79. package/dist/cdn/chunks/media-library-BIYzV2Y2.js.map +1 -0
  80. package/dist/cdn/chunks/pusher-DJPhQnE8.js +2505 -0
  81. package/dist/cdn/chunks/pusher-DJPhQnE8.js.map +1 -0
  82. package/dist/cdn/chunks/readableTextColor-Cd_cgWO_.js +32 -0
  83. package/dist/cdn/chunks/readableTextColor-Cd_cgWO_.js.map +1 -0
  84. package/dist/cdn/chunks/rolldown-runtime-DPITmOBR.js +20 -0
  85. package/dist/cdn/chunks/src-BuW9oYtm.js +494 -0
  86. package/dist/cdn/chunks/src-BuW9oYtm.js.map +1 -0
  87. package/dist/cdn/chunks/styleConstants-1KwsBMxJ.js +57 -0
  88. package/dist/cdn/chunks/{styleConstants-CNejCb-L.js.map → styleConstants-1KwsBMxJ.js.map} +1 -1
  89. package/dist/cdn/chunks/styles-DQFExz-T.js +3222 -0
  90. package/dist/cdn/chunks/styles-DQFExz-T.js.map +1 -0
  91. package/dist/cdn/chunks/tiptap-DplY-S-k.js +14208 -0
  92. package/dist/cdn/chunks/{tiptap-Cya4P9CN.js.map → tiptap-DplY-S-k.js.map} +1 -1
  93. package/dist/cdn/editor.css +2 -1
  94. package/dist/cdn/editor.js +260 -1
  95. package/dist/cdn/editor.js.map +1 -1
  96. package/dist/{de-B4Ob4vCo.js → de-D7TLGIPA.js} +20 -4
  97. package/dist/{dist-DmpMJbmZ.js → dist-BkIys9zn.js} +1 -1
  98. package/dist/{en-YXsspZJG.js → en-DvtiEMwP.js} +20 -4
  99. package/dist/{extensions-CKM99njP.js → extensions-DEjfEFhD.js} +3 -3
  100. package/dist/{keys-Dwa2PmdD.js → keys-C0MQRs8d.js} +3 -3
  101. package/dist/readableTextColor-LDlmVEUv.js +30 -0
  102. package/dist/{styles-DSw1VNU3.js → styles-CgLaxDfu.js} +1096 -1074
  103. package/dist/templatical-editor.css +1 -1
  104. package/dist/templatical-editor.js +113 -89
  105. package/dist/templatical-editor.umd.cjs +59 -59
  106. package/dist/{useEditorCore-Cc4RCwWq.js → useEditorCore-CjwRMl7K.js} +1152 -1014
  107. package/dist/{useI18n-DUirdXEX.js → useI18n-D6m7ZUgY.js} +1 -1
  108. package/dist/{useMergeTag-DVnlvPYJ.js → useMergeTag-BZ3X0bNr.js} +1 -1
  109. package/package.json +2 -2
  110. package/dist/CloudEditor-BDnHd6Um.js +0 -919
  111. package/dist/ParagraphEditor-DH8cSC6m.js +0 -625
  112. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js +0 -3
  113. package/dist/cdn/chunks/ParagraphEditor-CCtWbGDv.js.map +0 -1
  114. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js +0 -2
  115. package/dist/cdn/chunks/RichTextEditorContent-BUD9veXd.js.map +0 -1
  116. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js +0 -3
  117. package/dist/cdn/chunks/TitleEditor-e_UTyxjd.js.map +0 -1
  118. package/dist/cdn/chunks/dist-0UheN8rK.js +0 -1
  119. package/dist/cdn/chunks/dist-55mmbGQ9.js +0 -1
  120. package/dist/cdn/chunks/dist-B31mxKyP.js +0 -1
  121. package/dist/cdn/chunks/dist-B5JI9nIg.js +0 -1
  122. package/dist/cdn/chunks/dist-B93vLKhU.js +0 -1
  123. package/dist/cdn/chunks/dist-BDt3FJvj.js +0 -1
  124. package/dist/cdn/chunks/dist-BJRuFHmi.js +0 -1
  125. package/dist/cdn/chunks/dist-BKSzrf0L.js +0 -1
  126. package/dist/cdn/chunks/dist-BL8c5gYQ.js +0 -1
  127. package/dist/cdn/chunks/dist-CYThWMP5.js +0 -1
  128. package/dist/cdn/chunks/dist-DxZbPJYt.js +0 -1
  129. package/dist/cdn/chunks/draggable-ClUwYCFL.js +0 -17
  130. package/dist/cdn/chunks/emojiData-6fVLNqeH.js +0 -2
  131. package/dist/cdn/chunks/extensions-ea_ewKUl.js +0 -2
  132. package/dist/cdn/chunks/icons-vmLJTaJk.js +0 -2
  133. package/dist/cdn/chunks/icons-vmLJTaJk.js.map +0 -1
  134. package/dist/cdn/chunks/rolldown-runtime-BakkzWXw.js +0 -1
  135. package/dist/cdn/chunks/styleConstants-CNejCb-L.js +0 -2
  136. package/dist/cdn/chunks/tiptap-Cya4P9CN.js +0 -145
  137. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js +0 -2
  138. package/dist/cdn/chunks/useEditorCore-CwuxQuvh.js.map +0 -1
  139. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js +0 -2
  140. package/dist/cdn/chunks/useMergeTag-DVOz1v9p.js.map +0 -1
  141. package/dist/i18n-CJsFtdbZ.js +0 -23
@@ -0,0 +1,503 @@
1
+ import { $ as e, E as t, F as n, J as r, N as i, S as a, _ as o, at as s, b as c, ct as l, d as u, f as d, g as f, h as p, l as m, lt as h, m as g, p as _, st as v, u as y, y as b } from "./draggable-BQNU47zu.js";
2
+ import { $t as x, At as S, Q as C, Ut as w, X as T, Zt as E, en as D, pt as O, q as k, tn as A } from "./features-ofOGnSC0.js";
3
+ import { C as ee, J as j, L as M, R as N, V as P, a as F, b as I, d as te, f as ne, g as L, l as re, o as ie, r as ae, s as R, z } from "./icons-bIb7PBOE.js";
4
+ import { a as B, o as V, s as H } from "./styleConstants-1KwsBMxJ.js";
5
+ import { n as U, t as W } from "./RichTextEditorContent-DWUzizsC.js";
6
+ //#region src/components/blocks/EmojiPickerDropdown.vue?vue&type=script&setup=true&lang.ts
7
+ var G = [
8
+ "aria-label",
9
+ "title",
10
+ "aria-expanded"
11
+ ], K = ["aria-label"], q = { class: "tpl:mb-1.5 tpl:text-[10px] tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase" }, J = { class: "tpl:grid tpl:grid-cols-10 tpl:gap-0.5" }, Y = ["aria-label", "onClick"], oe = /* @__PURE__ */ a({
12
+ __name: "EmojiPickerDropdown",
13
+ emits: ["insert"],
14
+ setup(t, { emit: r }) {
15
+ let a = r, { categories: l, isOpen: d, toggle: p, close: b } = T(), { t: x, format: w } = S(), E = e(null), D = e(null);
16
+ C(E, _(() => d.value)), A(D, () => {
17
+ d.value && b();
18
+ });
19
+ function O(e) {
20
+ a("insert", e), b();
21
+ }
22
+ return (e, t) => (i(), o("div", {
23
+ ref_key: "rootRef",
24
+ ref: D,
25
+ class: "tpl:relative"
26
+ }, [g("button", {
27
+ type: "button",
28
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": s(d) }]),
29
+ "aria-label": s(x).paragraphEditor.insertEmoji,
30
+ title: s(x).paragraphEditor.insertEmoji,
31
+ "aria-expanded": s(d),
32
+ "aria-haspopup": "dialog",
33
+ "aria-controls": "tpl-emoji-picker",
34
+ onClick: t[0] ||= (...e) => s(p) && s(p)(...e)
35
+ }, [c(s(L), {
36
+ size: 16,
37
+ "stroke-width": 2
38
+ })], 10, G), s(d) ? (i(), o("div", {
39
+ key: 0,
40
+ id: "tpl-emoji-picker",
41
+ ref_key: "pickerRef",
42
+ ref: E,
43
+ role: "dialog",
44
+ "aria-modal": "false",
45
+ "aria-label": s(x).paragraphEditor.insertEmoji,
46
+ tabindex: "-1",
47
+ 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",
48
+ onKeydown: t[1] ||= m(y((...e) => s(b) && s(b)(...e), ["stop", "prevent"]), ["esc"])
49
+ }, [(i(!0), o(u, null, n(s(l), (e) => (i(), o("div", {
50
+ key: e.key,
51
+ class: "tpl:mb-2 tpl:last:mb-0"
52
+ }, [g("div", q, h(s(x).emoji[e.key]), 1), g("div", J, [(i(!0), o(u, null, n(e.emojis, (e) => (i(), o("button", {
53
+ key: e,
54
+ type: "button",
55
+ "aria-label": s(w)(s(x).paragraphEditor.emojiItemLabel, { emoji: e }),
56
+ 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)]",
57
+ onClick: (t) => O(e)
58
+ }, h(e), 9, Y))), 128))])]))), 128))], 40, K)) : f("", !0)], 512));
59
+ }
60
+ }), se = ["data-tpl-theme", "aria-label"], ce = { class: "tpl:flex tpl:items-center tpl:gap-1" }, le = [
61
+ "value",
62
+ "aria-label",
63
+ "title"
64
+ ], ue = { value: "" }, de = ["value"], fe = [
65
+ "value",
66
+ "aria-label",
67
+ "title"
68
+ ], pe = { value: "" }, me = ["value"], he = { class: "tpl:relative" }, ge = [
69
+ "value",
70
+ "aria-label",
71
+ "title"
72
+ ], _e = { class: "tpl:relative" }, ve = [
73
+ "value",
74
+ "aria-label",
75
+ "title"
76
+ ], ye = ["aria-label", "title"], be = ["aria-label", "title"], xe = ["aria-label", "title"], Se = ["aria-label", "title"], Ce = ["aria-label", "title"], we = ["aria-label", "title"], Te = ["aria-label", "title"], Ee = { class: "tpl:flex tpl:items-center tpl:gap-1" }, De = ["aria-label", "title"], Oe = ["aria-label", "title"], ke = ["aria-label", "title"], Ae = ["aria-label", "title"], X = ["aria-label", "title"], je = ["value", "title"], Me = ["value"], Ne = ["value", "title"], Pe = ["value"], Fe = ["aria-label", "title"], Ie = {
77
+ key: 0,
78
+ class: "tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]"
79
+ }, Le = ["aria-label", "title"], Re = {
80
+ key: 1,
81
+ class: "tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]"
82
+ }, Z = /* @__PURE__ */ a({
83
+ __name: "ParagraphToolbar",
84
+ props: {
85
+ editor: {},
86
+ toolbarPosition: {},
87
+ isLoading: { type: Boolean },
88
+ mergeTagEnabled: { type: Boolean }
89
+ },
90
+ emits: ["open-link-dialog", "add-merge-tag"],
91
+ setup(e, { emit: r }) {
92
+ let a = e, m = r, _ = t(E, null), y = t(x, null), C = D(w, "ParagraphToolbar"), { t: T } = S(), k = C.fonts;
93
+ function A(e) {
94
+ a.editor?.chain().focus().insertContent(e).run();
95
+ }
96
+ function L() {
97
+ return a.editor?.getAttributes("textStyle").fontFamily || "";
98
+ }
99
+ function U() {
100
+ return a.editor?.getAttributes("textStyle").fontSize || "";
101
+ }
102
+ function W() {
103
+ return a.editor?.getAttributes("textStyle").color || "";
104
+ }
105
+ function G(e) {
106
+ e ? a.editor?.chain().focus().setFontFamily(e).run() : a.editor?.chain().focus().unsetFontFamily().run();
107
+ }
108
+ function K(e) {
109
+ e ? a.editor?.chain().focus().setFontSize(e).run() : a.editor?.chain().focus().unsetFontSize().run();
110
+ }
111
+ function q(e) {
112
+ e ? a.editor?.chain().focus().setColor(e).run() : a.editor?.chain().focus().unsetColor().run();
113
+ }
114
+ function J() {
115
+ return a.editor?.getAttributes("paragraph").lineHeight || "";
116
+ }
117
+ function Y(e) {
118
+ e ? a.editor?.chain().focus().setLineHeight(e).run() : a.editor?.chain().focus().unsetLineHeight().run();
119
+ }
120
+ function Z() {
121
+ return a.editor?.getAttributes("textStyle").letterSpacing || "";
122
+ }
123
+ function Q(e) {
124
+ e && e !== "normal" ? a.editor?.chain().focus().setLetterSpacing(e).run() : a.editor?.chain().focus().unsetLetterSpacing().run();
125
+ }
126
+ function $() {
127
+ return a.editor?.getAttributes("highlight").color || "";
128
+ }
129
+ function ze(e) {
130
+ e ? a.editor?.chain().focus().setHighlight({ color: e }).run() : a.editor?.chain().focus().unsetHighlight().run();
131
+ }
132
+ return (t, r) => (i(), p(d, { to: "body" }, [g("div", {
133
+ "data-tpl-theme": s(y),
134
+ role: "toolbar",
135
+ "aria-label": s(T).paragraphEditor.toolbar,
136
+ 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",
137
+ style: l({
138
+ ...s(_),
139
+ top: `${e.toolbarPosition.top}px`,
140
+ left: `${e.toolbarPosition.left}px`,
141
+ transform: "translateY(-100%)",
142
+ flexDirection: "column"
143
+ })
144
+ }, [!e.isLoading && e.editor ? (i(), o(u, { key: 0 }, [g("div", ce, [
145
+ g("select", {
146
+ 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",
147
+ value: L(),
148
+ "aria-label": s(T).paragraphEditor.fontFamily,
149
+ title: s(T).paragraphEditor.fontFamily,
150
+ onChange: r[0] ||= (e) => G(e.target.value)
151
+ }, [g("option", ue, h(s(T).paragraphEditor.defaultFont), 1), (i(!0), o(u, null, n(s(k), (e) => (i(), o("option", {
152
+ key: e.value,
153
+ value: e.value
154
+ }, h(e.label), 9, de))), 128))], 40, le),
155
+ g("select", {
156
+ 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",
157
+ value: U(),
158
+ "aria-label": s(T).paragraphEditor.fontSize,
159
+ title: s(T).paragraphEditor.fontSize,
160
+ onChange: r[1] ||= (e) => K(e.target.value)
161
+ }, [g("option", pe, h(s(T).paragraphEditor.defaultSize), 1), (i(!0), o(u, null, n(s(B), (e) => (i(), o("option", {
162
+ key: e,
163
+ value: e
164
+ }, h(e), 9, me))), 128))], 40, fe),
165
+ r[20] ||= g("span", {
166
+ class: "tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
167
+ "aria-hidden": "true"
168
+ }, null, -1),
169
+ g("div", he, [g("input", {
170
+ type: "color",
171
+ class: "tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-1",
172
+ value: W() || s("#000000"),
173
+ "aria-label": s(T).paragraphEditor.textColor,
174
+ title: s(T).paragraphEditor.textColor,
175
+ onInput: r[2] ||= (e) => q(e.target.value)
176
+ }, null, 40, ge)]),
177
+ g("div", _e, [g("input", {
178
+ type: "color",
179
+ class: "tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:p-1",
180
+ style: l({ backgroundColor: $() || "var(--tpl-bg)" }),
181
+ value: $() || s("#ffff00"),
182
+ "aria-label": s(T).paragraphEditor.highlightColor,
183
+ title: s(T).paragraphEditor.highlightColor,
184
+ onInput: r[3] ||= (e) => ze(e.target.value)
185
+ }, null, 44, ve)]),
186
+ r[21] ||= g("span", {
187
+ class: "tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
188
+ "aria-hidden": "true"
189
+ }, null, -1),
190
+ g("button", {
191
+ type: "button",
192
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("bold") }]),
193
+ "aria-label": s(T).paragraphEditor.bold,
194
+ title: s(T).paragraphEditor.bold,
195
+ onClick: r[4] ||= (t) => e.editor?.chain().focus().toggleBold().run()
196
+ }, [c(s(j), {
197
+ size: 16,
198
+ "stroke-width": 2.5
199
+ })], 10, ye),
200
+ g("button", {
201
+ type: "button",
202
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("italic") }]),
203
+ "aria-label": s(T).paragraphEditor.italic,
204
+ title: s(T).paragraphEditor.italic,
205
+ onClick: r[5] ||= (t) => e.editor?.chain().focus().toggleItalic().run()
206
+ }, [c(s(P), {
207
+ size: 16,
208
+ "stroke-width": 2
209
+ })], 10, be),
210
+ g("button", {
211
+ type: "button",
212
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("underline") }]),
213
+ "aria-label": s(T).paragraphEditor.underline,
214
+ title: s(T).paragraphEditor.underline,
215
+ onClick: r[6] ||= (t) => e.editor?.chain().focus().toggleUnderline().run()
216
+ }, [c(s(ae), {
217
+ size: 16,
218
+ "stroke-width": 2
219
+ })], 10, xe),
220
+ g("button", {
221
+ type: "button",
222
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("strike") }]),
223
+ "aria-label": s(T).paragraphEditor.strikethrough,
224
+ title: s(T).paragraphEditor.strikethrough,
225
+ onClick: r[7] ||= (t) => e.editor?.chain().focus().toggleStrike().run()
226
+ }, [c(s(ne), {
227
+ size: 16,
228
+ "stroke-width": 2
229
+ })], 10, Se),
230
+ r[22] ||= g("span", {
231
+ class: "tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
232
+ "aria-hidden": "true"
233
+ }, null, -1),
234
+ g("button", {
235
+ type: "button",
236
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("subscript") }]),
237
+ "aria-label": s(T).paragraphEditor.subscript,
238
+ title: s(T).paragraphEditor.subscript,
239
+ onClick: r[8] ||= (t) => e.editor?.chain().focus().toggleSubscript().run()
240
+ }, [c(s(te), {
241
+ size: 16,
242
+ "stroke-width": 2
243
+ })], 10, Ce),
244
+ g("button", {
245
+ type: "button",
246
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("superscript") }]),
247
+ "aria-label": s(T).paragraphEditor.superscript,
248
+ title: s(T).paragraphEditor.superscript,
249
+ onClick: r[9] ||= (t) => e.editor?.chain().focus().toggleSuperscript().run()
250
+ }, [c(s(re), {
251
+ size: 16,
252
+ "stroke-width": 2
253
+ })], 10, we),
254
+ r[23] ||= g("span", {
255
+ class: "tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
256
+ "aria-hidden": "true"
257
+ }, null, -1),
258
+ g("button", {
259
+ type: "button",
260
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("link") }]),
261
+ "aria-label": s(T).paragraphEditor.addLink,
262
+ title: s(T).paragraphEditor.addLink,
263
+ onClick: r[10] ||= (e) => m("open-link-dialog")
264
+ }, [c(s(z), {
265
+ size: 16,
266
+ "stroke-width": 2
267
+ })], 10, Te)
268
+ ]), g("div", Ee, [
269
+ g("button", {
270
+ type: "button",
271
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("bulletList") }]),
272
+ "aria-label": s(T).paragraphEditor.bulletList,
273
+ title: s(T).paragraphEditor.bulletList,
274
+ onClick: r[11] ||= (t) => e.editor?.chain().focus().toggleBulletList().run()
275
+ }, [c(s(M), {
276
+ size: 16,
277
+ "stroke-width": 2
278
+ })], 10, De),
279
+ g("button", {
280
+ type: "button",
281
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive("orderedList") }]),
282
+ "aria-label": s(T).paragraphEditor.numberedList,
283
+ title: s(T).paragraphEditor.numberedList,
284
+ onClick: r[12] ||= (t) => e.editor?.chain().focus().toggleOrderedList().run()
285
+ }, [c(s(N), {
286
+ size: 16,
287
+ "stroke-width": 2
288
+ })], 10, Oe),
289
+ r[26] ||= g("span", {
290
+ class: "tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
291
+ "aria-hidden": "true"
292
+ }, null, -1),
293
+ g("button", {
294
+ type: "button",
295
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive({ textAlign: "left" }) }]),
296
+ "aria-label": s(T).paragraphEditor.alignLeft,
297
+ title: s(T).paragraphEditor.alignLeft,
298
+ onClick: r[13] ||= (t) => e.editor?.chain().focus().setTextAlign("left").run()
299
+ }, [c(s(F), {
300
+ size: 16,
301
+ "stroke-width": 2
302
+ })], 10, ke),
303
+ g("button", {
304
+ type: "button",
305
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive({ textAlign: "center" }) }]),
306
+ "aria-label": s(T).paragraphEditor.alignCenter,
307
+ title: s(T).paragraphEditor.alignCenter,
308
+ onClick: r[14] ||= (t) => e.editor?.chain().focus().setTextAlign("center").run()
309
+ }, [c(s(R), {
310
+ size: 16,
311
+ "stroke-width": 2
312
+ })], 10, Ae),
313
+ g("button", {
314
+ type: "button",
315
+ class: v(["tpl-text-toolbar-btn", { "tpl-text-toolbar-btn--active": e.editor?.isActive({ textAlign: "right" }) }]),
316
+ "aria-label": s(T).paragraphEditor.alignRight,
317
+ title: s(T).paragraphEditor.alignRight,
318
+ onClick: r[15] ||= (t) => e.editor?.chain().focus().setTextAlign("right").run()
319
+ }, [c(s(ie), {
320
+ size: 16,
321
+ "stroke-width": 2
322
+ })], 10, X),
323
+ r[27] ||= g("span", {
324
+ class: "tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
325
+ "aria-hidden": "true"
326
+ }, null, -1),
327
+ g("select", {
328
+ 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",
329
+ value: J(),
330
+ title: s(T).paragraphEditor.lineHeight,
331
+ onChange: r[16] ||= (e) => Y(e.target.value)
332
+ }, [r[24] ||= g("option", { value: "" }, "LH", -1), (i(!0), o(u, null, n(s(H), (e) => (i(), o("option", {
333
+ key: e,
334
+ value: e
335
+ }, h(e), 9, Me))), 128))], 40, je),
336
+ g("select", {
337
+ 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",
338
+ value: Z(),
339
+ title: s(T).paragraphEditor.letterSpacing,
340
+ onChange: r[17] ||= (e) => Q(e.target.value)
341
+ }, [r[25] ||= g("option", { value: "" }, "LS", -1), (i(!0), o(u, null, n(s(V), (e) => (i(), o("option", {
342
+ key: e.value,
343
+ value: e.value
344
+ }, h(e.label), 9, Pe))), 128))], 40, Ne),
345
+ r[28] ||= g("span", {
346
+ class: "tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
347
+ "aria-hidden": "true"
348
+ }, null, -1),
349
+ g("button", {
350
+ type: "button",
351
+ class: "tpl-text-toolbar-btn",
352
+ "aria-label": s(T).paragraphEditor.clearFormatting,
353
+ title: s(T).paragraphEditor.clearFormatting,
354
+ onClick: r[18] ||= (t) => e.editor?.chain().focus().clearNodes().unsetAllMarks().run()
355
+ }, [c(s(ee), {
356
+ size: 16,
357
+ "stroke-width": 2
358
+ })], 8, Fe),
359
+ r[29] ||= g("span", {
360
+ class: "tpl:mx-1.5 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
361
+ "aria-hidden": "true"
362
+ }, null, -1),
363
+ c(oe, { onInsert: A }),
364
+ e.mergeTagEnabled ? (i(), o("span", Ie)) : f("", !0),
365
+ e.mergeTagEnabled ? (i(), o("button", {
366
+ key: 1,
367
+ type: "button",
368
+ 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)]",
369
+ "aria-label": s(T).mergeTag.add,
370
+ title: s(T).mergeTag.add,
371
+ onClick: r[19] ||= (e) => m("add-merge-tag")
372
+ }, [c(s(I), {
373
+ size: 16,
374
+ "stroke-width": 2
375
+ }), b(" " + h(s(T).mergeTag.add), 1)], 8, Le)) : f("", !0)
376
+ ])], 64)) : (i(), o("div", Re, [c(s(O), {
377
+ class: "tpl-spinner",
378
+ size: 14,
379
+ "stroke-width": 2
380
+ }), b(" " + h(s(T).errors.editorLoading), 1)]))], 12, se)]));
381
+ }
382
+ }), Q = { class: "tpl-text-editor-wrapper tpl:relative" }, $ = /* @__PURE__ */ a({
383
+ __name: "ParagraphEditor",
384
+ props: {
385
+ block: {},
386
+ toolbarPosition: {}
387
+ },
388
+ emits: ["done"],
389
+ setup(e, { emit: t }) {
390
+ let n = e, a = t, { editor: l, EditorContent: u, isLoading: d, initError: f, retry: p, showLinkDialog: m, linkUrl: h, linkDialogRef: g, mergeTagEnabled: _, openLinkDialog: v, insertLink: y, removeLink: b, closeLinkDialog: x, handleLinkKeydown: S, handleAddMergeTag: C } = k({
391
+ blockId: () => n.block.id,
392
+ blockContent: () => n.block.content,
393
+ onDone: () => a("done"),
394
+ editorName: "ParagraphEditor",
395
+ async loadExtensions({ mergeTags: e, syntax: t }) {
396
+ 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([
397
+ import("./dist-CJcMnY7o.js"),
398
+ import("./dist-Bf1Op9A1.js"),
399
+ import("./dist-CllLxIMQ.js"),
400
+ import("./dist-DTXopj1a.js"),
401
+ import("./dist-B6AUkMyh.js"),
402
+ import("./dist-Cs0wFwdw.js"),
403
+ import("./dist-CWsl6S1K.js"),
404
+ import("./dist-DLWHlekl.js"),
405
+ import("./dist-DS3_HVpX.js"),
406
+ import("./dist-DnwLoNLm.js"),
407
+ import("./dist-BkETaOfw.js"),
408
+ import("./extensions-B_kcV0tK.js")
409
+ ]);
410
+ return {
411
+ TiptapEditor: n,
412
+ EC: r,
413
+ extensions: [
414
+ i.configure({
415
+ heading: !1,
416
+ codeBlock: !1,
417
+ blockquote: !1,
418
+ horizontalRule: !1
419
+ }),
420
+ o,
421
+ s,
422
+ c,
423
+ a.configure({
424
+ openOnClick: !1,
425
+ HTMLAttributes: {
426
+ target: "_blank",
427
+ rel: "noopener noreferrer"
428
+ }
429
+ }),
430
+ l.configure({ types: ["paragraph"] }),
431
+ u,
432
+ d,
433
+ f,
434
+ p.configure({ multicolor: !0 }),
435
+ g,
436
+ _,
437
+ v,
438
+ m.configure({
439
+ mergeTags: e,
440
+ syntax: t
441
+ }),
442
+ h.configure({ syntax: t })
443
+ ]
444
+ };
445
+ }
446
+ });
447
+ return (t, n) => (i(), o("div", Q, [
448
+ c(Z, {
449
+ editor: s(l),
450
+ "toolbar-position": e.toolbarPosition,
451
+ "is-loading": s(d),
452
+ "merge-tag-enabled": s(_),
453
+ onOpenLinkDialog: s(v),
454
+ onAddMergeTag: s(C)
455
+ }, null, 8, [
456
+ "editor",
457
+ "toolbar-position",
458
+ "is-loading",
459
+ "merge-tag-enabled",
460
+ "onOpenLinkDialog",
461
+ "onAddMergeTag"
462
+ ]),
463
+ c(W, {
464
+ editor: s(l),
465
+ "editor-content": s(u),
466
+ "is-loading": s(d),
467
+ "init-error": s(f),
468
+ onRetry: s(p)
469
+ }, null, 8, [
470
+ "editor",
471
+ "editor-content",
472
+ "is-loading",
473
+ "init-error",
474
+ "onRetry"
475
+ ]),
476
+ c(U, {
477
+ visible: s(m),
478
+ "is-editing-link": s(l)?.isActive("link") ?? !1,
479
+ "dialog-ref": s(g),
480
+ "onUpdate:dialogRef": n[0] ||= (e) => r(g) ? g.value = e : null,
481
+ "link-url": s(h),
482
+ "onUpdate:linkUrl": n[1] ||= (e) => r(h) ? h.value = e : null,
483
+ onClose: s(x),
484
+ onInsert: s(y),
485
+ onRemove: s(b),
486
+ onKeydown: s(S)
487
+ }, null, 8, [
488
+ "visible",
489
+ "is-editing-link",
490
+ "dialog-ref",
491
+ "link-url",
492
+ "onClose",
493
+ "onInsert",
494
+ "onRemove",
495
+ "onKeydown"
496
+ ])
497
+ ]));
498
+ }
499
+ });
500
+ //#endregion
501
+ export { $ as default };
502
+
503
+ //# sourceMappingURL=ParagraphEditor-DHdu6lb3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParagraphEditor-DHdu6lb3.js","names":[],"sources":["../../../src/components/blocks/EmojiPickerDropdown.vue","../../../src/components/blocks/EmojiPickerDropdown.vue","../../../src/components/blocks/ParagraphToolbar.vue","../../../src/components/blocks/ParagraphToolbar.vue","../../../src/components/blocks/ParagraphEditor.vue","../../../src/components/blocks/ParagraphEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useEmoji, useI18n } from \"../../composables\";\nimport { useFocusTrap } from \"../../composables/useFocusTrap\";\nimport { onClickOutside } from \"@vueuse/core\";\nimport { Smile } from \"@lucide/vue\";\nimport { computed, ref } from \"vue\";\n\nconst emit = defineEmits<{\n (e: \"insert\", emoji: string): void;\n}>();\n\nconst {\n categories: emojiCategories,\n isOpen: showEmojiPicker,\n toggle: toggleEmojiPicker,\n close: closeEmojiPicker,\n} = useEmoji();\n\nconst { t, format } = useI18n();\n\nconst pickerRef = ref<HTMLElement | null>(null);\nconst rootRef = ref<HTMLElement | null>(null);\n\nconst isOpenRef = computed(() => showEmojiPicker.value);\nuseFocusTrap(pickerRef, isOpenRef);\n\nonClickOutside(rootRef, () => {\n if (showEmojiPicker.value) {\n closeEmojiPicker();\n }\n});\n\nfunction handleInsert(emoji: string): void {\n emit(\"insert\", emoji);\n closeEmojiPicker();\n}\n</script>\n\n<template>\n <div ref=\"rootRef\" 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 :aria-expanded=\"showEmojiPicker\"\n aria-haspopup=\"dialog\"\n aria-controls=\"tpl-emoji-picker\"\n @click=\"toggleEmojiPicker\"\n >\n <Smile :size=\"16\" :stroke-width=\"2\" />\n </button>\n <div\n v-if=\"showEmojiPicker\"\n id=\"tpl-emoji-picker\"\n ref=\"pickerRef\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-label=\"t.paragraphEditor.insertEmoji\"\n tabindex=\"-1\"\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 @keydown.esc.stop.prevent=\"closeEmojiPicker\"\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 :aria-label=\"\n format(t.paragraphEditor.emojiItemLabel, { emoji })\n \"\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=\"handleInsert(emoji)\"\n >\n {{ emoji }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useEmoji, useI18n } from \"../../composables\";\nimport { useFocusTrap } from \"../../composables/useFocusTrap\";\nimport { onClickOutside } from \"@vueuse/core\";\nimport { Smile } from \"@lucide/vue\";\nimport { computed, ref } from \"vue\";\n\nconst emit = defineEmits<{\n (e: \"insert\", emoji: string): void;\n}>();\n\nconst {\n categories: emojiCategories,\n isOpen: showEmojiPicker,\n toggle: toggleEmojiPicker,\n close: closeEmojiPicker,\n} = useEmoji();\n\nconst { t, format } = useI18n();\n\nconst pickerRef = ref<HTMLElement | null>(null);\nconst rootRef = ref<HTMLElement | null>(null);\n\nconst isOpenRef = computed(() => showEmojiPicker.value);\nuseFocusTrap(pickerRef, isOpenRef);\n\nonClickOutside(rootRef, () => {\n if (showEmojiPicker.value) {\n closeEmojiPicker();\n }\n});\n\nfunction handleInsert(emoji: string): void {\n emit(\"insert\", emoji);\n closeEmojiPicker();\n}\n</script>\n\n<template>\n <div ref=\"rootRef\" 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 :aria-expanded=\"showEmojiPicker\"\n aria-haspopup=\"dialog\"\n aria-controls=\"tpl-emoji-picker\"\n @click=\"toggleEmojiPicker\"\n >\n <Smile :size=\"16\" :stroke-width=\"2\" />\n </button>\n <div\n v-if=\"showEmojiPicker\"\n id=\"tpl-emoji-picker\"\n ref=\"pickerRef\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-label=\"t.paragraphEditor.insertEmoji\"\n tabindex=\"-1\"\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 @keydown.esc.stop.prevent=\"closeEmojiPicker\"\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 :aria-label=\"\n format(t.paragraphEditor.emojiItemLabel, { emoji })\n \"\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=\"handleInsert(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 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","<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"],"mappings":"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"}