@editora/core 1.0.0 → 1.0.2
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 +9 -0
- package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs +475 -0
- package/dist/A11yCheckerPlugin.native-CZKpi3uF.mjs.map +1 -0
- package/dist/AnchorPlugin.native-7es9PVZ9.mjs +340 -0
- package/dist/AnchorPlugin.native-7es9PVZ9.mjs.map +1 -0
- package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs +449 -0
- package/dist/BackgroundColorPlugin.native-Dip5uqTg.mjs.map +1 -0
- package/dist/BlockquotePlugin.native-JFmOLsxN.mjs +48 -0
- package/dist/BlockquotePlugin.native-JFmOLsxN.mjs.map +1 -0
- package/dist/BoldPlugin.native-BAzzoqU5.mjs +45 -0
- package/dist/BoldPlugin.native-BAzzoqU5.mjs.map +1 -0
- package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs +79 -0
- package/dist/CapitalizationPlugin.native-DOMsh5R7.mjs.map +1 -0
- package/dist/ChecklistPlugin.native-Dccs3nLe.mjs +153 -0
- package/dist/ChecklistPlugin.native-Dccs3nLe.mjs.map +1 -0
- package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs +27 -0
- package/dist/ClearFormattingPlugin.native-BZPDHswo.mjs.map +1 -0
- package/dist/CodePlugin.native-DD9xFIid.mjs +1679 -0
- package/dist/CodePlugin.native-DD9xFIid.mjs.map +1 -0
- package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs +326 -0
- package/dist/CodeSamplePlugin.native-DMbEdO9j.mjs.map +1 -0
- package/dist/CommentsPlugin.native-2zQV8Ia4.mjs +473 -0
- package/dist/CommentsPlugin.native-2zQV8Ia4.mjs.map +1 -0
- package/dist/DirectionPlugin.native-Be7wCzkI.mjs +59 -0
- package/dist/DirectionPlugin.native-Be7wCzkI.mjs.map +1 -0
- package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs +116 -0
- package/dist/DocumentManagerPlugin.native-BvZL5CSG.mjs.map +1 -0
- package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs +461 -0
- package/dist/EmbedIframePlugin.native-ifr9KLdN.mjs.map +1 -0
- package/dist/EmojisPlugin.native-D6mJSnSR.mjs +1033 -0
- package/dist/EmojisPlugin.native-D6mJSnSR.mjs.map +1 -0
- package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs +106 -0
- package/dist/FontFamilyPlugin.native-BzS_9qbM.mjs.map +1 -0
- package/dist/FontSizePlugin.native-DkLMLPue.mjs +186 -0
- package/dist/FontSizePlugin.native-DkLMLPue.mjs.map +1 -0
- package/dist/FootnotePlugin.native-BciVc9W6.mjs +128 -0
- package/dist/FootnotePlugin.native-BciVc9W6.mjs.map +1 -0
- package/dist/FullscreenPlugin.native-ChXyxeNw.mjs +77 -0
- package/dist/FullscreenPlugin.native-ChXyxeNw.mjs.map +1 -0
- package/dist/HeadingPlugin.native-DrLYwQnQ.mjs +64 -0
- package/dist/HeadingPlugin.native-DrLYwQnQ.mjs.map +1 -0
- package/dist/HistoryPlugin.native-DoDRifCf.mjs +89 -0
- package/dist/HistoryPlugin.native-DoDRifCf.mjs.map +1 -0
- package/dist/IndentPlugin.native-CbFugPoi.mjs +133 -0
- package/dist/IndentPlugin.native-CbFugPoi.mjs.map +1 -0
- package/dist/ItalicPlugin.native-CQjjDyUL.mjs +43 -0
- package/dist/ItalicPlugin.native-CQjjDyUL.mjs.map +1 -0
- package/dist/LineHeightPlugin.native-CWQT2FIa.mjs +73 -0
- package/dist/LineHeightPlugin.native-CWQT2FIa.mjs.map +1 -0
- package/dist/LinkPlugin.native-BdAOV-iu.mjs +206 -0
- package/dist/LinkPlugin.native-BdAOV-iu.mjs.map +1 -0
- package/dist/ListPlugin.native-CLFU5AUQ.mjs +59 -0
- package/dist/ListPlugin.native-CLFU5AUQ.mjs.map +1 -0
- package/dist/MathPlugin.native-DE_ii-LA.mjs +182 -0
- package/dist/MathPlugin.native-DE_ii-LA.mjs.map +1 -0
- package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs +533 -0
- package/dist/MediaManagerPlugin.native-DaYFDzNM.mjs.map +1 -0
- package/dist/MergeTagPlugin.native-CrxyThyn.mjs +178 -0
- package/dist/MergeTagPlugin.native-CrxyThyn.mjs.map +1 -0
- package/dist/PageBreakPlugin.native-DDjcDyRW.mjs +172 -0
- package/dist/PageBreakPlugin.native-DDjcDyRW.mjs.map +1 -0
- package/dist/PreviewPlugin.native-DBvfpmIv.mjs +322 -0
- package/dist/PreviewPlugin.native-DBvfpmIv.mjs.map +1 -0
- package/dist/PrintPlugin.native-BUpm52VJ.mjs +311 -0
- package/dist/PrintPlugin.native-BUpm52VJ.mjs.map +1 -0
- package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs +731 -0
- package/dist/SpecialCharactersPlugin.native-x7a2SWXc.mjs.map +1 -0
- package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs +465 -0
- package/dist/SpellCheckPlugin.native-B7yTh0iE.mjs.map +1 -0
- package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs +43 -0
- package/dist/StrikethroughPlugin.native-ChaZLaXw.mjs.map +1 -0
- package/dist/TablePlugin.native-EEWXn1-s.mjs +491 -0
- package/dist/TablePlugin.native-EEWXn1-s.mjs.map +1 -0
- package/dist/TemplatePlugin.native-BlSn1c9h.mjs +564 -0
- package/dist/TemplatePlugin.native-BlSn1c9h.mjs.map +1 -0
- package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs +97 -0
- package/dist/TextAlignmentPlugin.native-CQIs1m7R.mjs.map +1 -0
- package/dist/TextColorPlugin.native-D6SmTglm.mjs +432 -0
- package/dist/TextColorPlugin.native-D6SmTglm.mjs.map +1 -0
- package/dist/UnderlinePlugin.native-QpIcK4L2.mjs +35 -0
- package/dist/UnderlinePlugin.native-QpIcK4L2.mjs.map +1 -0
- package/dist/core.css +1 -0
- package/dist/documentManager-irzj9n3V.mjs +37627 -0
- package/dist/documentManager-irzj9n3V.mjs.map +1 -0
- package/dist/editorContainerHelpers-C7kdWnS0.mjs +27 -0
- package/dist/editorContainerHelpers-C7kdWnS0.mjs.map +1 -0
- package/dist/editora.min.js +519 -4
- package/dist/editora.min.js.map +1 -0
- package/dist/editora.umd.js +519 -4
- package/dist/editora.umd.js.map +1 -0
- package/dist/index-BF5RBhL9.js +4 -0
- package/dist/index-BF5RBhL9.js.map +1 -0
- package/dist/index-BPsf460l.mjs +1243 -0
- package/dist/index-BPsf460l.mjs.map +1 -0
- package/dist/index.cjs.js +517 -4
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es-CuicffkQ.mjs +6665 -0
- package/dist/index.es-CuicffkQ.mjs.map +1 -0
- package/dist/index.esm.js +1403 -122
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin-loader.js +55 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/purify.es-CKpwg8Tk.mjs +471 -0
- package/dist/purify.es-CKpwg8Tk.mjs.map +1 -0
- package/dist/webcomponent-core.js +1243 -0
- package/dist/webcomponent-core.js.map +1 -0
- package/dist/webcomponent-core.min.css +1 -0
- package/dist/webcomponent-core.min.js +597 -0
- package/dist/webcomponent-core.min.js.map +1 -0
- package/dist/webcomponent.cjs.js +2 -0
- package/dist/webcomponent.cjs.js.map +1 -0
- package/dist/webcomponent.esm.js +6 -0
- package/dist/webcomponent.esm.js.map +1 -0
- package/dist/webcomponent.js +1286 -0
- package/dist/webcomponent.js.map +1 -0
- package/dist/webcomponent.min.css +1 -0
- package/dist/webcomponent.min.js +4076 -0
- package/dist/webcomponent.min.js.map +1 -0
- package/package.json +64 -6
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const o = () => ({
|
|
2
|
+
name: "strikethrough",
|
|
3
|
+
// Schema definition for strikethrough mark
|
|
4
|
+
marks: {
|
|
5
|
+
strikethrough: {
|
|
6
|
+
parseDOM: [
|
|
7
|
+
{ tag: "s" },
|
|
8
|
+
{ tag: "strike" },
|
|
9
|
+
{ tag: "del" },
|
|
10
|
+
{
|
|
11
|
+
style: "text-decoration",
|
|
12
|
+
getAttrs: (t) => (typeof t == "string" ? t : t.style.textDecoration) === "line-through" && null
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
toDOM: () => ["s", 0]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
// Toolbar button configuration
|
|
19
|
+
toolbar: [
|
|
20
|
+
{
|
|
21
|
+
label: "Strikethrough",
|
|
22
|
+
command: "toggleStrikethrough",
|
|
23
|
+
icon: '<svg width="24" height="24" focusable="false"><g fill-rule="evenodd"><path d="M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 0 1 7 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1Z"></path><path d="M5 11h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Z" fill-rule="nonzero"></path></g></svg>',
|
|
24
|
+
shortcut: "Mod-Shift-x"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
// Native command implementations
|
|
28
|
+
commands: {
|
|
29
|
+
/**
|
|
30
|
+
* Toggle strikethrough formatting on current selection
|
|
31
|
+
*/
|
|
32
|
+
toggleStrikethrough: () => (document.execCommand("strikeThrough", !1), !0)
|
|
33
|
+
},
|
|
34
|
+
// Keyboard shortcuts
|
|
35
|
+
keymap: {
|
|
36
|
+
"Mod-Shift-x": "toggleStrikethrough",
|
|
37
|
+
"Mod-Shift-X": "toggleStrikethrough"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
export {
|
|
41
|
+
o as StrikethroughPlugin
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=StrikethroughPlugin.native-ChaZLaXw.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrikethroughPlugin.native-ChaZLaXw.mjs","sources":["../../plugins/strikethrough/src/StrikethroughPlugin.native.ts"],"sourcesContent":["import { Plugin } from '@editora/core';\n\n/**\n * Strikethrough Plugin - Framework Agnostic\n * \n * Adds strikethrough formatting support with native command implementation.\n * No React dependency required.\n */\nexport const StrikethroughPlugin = (): Plugin => ({\n name: 'strikethrough',\n \n // Schema definition for strikethrough mark\n marks: {\n strikethrough: {\n parseDOM: [\n { tag: 's' },\n { tag: 'strike' },\n { tag: 'del' },\n {\n style: 'text-decoration',\n getAttrs: (value: string | HTMLElement) => {\n const decoration = typeof value === 'string' \n ? value \n : (value as HTMLElement).style.textDecoration;\n return decoration === 'line-through' && null;\n }\n }\n ],\n toDOM: () => ['s', 0]\n }\n },\n \n // Toolbar button configuration\n toolbar: [\n {\n label: 'Strikethrough',\n command: 'toggleStrikethrough',\n icon: '<svg width=\"24\" height=\"24\" focusable=\"false\"><g fill-rule=\"evenodd\"><path d=\"M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 0 1 7 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1Z\"></path><path d=\"M5 11h14a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2Z\" fill-rule=\"nonzero\"></path></g></svg>',\n shortcut: 'Mod-Shift-x'\n }\n ],\n \n // Native command implementations\n commands: {\n /**\n * Toggle strikethrough formatting on current selection\n */\n toggleStrikethrough: () => {\n document.execCommand('strikeThrough', false);\n return true;\n }\n },\n \n // Keyboard shortcuts\n keymap: {\n 'Mod-Shift-x': 'toggleStrikethrough',\n 'Mod-Shift-X': 'toggleStrikethrough'\n }\n});\n"],"names":["StrikethroughPlugin","value"],"mappings":"AAQO,MAAMA,IAAsB,OAAe;AAAA,EAChD,MAAM;AAAA;AAAA,EAGN,OAAO;AAAA,IACL,eAAe;AAAA,MACb,UAAU;AAAA,QACR,EAAE,KAAK,IAAA;AAAA,QACP,EAAE,KAAK,SAAA;AAAA,QACP,EAAE,KAAK,MAAA;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,UAAU,CAACC,OACU,OAAOA,KAAU,WAChCA,IACCA,EAAsB,MAAM,oBACX,kBAAkB;AAAA,QAC1C;AAAA,MACF;AAAA,MAEF,OAAO,MAAM,CAAC,KAAK,CAAC;AAAA,IAAA;AAAA,EACtB;AAAA;AAAA,EAIF,SAAS;AAAA,IACP;AAAA,MACE,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA;AAAA,EAIF,UAAU;AAAA;AAAA;AAAA;AAAA,IAIR,qBAAqB,OACnB,SAAS,YAAY,iBAAiB,EAAK,GACpC;AAAA,EACT;AAAA;AAAA,EAIF,QAAQ;AAAA,IACN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAEnB;"}
|
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import { f as N, g as q } from "./editorContainerHelpers-C7kdWnS0.mjs";
|
|
2
|
+
let h = null, m = null, T = null, R = null, x = null, I = null, V = null, w = !1, v = null, S = 0, M = 0, C = !1, L = 0, k = 0, A = 0, B = 0;
|
|
3
|
+
const X = () => {
|
|
4
|
+
const e = N(), t = q(e);
|
|
5
|
+
if (!t)
|
|
6
|
+
return alert("Please place your cursor in the editor before inserting a table"), !1;
|
|
7
|
+
const n = window.getSelection();
|
|
8
|
+
if (!n || n.rangeCount === 0) return;
|
|
9
|
+
const l = n.getRangeAt(0), r = document.createElement("table");
|
|
10
|
+
r.className = "rte-table";
|
|
11
|
+
const o = document.createElement("thead"), a = document.createElement("tr");
|
|
12
|
+
for (let d = 0; d < 3; d++) {
|
|
13
|
+
const c = document.createElement("th"), u = document.createElement("p");
|
|
14
|
+
u.appendChild(document.createElement("br")), c.appendChild(u), a.appendChild(c);
|
|
15
|
+
}
|
|
16
|
+
o.appendChild(a);
|
|
17
|
+
const i = document.createElement("tbody");
|
|
18
|
+
for (let d = 0; d < 2; d++) {
|
|
19
|
+
const c = document.createElement("tr");
|
|
20
|
+
for (let u = 0; u < 3; u++) {
|
|
21
|
+
const b = document.createElement("td"), f = document.createElement("p");
|
|
22
|
+
f.appendChild(document.createElement("br")), b.appendChild(f), c.appendChild(b);
|
|
23
|
+
}
|
|
24
|
+
i.appendChild(c);
|
|
25
|
+
}
|
|
26
|
+
r.appendChild(o), r.appendChild(i), l.deleteContents(), l.insertNode(r);
|
|
27
|
+
const s = r.querySelector("th p");
|
|
28
|
+
if (s) {
|
|
29
|
+
const d = document.createRange();
|
|
30
|
+
d.setStart(s, 0), d.collapse(!0), n.removeAllRanges(), n.addRange(d);
|
|
31
|
+
}
|
|
32
|
+
t.focus();
|
|
33
|
+
}, _ = () => {
|
|
34
|
+
var a;
|
|
35
|
+
const e = p();
|
|
36
|
+
if (!e) return;
|
|
37
|
+
const { table: t, rowIndex: n } = e, l = document.createElement("tr"), r = ((a = t.rows[0]) == null ? void 0 : a.cells.length) || 0;
|
|
38
|
+
for (let i = 0; i < r; i++) {
|
|
39
|
+
const s = document.createElement("td"), d = document.createElement("p");
|
|
40
|
+
d.innerHTML = "<br>", s.appendChild(d), l.appendChild(s);
|
|
41
|
+
}
|
|
42
|
+
const o = t.rows[n];
|
|
43
|
+
o && o.parentElement ? o.parentElement.insertBefore(l, o) : t.appendChild(l), g();
|
|
44
|
+
}, H = () => {
|
|
45
|
+
var o;
|
|
46
|
+
const e = p();
|
|
47
|
+
if (!e) return;
|
|
48
|
+
const { table: t, rowIndex: n } = e, l = document.createElement("tr"), r = ((o = t.rows[0]) == null ? void 0 : o.cells.length) || 0;
|
|
49
|
+
for (let a = 0; a < r; a++) {
|
|
50
|
+
const i = document.createElement("td"), s = document.createElement("p");
|
|
51
|
+
s.innerHTML = "<br>", i.appendChild(s), l.appendChild(i);
|
|
52
|
+
}
|
|
53
|
+
n >= t.rows.length - 1 ? t.appendChild(l) : t.insertBefore(l, t.rows[n + 1]), g();
|
|
54
|
+
}, P = () => {
|
|
55
|
+
const e = p();
|
|
56
|
+
if (!e) return;
|
|
57
|
+
const { table: t, colIndex: n } = e;
|
|
58
|
+
for (let l = 0; l < t.rows.length; l++) {
|
|
59
|
+
const r = t.rows[l], o = document.createElement("td"), a = document.createElement("p");
|
|
60
|
+
a.innerHTML = "<br>", o.appendChild(a), n === 0 ? r.insertBefore(o, r.cells[0]) : r.insertBefore(o, r.cells[n]);
|
|
61
|
+
}
|
|
62
|
+
g();
|
|
63
|
+
}, z = () => {
|
|
64
|
+
const e = p();
|
|
65
|
+
if (!e) return;
|
|
66
|
+
const { table: t, colIndex: n } = e;
|
|
67
|
+
for (let l = 0; l < t.rows.length; l++) {
|
|
68
|
+
const r = t.rows[l], o = document.createElement("td"), a = document.createElement("p");
|
|
69
|
+
a.innerHTML = "<br>", o.appendChild(a), n >= r.cells.length - 1 ? r.appendChild(o) : r.insertBefore(o, r.cells[n + 1]);
|
|
70
|
+
}
|
|
71
|
+
g();
|
|
72
|
+
}, W = () => {
|
|
73
|
+
const e = p();
|
|
74
|
+
if (!e || e.rowCount <= 1) return;
|
|
75
|
+
const { table: t, rowIndex: n } = e;
|
|
76
|
+
t.deleteRow(n), g();
|
|
77
|
+
}, O = () => {
|
|
78
|
+
const e = p();
|
|
79
|
+
if (!e || e.cellCount <= 1) return;
|
|
80
|
+
const { table: t, colIndex: n } = e;
|
|
81
|
+
for (let l = 0; l < t.rows.length; l++) {
|
|
82
|
+
const r = t.rows[l];
|
|
83
|
+
r.cells[n] && r.deleteCell(n);
|
|
84
|
+
}
|
|
85
|
+
g();
|
|
86
|
+
}, K = () => {
|
|
87
|
+
var o;
|
|
88
|
+
const e = p();
|
|
89
|
+
if (!e) return;
|
|
90
|
+
const { table: t, rowIndex: n } = e, l = t.rows[n];
|
|
91
|
+
if (((o = l.parentElement) == null ? void 0 : o.tagName.toLowerCase()) === "thead") {
|
|
92
|
+
const a = t.querySelector("tbody") || t.appendChild(document.createElement("tbody")), i = t.querySelector("thead");
|
|
93
|
+
i && (a.insertBefore(l, a.firstChild), i.rows.length === 0 && i.remove());
|
|
94
|
+
} else {
|
|
95
|
+
let a = t.querySelector("thead");
|
|
96
|
+
a || (a = document.createElement("thead"), t.insertBefore(a, t.firstChild)), a.appendChild(l);
|
|
97
|
+
}
|
|
98
|
+
g();
|
|
99
|
+
}, Y = () => {
|
|
100
|
+
var l;
|
|
101
|
+
const e = p();
|
|
102
|
+
if (!e) return;
|
|
103
|
+
const { table: t, colIndex: n } = e;
|
|
104
|
+
for (let r = 0; r < t.rows.length; r++) {
|
|
105
|
+
const o = t.rows[r].cells[n];
|
|
106
|
+
if (o) {
|
|
107
|
+
const a = o.tagName.toLowerCase() === "th" ? "td" : "th", i = document.createElement(a);
|
|
108
|
+
i.innerHTML = o.innerHTML;
|
|
109
|
+
for (let s = 0; s < o.attributes.length; s++) {
|
|
110
|
+
const d = o.attributes[s];
|
|
111
|
+
i.setAttribute(d.name, d.value);
|
|
112
|
+
}
|
|
113
|
+
(l = o.parentNode) == null || l.replaceChild(i, o);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
g();
|
|
117
|
+
}, F = () => {
|
|
118
|
+
const e = p();
|
|
119
|
+
if (!e) return;
|
|
120
|
+
e.table.remove(), document.dispatchEvent(new CustomEvent("tableDeleted"));
|
|
121
|
+
}, G = () => {
|
|
122
|
+
var u, b;
|
|
123
|
+
const e = window.getSelection();
|
|
124
|
+
if (!e || e.rangeCount === 0) return;
|
|
125
|
+
const n = e.getRangeAt(0).startContainer;
|
|
126
|
+
if (!(n.nodeType === Node.TEXT_NODE ? (u = n.parentElement) == null ? void 0 : u.closest("table") : n.closest("table"))) return;
|
|
127
|
+
let r = null;
|
|
128
|
+
if (n.nodeType === Node.TEXT_NODE ? r = (b = n.parentElement) == null ? void 0 : b.closest("td, th") : n.nodeType === Node.ELEMENT_NODE && (r = n.closest("td, th")), !r) return;
|
|
129
|
+
const o = r.parentElement;
|
|
130
|
+
if (!o) return;
|
|
131
|
+
let a = -1;
|
|
132
|
+
for (let f = 0; f < o.cells.length; f++)
|
|
133
|
+
if (o.cells[f] === r) {
|
|
134
|
+
a = f;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
if (a === -1 || a === o.cells.length - 1) return;
|
|
138
|
+
const i = o.cells[a + 1];
|
|
139
|
+
if (!i) return;
|
|
140
|
+
const s = parseInt(r.getAttribute("colspan") || "1"), d = parseInt(i.getAttribute("colspan") || "1");
|
|
141
|
+
r.setAttribute("colspan", String(s + d)), Array.from(i.childNodes).forEach((f) => {
|
|
142
|
+
r.appendChild(f);
|
|
143
|
+
}), i.remove(), g();
|
|
144
|
+
};
|
|
145
|
+
function p() {
|
|
146
|
+
var s, d, c;
|
|
147
|
+
const e = window.getSelection();
|
|
148
|
+
if (!e || e.rangeCount === 0) return null;
|
|
149
|
+
const n = e.getRangeAt(0).startContainer;
|
|
150
|
+
let l = n.nodeType === Node.TEXT_NODE ? (s = n.parentElement) == null ? void 0 : s.closest("table") : n.closest("table");
|
|
151
|
+
if (!l) return null;
|
|
152
|
+
const r = l;
|
|
153
|
+
let o = 0, a = 0;
|
|
154
|
+
const i = n.nodeType === Node.TEXT_NODE ? (d = n.parentElement) == null ? void 0 : d.closest("td, th") : n.closest("td, th");
|
|
155
|
+
if (i) {
|
|
156
|
+
let u = i.parentElement;
|
|
157
|
+
for (; u && u !== r.rows[o] && (o++, !(o >= r.rows.length)); )
|
|
158
|
+
;
|
|
159
|
+
const b = u;
|
|
160
|
+
if (b) {
|
|
161
|
+
for (let f = 0; f < b.cells.length; f++)
|
|
162
|
+
if (b.cells[f] === i) {
|
|
163
|
+
a = f;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
table: r,
|
|
170
|
+
rowIndex: o,
|
|
171
|
+
colIndex: a,
|
|
172
|
+
rowCount: r.rows.length,
|
|
173
|
+
cellCount: ((c = r.rows[0]) == null ? void 0 : c.cells.length) || 0
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function g() {
|
|
177
|
+
if (!h || !m) return;
|
|
178
|
+
const e = p();
|
|
179
|
+
if (!e) return;
|
|
180
|
+
const t = e.rowCount > 1, n = e.cellCount > 1;
|
|
181
|
+
D(t, n);
|
|
182
|
+
}
|
|
183
|
+
function j() {
|
|
184
|
+
T = () => {
|
|
185
|
+
const e = p();
|
|
186
|
+
e ? U(e.table) : y();
|
|
187
|
+
}, R = (e) => {
|
|
188
|
+
const t = e.target, n = t.closest("table"), l = t.closest(".table-toolbar");
|
|
189
|
+
!n && !l && y();
|
|
190
|
+
}, x = () => {
|
|
191
|
+
y();
|
|
192
|
+
}, I = () => {
|
|
193
|
+
m && h && h.style.display !== "none" && E(m);
|
|
194
|
+
}, V = () => {
|
|
195
|
+
m && h && h.style.display !== "none" && E(m);
|
|
196
|
+
}, document.addEventListener("selectionchange", T), document.addEventListener("mousedown", R), document.addEventListener("tableDeleted", x), window.addEventListener("scroll", I, !0), window.addEventListener("resize", V);
|
|
197
|
+
}
|
|
198
|
+
function E(e) {
|
|
199
|
+
if (!h) return;
|
|
200
|
+
const t = e.getBoundingClientRect(), n = h.getBoundingClientRect(), l = n.height || 40, r = n.width || 280, o = 10;
|
|
201
|
+
let a = t.top - l - o, i = t.left + t.width / 2 - r / 2;
|
|
202
|
+
a < o && (a = t.bottom + o), i < o && (i = o);
|
|
203
|
+
const s = window.innerWidth;
|
|
204
|
+
i + r > s - o && (i = s - r - o);
|
|
205
|
+
const d = window.innerHeight;
|
|
206
|
+
a + l > d - o && (a = d - l - o), h.style.top = a + "px", h.style.left = i + "px";
|
|
207
|
+
}
|
|
208
|
+
function U(e) {
|
|
209
|
+
m = e, h || (h = Z(), document.body.appendChild(h)), h.style.display = "flex", h.style.visibility = "hidden", requestAnimationFrame(() => {
|
|
210
|
+
E(e), h && (h.style.visibility = "visible");
|
|
211
|
+
});
|
|
212
|
+
const t = p();
|
|
213
|
+
t && D(t.rowCount > 1, t.cellCount > 1), Q(e);
|
|
214
|
+
}
|
|
215
|
+
function y() {
|
|
216
|
+
if (h && (h.style.display = "none"), m) {
|
|
217
|
+
m.querySelectorAll(".resize-handle").forEach((n) => n.remove());
|
|
218
|
+
const t = m.querySelector(".table-resize-handle");
|
|
219
|
+
t && t.remove();
|
|
220
|
+
}
|
|
221
|
+
m = null;
|
|
222
|
+
}
|
|
223
|
+
function D(e, t) {
|
|
224
|
+
if (!h) return;
|
|
225
|
+
const n = h.querySelector('[data-action="deleteRow"]'), l = h.querySelector('[data-action="deleteColumn"]');
|
|
226
|
+
n && (n.disabled = !e), l && (l.disabled = !t);
|
|
227
|
+
}
|
|
228
|
+
function Z() {
|
|
229
|
+
const e = document.createElement("div");
|
|
230
|
+
e.className = "table-toolbar", e.style.cssText = `
|
|
231
|
+
position: fixed;
|
|
232
|
+
z-index: 1000;
|
|
233
|
+
display: none;
|
|
234
|
+
`, e.setAttribute("role", "toolbar"), e.setAttribute("aria-label", "Table editing toolbar");
|
|
235
|
+
const t = (c) => {
|
|
236
|
+
const u = document.createElement("button");
|
|
237
|
+
return u.className = "toolbar-icon-btn", c.danger && u.classList.add("toolbar-icon-btn-danger"), c.delete && u.classList.add("toolbar-icon-btn-delete"), u.innerHTML = c.icon, u.title = c.title, u.setAttribute("aria-label", c.title), u.setAttribute("type", "button"), u.setAttribute("data-action", c.action), u.onclick = () => J(c.action), u;
|
|
238
|
+
}, n = () => {
|
|
239
|
+
const c = document.createElement("div");
|
|
240
|
+
return c.className = "toolbar-divider", c;
|
|
241
|
+
}, l = (...c) => {
|
|
242
|
+
const u = document.createElement("div");
|
|
243
|
+
return u.className = "toolbar-section", c.forEach((b) => u.appendChild(b)), u;
|
|
244
|
+
}, r = l(
|
|
245
|
+
t({
|
|
246
|
+
icon: te(),
|
|
247
|
+
title: "Add row above (Ctrl+Shift+R)",
|
|
248
|
+
action: "addRowAbove"
|
|
249
|
+
}),
|
|
250
|
+
t({
|
|
251
|
+
icon: ne(),
|
|
252
|
+
title: "Add row below",
|
|
253
|
+
action: "addRowBelow"
|
|
254
|
+
}),
|
|
255
|
+
t({
|
|
256
|
+
icon: oe(),
|
|
257
|
+
title: "Delete row",
|
|
258
|
+
action: "deleteRow",
|
|
259
|
+
danger: !0
|
|
260
|
+
})
|
|
261
|
+
), o = l(
|
|
262
|
+
t({
|
|
263
|
+
icon: le(),
|
|
264
|
+
title: "Add column left",
|
|
265
|
+
action: "addColumnLeft"
|
|
266
|
+
}),
|
|
267
|
+
t({
|
|
268
|
+
icon: re(),
|
|
269
|
+
title: "Add column right (Ctrl+Shift+C)",
|
|
270
|
+
action: "addColumnRight"
|
|
271
|
+
}),
|
|
272
|
+
t({
|
|
273
|
+
icon: ae(),
|
|
274
|
+
title: "Delete column",
|
|
275
|
+
action: "deleteColumn",
|
|
276
|
+
danger: !0
|
|
277
|
+
})
|
|
278
|
+
), a = l(
|
|
279
|
+
t({
|
|
280
|
+
icon: ie(),
|
|
281
|
+
title: "Toggle header row",
|
|
282
|
+
action: "toggleHeaderRow"
|
|
283
|
+
}),
|
|
284
|
+
t({
|
|
285
|
+
icon: se(),
|
|
286
|
+
title: "Toggle header column",
|
|
287
|
+
action: "toggleHeaderColumn"
|
|
288
|
+
})
|
|
289
|
+
), i = l(
|
|
290
|
+
t({
|
|
291
|
+
icon: ce(),
|
|
292
|
+
title: "Merge cells (horizontally)",
|
|
293
|
+
action: "mergeCells"
|
|
294
|
+
})
|
|
295
|
+
), s = l(
|
|
296
|
+
t({
|
|
297
|
+
icon: de(),
|
|
298
|
+
title: "Delete table",
|
|
299
|
+
action: "deleteTable",
|
|
300
|
+
delete: !0
|
|
301
|
+
})
|
|
302
|
+
);
|
|
303
|
+
e.appendChild(r), e.appendChild(n()), e.appendChild(o), e.appendChild(n()), e.appendChild(a), e.appendChild(n()), e.appendChild(i), e.appendChild(n()), e.appendChild(s);
|
|
304
|
+
const d = (c) => {
|
|
305
|
+
!h || h.style.display === "none" || (c.ctrlKey || c.metaKey) && c.shiftKey && (c.key === "r" || c.key === "R" ? (c.preventDefault(), H()) : (c.key === "c" || c.key === "C") && (c.preventDefault(), z()));
|
|
306
|
+
};
|
|
307
|
+
return window.addEventListener("keydown", d), e;
|
|
308
|
+
}
|
|
309
|
+
function J(e) {
|
|
310
|
+
switch (e) {
|
|
311
|
+
case "addRowAbove":
|
|
312
|
+
_();
|
|
313
|
+
break;
|
|
314
|
+
case "addRowBelow":
|
|
315
|
+
H();
|
|
316
|
+
break;
|
|
317
|
+
case "addColumnLeft":
|
|
318
|
+
P();
|
|
319
|
+
break;
|
|
320
|
+
case "addColumnRight":
|
|
321
|
+
z();
|
|
322
|
+
break;
|
|
323
|
+
case "deleteRow":
|
|
324
|
+
W();
|
|
325
|
+
break;
|
|
326
|
+
case "deleteColumn":
|
|
327
|
+
O();
|
|
328
|
+
break;
|
|
329
|
+
case "toggleHeaderRow":
|
|
330
|
+
K();
|
|
331
|
+
break;
|
|
332
|
+
case "toggleHeaderColumn":
|
|
333
|
+
Y();
|
|
334
|
+
break;
|
|
335
|
+
case "deleteTable":
|
|
336
|
+
F();
|
|
337
|
+
break;
|
|
338
|
+
case "mergeCells":
|
|
339
|
+
G();
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function Q(e) {
|
|
344
|
+
e.querySelectorAll(".resize-handle").forEach((a) => a.remove());
|
|
345
|
+
const n = e.querySelector(".table-resize-handle");
|
|
346
|
+
n && n.remove();
|
|
347
|
+
const l = e.querySelector("thead tr, tbody tr:first-child");
|
|
348
|
+
if (!l) return;
|
|
349
|
+
const r = l.querySelectorAll("td, th");
|
|
350
|
+
r.forEach((a, i) => {
|
|
351
|
+
if (i === r.length - 1) return;
|
|
352
|
+
const s = document.createElement("div");
|
|
353
|
+
s.className = "resize-handle", s.style.cssText = `
|
|
354
|
+
position: absolute;
|
|
355
|
+
right: -4px;
|
|
356
|
+
top: 0;
|
|
357
|
+
bottom: 0;
|
|
358
|
+
width: 8px;
|
|
359
|
+
background: transparent;
|
|
360
|
+
cursor: col-resize;
|
|
361
|
+
z-index: 10;
|
|
362
|
+
transition: background 0.15s ease;
|
|
363
|
+
`, s.addEventListener("mouseenter", () => {
|
|
364
|
+
w || (s.style.background = "rgba(0, 102, 204, 0.3)");
|
|
365
|
+
}), s.addEventListener("mouseleave", () => {
|
|
366
|
+
w || (s.style.background = "transparent");
|
|
367
|
+
}), s.addEventListener("mousedown", (d) => {
|
|
368
|
+
d.preventDefault(), d.stopPropagation(), $(d, i);
|
|
369
|
+
}), a.style.position = "relative", a.appendChild(s);
|
|
370
|
+
});
|
|
371
|
+
const o = document.createElement("div");
|
|
372
|
+
o.className = "table-resize-handle", o.addEventListener("mousedown", (a) => {
|
|
373
|
+
a.preventDefault(), a.stopPropagation(), ee(a);
|
|
374
|
+
}), e.appendChild(o);
|
|
375
|
+
}
|
|
376
|
+
function $(e, t) {
|
|
377
|
+
if (w = !0, v = t, S = e.clientX, !m) return;
|
|
378
|
+
const n = m.querySelector("thead tr, tbody tr:first-child");
|
|
379
|
+
n && n.cells[t] && (M = n.cells[t].offsetWidth), document.body.style.cursor = "col-resize", document.body.style.userSelect = "none";
|
|
380
|
+
const l = (o) => {
|
|
381
|
+
if (!w || v === null || !m) return;
|
|
382
|
+
const a = o.clientX - S, i = Math.max(50, M + a);
|
|
383
|
+
m.querySelectorAll("tr").forEach((d) => {
|
|
384
|
+
d.cells[v] && (d.cells[v].style.width = i + "px");
|
|
385
|
+
});
|
|
386
|
+
}, r = () => {
|
|
387
|
+
w = !1, v = null, document.body.style.cursor = "", document.body.style.userSelect = "", document.removeEventListener("mousemove", l), document.removeEventListener("mouseup", r);
|
|
388
|
+
};
|
|
389
|
+
document.addEventListener("mousemove", l), document.addEventListener("mouseup", r);
|
|
390
|
+
}
|
|
391
|
+
function ee(e) {
|
|
392
|
+
if (!m) return;
|
|
393
|
+
C = !0, L = e.clientX, k = e.clientY, A = m.offsetWidth, B = m.offsetHeight, document.body.style.cursor = "nwse-resize", document.body.style.userSelect = "none";
|
|
394
|
+
const t = (l) => {
|
|
395
|
+
if (!C || !m) return;
|
|
396
|
+
const r = l.clientX - L, o = l.clientY - k, a = Math.max(200, A + r), i = Math.max(100, B + o);
|
|
397
|
+
m.style.width = a + "px", m.style.height = i + "px";
|
|
398
|
+
}, n = () => {
|
|
399
|
+
C = !1, document.body.style.cursor = "", document.body.style.userSelect = "", document.removeEventListener("mousemove", t), document.removeEventListener("mouseup", n);
|
|
400
|
+
};
|
|
401
|
+
document.addEventListener("mousemove", t), document.addEventListener("mouseup", n);
|
|
402
|
+
}
|
|
403
|
+
function te() {
|
|
404
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
405
|
+
<path d="M2 7h12V5H2v2zm0 4h12V9H2v2zM8 1v3H5v2h3v3h2V6h3V4h-3V1H8z"/>
|
|
406
|
+
</svg>`;
|
|
407
|
+
}
|
|
408
|
+
function ne() {
|
|
409
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
410
|
+
<path d="M2 3h12V1H2v2zm0 4h12V5H2v2zm6 4v3h3v-2h2v-2h-2v-3h-2v3H5v2h3z"/>
|
|
411
|
+
</svg>`;
|
|
412
|
+
}
|
|
413
|
+
function oe() {
|
|
414
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
415
|
+
<path d="M2 5h12v2H2V5zm0 4h12v2H2V9zm4-6v2H4v2h2v2h2V7h2V5H8V3H6z"/>
|
|
416
|
+
</svg>`;
|
|
417
|
+
}
|
|
418
|
+
function le() {
|
|
419
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
420
|
+
<path d="M7 2v12h2V2H7zm4 0v12h2V2h-2zM1 8h3v-3H1v3zm3 2H1v3h3v-3z"/>
|
|
421
|
+
</svg>`;
|
|
422
|
+
}
|
|
423
|
+
function re() {
|
|
424
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
425
|
+
<path d="M2 2v12h2V2H2zm4 0v12h2V2H6zM12 8h3v-3h-3v3zm0 2h3v3h-3v-3z"/>
|
|
426
|
+
</svg>`;
|
|
427
|
+
}
|
|
428
|
+
function ae() {
|
|
429
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
430
|
+
<path d="M5 2v12h2V2H5zm4 0v12h2V2H9zm3 2h3V1h-3v3zm3 2h-3v3h3V6zm0 4h-3v3h3v-3z"/>
|
|
431
|
+
</svg>`;
|
|
432
|
+
}
|
|
433
|
+
function ie() {
|
|
434
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
435
|
+
<path d="M2 2h12v3H2V2zm0 5h12v8H2V7zm2 2v4h2V9H4zm4 0v4h2V9H8zm4 0v4h2V9h-2z"/>
|
|
436
|
+
</svg>`;
|
|
437
|
+
}
|
|
438
|
+
function se() {
|
|
439
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
440
|
+
<path d="M2 2v12h3V2H2zm5 0v12h8V2H7zm2 2h4v2H9V4zm0 4h4v2H9V8zm0 4h4v2H9v-2z"/>
|
|
441
|
+
</svg>`;
|
|
442
|
+
}
|
|
443
|
+
function de() {
|
|
444
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
445
|
+
<path d="M3 1h10v1H3V1zm1 2v11h8V3H4zM6 5h1v6H6V5zm3 0h1v6H9V5z"/>
|
|
446
|
+
</svg>`;
|
|
447
|
+
}
|
|
448
|
+
function ce() {
|
|
449
|
+
return `<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
|
450
|
+
<path d="M2 2h4v3H2V2zm5 0h4v3H7V2zm5 0h2v3h-2V2zm-10 4h4v3H2V6zm5 0h4v3H7V6zm5 0h2v3h-2V6zm-10 4h4v3H2v-3zm5 0h4v3H7v-3zm5 0h2v3h-2v-3z"/>
|
|
451
|
+
</svg>`;
|
|
452
|
+
}
|
|
453
|
+
if (typeof window != "undefined" && !window.__tablePluginInitialized) {
|
|
454
|
+
window.__tablePluginInitialized = !0;
|
|
455
|
+
const e = () => {
|
|
456
|
+
j();
|
|
457
|
+
};
|
|
458
|
+
document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", e) : setTimeout(e, 100);
|
|
459
|
+
}
|
|
460
|
+
const he = () => ({
|
|
461
|
+
name: "table",
|
|
462
|
+
toolbar: [
|
|
463
|
+
{
|
|
464
|
+
label: "Insert Table",
|
|
465
|
+
command: "insertTable",
|
|
466
|
+
icon: '<svg width="24px" height="24px" viewBox="0 0 24 24" fill="none" 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="M12 10V20M3 15L21 15M3 10H21M6.2 20H17.8C18.9201 20 19.4802 20 19.908 19.782C20.2843 19.5903 20.5903 19.2843 20.782 18.908C21 18.4802 21 17.9201 21 16.8V7.2C21 6.0799 21 5.51984 20.782 5.09202C20.5903 4.71569 20.2843 4.40973 19.908 4.21799C19.4802 4 18.9201 4 17.8 4H6.2C5.0799 4 4.51984 4 4.09202 4.21799C3.71569 4.40973 3.40973 4.71569 3.21799 5.09202C3 5.51984 3 6.07989 3 7.2V16.8C3 17.9201 3 18.4802 3.21799 18.908C3.40973 19.2843 3.71569 19.5903 4.09202 19.782C4.51984 20 5.07989 20 6.2 20Z" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> </g></svg>'
|
|
467
|
+
}
|
|
468
|
+
],
|
|
469
|
+
commands: {
|
|
470
|
+
insertTable: () => (X(), !0)
|
|
471
|
+
},
|
|
472
|
+
keymap: {
|
|
473
|
+
"Mod-Shift-r": () => (H(), !0),
|
|
474
|
+
"Mod-Shift-c": () => (z(), !0)
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
export {
|
|
478
|
+
he as TablePlugin,
|
|
479
|
+
P as addColumnLeftCommand,
|
|
480
|
+
z as addColumnRightCommand,
|
|
481
|
+
_ as addRowAboveCommand,
|
|
482
|
+
H as addRowBelowCommand,
|
|
483
|
+
O as deleteColumnCommand,
|
|
484
|
+
W as deleteRowCommand,
|
|
485
|
+
F as deleteTableCommand,
|
|
486
|
+
X as insertTableCommand,
|
|
487
|
+
G as mergeCellsCommand,
|
|
488
|
+
Y as toggleHeaderColumnCommand,
|
|
489
|
+
K as toggleHeaderRowCommand
|
|
490
|
+
};
|
|
491
|
+
//# sourceMappingURL=TablePlugin.native-EEWXn1-s.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TablePlugin.native-EEWXn1-s.mjs","sources":["../../plugins/table/src/TablePlugin.native.ts"],"sourcesContent":["import { Plugin } from '@editora/core';\nimport { findEditorContainerFromSelection, getContentElement } from '../../shared/editorContainerHelpers';\nimport './table.css';\n\n/**\n * Advanced Table Plugin - Native Implementation\n * \n * Exactly matches React version functionality:\n * - Direct table insertion (3x3 with thead/tbody) - NO DIALOG\n * - Floating contextual toolbar (appears when cursor in table)\n * - 10 table operations (rows, columns, headers, merge, delete)\n * - Column resizing with drag handles\n * - Table-level resizing\n * - Keyboard shortcuts (Ctrl+Shift+R, Ctrl+Shift+C)\n */\n\n// ============================================\n// MODULE-LEVEL STATE\n// ============================================\n\nlet toolbarElement: HTMLDivElement | null = null;\nlet currentTable: HTMLTableElement | null = null;\nlet selectionChangeHandler: (() => void) | null = null;\nlet mouseDownHandler: ((e: MouseEvent) => void) | null = null;\nlet tableDeletedHandler: (() => void) | null = null;\nlet scrollHandler: (() => void) | null = null;\nlet resizeHandler: (() => void) | null = null;\n\n// Column resizing state\nlet isResizing = false;\nlet resizeColumn: number | null = null;\nlet startX = 0;\nlet startWidth = 0;\n\n// Table resizing state\nlet isTableResizing = false;\nlet tableStartX = 0;\nlet tableStartY = 0;\nlet tableStartWidth = 0;\nlet tableStartHeight = 0;\n\ndeclare global {\n interface Window {\n __tablePluginInitialized?: boolean;\n }\n}\n\n// ============================================\n// TABLE INSERTION - Direct (NO DIALOG)\n// ============================================\n\nexport const insertTableCommand = () => {\n \n // Find editor container from current selection instead of activeElement\n const editorContainer = findEditorContainerFromSelection();\n \n const contentEl = getContentElement(editorContainer);\n \n if (!contentEl) {\n alert('Please place your cursor in the editor before inserting a table');\n return false;\n }\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n\n // Create table\n const table = document.createElement('table');\n table.className = 'rte-table';\n\n // ===== THEAD =====\n const thead = document.createElement('thead');\n const headerRow = document.createElement('tr');\n\n for (let i = 0; i < 3; i++) {\n const th = document.createElement('th');\n const p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n th.appendChild(p);\n headerRow.appendChild(th);\n }\n\n thead.appendChild(headerRow);\n\n // ===== TBODY =====\n const tbody = document.createElement('tbody');\n\n for (let rowIndex = 0; rowIndex < 2; rowIndex++) {\n const row = document.createElement('tr');\n\n for (let colIndex = 0; colIndex < 3; colIndex++) {\n const td = document.createElement('td');\n const p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n td.appendChild(p);\n row.appendChild(td);\n }\n\n tbody.appendChild(row);\n }\n\n table.appendChild(thead);\n table.appendChild(tbody);\n\n // Insert table\n range.deleteContents();\n range.insertNode(table);\n\n // Move cursor to first header cell paragraph\n const firstParagraph = table.querySelector('th p');\n if (firstParagraph) {\n const newRange = document.createRange();\n newRange.setStart(firstParagraph, 0);\n newRange.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n\n contentEl.focus();\n};\n\n// ============================================\n// TABLE OPERATIONS (10 COMMANDS)\n// ============================================\n\nexport const addRowAboveCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, rowIndex } = tableInfo;\n\n // Create new row with same number of cells\n const newRow = document.createElement('tr');\n const cellCount = table.rows[0]?.cells.length || 0;\n\n for (let i = 0; i < cellCount; i++) {\n const cell = document.createElement('td');\n const paragraph = document.createElement('p');\n paragraph.innerHTML = '<br>';\n cell.appendChild(paragraph);\n newRow.appendChild(cell);\n }\n\n // Find the correct tbody/thead element and insert row\n const currentRow = table.rows[rowIndex];\n if (currentRow && currentRow.parentElement) {\n currentRow.parentElement.insertBefore(newRow, currentRow);\n } else {\n table.appendChild(newRow);\n }\n \n updateTableInfo();\n};\n\nexport const addRowBelowCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, rowIndex } = tableInfo;\n\n // Create new row with same number of cells\n const newRow = document.createElement('tr');\n const cellCount = table.rows[0]?.cells.length || 0;\n\n for (let i = 0; i < cellCount; i++) {\n const cell = document.createElement('td');\n const paragraph = document.createElement('p');\n paragraph.innerHTML = '<br>';\n cell.appendChild(paragraph);\n newRow.appendChild(cell);\n }\n\n // Insert row after current position\n if (rowIndex >= table.rows.length - 1) {\n table.appendChild(newRow);\n } else {\n table.insertBefore(newRow, table.rows[rowIndex + 1]);\n }\n \n updateTableInfo();\n};\n\nexport const addColumnLeftCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, colIndex } = tableInfo;\n\n // Add cell to each row at specified column index\n for (let rowIndex = 0; rowIndex < table.rows.length; rowIndex++) {\n const row = table.rows[rowIndex];\n const cell = document.createElement('td');\n const paragraph = document.createElement('p');\n paragraph.innerHTML = '<br>';\n cell.appendChild(paragraph);\n\n if (colIndex === 0) {\n row.insertBefore(cell, row.cells[0]);\n } else {\n row.insertBefore(cell, row.cells[colIndex]);\n }\n }\n \n updateTableInfo();\n};\n\nexport const addColumnRightCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, colIndex } = tableInfo;\n\n // Add cell to each row after specified column index\n for (let rowIndex = 0; rowIndex < table.rows.length; rowIndex++) {\n const row = table.rows[rowIndex];\n const cell = document.createElement('td');\n const paragraph = document.createElement('p');\n paragraph.innerHTML = '<br>';\n cell.appendChild(paragraph);\n\n if (colIndex >= row.cells.length - 1) {\n row.appendChild(cell);\n } else {\n row.insertBefore(cell, row.cells[colIndex + 1]);\n }\n }\n \n updateTableInfo();\n};\n\nexport const deleteRowCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo || tableInfo.rowCount <= 1) return;\n\n const { table, rowIndex } = tableInfo;\n table.deleteRow(rowIndex);\n \n updateTableInfo();\n};\n\nexport const deleteColumnCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo || tableInfo.cellCount <= 1) return;\n\n const { table, colIndex } = tableInfo;\n\n // Delete cell from each row at specified column index\n for (let rowIndex = 0; rowIndex < table.rows.length; rowIndex++) {\n const row = table.rows[rowIndex];\n if (row.cells[colIndex]) {\n row.deleteCell(colIndex);\n }\n }\n \n updateTableInfo();\n};\n\nexport const toggleHeaderRowCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, rowIndex } = tableInfo;\n const targetRow = table.rows[rowIndex];\n\n const isCurrentlyHeader = targetRow.parentElement?.tagName.toLowerCase() === 'thead';\n\n if (isCurrentlyHeader) {\n const tbody = table.querySelector('tbody') || table.appendChild(document.createElement('tbody'));\n const thead = table.querySelector('thead');\n if (thead) {\n tbody.insertBefore(targetRow, tbody.firstChild);\n if (thead.rows.length === 0) {\n thead.remove();\n }\n }\n } else {\n let thead = table.querySelector('thead');\n if (!thead) {\n thead = document.createElement('thead');\n table.insertBefore(thead, table.firstChild);\n }\n thead.appendChild(targetRow);\n }\n \n updateTableInfo();\n};\n\nexport const toggleHeaderColumnCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const { table, colIndex } = tableInfo;\n\n for (let rowIndex = 0; rowIndex < table.rows.length; rowIndex++) {\n const cell = table.rows[rowIndex].cells[colIndex];\n if (cell) {\n const newTag = cell.tagName.toLowerCase() === 'th' ? 'td' : 'th';\n const newCell = document.createElement(newTag);\n newCell.innerHTML = cell.innerHTML;\n\n for (let i = 0; i < cell.attributes.length; i++) {\n const attr = cell.attributes[i];\n newCell.setAttribute(attr.name, attr.value);\n }\n\n cell.parentNode?.replaceChild(newCell, cell);\n }\n }\n \n updateTableInfo();\n};\n\nexport const deleteTableCommand = () => {\n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n\n const table = tableInfo.table;\n table.remove();\n\n // Trigger toolbar hide event\n document.dispatchEvent(new CustomEvent('tableDeleted'));\n};\n\nexport const mergeCellsCommand = () => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const startContainer = range.startContainer;\n\n let tableElement = startContainer.nodeType === Node.TEXT_NODE\n ? startContainer.parentElement?.closest('table')\n : (startContainer as Element).closest('table');\n\n if (!tableElement) return;\n\n const table = tableElement as HTMLTableElement;\n\n let firstCell: HTMLTableCellElement | null = null;\n if (startContainer.nodeType === Node.TEXT_NODE) {\n firstCell = startContainer.parentElement?.closest('td, th') as HTMLTableCellElement;\n } else if (startContainer.nodeType === Node.ELEMENT_NODE) {\n firstCell = (startContainer as Element).closest('td, th') as HTMLTableCellElement;\n }\n\n if (!firstCell) return;\n\n const firstRow = firstCell.parentElement as HTMLTableRowElement;\n if (!firstRow) return;\n\n let cellIndex = -1;\n for (let i = 0; i < firstRow.cells.length; i++) {\n if (firstRow.cells[i] === firstCell) {\n cellIndex = i;\n break;\n }\n }\n\n if (cellIndex === -1 || cellIndex === firstRow.cells.length - 1) return;\n\n const secondCell = firstRow.cells[cellIndex + 1];\n if (!secondCell) return;\n\n const colspan1 = parseInt(firstCell.getAttribute('colspan') || '1');\n const colspan2 = parseInt(secondCell.getAttribute('colspan') || '1');\n firstCell.setAttribute('colspan', String(colspan1 + colspan2));\n\n const secondCellContent = Array.from(secondCell.childNodes);\n secondCellContent.forEach(node => {\n firstCell.appendChild(node);\n });\n\n secondCell.remove();\n \n updateTableInfo();\n};\n\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n\ninterface TableDOMInfo {\n table: HTMLTableElement;\n rowIndex: number;\n colIndex: number;\n rowCount: number;\n cellCount: number;\n}\n\nfunction getTableInfoFromDOM(): TableDOMInfo | null {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n const startContainer = range.startContainer;\n\n let tableElement = startContainer.nodeType === Node.TEXT_NODE\n ? startContainer.parentElement?.closest('table')\n : (startContainer as Element).closest('table');\n\n if (!tableElement) return null;\n\n const table = tableElement as HTMLTableElement;\n\n let rowIndex = 0;\n let colIndex = 0;\n\n const cellElement = startContainer.nodeType === Node.TEXT_NODE\n ? startContainer.parentElement?.closest('td, th')\n : (startContainer as Element).closest('td, th');\n\n if (cellElement) {\n let currentRow = cellElement.parentElement as HTMLTableRowElement;\n while (currentRow && currentRow !== table.rows[rowIndex]) {\n rowIndex++;\n if (rowIndex >= table.rows.length) break;\n }\n\n const row = currentRow;\n if (row) {\n for (let i = 0; i < row.cells.length; i++) {\n if (row.cells[i] === cellElement) {\n colIndex = i;\n break;\n }\n }\n }\n }\n\n return {\n table,\n rowIndex,\n colIndex,\n rowCount: table.rows.length,\n cellCount: table.rows[0]?.cells.length || 0\n };\n}\n\nfunction updateTableInfo(): void {\n if (!toolbarElement || !currentTable) return;\n \n const tableInfo = getTableInfoFromDOM();\n if (!tableInfo) return;\n \n const canDeleteRow = tableInfo.rowCount > 1;\n const canDeleteColumn = tableInfo.cellCount > 1;\n \n updateToolbarButtonStates(canDeleteRow, canDeleteColumn);\n}\n\n// ============================================\n// FLOATING TOOLBAR MANAGEMENT\n// ============================================\n\nfunction initTableToolbar(): void {\n selectionChangeHandler = () => {\n const tableInfo = getTableInfoFromDOM();\n if (tableInfo) {\n showTableToolbar(tableInfo.table);\n } else {\n hideTableToolbar();\n }\n };\n\n mouseDownHandler = (e: MouseEvent) => {\n const target = e.target as Element;\n const isInsideTable = target.closest('table');\n const isInsideToolbar = target.closest('.table-toolbar');\n\n if (!isInsideTable && !isInsideToolbar) {\n hideTableToolbar();\n }\n };\n\n tableDeletedHandler = () => {\n hideTableToolbar();\n };\n\n scrollHandler = () => {\n if (currentTable && toolbarElement && toolbarElement.style.display !== 'none') {\n updateToolbarPosition(currentTable);\n }\n };\n\n resizeHandler = () => {\n if (currentTable && toolbarElement && toolbarElement.style.display !== 'none') {\n updateToolbarPosition(currentTable);\n }\n };\n\n document.addEventListener('selectionchange', selectionChangeHandler);\n document.addEventListener('mousedown', mouseDownHandler);\n document.addEventListener('tableDeleted', tableDeletedHandler as EventListener);\n window.addEventListener('scroll', scrollHandler, true); // Use capture to catch all scroll events\n window.addEventListener('resize', resizeHandler);\n}\n\nfunction cleanupTableToolbar(): void {\n if (selectionChangeHandler) {\n document.removeEventListener('selectionchange', selectionChangeHandler);\n }\n if (mouseDownHandler) {\n document.removeEventListener('mousedown', mouseDownHandler);\n }\n if (tableDeletedHandler) {\n document.removeEventListener('tableDeleted', tableDeletedHandler as EventListener);\n }\n if (scrollHandler) {\n window.removeEventListener('scroll', scrollHandler, true);\n }\n if (resizeHandler) {\n window.removeEventListener('resize', resizeHandler);\n }\n \n hideTableToolbar();\n}\n\nfunction updateToolbarPosition(table: HTMLTableElement): void {\n if (!toolbarElement) return;\n\n const rect = table.getBoundingClientRect();\n const toolbarRect = toolbarElement.getBoundingClientRect();\n const toolbarHeight = toolbarRect.height || 40;\n const toolbarWidth = toolbarRect.width || 280;\n const padding = 10;\n\n // Smart viewport collision detection\n let top = rect.top - toolbarHeight - padding;\n let left = rect.left + (rect.width / 2) - (toolbarWidth / 2);\n\n // Adjust if off-screen (top) - show below if no room above\n if (top < padding) {\n top = rect.bottom + padding;\n }\n\n // Adjust if off-screen (left)\n if (left < padding) {\n left = padding;\n }\n\n // Adjust if off-screen (right)\n const viewportWidth = window.innerWidth;\n if (left + toolbarWidth > viewportWidth - padding) {\n left = viewportWidth - toolbarWidth - padding;\n }\n\n // Adjust if off-screen (bottom)\n const viewportHeight = window.innerHeight;\n if (top + toolbarHeight > viewportHeight - padding) {\n top = viewportHeight - toolbarHeight - padding;\n }\n\n toolbarElement.style.top = top + 'px';\n toolbarElement.style.left = left + 'px';\n}\n\nfunction showTableToolbar(table: HTMLTableElement): void {\n currentTable = table;\n\n if (!toolbarElement) {\n toolbarElement = createTableToolbar();\n document.body.appendChild(toolbarElement);\n }\n\n // Make toolbar visible temporarily to measure its dimensions\n toolbarElement.style.display = 'flex';\n toolbarElement.style.visibility = 'hidden';\n \n // Small delay to ensure toolbar is rendered\n requestAnimationFrame(() => {\n updateToolbarPosition(table);\n if (toolbarElement) {\n toolbarElement.style.visibility = 'visible';\n }\n });\n\n // Update button states\n const tableInfo = getTableInfoFromDOM();\n if (tableInfo) {\n updateToolbarButtonStates(tableInfo.rowCount > 1, tableInfo.cellCount > 1);\n }\n\n // Attach resize handles\n attachResizeHandles(table);\n}\n\nfunction hideTableToolbar(): void {\n if (toolbarElement) {\n toolbarElement.style.display = 'none';\n }\n \n // Remove resize handles\n if (currentTable) {\n const handles = currentTable.querySelectorAll('.resize-handle');\n handles.forEach(handle => handle.remove());\n \n const tableResizeHandle = currentTable.querySelector('.table-resize-handle');\n if (tableResizeHandle) {\n tableResizeHandle.remove();\n }\n }\n \n currentTable = null;\n}\n\nfunction updateToolbarButtonStates(canDeleteRow: boolean, canDeleteColumn: boolean): void {\n if (!toolbarElement) return;\n \n const deleteRowBtn = toolbarElement.querySelector('[data-action=\"deleteRow\"]') as HTMLButtonElement;\n const deleteColBtn = toolbarElement.querySelector('[data-action=\"deleteColumn\"]') as HTMLButtonElement;\n \n if (deleteRowBtn) deleteRowBtn.disabled = !canDeleteRow;\n if (deleteColBtn) deleteColBtn.disabled = !canDeleteColumn;\n}\n\nfunction createTableToolbar(): HTMLDivElement {\n const toolbar = document.createElement('div');\n toolbar.className = 'table-toolbar';\n toolbar.style.cssText = `\n position: fixed;\n z-index: 1000;\n display: none;\n `;\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', 'Table editing toolbar');\n\n // Helper function to create icon button\n const createButton = (config: {\n icon: string;\n title: string;\n action: string;\n danger?: boolean;\n delete?: boolean;\n }) => {\n const btn = document.createElement('button');\n btn.className = 'toolbar-icon-btn';\n if (config.danger) btn.classList.add('toolbar-icon-btn-danger');\n if (config.delete) btn.classList.add('toolbar-icon-btn-delete');\n btn.innerHTML = config.icon;\n btn.title = config.title;\n btn.setAttribute('aria-label', config.title);\n btn.setAttribute('type', 'button');\n btn.setAttribute('data-action', config.action);\n btn.onclick = () => executeTableCommand(config.action);\n return btn;\n };\n\n const createDivider = () => {\n const divider = document.createElement('div');\n divider.className = 'toolbar-divider';\n return divider;\n };\n\n const createSection = (...buttons: HTMLButtonElement[]) => {\n const section = document.createElement('div');\n section.className = 'toolbar-section';\n buttons.forEach(btn => section.appendChild(btn));\n return section;\n };\n\n // Row operations section\n const rowSection = createSection(\n createButton({\n icon: getIconAddRowAbove(),\n title: 'Add row above (Ctrl+Shift+R)',\n action: 'addRowAbove'\n }),\n createButton({\n icon: getIconAddRowBelow(),\n title: 'Add row below',\n action: 'addRowBelow'\n }),\n createButton({\n icon: getIconDeleteRow(),\n title: 'Delete row',\n action: 'deleteRow',\n danger: true\n })\n );\n\n // Column operations section\n const colSection = createSection(\n createButton({\n icon: getIconAddColumnLeft(),\n title: 'Add column left',\n action: 'addColumnLeft'\n }),\n createButton({\n icon: getIconAddColumnRight(),\n title: 'Add column right (Ctrl+Shift+C)',\n action: 'addColumnRight'\n }),\n createButton({\n icon: getIconDeleteColumn(),\n title: 'Delete column',\n action: 'deleteColumn',\n danger: true\n })\n );\n\n // Header operations section\n const headerSection = createSection(\n createButton({\n icon: getIconToggleHeaderRow(),\n title: 'Toggle header row',\n action: 'toggleHeaderRow'\n }),\n createButton({\n icon: getIconToggleHeaderColumn(),\n title: 'Toggle header column',\n action: 'toggleHeaderColumn'\n })\n );\n\n // Merge section\n const mergeSection = createSection(\n createButton({\n icon: getIconMergeCells(),\n title: 'Merge cells (horizontally)',\n action: 'mergeCells'\n })\n );\n\n // Delete table section\n const deleteSection = createSection(\n createButton({\n icon: getIconDeleteTable(),\n title: 'Delete table',\n action: 'deleteTable',\n delete: true\n })\n );\n\n // Assemble toolbar with dividers\n toolbar.appendChild(rowSection);\n toolbar.appendChild(createDivider());\n toolbar.appendChild(colSection);\n toolbar.appendChild(createDivider());\n toolbar.appendChild(headerSection);\n toolbar.appendChild(createDivider());\n toolbar.appendChild(mergeSection);\n toolbar.appendChild(createDivider());\n toolbar.appendChild(deleteSection);\n\n // Add keyboard shortcuts\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!toolbarElement || toolbarElement.style.display === 'none') return;\n \n if ((e.ctrlKey || e.metaKey) && e.shiftKey) {\n if (e.key === 'r' || e.key === 'R') {\n e.preventDefault();\n addRowBelowCommand();\n } else if (e.key === 'c' || e.key === 'C') {\n e.preventDefault();\n addColumnRightCommand();\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return toolbar;\n}\n\nfunction executeTableCommand(action: string): void {\n switch (action) {\n case 'addRowAbove': addRowAboveCommand(); break;\n case 'addRowBelow': addRowBelowCommand(); break;\n case 'addColumnLeft': addColumnLeftCommand(); break;\n case 'addColumnRight': addColumnRightCommand(); break;\n case 'deleteRow': deleteRowCommand(); break;\n case 'deleteColumn': deleteColumnCommand(); break;\n case 'toggleHeaderRow': toggleHeaderRowCommand(); break;\n case 'toggleHeaderColumn': toggleHeaderColumnCommand(); break;\n case 'deleteTable': deleteTableCommand(); break;\n case 'mergeCells': mergeCellsCommand(); break;\n }\n}\n\n// ============================================\n// COLUMN & TABLE RESIZING\n// ============================================\n\nfunction attachResizeHandles(table: HTMLTableElement): void {\n // Remove existing handles first\n const existingHandles = table.querySelectorAll('.resize-handle');\n existingHandles.forEach(handle => handle.remove());\n \n const existingTableHandle = table.querySelector('.table-resize-handle');\n if (existingTableHandle) existingTableHandle.remove();\n\n const headerRow = table.querySelector('thead tr, tbody tr:first-child') as HTMLTableRowElement;\n if (!headerRow) return;\n\n const cells = headerRow.querySelectorAll('td, th');\n\n // Add column resize handles (skip last column)\n cells.forEach((cell, index) => {\n if (index === cells.length - 1) return;\n\n const handle = document.createElement('div');\n handle.className = 'resize-handle';\n handle.style.cssText = `\n position: absolute;\n right: -4px;\n top: 0;\n bottom: 0;\n width: 8px;\n background: transparent;\n cursor: col-resize;\n z-index: 10;\n transition: background 0.15s ease;\n `;\n\n handle.addEventListener('mouseenter', () => {\n if (!isResizing) {\n handle.style.background = 'rgba(0, 102, 204, 0.3)';\n }\n });\n\n handle.addEventListener('mouseleave', () => {\n if (!isResizing) {\n handle.style.background = 'transparent';\n }\n });\n\n handle.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n startColumnResize(e as MouseEvent, index);\n });\n\n (cell as HTMLElement).style.position = 'relative';\n cell.appendChild(handle);\n });\n\n // Add table-level resize handle\n const tableResizeHandle = document.createElement('div');\n tableResizeHandle.className = 'table-resize-handle';\n tableResizeHandle.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n startTableResize(e as MouseEvent);\n });\n table.appendChild(tableResizeHandle);\n}\n\nfunction startColumnResize(e: MouseEvent, columnIndex: number): void {\n isResizing = true;\n resizeColumn = columnIndex;\n startX = e.clientX;\n\n if (!currentTable) return;\n\n const headerRow = currentTable.querySelector('thead tr, tbody tr:first-child') as HTMLTableRowElement;\n if (headerRow && headerRow.cells[columnIndex]) {\n startWidth = (headerRow.cells[columnIndex] as HTMLElement).offsetWidth;\n }\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || resizeColumn === null || !currentTable) return;\n\n const deltaX = e.clientX - startX;\n const newWidth = Math.max(50, startWidth + deltaX);\n\n // Set width for all cells in this column\n const allRows = currentTable.querySelectorAll('tr') as NodeListOf<HTMLTableRowElement>;\n allRows.forEach(row => {\n if (row.cells[resizeColumn!]) {\n (row.cells[resizeColumn!] as HTMLElement).style.width = newWidth + 'px';\n }\n });\n };\n\n const handleMouseUp = () => {\n isResizing = false;\n resizeColumn = null;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n}\n\nfunction startTableResize(e: MouseEvent): void {\n if (!currentTable) return;\n\n isTableResizing = true;\n tableStartX = e.clientX;\n tableStartY = e.clientY;\n tableStartWidth = currentTable.offsetWidth;\n tableStartHeight = currentTable.offsetHeight;\n\n document.body.style.cursor = 'nwse-resize';\n document.body.style.userSelect = 'none';\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isTableResizing || !currentTable) return;\n\n const deltaX = e.clientX - tableStartX;\n const deltaY = e.clientY - tableStartY;\n const newWidth = Math.max(200, tableStartWidth + deltaX);\n const newHeight = Math.max(100, tableStartHeight + deltaY);\n\n currentTable.style.width = newWidth + 'px';\n currentTable.style.height = newHeight + 'px';\n };\n\n const handleMouseUp = () => {\n isTableResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n}\n\n// ============================================\n// SVG ICONS (matching React version exactly)\n// ============================================\n\nfunction getIconAddRowAbove(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 7h12V5H2v2zm0 4h12V9H2v2zM8 1v3H5v2h3v3h2V6h3V4h-3V1H8z\"/>\n </svg>`;\n}\n\nfunction getIconAddRowBelow(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 3h12V1H2v2zm0 4h12V5H2v2zm6 4v3h3v-2h2v-2h-2v-3h-2v3H5v2h3z\"/>\n </svg>`;\n}\n\nfunction getIconDeleteRow(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 5h12v2H2V5zm0 4h12v2H2V9zm4-6v2H4v2h2v2h2V7h2V5H8V3H6z\"/>\n </svg>`;\n}\n\nfunction getIconAddColumnLeft(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M7 2v12h2V2H7zm4 0v12h2V2h-2zM1 8h3v-3H1v3zm3 2H1v3h3v-3z\"/>\n </svg>`;\n}\n\nfunction getIconAddColumnRight(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2v12h2V2H2zm4 0v12h2V2H6zM12 8h3v-3h-3v3zm0 2h3v3h-3v-3z\"/>\n </svg>`;\n}\n\nfunction getIconDeleteColumn(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M5 2v12h2V2H5zm4 0v12h2V2H9zm3 2h3V1h-3v3zm3 2h-3v3h3V6zm0 4h-3v3h3v-3z\"/>\n </svg>`;\n}\n\nfunction getIconToggleHeaderRow(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2h12v3H2V2zm0 5h12v8H2V7zm2 2v4h2V9H4zm4 0v4h2V9H8zm4 0v4h2V9h-2z\"/>\n </svg>`;\n}\n\nfunction getIconToggleHeaderColumn(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2v12h3V2H2zm5 0v12h8V2H7zm2 2h4v2H9V4zm0 4h4v2H9V8zm0 4h4v2H9v-2z\"/>\n </svg>`;\n}\n\nfunction getIconDeleteTable(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M3 1h10v1H3V1zm1 2v11h8V3H4zM6 5h1v6H6V5zm3 0h1v6H9V5z\"/>\n </svg>`;\n}\n\nfunction getIconMergeCells(): string {\n return `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2h4v3H2V2zm5 0h4v3H7V2zm5 0h2v3h-2V2zm-10 4h4v3H2V6zm5 0h4v3H7V6zm5 0h2v3h-2V6zm-10 4h4v3H2v-3zm5 0h4v3H7v-3zm5 0h2v3h-2v-3z\"/>\n </svg>`;\n}\n\n// ============================================\n// MODULE-LEVEL INITIALIZATION\n// ============================================\n\n// Initialize table toolbar monitoring\nif (typeof window !== 'undefined' && !window.__tablePluginInitialized) {\n window.__tablePluginInitialized = true;\n\n const initTablePlugin = () => {\n initTableToolbar();\n };\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initTablePlugin);\n } else {\n // If DOM is already ready, init immediately\n setTimeout(initTablePlugin, 100);\n }\n}\n\n// ============================================\n// PLUGIN DEFINITION\n// ============================================\n\nexport const TablePlugin = (): Plugin => ({\n name: \"table\",\n\n toolbar: [\n {\n label: \"Insert Table\",\n command: \"insertTable\",\n icon: '<svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" fill=\"none\" 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=\"M12 10V20M3 15L21 15M3 10H21M6.2 20H17.8C18.9201 20 19.4802 20 19.908 19.782C20.2843 19.5903 20.5903 19.2843 20.782 18.908C21 18.4802 21 17.9201 21 16.8V7.2C21 6.0799 21 5.51984 20.782 5.09202C20.5903 4.71569 20.2843 4.40973 19.908 4.21799C19.4802 4 18.9201 4 17.8 4H6.2C5.0799 4 4.51984 4 4.09202 4.21799C3.71569 4.40973 3.40973 4.71569 3.21799 5.09202C3 5.51984 3 6.07989 3 7.2V16.8C3 17.9201 3 18.4802 3.21799 18.908C3.40973 19.2843 3.71569 19.5903 4.09202 19.782C4.51984 20 5.07989 20 6.2 20Z\" stroke=\"#000000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path> </g></svg>',\n },\n ],\n\n commands: {\n insertTable: () => {\n insertTableCommand();\n return true;\n },\n },\n\n keymap: {\n \"Mod-Shift-r\": () => {\n addRowBelowCommand();\n return true;\n },\n \"Mod-Shift-c\": () => {\n addColumnRightCommand();\n return true;\n },\n },\n});\n"],"names":["toolbarElement","currentTable","selectionChangeHandler","mouseDownHandler","tableDeletedHandler","scrollHandler","resizeHandler","isResizing","resizeColumn","startX","startWidth","isTableResizing","tableStartX","tableStartY","tableStartWidth","tableStartHeight","insertTableCommand","editorContainer","findEditorContainerFromSelection","contentEl","getContentElement","selection","range","table","thead","headerRow","i","th","p","tbody","rowIndex","row","colIndex","td","firstParagraph","newRange","addRowAboveCommand","tableInfo","getTableInfoFromDOM","newRow","cellCount","_a","cell","paragraph","currentRow","updateTableInfo","addRowBelowCommand","addColumnLeftCommand","addColumnRightCommand","deleteRowCommand","deleteColumnCommand","toggleHeaderRowCommand","targetRow","toggleHeaderColumnCommand","newTag","newCell","attr","deleteTableCommand","mergeCellsCommand","startContainer","firstCell","_b","firstRow","cellIndex","secondCell","colspan1","colspan2","node","tableElement","cellElement","_c","canDeleteRow","canDeleteColumn","updateToolbarButtonStates","initTableToolbar","showTableToolbar","hideTableToolbar","target","isInsideTable","isInsideToolbar","updateToolbarPosition","rect","toolbarRect","toolbarHeight","toolbarWidth","padding","top","left","viewportWidth","viewportHeight","createTableToolbar","attachResizeHandles","handle","tableResizeHandle","deleteRowBtn","deleteColBtn","toolbar","createButton","config","btn","executeTableCommand","createDivider","divider","createSection","buttons","section","rowSection","getIconAddRowAbove","getIconAddRowBelow","getIconDeleteRow","colSection","getIconAddColumnLeft","getIconAddColumnRight","getIconDeleteColumn","headerSection","getIconToggleHeaderRow","getIconToggleHeaderColumn","mergeSection","getIconMergeCells","deleteSection","getIconDeleteTable","handleKeyDown","e","action","existingTableHandle","cells","index","startColumnResize","startTableResize","columnIndex","handleMouseMove","deltaX","newWidth","handleMouseUp","deltaY","newHeight","initTablePlugin","TablePlugin"],"mappings":"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"}
|