@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.
- package/README.md +30 -5
- package/dist/a11y-checker.cjs.js +109 -0
- package/dist/a11y-checker.esm.js +509 -0
- package/dist/anchor.cjs.js +176 -0
- package/dist/anchor.esm.js +400 -0
- package/dist/background-color.cjs.js +218 -0
- package/dist/background-color.esm.js +482 -0
- package/dist/blockquote.cjs.js +1 -0
- package/dist/blockquote.esm.js +47 -0
- package/dist/bold.cjs.js +1 -0
- package/dist/bold.esm.js +44 -0
- package/dist/capitalization.cjs.js +1 -0
- package/dist/capitalization.esm.js +78 -0
- package/dist/checklist.cjs.js +1 -0
- package/dist/checklist.esm.js +305 -0
- package/dist/clear-formatting.cjs.js +1 -0
- package/dist/clear-formatting.esm.js +138 -0
- package/dist/code-sample.cjs.js +161 -0
- package/dist/code-sample.esm.js +381 -0
- package/dist/code.cjs.js +606 -0
- package/dist/code.esm.js +2164 -0
- package/dist/colorSelectionApply-C0iOfMWb.js +1 -0
- package/dist/colorSelectionApply-D8r_gV32.mjs +63 -0
- package/dist/comments.cjs.js +354 -0
- package/dist/comments.esm.js +692 -0
- package/dist/direction.cjs.js +1 -0
- package/dist/direction.esm.js +129 -0
- package/dist/document-manager.cjs.js +1 -0
- package/dist/document-manager.esm.js +6 -0
- package/dist/{documentManager-CYC9totK.mjs → documentManager-DRUc1-Cs.mjs} +3 -3
- package/dist/{documentManager-BGlu3WRB.js → documentManager-_tQQfQi9.js} +3 -3
- package/dist/editorContainerHelpers-C7kdWnS0.mjs +26 -0
- package/dist/editorContainerHelpers-CFbfiOJI.js +1 -0
- package/dist/embed-iframe.cjs.js +361 -0
- package/dist/embed-iframe.esm.js +556 -0
- package/dist/emojis.cjs.js +284 -0
- package/dist/emojis.esm.js +1080 -0
- package/dist/font-family.cjs.js +1 -0
- package/dist/font-family.esm.js +152 -0
- package/dist/font-size.cjs.js +1 -0
- package/dist/font-size.esm.js +278 -0
- package/dist/footnote.cjs.js +85 -0
- package/dist/footnote.esm.js +397 -0
- package/dist/fullscreen.cjs.js +1 -0
- package/dist/fullscreen.esm.js +73 -0
- package/dist/heading.cjs.js +1 -0
- package/dist/heading.esm.js +63 -0
- package/dist/history.cjs.js +1 -0
- package/dist/history.esm.js +246 -0
- package/dist/indent.cjs.js +1 -0
- package/dist/indent.esm.js +146 -0
- package/dist/index-Bskk414V.mjs +145 -0
- package/dist/index-D3pJyAsj.js +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/{index.es-B-to-4j4.js → index.es-Cz1qItab.js} +1 -1
- package/dist/{index.es-BbXJ7tyO.mjs → index.es-DEcRmSTY.mjs} +1 -1
- package/dist/index.esm.js +89 -49
- package/dist/italic.cjs.js +1 -0
- package/dist/italic.esm.js +40 -0
- package/dist/line-height.cjs.js +1 -0
- package/dist/line-height.esm.js +145 -0
- package/dist/link.cjs.js +138 -0
- package/dist/link.esm.js +276 -0
- package/dist/list.cjs.js +1 -0
- package/dist/list.esm.js +102 -0
- package/dist/lite.cjs.js +1 -0
- package/dist/lite.esm.js +61 -0
- package/dist/math.cjs.js +45 -0
- package/dist/math.esm.js +249 -0
- package/dist/media-manager.cjs.js +619 -0
- package/dist/media-manager.esm.js +994 -0
- package/dist/merge-tag.cjs.js +93 -0
- package/dist/merge-tag.esm.js +412 -0
- package/dist/page-break.cjs.js +72 -0
- package/dist/page-break.esm.js +295 -0
- package/dist/plugins.css +1 -1
- package/dist/preview.cjs.js +230 -0
- package/dist/preview.esm.js +321 -0
- package/dist/print.cjs.js +254 -0
- package/dist/print.esm.js +309 -0
- package/dist/purify.es-DHhaBdbu.mjs +470 -0
- package/dist/purify.es-T2a3nLiC.js +3 -0
- package/dist/shared-config.cjs.js +1 -0
- package/dist/shared-config.esm.js +30 -0
- package/dist/special-characters.cjs.js +257 -0
- package/dist/special-characters.esm.js +772 -0
- package/dist/spell-check.cjs.js +512 -0
- package/dist/spell-check.esm.js +1013 -0
- package/dist/strikethrough.cjs.js +1 -0
- package/dist/strikethrough.esm.js +71 -0
- package/dist/table.cjs.js +35 -0
- package/dist/table.esm.js +477 -0
- package/dist/template.cjs.js +356 -0
- package/dist/template.esm.js +560 -0
- package/dist/text-alignment.cjs.js +1 -0
- package/dist/text-alignment.esm.js +105 -0
- package/dist/text-color.cjs.js +300 -0
- package/dist/text-color.esm.js +507 -0
- package/dist/underline.cjs.js +1 -0
- package/dist/underline.esm.js +34 -0
- package/index.d.ts +62 -0
- package/package.json +220 -7
- package/LICENSE +0 -21
- package/dist/index-BbORIHoM.mjs +0 -11763
- 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;
|