@templatical/editor 0.8.5 → 0.9.0

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 (102) hide show
  1. package/dist/{AiChatSidebar-uhkhnXQd.js → AiChatSidebar-BUKj9n02.js} +4 -4
  2. package/dist/{AiFeatureMenu-DXNKvXP5.js → AiFeatureMenu-Co14YVJt.js} +3 -3
  3. package/dist/{BlockIssueBadge-DM-vXeD6.js → BlockIssueBadge-DThKKeub.js} +2 -2
  4. package/dist/{CloudEditor-BSkPQjwo.js → CloudEditor-CAtw_sFC.js} +217 -216
  5. package/dist/{CollaboratorBar-CP76Sh6c.js → CollaboratorBar-Bc6q0gB9.js} +2 -2
  6. package/dist/{CommentsSidebar-_llWQ4VT.js → CommentsSidebar-DiH4R4F0.js} +3 -3
  7. package/dist/{CountdownBlock-I99sC0C5.js → CountdownBlock-BTPefclD.js} +2 -2
  8. package/dist/{CountdownToolbar-BUhOUiQ9.js → CountdownToolbar-Dvr2icg-.js} +2 -2
  9. package/dist/{DesignReferenceSidebar-CfJqJ7l6.js → DesignReferenceSidebar-BP32MgpS.js} +2 -2
  10. package/dist/{IssuesPanel-4MKZe8yP.js → IssuesPanel-B1LT91IX.js} +2 -2
  11. package/dist/{ModuleBrowserModal-BFQTm6uY.js → ModuleBrowserModal-CWegFoOA.js} +77 -85
  12. package/dist/{ModulePreviewCanvas-DeqMpo73.js → ModulePreviewCanvas-D9WUSSRT.js} +2 -2
  13. package/dist/{NumberWithSuffix-CxMFy_j3.js → NumberWithSuffix-CxUBW_V2.js} +2 -2
  14. package/dist/{ParagraphEditor-DqomSbW3.js → ParagraphEditor-DrAz2yot.js} +115 -115
  15. package/dist/{RichTextEditorContent-B_KCY6T1.js → RichTextEditorContent-gR169m1-.js} +4 -4
  16. package/dist/{SaveModuleDialog-DKcpPeWd.js → SaveModuleDialog-DWidA0c9.js} +6 -6
  17. package/dist/{SnapshotHistory-Z9RQj53S.js → SnapshotHistory-CIo2Jaw-.js} +4 -4
  18. package/dist/{TemplateScoringPanel-BIwEwFxD.js → TemplateScoringPanel-seBvvn8O.js} +2 -2
  19. package/dist/{TestEmailModal-C8DhylO1.js → TestEmailModal-BuCuWp3N.js} +3 -3
  20. package/dist/{TitleEditor-CgLrn6R3.js → TitleEditor-BmW0uMl7.js} +64 -64
  21. package/dist/{TplModal-CbwRwmR3.js → TplModal-YFpBaiLj.js} +4 -4
  22. package/dist/{blockTypeIcons-CccKujXP.js → blockTypeIcons-DCkHXPhx.js} +19 -11
  23. package/dist/bundle-stats.json +8 -8
  24. package/dist/cdn/chunks/{AiFeatureMenu-ChNv7XXj.js → AiFeatureMenu-Dayzk2H7.js} +2 -2
  25. package/dist/cdn/chunks/{AiFeatureMenu-ChNv7XXj.js.map → AiFeatureMenu-Dayzk2H7.js.map} +1 -1
  26. package/dist/cdn/chunks/{BlockIssueBadge-BovmWgok.js → BlockIssueBadge-D_US2wqo.js} +4 -4
  27. package/dist/cdn/chunks/{BlockIssueBadge-BovmWgok.js.map → BlockIssueBadge-D_US2wqo.js.map} +1 -1
  28. package/dist/cdn/chunks/{CloudEditor-CHF_P5OL.js → CloudEditor-CyJItWsK.js} +186 -185
  29. package/dist/cdn/chunks/{CloudEditor-CHF_P5OL.js.map → CloudEditor-CyJItWsK.js.map} +1 -1
  30. package/dist/cdn/chunks/{CollaboratorBar-Bjr5YSh0.js → CollaboratorBar-C4CFs5EJ.js} +3 -3
  31. package/dist/cdn/chunks/{CollaboratorBar-Bjr5YSh0.js.map → CollaboratorBar-C4CFs5EJ.js.map} +1 -1
  32. package/dist/cdn/chunks/{CountdownBlock-KyzvhjMF.js → CountdownBlock-D6lCXhZA.js} +2 -2
  33. package/dist/cdn/chunks/{CountdownBlock-KyzvhjMF.js.map → CountdownBlock-D6lCXhZA.js.map} +1 -1
  34. package/dist/cdn/chunks/{CountdownToolbar-bJtMHGYz.js → CountdownToolbar-BsGUxoRv.js} +3 -3
  35. package/dist/cdn/chunks/{CountdownToolbar-bJtMHGYz.js.map → CountdownToolbar-BsGUxoRv.js.map} +1 -1
  36. package/dist/cdn/chunks/{IssuesPanel-DFSYTQXy.js → IssuesPanel-DeHTmRDz.js} +5 -5
  37. package/dist/cdn/chunks/{IssuesPanel-DFSYTQXy.js.map → IssuesPanel-DeHTmRDz.js.map} +1 -1
  38. package/dist/cdn/chunks/{ModuleBrowserModal-DS0BGRhZ.js → ModuleBrowserModal-Cgjz4xAz.js} +8 -8
  39. package/dist/cdn/chunks/ModuleBrowserModal-Cgjz4xAz.js.map +1 -0
  40. package/dist/cdn/chunks/{ModulePreviewCanvas-Dwn2cA5a.js → ModulePreviewCanvas-CeS9PsAA.js} +2 -2
  41. package/dist/cdn/chunks/{ModulePreviewCanvas-Dwn2cA5a.js.map → ModulePreviewCanvas-CeS9PsAA.js.map} +1 -1
  42. package/dist/cdn/chunks/{NumberWithSuffix-BNBeHv0P.js → NumberWithSuffix-Bp-idLCc.js} +2 -2
  43. package/dist/cdn/chunks/{NumberWithSuffix-BNBeHv0P.js.map → NumberWithSuffix-Bp-idLCc.js.map} +1 -1
  44. package/dist/cdn/chunks/{ParagraphEditor-C4TrTIOm.js → ParagraphEditor-fM9aFu8T.js} +105 -105
  45. package/dist/cdn/chunks/ParagraphEditor-fM9aFu8T.js.map +1 -0
  46. package/dist/cdn/chunks/{RichTextEditorContent-HNFFL4aK.js → RichTextEditorContent-DwNPE5H5.js} +4 -4
  47. package/dist/cdn/chunks/{RichTextEditorContent-HNFFL4aK.js.map → RichTextEditorContent-DwNPE5H5.js.map} +1 -1
  48. package/dist/cdn/chunks/{SaveModuleDialog-CbHqqeID.js → SaveModuleDialog-BrtDXzIz.js} +4 -4
  49. package/dist/cdn/chunks/SaveModuleDialog-BrtDXzIz.js.map +1 -0
  50. package/dist/cdn/chunks/TitleEditor-D0rSnye0.js +175 -0
  51. package/dist/cdn/chunks/TitleEditor-D0rSnye0.js.map +1 -0
  52. package/dist/cdn/chunks/{blockTypeIcons-BUlgu9JL.js → blockTypeIcons-YOEe5mDE.js} +3 -3
  53. package/dist/cdn/chunks/{blockTypeIcons-BUlgu9JL.js.map → blockTypeIcons-YOEe5mDE.js.map} +1 -1
  54. package/dist/{de-ED7c5RpG.js → cdn/chunks/de-CATfXDKV.js} +14 -1
  55. package/dist/cdn/chunks/{de-ED7c5RpG.js.map → de-CATfXDKV.js.map} +1 -1
  56. package/dist/cdn/chunks/{en-ivilDUn0.js → en-CwCAgYL5.js} +13 -2
  57. package/dist/cdn/chunks/{en-ivilDUn0.js.map → en-CwCAgYL5.js.map} +1 -1
  58. package/dist/cdn/chunks/{extensions-DK_lVs7A.js → extensions-GYsbQFPr.js} +25 -22
  59. package/dist/cdn/chunks/extensions-GYsbQFPr.js.map +1 -0
  60. package/dist/cdn/chunks/{features-LiilsBqW.js → features-D-2kVhHY.js} +1232 -1189
  61. package/dist/cdn/chunks/features-D-2kVhHY.js.map +1 -0
  62. package/dist/cdn/chunks/{icons-Bn2SIR30.js → icons-fZoyKV_s.js} +2 -2
  63. package/dist/cdn/chunks/{icons-Bn2SIR30.js.map → icons-fZoyKV_s.js.map} +1 -1
  64. package/dist/cdn/chunks/{media-library-Bb2PavAd.js → media-library-CO2WOETY.js} +240 -240
  65. package/dist/cdn/chunks/{media-library-Bb2PavAd.js.map → media-library-CO2WOETY.js.map} +1 -1
  66. package/dist/{pt-BR-B5tm2iBl.js → cdn/chunks/pt-BR-D3Mg7AKe.js} +14 -1
  67. package/dist/cdn/chunks/{pt-BR-B5tm2iBl.js.map → pt-BR-D3Mg7AKe.js.map} +1 -1
  68. package/dist/cdn/chunks/{quality-Bpj6kNxR.js → quality-BxPiS-wv.js} +464 -464
  69. package/dist/cdn/chunks/{quality-Bpj6kNxR.js.map → quality-BxPiS-wv.js.map} +1 -1
  70. package/dist/cdn/chunks/{renderer-CYYyu-Di.js → renderer-7z2t_bYQ.js} +68 -68
  71. package/dist/cdn/chunks/{renderer-CYYyu-Di.js.map → renderer-7z2t_bYQ.js.map} +1 -1
  72. package/dist/cdn/chunks/{src-CQjZnxvw.js → src-ftxPuuQh.js} +4 -4
  73. package/dist/cdn/chunks/{src-CQjZnxvw.js.map → src-ftxPuuQh.js.map} +1 -1
  74. package/dist/cdn/chunks/{styles-5g8XOS68.js → styles-o0HIrw9F.js} +877 -622
  75. package/dist/cdn/chunks/styles-o0HIrw9F.js.map +1 -0
  76. package/dist/cdn/editor.css +1 -1
  77. package/dist/cdn/editor.js +102 -101
  78. package/dist/cdn/editor.js.map +1 -1
  79. package/dist/{cdn/chunks/de-ED7c5RpG.js → de-CATfXDKV.js} +12 -3
  80. package/dist/{dist-HO0vjY5Z.js → dist-CNLAS2v2.js} +130 -124
  81. package/dist/{en-ivilDUn0.js → en-CwCAgYL5.js} +12 -1
  82. package/dist/{extensions-DeNHyWwh.js → extensions-Mj2-D8uK.js} +6 -3
  83. package/dist/{keys-B8K7Z7Ef.js → keys-BiQlvx51.js} +3 -3
  84. package/dist/{cdn/chunks/pt-BR-B5tm2iBl.js → pt-BR-D3Mg7AKe.js} +12 -3
  85. package/dist/style.css +1 -1
  86. package/dist/{styles-Bgqv7rLA.js → styles-CJtcKmsx.js} +857 -601
  87. package/dist/templatical-editor.js +104 -103
  88. package/dist/{useCloudI18n-DFzVgYhJ.js → useCloudI18n-DKWJg6rJ.js} +1 -1
  89. package/dist/{useEditorCore-CaOVDL_m.js → useEditorCore-CEkf_VWX.js} +662 -632
  90. package/dist/{useI18n-CBbStVlD.js → useI18n-Besvmtxy.js} +1 -1
  91. package/dist/useMergeTag-WNzaCpXR.js +44 -0
  92. package/dist/{usePopoverRoot-62PlZQQ3.js → usePopoverRoot-CKt956u-.js} +1 -1
  93. package/package.json +7 -7
  94. package/dist/cdn/chunks/ModuleBrowserModal-DS0BGRhZ.js.map +0 -1
  95. package/dist/cdn/chunks/ParagraphEditor-C4TrTIOm.js.map +0 -1
  96. package/dist/cdn/chunks/SaveModuleDialog-CbHqqeID.js.map +0 -1
  97. package/dist/cdn/chunks/TitleEditor-gr-eBUq_.js +0 -175
  98. package/dist/cdn/chunks/TitleEditor-gr-eBUq_.js.map +0 -1
  99. package/dist/cdn/chunks/extensions-DK_lVs7A.js.map +0 -1
  100. package/dist/cdn/chunks/features-LiilsBqW.js.map +0 -1
  101. package/dist/cdn/chunks/styles-5g8XOS68.js.map +0 -1
  102. package/dist/useMergeTag-RWsgUcSh.js +0 -34
@@ -1,22 +1,22 @@
1
1
  import { K as e, L as t, M as n, P as r, T as i, Z as a, c as o, ct as s, d as c, f as l, g as u, h as d, it as f, l as p, m, ot as h, p as g, st as _, u as v, v as y, x as b, y as x } from "./draggable-BwWMFq33.js";
2
- import { Ft as S, Jt as C, Q as w, Y as T, a as E, en as D, nn as ee, nt as O, rn as k, rt as A, tn as j, vt as M } from "./features-LiilsBqW.js";
3
- import { R as N, U as te, V as ne, Z as re, _ as P, c as ie, f as ae, i as oe, o as F, p as I, s as L, u as R, w as z, x as B, z as V } from "./icons-Bn2SIR30.js";
4
- import { a as H, o as U, s as W } from "./styleConstants-lGobwiLH.js";
5
- import { n as G, t as K } from "./RichTextEditorContent-HNFFL4aK.js";
2
+ import { Ft as S, Jt as C, Q as w, Y as T, Yt as E, in as D, k as O, nn as k, nt as A, rn as ee, rt as j, tn as M, vt as te } from "./features-D-2kVhHY.js";
3
+ import { R as ne, U as re, V as ie, Z as ae, _ as N, c as oe, f as se, i as ce, o as le, p as ue, s as P, u as F, w as I, x as L, z as R } from "./icons-fZoyKV_s.js";
4
+ import { a as z, o as B, s as V } from "./styleConstants-lGobwiLH.js";
5
+ import { n as H, t as U } from "./RichTextEditorContent-DwNPE5H5.js";
6
6
  //#region src/components/blocks/EmojiPickerDropdown.vue?vue&type=script&setup=true&lang.ts
7
- var q = [
7
+ var W = [
8
8
  "aria-label",
9
9
  "title",
10
10
  "aria-expanded"
11
- ], J = ["aria-label"], Y = { class: "tpl:mb-1.5 tpl:text-[10px] tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase" }, se = { class: "tpl:grid tpl:grid-cols-10 tpl:gap-0.5" }, ce = ["aria-label", "onClick"], le = /* @__PURE__ */ b({
11
+ ], G = ["aria-label"], K = { class: "tpl:mb-1.5 tpl:text-[10px] tpl:font-medium tpl:tracking-wide tpl:text-[var(--tpl-text-muted)] tpl:uppercase" }, q = { class: "tpl:grid tpl:grid-cols-10 tpl:gap-0.5" }, J = ["aria-label", "onClick"], de = /* @__PURE__ */ b({
12
12
  __name: "EmojiPickerDropdown",
13
13
  emits: ["insert"],
14
14
  setup(e, { emit: t }) {
15
15
  let i = t, { categories: c, isOpen: m, toggle: _, close: y } = w(), { t: b, format: C } = S(), T = a(null), E = a(null);
16
- O(T, l(() => m.value)), k(E, () => {
16
+ A(T, l(() => m.value)), D(E, () => {
17
17
  m.value && y();
18
18
  });
19
- function D(e) {
19
+ function O(e) {
20
20
  i("insert", e), y();
21
21
  }
22
22
  return (e, t) => (n(), u("div", {
@@ -32,10 +32,10 @@ var q = [
32
32
  "aria-haspopup": "dialog",
33
33
  "aria-controls": "tpl-emoji-picker",
34
34
  onClick: t[0] ||= (...e) => f(_) && f(_)(...e)
35
- }, [x(f(P), {
35
+ }, [x(f(N), {
36
36
  size: 16,
37
37
  "stroke-width": 2
38
- })], 10, q), f(m) ? (n(), u("div", {
38
+ })], 10, W), f(m) ? (n(), u("div", {
39
39
  key: 0,
40
40
  id: "tpl-emoji-picker",
41
41
  ref_key: "pickerRef",
@@ -49,15 +49,15 @@ var q = [
49
49
  }, [(n(!0), u(v, null, r(f(c), (e) => (n(), u("div", {
50
50
  key: e.key,
51
51
  class: "tpl:mb-2 tpl:last:mb-0"
52
- }, [g("div", Y, s(f(b).emoji[e.key]), 1), g("div", se, [(n(!0), u(v, null, r(e.emojis, (e) => (n(), u("button", {
52
+ }, [g("div", K, s(f(b).emoji[e.key]), 1), g("div", q, [(n(!0), u(v, null, r(e.emojis, (e) => (n(), u("button", {
53
53
  key: e,
54
54
  type: "button",
55
55
  "aria-label": f(C)(f(b).paragraphEditor.emojiItemLabel, { emoji: e }),
56
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) => D(e)
58
- }, s(e), 9, ce))), 128))])]))), 128))], 40, J)) : d("", !0)], 512));
57
+ onClick: (t) => O(e)
58
+ }, s(e), 9, J))), 128))])]))), 128))], 40, G)) : d("", !0)], 512));
59
59
  }
60
- }), ue = [
60
+ }), Y = [
61
61
  "aria-label",
62
62
  "title",
63
63
  "aria-pressed"
@@ -80,20 +80,20 @@ var q = [
80
80
  }, [(n(), m(t(e.icon), {
81
81
  size: e.size ?? 16,
82
82
  "stroke-width": e.strokeWidth ?? 2
83
- }, null, 8, ["size", "stroke-width"]))], 10, ue));
83
+ }, null, 8, ["size", "stroke-width"]))], 10, Y));
84
84
  }
85
- }), de = {}, fe = {
85
+ }), fe = {}, pe = {
86
86
  class: "tpl:mx-1 tpl:h-6 tpl:w-px tpl:bg-[var(--tpl-border)]",
87
87
  "aria-hidden": "true"
88
88
  };
89
- function pe(e, t) {
90
- return n(), u("span", fe);
89
+ function me(e, t) {
90
+ return n(), u("span", pe);
91
91
  }
92
- var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
92
+ var Z = /* @__PURE__ */ j(fe, [["render", me]]), he = [
93
93
  "value",
94
94
  "aria-label",
95
95
  "title"
96
- ], he = { value: "" }, ge = ["value"], Q = /* @__PURE__ */ b({
96
+ ], ge = { value: "" }, _e = ["value"], Q = /* @__PURE__ */ b({
97
97
  __name: "ToolbarSelect",
98
98
  props: {
99
99
  modelValue: {},
@@ -120,23 +120,23 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
120
120
  "aria-label": e.label,
121
121
  title: e.label,
122
122
  onChange: a
123
- }, [g("option", he, s(e.placeholder ?? ""), 1), (n(!0), u(v, null, r(e.options, (e) => (n(), u("option", {
123
+ }, [g("option", ge, s(e.placeholder ?? ""), 1), (n(!0), u(v, null, r(e.options, (e) => (n(), u("option", {
124
124
  key: o(e),
125
125
  value: o(e)
126
- }, s(c(e)), 9, ge))), 128))], 42, me));
126
+ }, s(c(e)), 9, _e))), 128))], 42, he));
127
127
  }
128
- }), _e = ["data-tpl-theme", "aria-label"], ve = { class: "tpl:flex tpl:items-center tpl:gap-1" }, ye = { class: "tpl:relative" }, be = [
128
+ }), ve = ["data-tpl-theme", "aria-label"], ye = { class: "tpl:flex tpl:items-center tpl:gap-1" }, be = { class: "tpl:relative" }, xe = [
129
129
  "value",
130
130
  "aria-label",
131
131
  "title"
132
- ], $ = { class: "tpl:relative" }, xe = [
132
+ ], Se = { class: "tpl:relative" }, Ce = [
133
133
  "value",
134
134
  "aria-label",
135
135
  "title"
136
- ], Se = { class: "tpl:flex tpl:items-center tpl:gap-1" }, Ce = ["aria-label", "title"], we = {
136
+ ], $ = { class: "tpl:flex tpl:items-center tpl:gap-1" }, we = ["aria-label", "title"], Te = {
137
137
  key: 1,
138
138
  class: "tpl:flex tpl:items-center tpl:gap-2 tpl:px-2 tpl:text-xs tpl:text-[var(--tpl-text-dim)]"
139
- }, Te = /* @__PURE__ */ b({
139
+ }, Ee = /* @__PURE__ */ b({
140
140
  __name: "ParagraphToolbar",
141
141
  props: {
142
142
  editor: {},
@@ -146,22 +146,22 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
146
146
  },
147
147
  emits: ["open-link-dialog", "add-merge-tag"],
148
148
  setup(e, { emit: t }) {
149
- let r = e, a = t, o = i(D, null), l = i(j, null), p = ee(C, "ParagraphToolbar"), h = E(), { t: b } = S(), w = p.fonts;
150
- function T(e) {
149
+ let r = e, a = t, o = i(M, null), p = i(k, null), h = ee(C, "ParagraphToolbar"), b = O(), w = i(E, null), T = l(() => w?.isOpen.value ?? !1), { t: D } = S(), A = h.fonts;
150
+ function j(e) {
151
151
  r.editor?.chain().focus().insertContent(e).run();
152
152
  }
153
- function O(e) {
153
+ function N(e) {
154
154
  return r.editor?.getAttributes("textStyle")[e] || "";
155
155
  }
156
- function k(e) {
156
+ function H(e) {
157
157
  let t = r.editor?.chain().focus();
158
158
  e ? t?.setFontFamily(e).run() : t?.unsetFontFamily().run();
159
159
  }
160
- function A(e) {
160
+ function U(e) {
161
161
  let t = r.editor?.chain().focus();
162
162
  e ? t?.setFontSize(e).run() : t?.unsetFontSize().run();
163
163
  }
164
- function P(e) {
164
+ function W(e) {
165
165
  let t = r.editor?.chain().focus();
166
166
  e ? t?.setColor(e).run() : t?.unsetColor().run();
167
167
  }
@@ -183,13 +183,13 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
183
183
  let t = r.editor?.chain().focus();
184
184
  e ? t?.setHighlight({ color: e }).run() : t?.unsetHighlight().run();
185
185
  }
186
- return (t, r) => f(h) ? (n(), m(c, {
186
+ return (t, r) => f(b) && !T.value ? (n(), m(c, {
187
187
  key: 0,
188
- to: f(h)
188
+ to: f(b)
189
189
  }, [g("div", {
190
- "data-tpl-theme": f(l),
190
+ "data-tpl-theme": f(p),
191
191
  role: "toolbar",
192
- "aria-label": f(b).paragraphEditor.toolbar,
192
+ "aria-label": f(D).paragraphEditor.toolbar,
193
193
  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",
194
194
  style: _({
195
195
  ...f(o),
@@ -198,14 +198,14 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
198
198
  transform: "translateY(-100%)",
199
199
  flexDirection: "column"
200
200
  })
201
- }, [!e.isLoading && e.editor ? (n(), u(v, { key: 0 }, [g("div", ve, [
201
+ }, [!e.isLoading && e.editor ? (n(), u(v, { key: 0 }, [g("div", ye, [
202
202
  x(Q, {
203
- "model-value": O("fontFamily"),
204
- options: f(w),
205
- label: f(b).paragraphEditor.fontFamily,
206
- placeholder: f(b).paragraphEditor.defaultFont,
203
+ "model-value": N("fontFamily"),
204
+ options: f(A),
205
+ label: f(D).paragraphEditor.fontFamily,
206
+ placeholder: f(D).paragraphEditor.defaultFont,
207
207
  "width-class": "tpl:w-32",
208
- "onUpdate:modelValue": k
208
+ "onUpdate:modelValue": H
209
209
  }, null, 8, [
210
210
  "model-value",
211
211
  "options",
@@ -213,12 +213,12 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
213
213
  "placeholder"
214
214
  ]),
215
215
  x(Q, {
216
- "model-value": O("fontSize"),
217
- options: f(H),
218
- label: f(b).paragraphEditor.fontSize,
219
- placeholder: f(b).paragraphEditor.defaultSize,
216
+ "model-value": N("fontSize"),
217
+ options: f(z),
218
+ label: f(D).paragraphEditor.fontSize,
219
+ placeholder: f(D).paragraphEditor.defaultSize,
220
220
  "width-class": "tpl:w-20",
221
- "onUpdate:modelValue": A
221
+ "onUpdate:modelValue": U
222
222
  }, null, 8, [
223
223
  "model-value",
224
224
  "options",
@@ -226,27 +226,27 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
226
226
  "placeholder"
227
227
  ]),
228
228
  x(Z),
229
- g("div", ye, [g("input", {
229
+ g("div", be, [g("input", {
230
230
  type: "color",
231
231
  class: "tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-1",
232
- value: O("color") || f("#000000"),
233
- "aria-label": f(b).paragraphEditor.textColor,
234
- title: f(b).paragraphEditor.textColor,
235
- onInput: r[0] ||= (e) => P(e.target.value)
236
- }, null, 40, be)]),
237
- g("div", $, [g("input", {
232
+ value: N("color") || f("#000000"),
233
+ "aria-label": f(D).paragraphEditor.textColor,
234
+ title: f(D).paragraphEditor.textColor,
235
+ onInput: r[0] ||= (e) => W(e.target.value)
236
+ }, null, 40, xe)]),
237
+ g("div", Se, [g("input", {
238
238
  type: "color",
239
239
  class: "tpl:size-8 tpl:cursor-pointer tpl:rounded tpl:border tpl:border-[var(--tpl-border)] tpl:p-1",
240
240
  style: _({ backgroundColor: J() || "var(--tpl-bg)" }),
241
241
  value: J() || f("#ffff00"),
242
- "aria-label": f(b).paragraphEditor.highlightColor,
243
- title: f(b).paragraphEditor.highlightColor,
242
+ "aria-label": f(D).paragraphEditor.highlightColor,
243
+ title: f(D).paragraphEditor.highlightColor,
244
244
  onInput: r[1] ||= (e) => Y(e.target.value)
245
- }, null, 44, xe)]),
245
+ }, null, 44, Ce)]),
246
246
  x(Z),
247
247
  x(X, {
248
- icon: f(re),
249
- label: f(b).paragraphEditor.bold,
248
+ icon: f(ae),
249
+ label: f(D).paragraphEditor.bold,
250
250
  active: e.editor.isActive("bold"),
251
251
  "stroke-width": 2.5,
252
252
  onClick: r[2] ||= (t) => e.editor.chain().focus().toggleBold().run()
@@ -256,8 +256,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
256
256
  "active"
257
257
  ]),
258
258
  x(X, {
259
- icon: f(te),
260
- label: f(b).paragraphEditor.italic,
259
+ icon: f(re),
260
+ label: f(D).paragraphEditor.italic,
261
261
  active: e.editor.isActive("italic"),
262
262
  onClick: r[3] ||= (t) => e.editor.chain().focus().toggleItalic().run()
263
263
  }, null, 8, [
@@ -266,8 +266,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
266
266
  "active"
267
267
  ]),
268
268
  x(X, {
269
- icon: f(oe),
270
- label: f(b).paragraphEditor.underline,
269
+ icon: f(ce),
270
+ label: f(D).paragraphEditor.underline,
271
271
  active: e.editor.isActive("underline"),
272
272
  onClick: r[4] ||= (t) => e.editor.chain().focus().toggleUnderline().run()
273
273
  }, null, 8, [
@@ -276,8 +276,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
276
276
  "active"
277
277
  ]),
278
278
  x(X, {
279
- icon: f(I),
280
- label: f(b).paragraphEditor.strikethrough,
279
+ icon: f(ue),
280
+ label: f(D).paragraphEditor.strikethrough,
281
281
  active: e.editor.isActive("strike"),
282
282
  onClick: r[5] ||= (t) => e.editor.chain().focus().toggleStrike().run()
283
283
  }, null, 8, [
@@ -287,8 +287,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
287
287
  ]),
288
288
  x(Z),
289
289
  x(X, {
290
- icon: f(ae),
291
- label: f(b).paragraphEditor.subscript,
290
+ icon: f(se),
291
+ label: f(D).paragraphEditor.subscript,
292
292
  active: e.editor.isActive("subscript"),
293
293
  onClick: r[6] ||= (t) => e.editor.chain().focus().toggleSubscript().run()
294
294
  }, null, 8, [
@@ -297,8 +297,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
297
297
  "active"
298
298
  ]),
299
299
  x(X, {
300
- icon: f(R),
301
- label: f(b).paragraphEditor.superscript,
300
+ icon: f(F),
301
+ label: f(D).paragraphEditor.superscript,
302
302
  active: e.editor.isActive("superscript"),
303
303
  onClick: r[7] ||= (t) => e.editor.chain().focus().toggleSuperscript().run()
304
304
  }, null, 8, [
@@ -308,8 +308,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
308
308
  ]),
309
309
  x(Z),
310
310
  x(X, {
311
- icon: f(ne),
312
- label: f(b).paragraphEditor.addLink,
311
+ icon: f(ie),
312
+ label: f(D).paragraphEditor.addLink,
313
313
  active: e.editor.isActive("link"),
314
314
  onClick: r[8] ||= (e) => a("open-link-dialog")
315
315
  }, null, 8, [
@@ -317,10 +317,10 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
317
317
  "label",
318
318
  "active"
319
319
  ])
320
- ]), g("div", Se, [
320
+ ]), g("div", $, [
321
321
  x(X, {
322
- icon: f(N),
323
- label: f(b).paragraphEditor.bulletList,
322
+ icon: f(ne),
323
+ label: f(D).paragraphEditor.bulletList,
324
324
  active: e.editor.isActive("bulletList"),
325
325
  onClick: r[9] ||= (t) => e.editor.chain().focus().toggleBulletList().run()
326
326
  }, null, 8, [
@@ -329,8 +329,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
329
329
  "active"
330
330
  ]),
331
331
  x(X, {
332
- icon: f(V),
333
- label: f(b).paragraphEditor.numberedList,
332
+ icon: f(R),
333
+ label: f(D).paragraphEditor.numberedList,
334
334
  active: e.editor.isActive("orderedList"),
335
335
  onClick: r[10] ||= (t) => e.editor.chain().focus().toggleOrderedList().run()
336
336
  }, null, 8, [
@@ -340,8 +340,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
340
340
  ]),
341
341
  x(Z),
342
342
  x(X, {
343
- icon: f(L),
344
- label: f(b).paragraphEditor.alignLeft,
343
+ icon: f(P),
344
+ label: f(D).paragraphEditor.alignLeft,
345
345
  active: e.editor.isActive({ textAlign: "left" }),
346
346
  onClick: r[11] ||= (t) => e.editor.chain().focus().setTextAlign("left").run()
347
347
  }, null, 8, [
@@ -350,8 +350,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
350
350
  "active"
351
351
  ]),
352
352
  x(X, {
353
- icon: f(ie),
354
- label: f(b).paragraphEditor.alignCenter,
353
+ icon: f(oe),
354
+ label: f(D).paragraphEditor.alignCenter,
355
355
  active: e.editor.isActive({ textAlign: "center" }),
356
356
  onClick: r[12] ||= (t) => e.editor.chain().focus().setTextAlign("center").run()
357
357
  }, null, 8, [
@@ -360,8 +360,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
360
360
  "active"
361
361
  ]),
362
362
  x(X, {
363
- icon: f(F),
364
- label: f(b).paragraphEditor.alignRight,
363
+ icon: f(le),
364
+ label: f(D).paragraphEditor.alignRight,
365
365
  active: e.editor.isActive({ textAlign: "right" }),
366
366
  onClick: r[13] ||= (t) => e.editor.chain().focus().setTextAlign("right").run()
367
367
  }, null, 8, [
@@ -372,8 +372,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
372
372
  x(Z),
373
373
  x(Q, {
374
374
  "model-value": G(),
375
- options: f(W),
376
- label: f(b).paragraphEditor.lineHeight,
375
+ options: f(V),
376
+ label: f(D).paragraphEditor.lineHeight,
377
377
  placeholder: "LH",
378
378
  "width-class": "tpl:w-16",
379
379
  "onUpdate:modelValue": K
@@ -383,9 +383,9 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
383
383
  "label"
384
384
  ]),
385
385
  x(Q, {
386
- "model-value": O("letterSpacing"),
387
- options: f(U),
388
- label: f(b).paragraphEditor.letterSpacing,
386
+ "model-value": N("letterSpacing"),
387
+ options: f(B),
388
+ label: f(D).paragraphEditor.letterSpacing,
389
389
  placeholder: "LS",
390
390
  "width-class": "tpl:w-20",
391
391
  "onUpdate:modelValue": q
@@ -396,29 +396,29 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
396
396
  ]),
397
397
  x(Z),
398
398
  x(X, {
399
- icon: f(z),
400
- label: f(b).paragraphEditor.clearFormatting,
399
+ icon: f(I),
400
+ label: f(D).paragraphEditor.clearFormatting,
401
401
  onClick: r[14] ||= (t) => e.editor.chain().focus().clearNodes().unsetAllMarks().run()
402
402
  }, null, 8, ["icon", "label"]),
403
403
  x(Z),
404
- x(le, { onInsert: T }),
404
+ x(de, { onInsert: j }),
405
405
  e.canRequestMergeTag ? (n(), u(v, { key: 0 }, [x(Z), g("button", {
406
406
  type: "button",
407
407
  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)]",
408
- "aria-label": f(b).mergeTag.insert,
409
- title: f(b).mergeTag.insert,
408
+ "aria-label": f(D).mergeTag.insert,
409
+ title: f(D).mergeTag.insert,
410
410
  onClick: r[15] ||= (e) => a("add-merge-tag")
411
- }, [x(f(B), {
411
+ }, [x(f(L), {
412
412
  size: 16,
413
413
  "stroke-width": 2
414
- }), y(" " + s(f(b).mergeTag.insert), 1)], 8, Ce)], 64)) : d("", !0)
415
- ])], 64)) : (n(), u("div", we, [x(f(M), {
414
+ }), y(" " + s(f(D).mergeTag.insert), 1)], 8, we)], 64)) : d("", !0)
415
+ ])], 64)) : (n(), u("div", Te, [x(f(te), {
416
416
  class: "tpl-spinner",
417
417
  size: 14,
418
418
  "stroke-width": 2
419
- }), y(" " + s(f(b).errors.editorLoading), 1)]))], 12, _e)], 8, ["to"])) : d("", !0);
419
+ }), y(" " + s(f(D).errors.editorLoading), 1)]))], 12, ve)], 8, ["to"])) : d("", !0);
420
420
  }
421
- }), Ee = { class: "tpl-text-editor-wrapper tpl:relative" }, De = /* @__PURE__ */ b({
421
+ }), De = { class: "tpl-text-editor-wrapper tpl:relative" }, Oe = /* @__PURE__ */ b({
422
422
  __name: "ParagraphEditor",
423
423
  props: {
424
424
  block: {},
@@ -426,7 +426,7 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
426
426
  },
427
427
  emits: ["done"],
428
428
  setup(t, { emit: r }) {
429
- let i = t, a = r, o = E(), { editor: s, EditorContent: c, isLoading: l, initError: d, retry: p, showLinkDialog: m, linkUrl: h, linkDialogRef: g, canRequestMergeTag: _, openLinkDialog: v, insertLink: y, removeLink: b, closeLinkDialog: S, handleLinkKeydown: C, handleAddMergeTag: w } = T({
429
+ let i = t, a = r, o = O(), { editor: s, EditorContent: c, isLoading: l, initError: d, retry: p, showLinkDialog: m, linkUrl: h, linkDialogRef: g, canRequestMergeTag: _, openLinkDialog: v, insertLink: y, removeLink: b, closeLinkDialog: S, handleLinkKeydown: C, handleAddMergeTag: w } = T({
430
430
  blockId: () => i.block.id,
431
431
  blockContent: () => i.block.content,
432
432
  onDone: () => a("done"),
@@ -444,7 +444,7 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
444
444
  import("./tiptap-BBbH3IT9.js").then((e) => e.p),
445
445
  import("./tiptap-BBbH3IT9.js").then((e) => e.f),
446
446
  import("./tiptap-BBbH3IT9.js").then((e) => e.d),
447
- import("./extensions-DK_lVs7A.js")
447
+ import("./extensions-GYsbQFPr.js")
448
448
  ]);
449
449
  return {
450
450
  TiptapEditor: a,
@@ -489,8 +489,8 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
489
489
  };
490
490
  }
491
491
  });
492
- return (r, i) => (n(), u("div", Ee, [
493
- x(Te, {
492
+ return (r, i) => (n(), u("div", De, [
493
+ x(Ee, {
494
494
  editor: f(s),
495
495
  "toolbar-position": t.toolbarPosition,
496
496
  "is-loading": f(l),
@@ -505,7 +505,7 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
505
505
  "onOpenLinkDialog",
506
506
  "onAddMergeTag"
507
507
  ]),
508
- x(K, {
508
+ x(U, {
509
509
  editor: f(s),
510
510
  "editor-content": f(c),
511
511
  "is-loading": f(l),
@@ -518,7 +518,7 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
518
518
  "init-error",
519
519
  "onRetry"
520
520
  ]),
521
- x(G, {
521
+ x(H, {
522
522
  visible: f(m),
523
523
  "is-editing-link": f(s)?.isActive("link") ?? !1,
524
524
  "dialog-ref": f(g),
@@ -543,6 +543,6 @@ var Z = /* @__PURE__ */ A(de, [["render", pe]]), me = [
543
543
  }
544
544
  });
545
545
  //#endregion
546
- export { De as default };
546
+ export { Oe as default };
547
547
 
548
- //# sourceMappingURL=ParagraphEditor-C4TrTIOm.js.map
548
+ //# sourceMappingURL=ParagraphEditor-fM9aFu8T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParagraphEditor-fM9aFu8T.js","names":[],"sources":["../../../src/components/blocks/EmojiPickerDropdown.vue","../../../src/components/blocks/EmojiPickerDropdown.vue","../../../src/components/toolbar/ToolbarIconButton.vue","../../../src/components/toolbar/ToolbarIconButton.vue","../../../src/components/toolbar/ToolbarSeparator.vue","../../../src/components/toolbar/ToolbarSelect.vue","../../../src/components/toolbar/ToolbarSelect.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=\"format(t.paragraphEditor.emojiItemLabel, { emoji })\"\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=\"format(t.paragraphEditor.emojiItemLabel, { emoji })\"\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 type { Component } from \"vue\";\n\ndefineProps<{\n icon: Component;\n label: string;\n active?: boolean;\n strokeWidth?: number;\n size?: number;\n}>();\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{ 'tpl-text-toolbar-btn--active': active }\"\n :aria-label=\"label\"\n :title=\"label\"\n :aria-pressed=\"active ? 'true' : 'false'\"\n >\n <component :is=\"icon\" :size=\"size ?? 16\" :stroke-width=\"strokeWidth ?? 2\" />\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\n\ndefineProps<{\n icon: Component;\n label: string;\n active?: boolean;\n strokeWidth?: number;\n size?: number;\n}>();\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"tpl-text-toolbar-btn\"\n :class=\"{ 'tpl-text-toolbar-btn--active': active }\"\n :aria-label=\"label\"\n :title=\"label\"\n :aria-pressed=\"active ? 'true' : 'false'\"\n >\n <component :is=\"icon\" :size=\"size ?? 16\" :stroke-width=\"strokeWidth ?? 2\" />\n </button>\n</template>\n","<template>\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</template>\n","<script setup lang=\"ts\">\ninterface OptionItem {\n value: string;\n label: string;\n}\n\ndefineProps<{\n modelValue: string;\n options: readonly (string | OptionItem)[];\n label: string;\n placeholder?: string;\n widthClass?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:modelValue\", value: string): void;\n}>();\n\nfunction onChange(e: Event): void {\n emit(\"update:modelValue\", (e.target as HTMLSelectElement).value);\n}\n\nfunction optionValue(opt: string | OptionItem): string {\n return typeof opt === \"string\" ? opt : opt.value;\n}\n\nfunction optionLabel(opt: string | OptionItem): string {\n return typeof opt === \"string\" ? opt : opt.label;\n}\n</script>\n\n<template>\n <select\n :class=\"[\n 'tpl:h-8 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 widthClass ?? 'tpl:w-20',\n ]\"\n :value=\"modelValue\"\n :aria-label=\"label\"\n :title=\"label\"\n @change=\"onChange\"\n >\n <option value=\"\">{{ placeholder ?? \"\" }}</option>\n <option\n v-for=\"opt in options\"\n :key=\"optionValue(opt)\"\n :value=\"optionValue(opt)\"\n >\n {{ optionLabel(opt) }}\n </option>\n </select>\n</template>\n","<script setup lang=\"ts\">\ninterface OptionItem {\n value: string;\n label: string;\n}\n\ndefineProps<{\n modelValue: string;\n options: readonly (string | OptionItem)[];\n label: string;\n placeholder?: string;\n widthClass?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:modelValue\", value: string): void;\n}>();\n\nfunction onChange(e: Event): void {\n emit(\"update:modelValue\", (e.target as HTMLSelectElement).value);\n}\n\nfunction optionValue(opt: string | OptionItem): string {\n return typeof opt === \"string\" ? opt : opt.value;\n}\n\nfunction optionLabel(opt: string | OptionItem): string {\n return typeof opt === \"string\" ? opt : opt.label;\n}\n</script>\n\n<template>\n <select\n :class=\"[\n 'tpl:h-8 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 widthClass ?? 'tpl:w-20',\n ]\"\n :value=\"modelValue\"\n :aria-label=\"label\"\n :title=\"label\"\n @change=\"onChange\"\n >\n <option value=\"\">{{ placeholder ?? \"\" }}</option>\n <option\n v-for=\"opt in options\"\n :key=\"optionValue(opt)\"\n :value=\"optionValue(opt)\"\n >\n {{ optionLabel(opt) }}\n </option>\n </select>\n</template>\n","<script setup lang=\"ts\">\nimport EmojiPickerDropdown from \"./EmojiPickerDropdown.vue\";\nimport ToolbarIconButton from \"../toolbar/ToolbarIconButton.vue\";\nimport ToolbarSeparator from \"../toolbar/ToolbarSeparator.vue\";\nimport ToolbarSelect from \"../toolbar/ToolbarSelect.vue\";\nimport { useI18n } from \"../../composables\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\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 { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n FONTS_MANAGER_KEY,\n MERGE_TAG_PICKER_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 canRequestMergeTag: 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\");\nconst popoverRoot = usePopoverRoot();\n// Picker may be null in non-editor contexts (e.g. isolated component tests).\n// When it's provided AND open, hide the floating toolbar — leaving it\n// visible behind the modal is visually noisy and the toolbar's Tailwind\n// z-index utility doesn't compile reliably, so it can sometimes paint\n// over the modal backdrop.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\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 textStyleAttr(attr: string): string {\n return (props.editor?.getAttributes(\"textStyle\")[attr] as string) || \"\";\n}\n\nfunction setFontFamily(family: string): void {\n const chain = props.editor?.chain().focus();\n if (family) chain?.setFontFamily(family).run();\n else chain?.unsetFontFamily().run();\n}\n\nfunction setFontSize(size: string): void {\n const chain = props.editor?.chain().focus();\n if (size) chain?.setFontSize(size).run();\n else chain?.unsetFontSize().run();\n}\n\nfunction setColor(color: string): void {\n const chain = props.editor?.chain().focus();\n if (color) chain?.setColor(color).run();\n else chain?.unsetColor().run();\n}\n\nfunction getCurrentLineHeight(): string {\n return (props.editor?.getAttributes(\"paragraph\").lineHeight as string) || \"\";\n}\n\nfunction setLineHeight(value: string): void {\n const chain = props.editor?.chain().focus();\n if (value) chain?.setLineHeight(value).run();\n else chain?.unsetLineHeight().run();\n}\n\nfunction setLetterSpacing(value: string): void {\n const chain = props.editor?.chain().focus();\n if (value && value !== \"normal\") chain?.setLetterSpacing(value).run();\n else chain?.unsetLetterSpacing().run();\n}\n\nfunction getCurrentHighlight(): string {\n return (props.editor?.getAttributes(\"highlight\").color as string) || \"\";\n}\n\nfunction setHighlight(color: string): void {\n const chain = props.editor?.chain().focus();\n if (color) chain?.setHighlight({ color }).run();\n else chain?.unsetHighlight().run();\n}\n</script>\n\n<template>\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\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 <ToolbarSelect\n :model-value=\"textStyleAttr('fontFamily')\"\n :options=\"fontFamilies\"\n :label=\"t.paragraphEditor.fontFamily\"\n :placeholder=\"t.paragraphEditor.defaultFont\"\n width-class=\"tpl:w-32\"\n @update:model-value=\"setFontFamily\"\n />\n <ToolbarSelect\n :model-value=\"textStyleAttr('fontSize')\"\n :options=\"FONT_SIZE_OPTIONS\"\n :label=\"t.paragraphEditor.fontSize\"\n :placeholder=\"t.paragraphEditor.defaultSize\"\n width-class=\"tpl:w-20\"\n @update:model-value=\"setFontSize\"\n />\n <ToolbarSeparator />\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=\"textStyleAttr('color') || 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 <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Bold\"\n :label=\"t.paragraphEditor.bold\"\n :active=\"editor.isActive('bold')\"\n :stroke-width=\"2.5\"\n @click=\"editor.chain().focus().toggleBold().run()\"\n />\n <ToolbarIconButton\n :icon=\"Italic\"\n :label=\"t.paragraphEditor.italic\"\n :active=\"editor.isActive('italic')\"\n @click=\"editor.chain().focus().toggleItalic().run()\"\n />\n <ToolbarIconButton\n :icon=\"Underline\"\n :label=\"t.paragraphEditor.underline\"\n :active=\"editor.isActive('underline')\"\n @click=\"editor.chain().focus().toggleUnderline().run()\"\n />\n <ToolbarIconButton\n :icon=\"Strikethrough\"\n :label=\"t.paragraphEditor.strikethrough\"\n :active=\"editor.isActive('strike')\"\n @click=\"editor.chain().focus().toggleStrike().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Subscript\"\n :label=\"t.paragraphEditor.subscript\"\n :active=\"editor.isActive('subscript')\"\n @click=\"editor.chain().focus().toggleSubscript().run()\"\n />\n <ToolbarIconButton\n :icon=\"Superscript\"\n :label=\"t.paragraphEditor.superscript\"\n :active=\"editor.isActive('superscript')\"\n @click=\"editor.chain().focus().toggleSuperscript().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Link\"\n :label=\"t.paragraphEditor.addLink\"\n :active=\"editor.isActive('link')\"\n @click=\"emit('open-link-dialog')\"\n />\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 <ToolbarIconButton\n :icon=\"List\"\n :label=\"t.paragraphEditor.bulletList\"\n :active=\"editor.isActive('bulletList')\"\n @click=\"editor.chain().focus().toggleBulletList().run()\"\n />\n <ToolbarIconButton\n :icon=\"ListOrdered\"\n :label=\"t.paragraphEditor.numberedList\"\n :active=\"editor.isActive('orderedList')\"\n @click=\"editor.chain().focus().toggleOrderedList().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"AlignLeft\"\n :label=\"t.paragraphEditor.alignLeft\"\n :active=\"editor.isActive({ textAlign: 'left' })\"\n @click=\"editor.chain().focus().setTextAlign('left').run()\"\n />\n <ToolbarIconButton\n :icon=\"AlignCenter\"\n :label=\"t.paragraphEditor.alignCenter\"\n :active=\"editor.isActive({ textAlign: 'center' })\"\n @click=\"editor.chain().focus().setTextAlign('center').run()\"\n />\n <ToolbarIconButton\n :icon=\"AlignRight\"\n :label=\"t.paragraphEditor.alignRight\"\n :active=\"editor.isActive({ textAlign: 'right' })\"\n @click=\"editor.chain().focus().setTextAlign('right').run()\"\n />\n <ToolbarSeparator />\n <ToolbarSelect\n :model-value=\"getCurrentLineHeight()\"\n :options=\"LINE_HEIGHT_OPTIONS\"\n :label=\"t.paragraphEditor.lineHeight\"\n placeholder=\"LH\"\n width-class=\"tpl:w-16\"\n @update:model-value=\"setLineHeight\"\n />\n <ToolbarSelect\n :model-value=\"textStyleAttr('letterSpacing')\"\n :options=\"LETTER_SPACING_OPTIONS\"\n :label=\"t.paragraphEditor.letterSpacing\"\n placeholder=\"LS\"\n width-class=\"tpl:w-20\"\n @update:model-value=\"setLetterSpacing\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"RemoveFormatting\"\n :label=\"t.paragraphEditor.clearFormatting\"\n @click=\"editor.chain().focus().clearNodes().unsetAllMarks().run()\"\n />\n <ToolbarSeparator />\n <EmojiPickerDropdown @insert=\"insertEmoji\" />\n <template v-if=\"canRequestMergeTag\">\n <ToolbarSeparator />\n <button\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"emit('add-merge-tag')\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\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 ToolbarIconButton from \"../toolbar/ToolbarIconButton.vue\";\nimport ToolbarSeparator from \"../toolbar/ToolbarSeparator.vue\";\nimport ToolbarSelect from \"../toolbar/ToolbarSelect.vue\";\nimport { useI18n } from \"../../composables\";\nimport { usePopoverRoot } from \"../../composables/usePopoverRoot\";\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 { computed, inject } from \"vue\";\nimport {\n THEME_STYLES_KEY,\n UI_THEME_KEY,\n FONTS_MANAGER_KEY,\n MERGE_TAG_PICKER_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 canRequestMergeTag: 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\");\nconst popoverRoot = usePopoverRoot();\n// Picker may be null in non-editor contexts (e.g. isolated component tests).\n// When it's provided AND open, hide the floating toolbar — leaving it\n// visible behind the modal is visually noisy and the toolbar's Tailwind\n// z-index utility doesn't compile reliably, so it can sometimes paint\n// over the modal backdrop.\nconst picker = inject(MERGE_TAG_PICKER_KEY, null);\nconst pickerIsOpen = computed(() => picker?.isOpen.value ?? false);\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 textStyleAttr(attr: string): string {\n return (props.editor?.getAttributes(\"textStyle\")[attr] as string) || \"\";\n}\n\nfunction setFontFamily(family: string): void {\n const chain = props.editor?.chain().focus();\n if (family) chain?.setFontFamily(family).run();\n else chain?.unsetFontFamily().run();\n}\n\nfunction setFontSize(size: string): void {\n const chain = props.editor?.chain().focus();\n if (size) chain?.setFontSize(size).run();\n else chain?.unsetFontSize().run();\n}\n\nfunction setColor(color: string): void {\n const chain = props.editor?.chain().focus();\n if (color) chain?.setColor(color).run();\n else chain?.unsetColor().run();\n}\n\nfunction getCurrentLineHeight(): string {\n return (props.editor?.getAttributes(\"paragraph\").lineHeight as string) || \"\";\n}\n\nfunction setLineHeight(value: string): void {\n const chain = props.editor?.chain().focus();\n if (value) chain?.setLineHeight(value).run();\n else chain?.unsetLineHeight().run();\n}\n\nfunction setLetterSpacing(value: string): void {\n const chain = props.editor?.chain().focus();\n if (value && value !== \"normal\") chain?.setLetterSpacing(value).run();\n else chain?.unsetLetterSpacing().run();\n}\n\nfunction getCurrentHighlight(): string {\n return (props.editor?.getAttributes(\"highlight\").color as string) || \"\";\n}\n\nfunction setHighlight(color: string): void {\n const chain = props.editor?.chain().focus();\n if (color) chain?.setHighlight({ color }).run();\n else chain?.unsetHighlight().run();\n}\n</script>\n\n<template>\n <Teleport v-if=\"popoverRoot && !pickerIsOpen\" :to=\"popoverRoot\">\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 <ToolbarSelect\n :model-value=\"textStyleAttr('fontFamily')\"\n :options=\"fontFamilies\"\n :label=\"t.paragraphEditor.fontFamily\"\n :placeholder=\"t.paragraphEditor.defaultFont\"\n width-class=\"tpl:w-32\"\n @update:model-value=\"setFontFamily\"\n />\n <ToolbarSelect\n :model-value=\"textStyleAttr('fontSize')\"\n :options=\"FONT_SIZE_OPTIONS\"\n :label=\"t.paragraphEditor.fontSize\"\n :placeholder=\"t.paragraphEditor.defaultSize\"\n width-class=\"tpl:w-20\"\n @update:model-value=\"setFontSize\"\n />\n <ToolbarSeparator />\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=\"textStyleAttr('color') || 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 <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Bold\"\n :label=\"t.paragraphEditor.bold\"\n :active=\"editor.isActive('bold')\"\n :stroke-width=\"2.5\"\n @click=\"editor.chain().focus().toggleBold().run()\"\n />\n <ToolbarIconButton\n :icon=\"Italic\"\n :label=\"t.paragraphEditor.italic\"\n :active=\"editor.isActive('italic')\"\n @click=\"editor.chain().focus().toggleItalic().run()\"\n />\n <ToolbarIconButton\n :icon=\"Underline\"\n :label=\"t.paragraphEditor.underline\"\n :active=\"editor.isActive('underline')\"\n @click=\"editor.chain().focus().toggleUnderline().run()\"\n />\n <ToolbarIconButton\n :icon=\"Strikethrough\"\n :label=\"t.paragraphEditor.strikethrough\"\n :active=\"editor.isActive('strike')\"\n @click=\"editor.chain().focus().toggleStrike().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Subscript\"\n :label=\"t.paragraphEditor.subscript\"\n :active=\"editor.isActive('subscript')\"\n @click=\"editor.chain().focus().toggleSubscript().run()\"\n />\n <ToolbarIconButton\n :icon=\"Superscript\"\n :label=\"t.paragraphEditor.superscript\"\n :active=\"editor.isActive('superscript')\"\n @click=\"editor.chain().focus().toggleSuperscript().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"Link\"\n :label=\"t.paragraphEditor.addLink\"\n :active=\"editor.isActive('link')\"\n @click=\"emit('open-link-dialog')\"\n />\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 <ToolbarIconButton\n :icon=\"List\"\n :label=\"t.paragraphEditor.bulletList\"\n :active=\"editor.isActive('bulletList')\"\n @click=\"editor.chain().focus().toggleBulletList().run()\"\n />\n <ToolbarIconButton\n :icon=\"ListOrdered\"\n :label=\"t.paragraphEditor.numberedList\"\n :active=\"editor.isActive('orderedList')\"\n @click=\"editor.chain().focus().toggleOrderedList().run()\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"AlignLeft\"\n :label=\"t.paragraphEditor.alignLeft\"\n :active=\"editor.isActive({ textAlign: 'left' })\"\n @click=\"editor.chain().focus().setTextAlign('left').run()\"\n />\n <ToolbarIconButton\n :icon=\"AlignCenter\"\n :label=\"t.paragraphEditor.alignCenter\"\n :active=\"editor.isActive({ textAlign: 'center' })\"\n @click=\"editor.chain().focus().setTextAlign('center').run()\"\n />\n <ToolbarIconButton\n :icon=\"AlignRight\"\n :label=\"t.paragraphEditor.alignRight\"\n :active=\"editor.isActive({ textAlign: 'right' })\"\n @click=\"editor.chain().focus().setTextAlign('right').run()\"\n />\n <ToolbarSeparator />\n <ToolbarSelect\n :model-value=\"getCurrentLineHeight()\"\n :options=\"LINE_HEIGHT_OPTIONS\"\n :label=\"t.paragraphEditor.lineHeight\"\n placeholder=\"LH\"\n width-class=\"tpl:w-16\"\n @update:model-value=\"setLineHeight\"\n />\n <ToolbarSelect\n :model-value=\"textStyleAttr('letterSpacing')\"\n :options=\"LETTER_SPACING_OPTIONS\"\n :label=\"t.paragraphEditor.letterSpacing\"\n placeholder=\"LS\"\n width-class=\"tpl:w-20\"\n @update:model-value=\"setLetterSpacing\"\n />\n <ToolbarSeparator />\n <ToolbarIconButton\n :icon=\"RemoveFormatting\"\n :label=\"t.paragraphEditor.clearFormatting\"\n @click=\"editor.chain().focus().clearNodes().unsetAllMarks().run()\"\n />\n <ToolbarSeparator />\n <EmojiPickerDropdown @insert=\"insertEmoji\" />\n <template v-if=\"canRequestMergeTag\">\n <ToolbarSeparator />\n <button\n type=\"button\"\n class=\"tpl:flex tpl:h-8 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-2.5 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)] tpl:transition-all tpl:duration-150 tpl:hover:bg-[var(--tpl-bg-active)]\"\n :aria-label=\"t.mergeTag.insert\"\n :title=\"t.mergeTag.insert\"\n @click=\"emit('add-merge-tag')\"\n >\n <ScanLine :size=\"16\" :stroke-width=\"2\" />\n {{ t.mergeTag.insert }}\n </button>\n </template>\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 { usePopoverRoot } from \"../../composables/usePopoverRoot\";\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 popoverRoot = usePopoverRoot();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"ParagraphEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { default: UnderlineExt },\n { default: SubscriptExt },\n { default: SuperscriptExt },\n { default: TextAlign },\n { TextStyle },\n { default: Color },\n { default: FontFamily },\n { default: Highlight },\n {\n MergeTagNode,\n MergeTagSuggestion,\n LogicMergeTagNode,\n FontSize,\n LineHeight,\n LetterSpacing,\n },\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 ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <ParagraphToolbar\n :editor=\"editor\"\n :toolbar-position=\"toolbarPosition\"\n :is-loading=\"isLoading\"\n :can-request-merge-tag=\"canRequestMergeTag\"\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 { usePopoverRoot } from \"../../composables/usePopoverRoot\";\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 popoverRoot = usePopoverRoot();\n\nconst {\n editor,\n EditorContent,\n isLoading,\n initError,\n retry,\n showLinkDialog,\n linkUrl,\n linkDialogRef,\n canRequestMergeTag,\n openLinkDialog,\n insertLink,\n removeLink,\n closeLinkDialog,\n handleLinkKeydown,\n handleAddMergeTag,\n} = useRichTextEditor({\n blockId: () => props.block.id,\n blockContent: () => props.block.content,\n onDone: () => emit(\"done\"),\n editorName: \"ParagraphEditor\",\n async loadExtensions({\n mergeTags,\n syntax,\n triggerChar,\n autocompleteEnabled,\n suggestionEmptyText,\n }) {\n const [\n { Editor: TiptapEditor, EditorContent: EC },\n { default: StarterKit },\n { default: LinkExt },\n { default: UnderlineExt },\n { default: SubscriptExt },\n { default: SuperscriptExt },\n { default: TextAlign },\n { TextStyle },\n { default: Color },\n { default: FontFamily },\n { default: Highlight },\n {\n MergeTagNode,\n MergeTagSuggestion,\n LogicMergeTagNode,\n FontSize,\n LineHeight,\n LetterSpacing,\n },\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 ...(autocompleteEnabled && triggerChar && mergeTags.length > 0\n ? [\n MergeTagSuggestion.configure({\n mergeTags,\n char: triggerChar,\n emptyText: suggestionEmptyText,\n popoverRoot,\n }),\n ]\n : []),\n ],\n };\n },\n});\n</script>\n\n<template>\n <div class=\"tpl-text-editor-wrapper tpl:relative\">\n <ParagraphToolbar\n :editor=\"editor\"\n :toolbar-position=\"toolbarPosition\"\n :is-loading=\"isLoading\"\n :can-request-merge-tag=\"canRequestMergeTag\"\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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"}