@editora/plugins 1.0.2 → 1.0.5

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 (105) hide show
  1. package/README.md +30 -5
  2. package/dist/a11y-checker.cjs.js +109 -0
  3. package/dist/a11y-checker.esm.js +509 -0
  4. package/dist/anchor.cjs.js +176 -0
  5. package/dist/anchor.esm.js +400 -0
  6. package/dist/background-color.cjs.js +218 -0
  7. package/dist/background-color.esm.js +482 -0
  8. package/dist/blockquote.cjs.js +1 -0
  9. package/dist/blockquote.esm.js +47 -0
  10. package/dist/bold.cjs.js +1 -0
  11. package/dist/bold.esm.js +44 -0
  12. package/dist/capitalization.cjs.js +1 -0
  13. package/dist/capitalization.esm.js +78 -0
  14. package/dist/checklist.cjs.js +1 -0
  15. package/dist/checklist.esm.js +305 -0
  16. package/dist/clear-formatting.cjs.js +1 -0
  17. package/dist/clear-formatting.esm.js +138 -0
  18. package/dist/code-sample.cjs.js +161 -0
  19. package/dist/code-sample.esm.js +381 -0
  20. package/dist/code.cjs.js +606 -0
  21. package/dist/code.esm.js +2164 -0
  22. package/dist/colorSelectionApply-C0iOfMWb.js +1 -0
  23. package/dist/colorSelectionApply-D8r_gV32.mjs +63 -0
  24. package/dist/comments.cjs.js +354 -0
  25. package/dist/comments.esm.js +692 -0
  26. package/dist/direction.cjs.js +1 -0
  27. package/dist/direction.esm.js +129 -0
  28. package/dist/document-manager.cjs.js +1 -0
  29. package/dist/document-manager.esm.js +6 -0
  30. package/dist/{documentManager-CYC9totK.mjs → documentManager-DRUc1-Cs.mjs} +3 -3
  31. package/dist/{documentManager-BGlu3WRB.js → documentManager-_tQQfQi9.js} +3 -3
  32. package/dist/editorContainerHelpers-C7kdWnS0.mjs +26 -0
  33. package/dist/editorContainerHelpers-CFbfiOJI.js +1 -0
  34. package/dist/embed-iframe.cjs.js +361 -0
  35. package/dist/embed-iframe.esm.js +556 -0
  36. package/dist/emojis.cjs.js +284 -0
  37. package/dist/emojis.esm.js +1080 -0
  38. package/dist/font-family.cjs.js +1 -0
  39. package/dist/font-family.esm.js +152 -0
  40. package/dist/font-size.cjs.js +1 -0
  41. package/dist/font-size.esm.js +278 -0
  42. package/dist/footnote.cjs.js +85 -0
  43. package/dist/footnote.esm.js +397 -0
  44. package/dist/fullscreen.cjs.js +1 -0
  45. package/dist/fullscreen.esm.js +73 -0
  46. package/dist/heading.cjs.js +1 -0
  47. package/dist/heading.esm.js +63 -0
  48. package/dist/history.cjs.js +1 -0
  49. package/dist/history.esm.js +246 -0
  50. package/dist/indent.cjs.js +1 -0
  51. package/dist/indent.esm.js +146 -0
  52. package/dist/index-Bskk414V.mjs +145 -0
  53. package/dist/index-D3pJyAsj.js +1 -0
  54. package/dist/index.cjs.js +1 -1
  55. package/dist/{index.es-B-to-4j4.js → index.es-Cz1qItab.js} +1 -1
  56. package/dist/{index.es-BbXJ7tyO.mjs → index.es-DEcRmSTY.mjs} +1 -1
  57. package/dist/index.esm.js +89 -49
  58. package/dist/italic.cjs.js +1 -0
  59. package/dist/italic.esm.js +40 -0
  60. package/dist/line-height.cjs.js +1 -0
  61. package/dist/line-height.esm.js +145 -0
  62. package/dist/link.cjs.js +138 -0
  63. package/dist/link.esm.js +276 -0
  64. package/dist/list.cjs.js +1 -0
  65. package/dist/list.esm.js +102 -0
  66. package/dist/lite.cjs.js +1 -0
  67. package/dist/lite.esm.js +61 -0
  68. package/dist/math.cjs.js +45 -0
  69. package/dist/math.esm.js +249 -0
  70. package/dist/media-manager.cjs.js +619 -0
  71. package/dist/media-manager.esm.js +994 -0
  72. package/dist/merge-tag.cjs.js +93 -0
  73. package/dist/merge-tag.esm.js +412 -0
  74. package/dist/page-break.cjs.js +72 -0
  75. package/dist/page-break.esm.js +295 -0
  76. package/dist/plugins.css +1 -1
  77. package/dist/preview.cjs.js +230 -0
  78. package/dist/preview.esm.js +321 -0
  79. package/dist/print.cjs.js +254 -0
  80. package/dist/print.esm.js +309 -0
  81. package/dist/purify.es-DHhaBdbu.mjs +470 -0
  82. package/dist/purify.es-T2a3nLiC.js +3 -0
  83. package/dist/shared-config.cjs.js +1 -0
  84. package/dist/shared-config.esm.js +30 -0
  85. package/dist/special-characters.cjs.js +257 -0
  86. package/dist/special-characters.esm.js +772 -0
  87. package/dist/spell-check.cjs.js +512 -0
  88. package/dist/spell-check.esm.js +1013 -0
  89. package/dist/strikethrough.cjs.js +1 -0
  90. package/dist/strikethrough.esm.js +71 -0
  91. package/dist/table.cjs.js +35 -0
  92. package/dist/table.esm.js +477 -0
  93. package/dist/template.cjs.js +356 -0
  94. package/dist/template.esm.js +560 -0
  95. package/dist/text-alignment.cjs.js +1 -0
  96. package/dist/text-alignment.esm.js +105 -0
  97. package/dist/text-color.cjs.js +300 -0
  98. package/dist/text-color.esm.js +507 -0
  99. package/dist/underline.cjs.js +1 -0
  100. package/dist/underline.esm.js +34 -0
  101. package/index.d.ts +62 -0
  102. package/package.json +220 -7
  103. package/LICENSE +0 -21
  104. package/dist/index-BbORIHoM.mjs +0 -11763
  105. package/dist/index-C-OCBS_6.js +0 -3753
@@ -0,0 +1,93 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R={USER:{name:"User",tags:[{key:"first_name",label:"First Name",category:"User",preview:"John"},{key:"last_name",label:"Last Name",category:"User",preview:"Doe"},{key:"email",label:"Email",category:"User",preview:"john@example.com"},{key:"phone",label:"Phone",category:"User",preview:"+1-555-1234"},{key:"full_name",label:"Full Name",category:"User",preview:"John Doe"},{key:"username",label:"Username",category:"User",preview:"johndoe"}]},COMPANY:{name:"Company",tags:[{key:"company_name",label:"Company Name",category:"Company",preview:"Acme Corp"},{key:"company_address",label:"Company Address",category:"Company",preview:"123 Main St"},{key:"company_phone",label:"Company Phone",category:"Company",preview:"+1-555-0000"},{key:"company_email",label:"Company Email",category:"Company",preview:"info@acme.com"}]},DATE:{name:"Date",tags:[{key:"today",label:"Today",category:"Date",preview:new Date().toLocaleDateString()},{key:"tomorrow",label:"Tomorrow",category:"Date",preview:new Date(Date.now()+864e5).toLocaleDateString()},{key:"next_week",label:"Next Week",category:"Date",preview:new Date(Date.now()+6048e5).toLocaleDateString()}]},CUSTOM:{name:"Custom",tags:[]}},v=".rte-content, .editora-content",X='[data-theme="dark"], .dark, .editora-theme-dark',L=Object.keys(R),Y=L.reduce((t,e)=>(t[e]=R[e].tags.map(r=>({...r,searchIndex:`${r.label} ${r.key} ${r.category} ${"description"in r?r.description??"":""}`.toLowerCase()})),t),{});let B=!1,P=!1,C=null,k=null,h=null,j=!1;function A(){if(B||typeof document>"u")return;B=!0;const t=document.createElement("style");t.id="merge-tag-plugin-styles",t.textContent=`
2
+ .rte-merge-tag-overlay {
3
+ --rte-mt-overlay-bg: rgba(15, 23, 36, 0.56);
4
+ --rte-mt-dialog-bg: #ffffff;
5
+ --rte-mt-dialog-text: #101828;
6
+ --rte-mt-border: #d6dbe4;
7
+ --rte-mt-subtle-bg: #f7f9fc;
8
+ --rte-mt-subtle-hover: #eef2f7;
9
+ --rte-mt-muted-text: #5f6b7d;
10
+ --rte-mt-accent: #1976d2;
11
+ --rte-mt-accent-strong: #1565c0;
12
+ position: fixed;
13
+ inset: 0;
14
+ background-color: var(--rte-mt-overlay-bg);
15
+ backdrop-filter: blur(2px);
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ z-index: 10000;
20
+ padding: 16px;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ .rte-merge-tag-overlay.rte-ui-theme-dark {
25
+ --rte-mt-overlay-bg: rgba(2, 8, 20, 0.72);
26
+ --rte-mt-dialog-bg: #202938;
27
+ --rte-mt-dialog-text: #e8effc;
28
+ --rte-mt-border: #49566c;
29
+ --rte-mt-subtle-bg: #2a3444;
30
+ --rte-mt-subtle-hover: #344256;
31
+ --rte-mt-muted-text: #a5b1c5;
32
+ --rte-mt-accent: #58a6ff;
33
+ --rte-mt-accent-strong: #4598f4;
34
+ }
35
+
36
+ .rte-merge-tag-dialog {
37
+ background: var(--rte-mt-dialog-bg);
38
+ color: var(--rte-mt-dialog-text);
39
+ border: 1px solid var(--rte-mt-border);
40
+ border-radius: 12px;
41
+ box-shadow: 0 24px 48px rgba(10, 15, 24, 0.28);
42
+ width: 500px;
43
+ max-width: 90vw;
44
+ max-height: 80vh;
45
+ display: flex;
46
+ flex-direction: column;
47
+ overflow: hidden;
48
+ }
49
+
50
+ .rte-merge-tag-header { padding: 16px; border-bottom: 1px solid var(--rte-mt-border); display:flex; justify-content:space-between; align-items:center; }
51
+ .rte-merge-tag-body { padding: 16px; overflow-y:auto; flex:1; }
52
+ .rte-merge-tag-input { width:100%; padding:10px; border:1px solid var(--rte-mt-border); border-radius:4px; background:var(--rte-mt-subtle-bg); color:var(--rte-mt-dialog-text); }
53
+ .rte-merge-tag-tabs { display:flex; gap:8px; margin: 12px 0; }
54
+ .rte-merge-tag-tab { padding:8px 12px; background:none; border:none; cursor:pointer; color:var(--rte-mt-muted-text); border-bottom:3px solid transparent; }
55
+ .rte-merge-tag-tab.active { color:var(--rte-mt-accent); border-bottom-color:var(--rte-mt-accent); }
56
+ .rte-merge-tag-list { border:1px solid var(--rte-mt-border); border-radius:4px; max-height:300px; overflow-y:auto; margin-bottom:12px; background:var(--rte-mt-subtle-bg); }
57
+ .rte-merge-tag-item { padding:8px 12px; border-bottom:1px solid var(--rte-mt-border); cursor:pointer; transition:background-color 0.16s; color:var(--rte-mt-dialog-text); }
58
+ .rte-merge-tag-item:last-child { border-bottom: none; }
59
+ .rte-merge-tag-item.selected, .rte-merge-tag-item:hover { background-color:var(--rte-mt-subtle-hover); }
60
+ .rte-merge-tag-item-label { font-weight: 600; }
61
+ .rte-merge-tag-item-preview { font-size: 12px; color: var(--rte-mt-muted-text); margin-top: 2px; }
62
+ .rte-merge-tag-empty { padding: 24px; text-align: center; color: var(--rte-mt-muted-text); }
63
+ .rte-merge-tag-preview { padding:8px; background:var(--rte-mt-subtle-bg); border-radius:4px; font-family:monospace; font-size:12px; color:var(--rte-mt-dialog-text); }
64
+ .rte-merge-tag-footer { padding:12px 16px; border-top:1px solid var(--rte-mt-border); display:flex; gap:8px; justify-content:flex-end; background:var(--rte-mt-subtle-bg); }
65
+ .rte-merge-tag-btn-primary { padding:8px 16px; border:none; border-radius:4px; background:var(--rte-mt-accent); color:#fff; cursor:pointer; }
66
+ .rte-merge-tag-btn-primary:hover { background: var(--rte-mt-accent-strong); }
67
+ .rte-merge-tag-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
68
+ .rte-merge-tag-btn-secondary { padding:8px 16px; border:1px solid var(--rte-mt-border); border-radius:4px; background:var(--rte-mt-subtle-bg); color:var(--rte-mt-dialog-text); cursor:pointer; }
69
+
70
+ .rte-merge-tag {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ white-space: nowrap;
74
+ user-select: none;
75
+ background-color: #e3f2fd;
76
+ border: 1px solid #bbdefb;
77
+ border-radius: 3px;
78
+ padding: 1px 6px;
79
+ margin: 0 2px;
80
+ color: #1976d2;
81
+ font-weight: 600;
82
+ line-height: 1.3;
83
+ }
84
+
85
+ :is([data-theme="dark"], .dark, .editora-theme-dark) .rte-merge-tag {
86
+ background: #223247;
87
+ border-color: #3f5f84;
88
+ color: #8dc4ff;
89
+ }
90
+ `,document.head.appendChild(t)}function H(){P||typeof document>"u"||(P=!0,document.addEventListener("focusin",t=>{const r=t.target?.closest(v);r&&(C=r)}),document.addEventListener("selectionchange",()=>{const t=V();t&&(C=t)}))}function V(){const t=window.getSelection();if(!t||t.rangeCount===0)return null;const r=t.getRangeAt(0).startContainer;return(r.nodeType===Node.ELEMENT_NODE?r:r.parentElement)?.closest(v)||null}function J(){const t=V();if(t)return t;const r=document.activeElement?.closest(v);return r||(C?.isConnected?C:document.querySelector(v))}function Q(t){const e=t.parentNode;if(!e)return;const r=window.getSelection();if(!r)return;const n=document.createRange(),i=Array.from(e.childNodes).indexOf(t);i<0||(n.setStart(e,i),n.setEnd(e,i+1),r.removeAllRanges(),r.addRange(n))}function $(t,e){t instanceof Text&&t.data.length!==0&&(e?(t.data.startsWith(" ")||t.data.startsWith(" "))&&t.deleteData(0,1):(t.data.endsWith(" ")||t.data.endsWith(" "))&&t.deleteData(t.data.length-1,1),t.data.length===0&&t.parentNode?.removeChild(t))}function G(t,e){const r=window.getSelection();if(!r)return;const n=document.createRange(),o=Math.max(0,Math.min(e,t.childNodes.length));n.setStart(t,o),n.collapse(!0),r.removeAllRanges(),r.addRange(n)}function Z(t,e){const r=t.parentNode;if(!r)return!1;const o=Array.from(r.childNodes).indexOf(t);if(o<0)return!1;const i=t.previousSibling,c=t.nextSibling;r.removeChild(t),e==="Backspace"?($(c,!0),G(r,o)):($(i,!1),G(r,o));const d=r instanceof HTMLElement?r.closest(v):r.parentElement?.closest(v)||null;return d&&d.dispatchEvent(new Event("input",{bubbles:!0})),!0}function ee(t){if(t.collapsed||!(t.startContainer instanceof HTMLElement||t.startContainer instanceof Text)||t.startContainer!==t.endContainer||t.endOffset!==t.startOffset+1)return null;const e=t.startContainer;if(!(e instanceof Element||e instanceof DocumentFragment))return null;const r=e.childNodes[t.startOffset];return r instanceof HTMLElement&&r.classList.contains("rte-merge-tag")?r:null}function te(t,e){if(!t.collapsed)return null;const{startContainer:r,startOffset:n}=t,o=i=>i instanceof HTMLElement&&i.classList.contains("rte-merge-tag")?i:null;if(r.nodeType===Node.ELEMENT_NODE){const i=r;return e==="Backspace"&&n>0?o(i.childNodes[n-1]||null):e==="Delete"?o(i.childNodes[n]||null):null}if(r.nodeType===Node.TEXT_NODE){const i=r;return e==="Backspace"?n===0?o(i.previousSibling):n===1&&(i.data[0]===" "||i.data[0]===" ")&&i.previousSibling instanceof HTMLElement&&i.previousSibling.classList.contains("rte-merge-tag")?i.previousSibling:null:n===i.data.length?o(i.nextSibling):null}return null}function q(){j||typeof document>"u"||(j=!0,document.addEventListener("click",t=>{const r=t.target?.closest(".rte-merge-tag");if(!r)return;const n=r.closest(v);n&&(t.preventDefault(),t.stopPropagation(),n.focus({preventScroll:!0}),Q(r))}),document.addEventListener("keydown",t=>{if(t.key!=="Backspace"&&t.key!=="Delete")return;const e=window.getSelection();if(!e||e.rangeCount===0)return;const r=e.getRangeAt(0),n=J();if(!n||!n.contains(r.commonAncestorContainer))return;let o=ee(r);o||(o=te(r,t.key)),o&&(t.preventDefault(),t.stopPropagation(),Z(o,t.key))}))}function re(t){return t?!!t.closest(X):!1}function ne(){h&&(h(),h=null),k=null}function W(t){const e=document.createRange();return e.selectNodeContents(t),e.collapse(!1),e}function ae(t,e){const r=window.getSelection(),n=e?e.cloneRange():W(t),i=n.startContainer.isConnected&&n.endContainer.isConnected&&t.contains(n.commonAncestorContainer)?n:W(t);return r&&(r.removeAllRanges(),r.addRange(i)),i}function oe(t){const e=document.createElement("span");return e.className="rte-merge-tag",e.setAttribute("contenteditable","false"),e.setAttribute("data-key",t.key),e.setAttribute("data-category",t.category),e.setAttribute("data-label",t.label),e.setAttribute("aria-label",`Merge tag: ${t.label}`),e.textContent=`{{ ${t.label} }}`,e}function ie(t,e,r){const n=window.getSelection();if(!n)return!1;t.focus({preventScroll:!0});const o=ae(t,e),c=(o.startContainer.nodeType===Node.ELEMENT_NODE?o.startContainer:o.startContainer.parentElement)?.closest(".rte-merge-tag");c&&t.contains(c)&&(o.setStartAfter(c),o.setEndAfter(c));try{o.deleteContents();const d=oe(r),g=document.createTextNode(" "),u=document.createDocumentFragment();u.appendChild(d),u.appendChild(g),o.insertNode(u);const f=document.createRange();return f.setStartAfter(g),f.collapse(!0),n.removeAllRanges(),n.addRange(f),t.dispatchEvent(new Event("input",{bubbles:!0})),!0}catch(d){return console.error("Failed to insert merge tag:",d),!1}}function le(t,e){const r=Y[t],n=e.trim().toLowerCase();return n?r.filter(o=>o.searchIndex.includes(n)):r}function se(t){ne(),A();const e={category:"USER",searchTerm:"",filteredTags:Y.USER,selectedIndex:0,savedRange:(()=>{const a=window.getSelection();if(!a||a.rangeCount===0)return null;const l=a.getRangeAt(0);return t.contains(l.commonAncestorContainer)?l.cloneRange():null})(),searchRaf:null},r=document.createElement("div");r.className="rte-merge-tag-overlay",r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),re(t)&&r.classList.add("rte-ui-theme-dark");const n=document.createElement("div");n.className="rte-merge-tag-dialog";const o=document.createElement("div");o.className="rte-merge-tag-header",o.innerHTML=`
91
+ <h2 style="margin:0; font-size:18px; font-weight:700;">Insert Merge Tag</h2>
92
+ <button class="rte-merge-tag-close" aria-label="Close" style="background:none;border:none;color:inherit;cursor:pointer;font-size:20px;">✕</button>
93
+ `;const i=document.createElement("div");i.className="rte-merge-tag-body";const c=document.createElement("input");c.type="text",c.className="rte-merge-tag-input",c.placeholder="Search merge tags...",c.setAttribute("aria-label","Search merge tags");const d=document.createElement("div");d.className="rte-merge-tag-tabs",L.forEach(a=>{const l=document.createElement("button");l.type="button",l.className="rte-merge-tag-tab",l.setAttribute("data-category",a),l.textContent=R[a].name,d.appendChild(l)});const g=document.createElement("div");g.className="rte-merge-tag-list";const u=document.createElement("div");u.className="rte-merge-tag-preview",i.appendChild(c),i.appendChild(d),i.appendChild(g),i.appendChild(u);const f=document.createElement("div");f.className="rte-merge-tag-footer";const x=document.createElement("button");x.type="button",x.className="rte-merge-tag-btn-secondary",x.textContent="Cancel";const p=document.createElement("button");p.type="button",p.className="rte-merge-tag-btn-primary",p.textContent="Insert",f.appendChild(x),f.appendChild(p),n.appendChild(o),n.appendChild(i),n.appendChild(f),r.appendChild(n),document.body.appendChild(r),k=r;const D=()=>{d.querySelectorAll(".rte-merge-tag-tab").forEach(l=>{const m=l.dataset.category===e.category;l.classList.toggle("active",m)})},w=()=>{if(e.filteredTags.length===0){e.selectedIndex=-1;return}e.selectedIndex<0&&(e.selectedIndex=0),e.selectedIndex>=e.filteredTags.length&&(e.selectedIndex=e.filteredTags.length-1)},I=()=>{w();const a=e.selectedIndex>=0?e.filteredTags[e.selectedIndex]:null;if(!a){u.style.display="none",p.disabled=!0;return}u.style.display="block",u.innerHTML=`<strong>Preview:</strong> {{ ${a.label} }}`,p.disabled=!1},K=()=>{if(e.selectedIndex<0)return;g.querySelector(`.rte-merge-tag-item[data-index="${e.selectedIndex}"]`)?.scrollIntoView({block:"nearest"})},y=()=>{if(e.filteredTags=le(e.category,e.searchTerm),e.filteredTags.length>0&&e.selectedIndex<0&&(e.selectedIndex=0),w(),g.innerHTML="",e.filteredTags.length===0){const l=document.createElement("div");l.className="rte-merge-tag-empty",l.textContent="No merge tags found",g.appendChild(l),I();return}const a=document.createDocumentFragment();e.filteredTags.forEach((l,m)=>{const s=document.createElement("div");s.className="rte-merge-tag-item",s.setAttribute("data-index",String(m)),s.classList.toggle("selected",m===e.selectedIndex);const N=document.createElement("div");if(N.className="rte-merge-tag-item-label",N.textContent=l.label,s.appendChild(N),l.preview){const S=document.createElement("div");S.className="rte-merge-tag-item-preview",S.textContent=l.preview,s.appendChild(S)}a.appendChild(s)}),g.appendChild(a),I(),K()},M=()=>{e.searchRaf!==null&&cancelAnimationFrame(e.searchRaf),e.searchRaf=requestAnimationFrame(()=>{e.searchRaf=null,e.searchTerm=c.value,e.selectedIndex=0,y()})},b=()=>{e.searchRaf!==null&&(cancelAnimationFrame(e.searchRaf),e.searchRaf=null),r.remove(),k===r&&(k=null,h=null)},E=()=>{if(w(),e.selectedIndex<0)return;const a=e.filteredTags[e.selectedIndex];ie(t,e.savedRange,a)&&b()},O=a=>{const m=a.target.closest(".rte-merge-tag-tab");if(!m)return;const s=m.dataset.category;!s||!L.includes(s)||(e.category=s,e.searchTerm="",c.value="",e.selectedIndex=0,D(),y())},_=a=>{const m=a.target.closest(".rte-merge-tag-item");if(!m)return;const s=Number(m.dataset.index||"-1");Number.isNaN(s)||s<0||s>=e.filteredTags.length||(e.selectedIndex=s,y())},F=a=>{const m=a.target.closest(".rte-merge-tag-item");if(!m)return;const s=Number(m.dataset.index||"-1");Number.isNaN(s)||s<0||s>=e.filteredTags.length||(e.selectedIndex=s,E())},T=a=>{if(a.key==="Escape"){a.preventDefault(),b();return}if(a.key==="ArrowDown"){if(a.preventDefault(),e.filteredTags.length===0)return;e.selectedIndex=Math.min(e.filteredTags.length-1,e.selectedIndex+1),y();return}if(a.key==="ArrowUp"){if(a.preventDefault(),e.filteredTags.length===0)return;e.selectedIndex=Math.max(0,e.selectedIndex-1),y();return}a.key==="Enter"&&(a.preventDefault(),E())},U=a=>{a.target===r&&b()},z=o.querySelector(".rte-merge-tag-close");d.addEventListener("click",O),g.addEventListener("click",_),g.addEventListener("dblclick",F),c.addEventListener("input",M),c.addEventListener("keydown",T),r.addEventListener("click",U),n.addEventListener("keydown",T),z?.addEventListener("click",b),x.addEventListener("click",b),p.addEventListener("click",E),h=()=>{d.removeEventListener("click",O),g.removeEventListener("click",_),g.removeEventListener("dblclick",F),c.removeEventListener("input",M),c.removeEventListener("keydown",T),r.removeEventListener("click",U),n.removeEventListener("keydown",T),z?.removeEventListener("click",b),x.removeEventListener("click",b),p.removeEventListener("click",E),e.searchRaf!==null&&(cancelAnimationFrame(e.searchRaf),e.searchRaf=null),r.remove()},D(),y(),setTimeout(()=>{c.focus()},0)}const ce=()=>({name:"mergeTag",init:()=>{A(),H(),q()},toolbar:[{label:"Merge Tag",command:"insertMergeTag",icon:"{{ }}"}],commands:{insertMergeTag:()=>{A(),H(),q();const t=J();return t?(se(t),!0):!1}}});exports.MergeTagPlugin=ce;
@@ -0,0 +1,412 @@
1
+ const R = {
2
+ USER: {
3
+ name: "User",
4
+ tags: [
5
+ { key: "first_name", label: "First Name", category: "User", preview: "John" },
6
+ { key: "last_name", label: "Last Name", category: "User", preview: "Doe" },
7
+ { key: "email", label: "Email", category: "User", preview: "john@example.com" },
8
+ { key: "phone", label: "Phone", category: "User", preview: "+1-555-1234" },
9
+ { key: "full_name", label: "Full Name", category: "User", preview: "John Doe" },
10
+ { key: "username", label: "Username", category: "User", preview: "johndoe" }
11
+ ]
12
+ },
13
+ COMPANY: {
14
+ name: "Company",
15
+ tags: [
16
+ { key: "company_name", label: "Company Name", category: "Company", preview: "Acme Corp" },
17
+ { key: "company_address", label: "Company Address", category: "Company", preview: "123 Main St" },
18
+ { key: "company_phone", label: "Company Phone", category: "Company", preview: "+1-555-0000" },
19
+ { key: "company_email", label: "Company Email", category: "Company", preview: "info@acme.com" }
20
+ ]
21
+ },
22
+ DATE: {
23
+ name: "Date",
24
+ tags: [
25
+ { key: "today", label: "Today", category: "Date", preview: (/* @__PURE__ */ new Date()).toLocaleDateString() },
26
+ { key: "tomorrow", label: "Tomorrow", category: "Date", preview: new Date(Date.now() + 864e5).toLocaleDateString() },
27
+ { key: "next_week", label: "Next Week", category: "Date", preview: new Date(Date.now() + 6048e5).toLocaleDateString() }
28
+ ]
29
+ },
30
+ CUSTOM: {
31
+ name: "Custom",
32
+ tags: []
33
+ }
34
+ }, v = ".rte-content, .editora-content", X = '[data-theme="dark"], .dark, .editora-theme-dark', L = Object.keys(R), Y = L.reduce(
35
+ (t, e) => (t[e] = R[e].tags.map((r) => ({
36
+ ...r,
37
+ searchIndex: `${r.label} ${r.key} ${r.category} ${"description" in r ? r.description ?? "" : ""}`.toLowerCase()
38
+ })), t),
39
+ {}
40
+ );
41
+ let B = !1, j = !1, T = null, C = null, y = null, H = !1;
42
+ function A() {
43
+ if (B || typeof document > "u") return;
44
+ B = !0;
45
+ const t = document.createElement("style");
46
+ t.id = "merge-tag-plugin-styles", t.textContent = `
47
+ .rte-merge-tag-overlay {
48
+ --rte-mt-overlay-bg: rgba(15, 23, 36, 0.56);
49
+ --rte-mt-dialog-bg: #ffffff;
50
+ --rte-mt-dialog-text: #101828;
51
+ --rte-mt-border: #d6dbe4;
52
+ --rte-mt-subtle-bg: #f7f9fc;
53
+ --rte-mt-subtle-hover: #eef2f7;
54
+ --rte-mt-muted-text: #5f6b7d;
55
+ --rte-mt-accent: #1976d2;
56
+ --rte-mt-accent-strong: #1565c0;
57
+ position: fixed;
58
+ inset: 0;
59
+ background-color: var(--rte-mt-overlay-bg);
60
+ backdrop-filter: blur(2px);
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ z-index: 10000;
65
+ padding: 16px;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ .rte-merge-tag-overlay.rte-ui-theme-dark {
70
+ --rte-mt-overlay-bg: rgba(2, 8, 20, 0.72);
71
+ --rte-mt-dialog-bg: #202938;
72
+ --rte-mt-dialog-text: #e8effc;
73
+ --rte-mt-border: #49566c;
74
+ --rte-mt-subtle-bg: #2a3444;
75
+ --rte-mt-subtle-hover: #344256;
76
+ --rte-mt-muted-text: #a5b1c5;
77
+ --rte-mt-accent: #58a6ff;
78
+ --rte-mt-accent-strong: #4598f4;
79
+ }
80
+
81
+ .rte-merge-tag-dialog {
82
+ background: var(--rte-mt-dialog-bg);
83
+ color: var(--rte-mt-dialog-text);
84
+ border: 1px solid var(--rte-mt-border);
85
+ border-radius: 12px;
86
+ box-shadow: 0 24px 48px rgba(10, 15, 24, 0.28);
87
+ width: 500px;
88
+ max-width: 90vw;
89
+ max-height: 80vh;
90
+ display: flex;
91
+ flex-direction: column;
92
+ overflow: hidden;
93
+ }
94
+
95
+ .rte-merge-tag-header { padding: 16px; border-bottom: 1px solid var(--rte-mt-border); display:flex; justify-content:space-between; align-items:center; }
96
+ .rte-merge-tag-body { padding: 16px; overflow-y:auto; flex:1; }
97
+ .rte-merge-tag-input { width:100%; padding:10px; border:1px solid var(--rte-mt-border); border-radius:4px; background:var(--rte-mt-subtle-bg); color:var(--rte-mt-dialog-text); }
98
+ .rte-merge-tag-tabs { display:flex; gap:8px; margin: 12px 0; }
99
+ .rte-merge-tag-tab { padding:8px 12px; background:none; border:none; cursor:pointer; color:var(--rte-mt-muted-text); border-bottom:3px solid transparent; }
100
+ .rte-merge-tag-tab.active { color:var(--rte-mt-accent); border-bottom-color:var(--rte-mt-accent); }
101
+ .rte-merge-tag-list { border:1px solid var(--rte-mt-border); border-radius:4px; max-height:300px; overflow-y:auto; margin-bottom:12px; background:var(--rte-mt-subtle-bg); }
102
+ .rte-merge-tag-item { padding:8px 12px; border-bottom:1px solid var(--rte-mt-border); cursor:pointer; transition:background-color 0.16s; color:var(--rte-mt-dialog-text); }
103
+ .rte-merge-tag-item:last-child { border-bottom: none; }
104
+ .rte-merge-tag-item.selected, .rte-merge-tag-item:hover { background-color:var(--rte-mt-subtle-hover); }
105
+ .rte-merge-tag-item-label { font-weight: 600; }
106
+ .rte-merge-tag-item-preview { font-size: 12px; color: var(--rte-mt-muted-text); margin-top: 2px; }
107
+ .rte-merge-tag-empty { padding: 24px; text-align: center; color: var(--rte-mt-muted-text); }
108
+ .rte-merge-tag-preview { padding:8px; background:var(--rte-mt-subtle-bg); border-radius:4px; font-family:monospace; font-size:12px; color:var(--rte-mt-dialog-text); }
109
+ .rte-merge-tag-footer { padding:12px 16px; border-top:1px solid var(--rte-mt-border); display:flex; gap:8px; justify-content:flex-end; background:var(--rte-mt-subtle-bg); }
110
+ .rte-merge-tag-btn-primary { padding:8px 16px; border:none; border-radius:4px; background:var(--rte-mt-accent); color:#fff; cursor:pointer; }
111
+ .rte-merge-tag-btn-primary:hover { background: var(--rte-mt-accent-strong); }
112
+ .rte-merge-tag-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
113
+ .rte-merge-tag-btn-secondary { padding:8px 16px; border:1px solid var(--rte-mt-border); border-radius:4px; background:var(--rte-mt-subtle-bg); color:var(--rte-mt-dialog-text); cursor:pointer; }
114
+
115
+ .rte-merge-tag {
116
+ display: inline-flex;
117
+ align-items: center;
118
+ white-space: nowrap;
119
+ user-select: none;
120
+ background-color: #e3f2fd;
121
+ border: 1px solid #bbdefb;
122
+ border-radius: 3px;
123
+ padding: 1px 6px;
124
+ margin: 0 2px;
125
+ color: #1976d2;
126
+ font-weight: 600;
127
+ line-height: 1.3;
128
+ }
129
+
130
+ :is([data-theme="dark"], .dark, .editora-theme-dark) .rte-merge-tag {
131
+ background: #223247;
132
+ border-color: #3f5f84;
133
+ color: #8dc4ff;
134
+ }
135
+ `, document.head.appendChild(t);
136
+ }
137
+ function P() {
138
+ j || typeof document > "u" || (j = !0, document.addEventListener("focusin", (t) => {
139
+ const r = t.target?.closest(v);
140
+ r && (T = r);
141
+ }), document.addEventListener("selectionchange", () => {
142
+ const t = V();
143
+ t && (T = t);
144
+ }));
145
+ }
146
+ function V() {
147
+ const t = window.getSelection();
148
+ if (!t || t.rangeCount === 0) return null;
149
+ const r = t.getRangeAt(0).startContainer;
150
+ return (r.nodeType === Node.ELEMENT_NODE ? r : r.parentElement)?.closest(v) || null;
151
+ }
152
+ function J() {
153
+ const t = V();
154
+ if (t) return t;
155
+ const r = document.activeElement?.closest(v);
156
+ return r || (T?.isConnected ? T : document.querySelector(v));
157
+ }
158
+ function Q(t) {
159
+ const e = t.parentNode;
160
+ if (!e) return;
161
+ const r = window.getSelection();
162
+ if (!r) return;
163
+ const n = document.createRange(), i = Array.from(e.childNodes).indexOf(t);
164
+ i < 0 || (n.setStart(e, i), n.setEnd(e, i + 1), r.removeAllRanges(), r.addRange(n));
165
+ }
166
+ function $(t, e) {
167
+ t instanceof Text && t.data.length !== 0 && (e ? (t.data.startsWith(" ") || t.data.startsWith(" ")) && t.deleteData(0, 1) : (t.data.endsWith(" ") || t.data.endsWith(" ")) && t.deleteData(t.data.length - 1, 1), t.data.length === 0 && t.parentNode?.removeChild(t));
168
+ }
169
+ function G(t, e) {
170
+ const r = window.getSelection();
171
+ if (!r) return;
172
+ const n = document.createRange(), o = Math.max(0, Math.min(e, t.childNodes.length));
173
+ n.setStart(t, o), n.collapse(!0), r.removeAllRanges(), r.addRange(n);
174
+ }
175
+ function Z(t, e) {
176
+ const r = t.parentNode;
177
+ if (!r) return !1;
178
+ const o = Array.from(r.childNodes).indexOf(t);
179
+ if (o < 0) return !1;
180
+ const i = t.previousSibling, c = t.nextSibling;
181
+ r.removeChild(t), e === "Backspace" ? ($(c, !0), G(r, o)) : ($(i, !1), G(r, o));
182
+ const d = r instanceof HTMLElement ? r.closest(v) : r.parentElement?.closest(v) || null;
183
+ return d && d.dispatchEvent(new Event("input", { bubbles: !0 })), !0;
184
+ }
185
+ function ee(t) {
186
+ if (t.collapsed || !(t.startContainer instanceof HTMLElement || t.startContainer instanceof Text) || t.startContainer !== t.endContainer || t.endOffset !== t.startOffset + 1) return null;
187
+ const e = t.startContainer;
188
+ if (!(e instanceof Element || e instanceof DocumentFragment)) return null;
189
+ const r = e.childNodes[t.startOffset];
190
+ return r instanceof HTMLElement && r.classList.contains("rte-merge-tag") ? r : null;
191
+ }
192
+ function te(t, e) {
193
+ if (!t.collapsed) return null;
194
+ const { startContainer: r, startOffset: n } = t, o = (i) => i instanceof HTMLElement && i.classList.contains("rte-merge-tag") ? i : null;
195
+ if (r.nodeType === Node.ELEMENT_NODE) {
196
+ const i = r;
197
+ return e === "Backspace" && n > 0 ? o(i.childNodes[n - 1] || null) : e === "Delete" ? o(i.childNodes[n] || null) : null;
198
+ }
199
+ if (r.nodeType === Node.TEXT_NODE) {
200
+ const i = r;
201
+ return e === "Backspace" ? n === 0 ? o(i.previousSibling) : n === 1 && (i.data[0] === " " || i.data[0] === " ") && i.previousSibling instanceof HTMLElement && i.previousSibling.classList.contains("rte-merge-tag") ? i.previousSibling : null : n === i.data.length ? o(i.nextSibling) : null;
202
+ }
203
+ return null;
204
+ }
205
+ function q() {
206
+ H || typeof document > "u" || (H = !0, document.addEventListener("click", (t) => {
207
+ const r = t.target?.closest(".rte-merge-tag");
208
+ if (!r) return;
209
+ const n = r.closest(v);
210
+ n && (t.preventDefault(), t.stopPropagation(), n.focus({ preventScroll: !0 }), Q(r));
211
+ }), document.addEventListener("keydown", (t) => {
212
+ if (t.key !== "Backspace" && t.key !== "Delete") return;
213
+ const e = window.getSelection();
214
+ if (!e || e.rangeCount === 0) return;
215
+ const r = e.getRangeAt(0), n = J();
216
+ if (!n || !n.contains(r.commonAncestorContainer)) return;
217
+ let o = ee(r);
218
+ o || (o = te(r, t.key)), o && (t.preventDefault(), t.stopPropagation(), Z(o, t.key));
219
+ }));
220
+ }
221
+ function re(t) {
222
+ return t ? !!t.closest(X) : !1;
223
+ }
224
+ function ne() {
225
+ y && (y(), y = null), C = null;
226
+ }
227
+ function W(t) {
228
+ const e = document.createRange();
229
+ return e.selectNodeContents(t), e.collapse(!1), e;
230
+ }
231
+ function ae(t, e) {
232
+ const r = window.getSelection(), n = e ? e.cloneRange() : W(t), i = n.startContainer.isConnected && n.endContainer.isConnected && t.contains(n.commonAncestorContainer) ? n : W(t);
233
+ return r && (r.removeAllRanges(), r.addRange(i)), i;
234
+ }
235
+ function oe(t) {
236
+ const e = document.createElement("span");
237
+ return e.className = "rte-merge-tag", e.setAttribute("contenteditable", "false"), e.setAttribute("data-key", t.key), e.setAttribute("data-category", t.category), e.setAttribute("data-label", t.label), e.setAttribute("aria-label", `Merge tag: ${t.label}`), e.textContent = `{{ ${t.label} }}`, e;
238
+ }
239
+ function ie(t, e, r) {
240
+ const n = window.getSelection();
241
+ if (!n) return !1;
242
+ t.focus({ preventScroll: !0 });
243
+ const o = ae(t, e), c = (o.startContainer.nodeType === Node.ELEMENT_NODE ? o.startContainer : o.startContainer.parentElement)?.closest(".rte-merge-tag");
244
+ c && t.contains(c) && (o.setStartAfter(c), o.setEndAfter(c));
245
+ try {
246
+ o.deleteContents();
247
+ const d = oe(r), g = document.createTextNode(" "), u = document.createDocumentFragment();
248
+ u.appendChild(d), u.appendChild(g), o.insertNode(u);
249
+ const f = document.createRange();
250
+ return f.setStartAfter(g), f.collapse(!0), n.removeAllRanges(), n.addRange(f), t.dispatchEvent(new Event("input", { bubbles: !0 })), !0;
251
+ } catch (d) {
252
+ return console.error("Failed to insert merge tag:", d), !1;
253
+ }
254
+ }
255
+ function le(t, e) {
256
+ const r = Y[t], n = e.trim().toLowerCase();
257
+ return n ? r.filter((o) => o.searchIndex.includes(n)) : r;
258
+ }
259
+ function se(t) {
260
+ ne(), A();
261
+ const e = {
262
+ category: "USER",
263
+ searchTerm: "",
264
+ filteredTags: Y.USER,
265
+ selectedIndex: 0,
266
+ savedRange: (() => {
267
+ const a = window.getSelection();
268
+ if (!a || a.rangeCount === 0) return null;
269
+ const l = a.getRangeAt(0);
270
+ return t.contains(l.commonAncestorContainer) ? l.cloneRange() : null;
271
+ })(),
272
+ searchRaf: null
273
+ }, r = document.createElement("div");
274
+ r.className = "rte-merge-tag-overlay", r.setAttribute("role", "dialog"), r.setAttribute("aria-modal", "true"), re(t) && r.classList.add("rte-ui-theme-dark");
275
+ const n = document.createElement("div");
276
+ n.className = "rte-merge-tag-dialog";
277
+ const o = document.createElement("div");
278
+ o.className = "rte-merge-tag-header", o.innerHTML = `
279
+ <h2 style="margin:0; font-size:18px; font-weight:700;">Insert Merge Tag</h2>
280
+ <button class="rte-merge-tag-close" aria-label="Close" style="background:none;border:none;color:inherit;cursor:pointer;font-size:20px;">✕</button>
281
+ `;
282
+ const i = document.createElement("div");
283
+ i.className = "rte-merge-tag-body";
284
+ const c = document.createElement("input");
285
+ c.type = "text", c.className = "rte-merge-tag-input", c.placeholder = "Search merge tags...", c.setAttribute("aria-label", "Search merge tags");
286
+ const d = document.createElement("div");
287
+ d.className = "rte-merge-tag-tabs", L.forEach((a) => {
288
+ const l = document.createElement("button");
289
+ l.type = "button", l.className = "rte-merge-tag-tab", l.setAttribute("data-category", a), l.textContent = R[a].name, d.appendChild(l);
290
+ });
291
+ const g = document.createElement("div");
292
+ g.className = "rte-merge-tag-list";
293
+ const u = document.createElement("div");
294
+ u.className = "rte-merge-tag-preview", i.appendChild(c), i.appendChild(d), i.appendChild(g), i.appendChild(u);
295
+ const f = document.createElement("div");
296
+ f.className = "rte-merge-tag-footer";
297
+ const x = document.createElement("button");
298
+ x.type = "button", x.className = "rte-merge-tag-btn-secondary", x.textContent = "Cancel";
299
+ const p = document.createElement("button");
300
+ p.type = "button", p.className = "rte-merge-tag-btn-primary", p.textContent = "Insert", f.appendChild(x), f.appendChild(p), n.appendChild(o), n.appendChild(i), n.appendChild(f), r.appendChild(n), document.body.appendChild(r), C = r;
301
+ const D = () => {
302
+ d.querySelectorAll(".rte-merge-tag-tab").forEach((l) => {
303
+ const m = l.dataset.category === e.category;
304
+ l.classList.toggle("active", m);
305
+ });
306
+ }, w = () => {
307
+ if (e.filteredTags.length === 0) {
308
+ e.selectedIndex = -1;
309
+ return;
310
+ }
311
+ e.selectedIndex < 0 && (e.selectedIndex = 0), e.selectedIndex >= e.filteredTags.length && (e.selectedIndex = e.filteredTags.length - 1);
312
+ }, I = () => {
313
+ w();
314
+ const a = e.selectedIndex >= 0 ? e.filteredTags[e.selectedIndex] : null;
315
+ if (!a) {
316
+ u.style.display = "none", p.disabled = !0;
317
+ return;
318
+ }
319
+ u.style.display = "block", u.innerHTML = `<strong>Preview:</strong> {{ ${a.label} }}`, p.disabled = !1;
320
+ }, K = () => {
321
+ if (e.selectedIndex < 0) return;
322
+ g.querySelector(`.rte-merge-tag-item[data-index="${e.selectedIndex}"]`)?.scrollIntoView({ block: "nearest" });
323
+ }, h = () => {
324
+ if (e.filteredTags = le(e.category, e.searchTerm), e.filteredTags.length > 0 && e.selectedIndex < 0 && (e.selectedIndex = 0), w(), g.innerHTML = "", e.filteredTags.length === 0) {
325
+ const l = document.createElement("div");
326
+ l.className = "rte-merge-tag-empty", l.textContent = "No merge tags found", g.appendChild(l), I();
327
+ return;
328
+ }
329
+ const a = document.createDocumentFragment();
330
+ e.filteredTags.forEach((l, m) => {
331
+ const s = document.createElement("div");
332
+ s.className = "rte-merge-tag-item", s.setAttribute("data-index", String(m)), s.classList.toggle("selected", m === e.selectedIndex);
333
+ const N = document.createElement("div");
334
+ if (N.className = "rte-merge-tag-item-label", N.textContent = l.label, s.appendChild(N), l.preview) {
335
+ const S = document.createElement("div");
336
+ S.className = "rte-merge-tag-item-preview", S.textContent = l.preview, s.appendChild(S);
337
+ }
338
+ a.appendChild(s);
339
+ }), g.appendChild(a), I(), K();
340
+ }, M = () => {
341
+ e.searchRaf !== null && cancelAnimationFrame(e.searchRaf), e.searchRaf = requestAnimationFrame(() => {
342
+ e.searchRaf = null, e.searchTerm = c.value, e.selectedIndex = 0, h();
343
+ });
344
+ }, b = () => {
345
+ e.searchRaf !== null && (cancelAnimationFrame(e.searchRaf), e.searchRaf = null), r.remove(), C === r && (C = null, y = null);
346
+ }, E = () => {
347
+ if (w(), e.selectedIndex < 0) return;
348
+ const a = e.filteredTags[e.selectedIndex];
349
+ ie(t, e.savedRange, a) && b();
350
+ }, O = (a) => {
351
+ const m = a.target.closest(".rte-merge-tag-tab");
352
+ if (!m) return;
353
+ const s = m.dataset.category;
354
+ !s || !L.includes(s) || (e.category = s, e.searchTerm = "", c.value = "", e.selectedIndex = 0, D(), h());
355
+ }, _ = (a) => {
356
+ const m = a.target.closest(".rte-merge-tag-item");
357
+ if (!m) return;
358
+ const s = Number(m.dataset.index || "-1");
359
+ Number.isNaN(s) || s < 0 || s >= e.filteredTags.length || (e.selectedIndex = s, h());
360
+ }, F = (a) => {
361
+ const m = a.target.closest(".rte-merge-tag-item");
362
+ if (!m) return;
363
+ const s = Number(m.dataset.index || "-1");
364
+ Number.isNaN(s) || s < 0 || s >= e.filteredTags.length || (e.selectedIndex = s, E());
365
+ }, k = (a) => {
366
+ if (a.key === "Escape") {
367
+ a.preventDefault(), b();
368
+ return;
369
+ }
370
+ if (a.key === "ArrowDown") {
371
+ if (a.preventDefault(), e.filteredTags.length === 0) return;
372
+ e.selectedIndex = Math.min(e.filteredTags.length - 1, e.selectedIndex + 1), h();
373
+ return;
374
+ }
375
+ if (a.key === "ArrowUp") {
376
+ if (a.preventDefault(), e.filteredTags.length === 0) return;
377
+ e.selectedIndex = Math.max(0, e.selectedIndex - 1), h();
378
+ return;
379
+ }
380
+ a.key === "Enter" && (a.preventDefault(), E());
381
+ }, U = (a) => {
382
+ a.target === r && b();
383
+ }, z = o.querySelector(".rte-merge-tag-close");
384
+ d.addEventListener("click", O), g.addEventListener("click", _), g.addEventListener("dblclick", F), c.addEventListener("input", M), c.addEventListener("keydown", k), r.addEventListener("click", U), n.addEventListener("keydown", k), z?.addEventListener("click", b), x.addEventListener("click", b), p.addEventListener("click", E), y = () => {
385
+ d.removeEventListener("click", O), g.removeEventListener("click", _), g.removeEventListener("dblclick", F), c.removeEventListener("input", M), c.removeEventListener("keydown", k), r.removeEventListener("click", U), n.removeEventListener("keydown", k), z?.removeEventListener("click", b), x.removeEventListener("click", b), p.removeEventListener("click", E), e.searchRaf !== null && (cancelAnimationFrame(e.searchRaf), e.searchRaf = null), r.remove();
386
+ }, D(), h(), setTimeout(() => {
387
+ c.focus();
388
+ }, 0);
389
+ }
390
+ const ce = () => ({
391
+ name: "mergeTag",
392
+ init: () => {
393
+ A(), P(), q();
394
+ },
395
+ toolbar: [
396
+ {
397
+ label: "Merge Tag",
398
+ command: "insertMergeTag",
399
+ icon: "{{ }}"
400
+ }
401
+ ],
402
+ commands: {
403
+ insertMergeTag: () => {
404
+ A(), P(), q();
405
+ const t = J();
406
+ return t ? (se(t), !0) : !1;
407
+ }
408
+ }
409
+ });
410
+ export {
411
+ ce as MergeTagPlugin
412
+ };
@@ -0,0 +1,72 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d='.rte-page-break[data-type="page-break"]',g=".rte-content, .editora-content";let p=null,m=!1;const v=new Set(["DIV","P","BLOCKQUOTE","PRE","H1","H2","H3","H4","H5","H6","LI","TD","TH"]),x=()=>{p||typeof document>"u"||(p=document.createElement("style"),p.textContent=`
2
+ .rte-page-break {
3
+ display: block;
4
+ position: relative;
5
+ height: 12px;
6
+ margin: 8px 0;
7
+ background: linear-gradient(90deg, #ccc 0%, transparent 100%);
8
+ border-top: 2px dashed #999;
9
+ border-bottom: none;
10
+ cursor: pointer;
11
+ user-select: none;
12
+ transition: all 0.2s ease;
13
+ outline: none;
14
+ -webkit-user-select: none;
15
+ -moz-user-select: none;
16
+ -ms-user-select: none;
17
+ }
18
+
19
+ .rte-page-break::before {
20
+ content: '⎙ PAGE BREAK';
21
+ position: absolute;
22
+ top: -12px;
23
+ left: 0;
24
+ font-size: 10px;
25
+ font-weight: bold;
26
+ color: #666;
27
+ background: white;
28
+ padding: 2px 6px;
29
+ letter-spacing: 0.5px;
30
+ opacity: 0.7;
31
+ pointer-events: none;
32
+ }
33
+
34
+ .rte-page-break:hover {
35
+ background: linear-gradient(90deg, #999 0%, transparent 100%);
36
+ border-top-color: #666;
37
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
38
+ }
39
+
40
+ .rte-page-break:hover::before {
41
+ opacity: 1;
42
+ color: #333;
43
+ }
44
+
45
+ .rte-page-break:focus,
46
+ .rte-page-break:focus-visible,
47
+ .rte-page-break-selected {
48
+ outline: 2px solid #0066cc;
49
+ outline-offset: -2px;
50
+ border-top-color: #0066cc;
51
+ background: linear-gradient(90deg, #0066cc 0%, transparent 100%);
52
+ }
53
+
54
+ .rte-page-break * {
55
+ user-select: none;
56
+ }
57
+
58
+ @media print {
59
+ .rte-page-break {
60
+ display: block;
61
+ height: 0;
62
+ margin: 0;
63
+ background: none;
64
+ border: none;
65
+ page-break-after: always;
66
+ }
67
+
68
+ .rte-page-break::before {
69
+ display: none;
70
+ }
71
+ }
72
+ `,document.head.appendChild(p))},N=()=>{const e=window.getSelection();if(!e||e.rangeCount===0)return null;const n=e.getRangeAt(0);return(n.startContainer.nodeType===Node.ELEMENT_NODE?n.startContainer:n.startContainer.parentElement)?.closest(g)||null},h=()=>{const e=N();if(e)return e;const t=document.activeElement?.closest(g);return t||document.querySelector(g)},C=(e,n)=>{let t=e;for(;t&&t!==n;){if(t.nodeType===Node.ELEMENT_NODE){const r=t;if(v.has(r.tagName))return r}t=t.parentNode}return null},S=()=>{const e=document.createElement("div");return e.className="rte-page-break",e.setAttribute("data-page-break","true"),e.setAttribute("data-type","page-break"),e.setAttribute("contenteditable","false"),e.setAttribute("tabindex","0"),e.setAttribute("role","separator"),e.setAttribute("aria-label","Page break"),e},w=e=>{let n=e.nextElementSibling;for(;n&&n.matches(d);){const r=n;n=n.nextElementSibling,r.remove()}let t=e.previousElementSibling;for(;t&&t.matches(d);){const r=t;t=t.previousElementSibling,r.remove()}},k=e=>{const n=e.nextElementSibling;if(n&&!n.matches(d))return n;const t=document.createElement("p");return t.innerHTML="<br>",e.parentNode?.insertBefore(t,e.nextSibling),t},u=e=>{const n=window.getSelection();if(!n)return;const t=document.createRange();e.nodeType,Node.TEXT_NODE,t.setStart(e,0),t.collapse(!0),n.removeAllRanges(),n.addRange(t)},b=e=>{const n=window.getSelection();if(!n)return;const t=document.createRange();if(e.nodeType===Node.TEXT_NODE){const r=e;t.setStart(r,r.data.length)}else t.selectNodeContents(e),t.collapse(!1);n.removeAllRanges(),n.addRange(t)},f=(e,n)=>{let t=e;for(;t;){if(!(t instanceof HTMLElement&&t.matches(d)))return t;t=n==="previous"?t.previousSibling:t.nextSibling}return null},A=e=>{const n=window.getSelection();if(!n||!e.parentNode)return;const t=e.parentNode,r=Array.from(t.childNodes).indexOf(e);if(r<0)return;const o=document.createRange();o.setStart(t,r),o.setEnd(t,r+1),n.removeAllRanges(),n.addRange(o),e.focus({preventScroll:!0})},T=e=>{if(e.collapsed||e.startContainer!==e.endContainer||e.endOffset!==e.startOffset+1||!(e.startContainer instanceof Element||e.startContainer instanceof DocumentFragment))return null;const n=e.startContainer.childNodes[e.startOffset];return n instanceof HTMLElement&&n.matches(d)?n:null},L=(e,n,t)=>{if(!e.collapsed)return null;const{startContainer:r,startOffset:o}=e,i=a=>a instanceof HTMLElement&&a.matches(d)?a:null,s=a=>{if(r.nodeType===Node.ELEMENT_NODE){const c=r;if(a==="previous"){if(o>0)return c.childNodes[o-1]||null}else if(o<c.childNodes.length)return c.childNodes[o]||null}if(r.nodeType===Node.TEXT_NODE&&(a==="previous"&&o<r.data.length||a==="next"&&o>0))return null;let l=r;for(;l&&l!==n;){const c=a==="previous"?l.previousSibling:l.nextSibling;if(c)return c;l=l.parentNode}return null};if(r.nodeType===Node.ELEMENT_NODE){const a=r;return t==="Backspace"&&o>0?i(a.childNodes[o-1]||null):t==="Delete"?i(a.childNodes[o]||null):null}if(r.nodeType===Node.TEXT_NODE){const a=r;if(t==="Backspace"&&o===0){const l=i(a.previousSibling);return l||i(s("previous"))}if(t==="Delete"&&o===a.data.length){const l=i(a.nextSibling);return l||i(s("next"))}}return i(s(t==="Backspace"?"previous":"next"))},E=(e,n)=>{const t=e.closest(g),r=e.previousSibling,o=e.nextSibling;e.remove();const i=f(r,"previous"),s=f(o,"next");if(n==="Backspace"){if(i)b(i);else if(s)u(s);else if(t){const a=document.createElement("p");a.innerHTML="<br>",t.appendChild(a),u(a)}}else if(s)u(s);else if(i)b(i);else if(t){const a=document.createElement("p");a.innerHTML="<br>",t.appendChild(a),u(a)}return t&&t.dispatchEvent(new Event("input",{bubbles:!0})),!0},R=()=>{const e=h();if(!e)return!1;const n=window.getSelection();if(!n)return!1;let t;n.rangeCount>0&&e.contains(n.getRangeAt(0).commonAncestorContainer)?t=n.getRangeAt(0):(t=document.createRange(),t.selectNodeContents(e),t.collapse(!1),n.removeAllRanges(),n.addRange(t));const r=C(t.endContainer,e)||C(t.startContainer,e),o=S();r&&r.parentNode?r.parentNode.insertBefore(o,r.nextSibling):e.appendChild(o),w(o);const i=k(o);return u(i),e.dispatchEvent(new Event("input",{bubbles:!0})),!0},B=()=>{m||typeof document>"u"||(m=!0,document.addEventListener("click",e=>{const t=e.target?.closest(d);t&&(e.preventDefault(),e.stopPropagation(),A(t))}),document.addEventListener("keydown",e=>{const n=e.key;if(!["Backspace","Delete","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(n))return;const t=window.getSelection();if(!t||t.rangeCount===0)return;const r=t.getRangeAt(0),o=h();if(!o||!o.contains(r.commonAncestorContainer))return;const i=T(r);if(i){if(n==="Backspace"||n==="Delete"){e.preventDefault(),e.stopPropagation(),E(i,n);return}if(n==="ArrowRight"||n==="ArrowDown"){e.preventDefault();const s=f(i.nextSibling,"next")||k(i);u(s);return}if(n==="ArrowLeft"||n==="ArrowUp"){e.preventDefault();const s=f(i.previousSibling,"previous");s?b(s):u(o);return}}if(n==="Backspace"||n==="Delete"){const s=L(r,o,n);if(!s)return;e.preventDefault(),e.stopPropagation(),E(s,n)}}))},P=()=>(x(),B(),{name:"pageBreak",toolbar:[{label:"Page Break",command:"insertPageBreak",icon:'<svg fill="#000000" width="24px" height="24px" viewBox="0 0 14 14" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><path d="M1,6 L3,6 C3.55228475,6 4,6.44771525 4,7 C4,7.55228475 3.55228475,8 3,8 L1,8 C0.44771525,8 0,7.55228475 0,7 C0,6.44771525 0.44771525,6 1,6 Z M11,6 L13,6 C13.5522847,6 14,6.44771525 14,7 C14,7.55228475 13.5522847,8 13,8 L11,8 C10.4477153,8 10,7.55228475 10,7 C10,6.44771525 10.4477153,6 11,6 Z M6,6 L8,6 C8.55228475,6 9,6.44771525 9,7 C9,7.55228475 8.55228475,8 8,8 L6,8 C5.44771525,8 5,7.55228475 5,7 C5,6.44771525 5.44771525,6 6,6 Z M0,1 C0,0.44771525 0.44771525,-2.26485497e-13 1,-2.26485497e-13 C1.55228475,-2.26485497e-13 2,0.44771525 2,1 L2,3.0142458 L12,3.0142458 L12,1 C12,0.44771525 12.4477153,-2.26485497e-13 13,-2.26485497e-13 C13.5522847,-2.26485497e-13 14,0.44771525 14,1 L14,3.0142458 C14,4.1188153 13.1045695,5.0142458 12,5.0142458 L2,5.0142458 C0.8954305,5.0142458 0,4.1188153 0,3.0142458 L0,1 Z M0,13.0142458 L0,11 C0,9.8954305 0.8954305,9 2,9 L12,9 C13.1045695,9 14,9.8954305 14,11 L14,13.0142458 C14,13.5665305 13.5522847,14.0142458 13,14.0142458 C12.4477153,14.0142458 12,13.5665305 12,13.0142458 L12,11 L2,11 L2,13.0142458 C2,13.5665305 1.55228475,14.0142458 1,14.0142458 C0.44771525,14.0142458 0,13.5665305 0,13.0142458 Z"></path></g></svg>',shortcut:"Mod-Enter"}],commands:{insertPageBreak:R},keymap:{"Mod-Enter":"insertPageBreak"}});exports.PageBreakPlugin=P;