@primeui/texteditor-core 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +1 -0
  3. package/dist/chunk-22B454VC.mjs +83 -0
  4. package/dist/chunk-22B454VC.mjs.map +1 -0
  5. package/dist/chunk-3RKMABZR.mjs +320 -0
  6. package/dist/chunk-3RKMABZR.mjs.map +1 -0
  7. package/dist/chunk-6GY64GPU.mjs +18 -0
  8. package/dist/chunk-6GY64GPU.mjs.map +1 -0
  9. package/dist/chunk-6YDCG63C.mjs +833 -0
  10. package/dist/chunk-6YDCG63C.mjs.map +1 -0
  11. package/dist/chunk-6ZN5XRH2.mjs +45 -0
  12. package/dist/chunk-6ZN5XRH2.mjs.map +1 -0
  13. package/dist/chunk-72T5I4O4.mjs +76 -0
  14. package/dist/chunk-72T5I4O4.mjs.map +1 -0
  15. package/dist/chunk-7QCHSEN2.mjs +16 -0
  16. package/dist/chunk-7QCHSEN2.mjs.map +1 -0
  17. package/dist/chunk-AJOKUIQD.mjs +33 -0
  18. package/dist/chunk-AJOKUIQD.mjs.map +1 -0
  19. package/dist/chunk-AUTGNC2Q.mjs +197 -0
  20. package/dist/chunk-AUTGNC2Q.mjs.map +1 -0
  21. package/dist/chunk-CRAB2MFE.mjs +19 -0
  22. package/dist/chunk-CRAB2MFE.mjs.map +1 -0
  23. package/dist/chunk-DXPG5XMX.mjs +18 -0
  24. package/dist/chunk-DXPG5XMX.mjs.map +1 -0
  25. package/dist/chunk-E2KXUP3F.mjs +9 -0
  26. package/dist/chunk-E2KXUP3F.mjs.map +1 -0
  27. package/dist/chunk-EA2YI7LA.mjs +23 -0
  28. package/dist/chunk-EA2YI7LA.mjs.map +1 -0
  29. package/dist/chunk-F7BJWPT6.mjs +401 -0
  30. package/dist/chunk-F7BJWPT6.mjs.map +1 -0
  31. package/dist/chunk-FFCQLWS5.mjs +32 -0
  32. package/dist/chunk-FFCQLWS5.mjs.map +1 -0
  33. package/dist/chunk-GG56GLXC.mjs +42 -0
  34. package/dist/chunk-GG56GLXC.mjs.map +1 -0
  35. package/dist/chunk-GGPBV4BM.mjs +37 -0
  36. package/dist/chunk-GGPBV4BM.mjs.map +1 -0
  37. package/dist/chunk-H3RFOYCT.mjs +27 -0
  38. package/dist/chunk-H3RFOYCT.mjs.map +1 -0
  39. package/dist/chunk-IUQKSDKG.mjs +23 -0
  40. package/dist/chunk-IUQKSDKG.mjs.map +1 -0
  41. package/dist/chunk-J5LGTIGS.mjs +9 -0
  42. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  43. package/dist/chunk-KNZAMA6H.mjs +198 -0
  44. package/dist/chunk-KNZAMA6H.mjs.map +1 -0
  45. package/dist/chunk-MNKMKFLQ.mjs +27 -0
  46. package/dist/chunk-MNKMKFLQ.mjs.map +1 -0
  47. package/dist/chunk-MWT5PK3Z.mjs +52 -0
  48. package/dist/chunk-MWT5PK3Z.mjs.map +1 -0
  49. package/dist/chunk-NWRVBNBW.mjs +65 -0
  50. package/dist/chunk-NWRVBNBW.mjs.map +1 -0
  51. package/dist/chunk-OGEMGWLR.mjs +180 -0
  52. package/dist/chunk-OGEMGWLR.mjs.map +1 -0
  53. package/dist/chunk-PRFYR67X.mjs +60 -0
  54. package/dist/chunk-PRFYR67X.mjs.map +1 -0
  55. package/dist/chunk-PT2O4RV7.mjs +143 -0
  56. package/dist/chunk-PT2O4RV7.mjs.map +1 -0
  57. package/dist/chunk-PT5V6UYE.mjs +10 -0
  58. package/dist/chunk-PT5V6UYE.mjs.map +1 -0
  59. package/dist/chunk-RH45QRSV.mjs +26 -0
  60. package/dist/chunk-RH45QRSV.mjs.map +1 -0
  61. package/dist/chunk-RQ2HHNI6.mjs +55 -0
  62. package/dist/chunk-RQ2HHNI6.mjs.map +1 -0
  63. package/dist/chunk-TB7ZSSR2.mjs +6 -0
  64. package/dist/chunk-TB7ZSSR2.mjs.map +1 -0
  65. package/dist/chunk-TBQVZVKA.mjs +1891 -0
  66. package/dist/chunk-TBQVZVKA.mjs.map +1 -0
  67. package/dist/chunk-VWGQMUPD.mjs +182 -0
  68. package/dist/chunk-VWGQMUPD.mjs.map +1 -0
  69. package/dist/chunk-XKY2VYPW.mjs +26 -0
  70. package/dist/chunk-XKY2VYPW.mjs.map +1 -0
  71. package/dist/chunk-XSVIGDQR.mjs +22 -0
  72. package/dist/chunk-XSVIGDQR.mjs.map +1 -0
  73. package/dist/chunk-YHMP6AN3.mjs +231 -0
  74. package/dist/chunk-YHMP6AN3.mjs.map +1 -0
  75. package/dist/commands/index.d.mts +13 -0
  76. package/dist/commands/index.mjs +13 -0
  77. package/dist/commands/index.mjs.map +1 -0
  78. package/dist/createTextEditor.d.mts +7 -0
  79. package/dist/createTextEditor.mjs +31 -0
  80. package/dist/createTextEditor.mjs.map +1 -0
  81. package/dist/index.d.mts +17 -0
  82. package/dist/index.mjs +45 -0
  83. package/dist/index.mjs.map +1 -0
  84. package/dist/plugins/columnWidthPin.d.mts +5 -0
  85. package/dist/plugins/columnWidthPin.mjs +4 -0
  86. package/dist/plugins/columnWidthPin.mjs.map +1 -0
  87. package/dist/plugins/contextToolbar.d.mts +9 -0
  88. package/dist/plugins/contextToolbar.mjs +5 -0
  89. package/dist/plugins/contextToolbar.mjs.map +1 -0
  90. package/dist/plugins/defineTextEditorPlugin.d.mts +20 -0
  91. package/dist/plugins/defineTextEditorPlugin.mjs +4 -0
  92. package/dist/plugins/defineTextEditorPlugin.mjs.map +1 -0
  93. package/dist/plugins/inputRules.d.mts +14 -0
  94. package/dist/plugins/inputRules.mjs +8 -0
  95. package/dist/plugins/inputRules.mjs.map +1 -0
  96. package/dist/plugins/keymap.d.mts +16 -0
  97. package/dist/plugins/keymap.mjs +6 -0
  98. package/dist/plugins/keymap.mjs.map +1 -0
  99. package/dist/plugins/mention.d.mts +24 -0
  100. package/dist/plugins/mention.mjs +5 -0
  101. package/dist/plugins/mention.mjs.map +1 -0
  102. package/dist/plugins/mentionController.d.mts +16 -0
  103. package/dist/plugins/mentionController.mjs +4 -0
  104. package/dist/plugins/mentionController.mjs.map +1 -0
  105. package/dist/plugins/placeholder.d.mts +9 -0
  106. package/dist/plugins/placeholder.mjs +5 -0
  107. package/dist/plugins/placeholder.mjs.map +1 -0
  108. package/dist/plugins/registry.d.mts +7 -0
  109. package/dist/plugins/registry.mjs +4 -0
  110. package/dist/plugins/registry.mjs.map +1 -0
  111. package/dist/plugins/selectionHighlight.d.mts +14 -0
  112. package/dist/plugins/selectionHighlight.mjs +5 -0
  113. package/dist/plugins/selectionHighlight.mjs.map +1 -0
  114. package/dist/plugins/slashCommands.d.mts +28 -0
  115. package/dist/plugins/slashCommands.mjs +5 -0
  116. package/dist/plugins/slashCommands.mjs.map +1 -0
  117. package/dist/plugins/tableOverlay.d.mts +15 -0
  118. package/dist/plugins/tableOverlay.mjs +6 -0
  119. package/dist/plugins/tableOverlay.mjs.map +1 -0
  120. package/dist/plugins/trailingNode.d.mts +6 -0
  121. package/dist/plugins/trailingNode.mjs +4 -0
  122. package/dist/plugins/trailingNode.mjs.map +1 -0
  123. package/dist/position-DbkbTrFL.d.mts +50 -0
  124. package/dist/schema/index.d.mts +89 -0
  125. package/dist/schema/index.mjs +8 -0
  126. package/dist/schema/index.mjs.map +1 -0
  127. package/dist/serialization/index.d.mts +8 -0
  128. package/dist/serialization/index.mjs +5 -0
  129. package/dist/serialization/index.mjs.map +1 -0
  130. package/dist/texteditor.classes.d.mts +34 -0
  131. package/dist/texteditor.classes.mjs +4 -0
  132. package/dist/texteditor.classes.mjs.map +1 -0
  133. package/dist/texteditor.constants.d.mts +36 -0
  134. package/dist/texteditor.constants.mjs +4 -0
  135. package/dist/texteditor.constants.mjs.map +1 -0
  136. package/dist/texteditor.props.d.mts +5 -0
  137. package/dist/texteditor.props.mjs +4 -0
  138. package/dist/texteditor.props.mjs.map +1 -0
  139. package/dist/texteditor.refs.d.mts +5 -0
  140. package/dist/texteditor.refs.mjs +4 -0
  141. package/dist/texteditor.refs.mjs.map +1 -0
  142. package/dist/texteditor.state.d.mts +5 -0
  143. package/dist/texteditor.state.mjs +4 -0
  144. package/dist/texteditor.state.mjs.map +1 -0
  145. package/dist/ui/focus.d.mts +5 -0
  146. package/dist/ui/focus.mjs +4 -0
  147. package/dist/ui/focus.mjs.map +1 -0
  148. package/dist/ui/index.d.mts +6 -0
  149. package/dist/ui/index.mjs +9 -0
  150. package/dist/ui/index.mjs.map +1 -0
  151. package/dist/ui/keyboard.d.mts +4 -0
  152. package/dist/ui/keyboard.mjs +4 -0
  153. package/dist/ui/keyboard.mjs.map +1 -0
  154. package/dist/ui/menu.d.mts +10 -0
  155. package/dist/ui/menu.mjs +4 -0
  156. package/dist/ui/menu.mjs.map +1 -0
  157. package/dist/ui/positioning.d.mts +30 -0
  158. package/dist/ui/positioning.mjs +5 -0
  159. package/dist/ui/positioning.mjs.map +1 -0
  160. package/dist/ui/scroll.d.mts +6 -0
  161. package/dist/ui/scroll.mjs +4 -0
  162. package/dist/ui/scroll.mjs.map +1 -0
  163. package/dist/utils/index.d.mts +18 -0
  164. package/dist/utils/index.mjs +18 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/package.json +73 -0
package/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ # License
2
+
3
+ MIT License
4
+
5
+ Copyright (c) 2026 PrimeTek
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # PrimeUI TextEditor Core
@@ -0,0 +1,83 @@
1
+ // src/utils/position.ts
2
+ function isRtl() {
3
+ return document.documentElement.dir === "rtl" || getComputedStyle(document.documentElement).direction === "rtl";
4
+ }
5
+ function inlineStartFixed(left, elWidth) {
6
+ if (!isRtl()) {
7
+ return { left: `${left}px` };
8
+ }
9
+ return { right: `${window.innerWidth - left - elWidth}px` };
10
+ }
11
+ function inlineStartAbsolute(offsetLeft, elWidth, containerWidth) {
12
+ if (!isRtl()) {
13
+ return { left: `${offsetLeft}px` };
14
+ }
15
+ return { right: `${containerWidth - offsetLeft - elWidth}px` };
16
+ }
17
+ function setInlineStart(el, offsetLeft, containerWidth, elWidth = 0) {
18
+ if (!isRtl()) {
19
+ el.style.left = `${offsetLeft}px`;
20
+ el.style.right = "";
21
+ } else {
22
+ el.style.right = `${containerWidth - offsetLeft - elWidth}px`;
23
+ el.style.left = "";
24
+ }
25
+ }
26
+ function computeBlockControlsStyle(blockEl, editorEl) {
27
+ if (!blockEl || !editorEl) return {};
28
+ const blockRect = blockEl.getBoundingClientRect();
29
+ const editorRect = editorEl.getBoundingClientRect();
30
+ const rtl = isRtl();
31
+ return {
32
+ position: "absolute",
33
+ top: `${blockRect.top - editorRect.top + editorEl.scrollTop}px`,
34
+ ...rtl ? { right: `${editorRect.right - blockRect.right}px` } : { left: `${blockRect.left - editorRect.left}px` }
35
+ };
36
+ }
37
+ function computeDropIndicatorStyle(editorEl, dropTargetIndex, blockClassName) {
38
+ if (dropTargetIndex < 0 || !editorEl) return {};
39
+ const blocks = editorEl.querySelectorAll(`.${blockClassName}`);
40
+ const editorRect = editorEl.getBoundingClientRect();
41
+ const scrollTop = editorEl.scrollTop;
42
+ let top;
43
+ if (dropTargetIndex < blocks.length) {
44
+ const blockRect = blocks[dropTargetIndex].getBoundingClientRect();
45
+ top = blockRect.top - editorRect.top + scrollTop;
46
+ } else {
47
+ const lastBlock = blocks[blocks.length - 1];
48
+ const blockRect = lastBlock.getBoundingClientRect();
49
+ top = blockRect.bottom - editorRect.top + scrollTop;
50
+ }
51
+ return { top: `${top}px` };
52
+ }
53
+ function computeDropTargetIndex(event, editorEl, draggedBlockIndex, blockClassName) {
54
+ const blocks = editorEl.querySelectorAll(`.${blockClassName}`);
55
+ const mouseY = event.clientY;
56
+ let targetIndex = blocks.length;
57
+ for (let i = 0; i < blocks.length; i++) {
58
+ const rect = blocks[i].getBoundingClientRect();
59
+ const midY = rect.top + rect.height / 2;
60
+ if (mouseY < midY) {
61
+ targetIndex = i;
62
+ break;
63
+ }
64
+ }
65
+ if (targetIndex === draggedBlockIndex || targetIndex === draggedBlockIndex + 1) {
66
+ return -1;
67
+ }
68
+ return targetIndex;
69
+ }
70
+ function clampToViewport(left, elWidth, margin) {
71
+ const viewportWidth = window.innerWidth;
72
+ if (left < margin) {
73
+ return margin;
74
+ }
75
+ if (left + elWidth > viewportWidth - margin) {
76
+ return viewportWidth - elWidth - margin;
77
+ }
78
+ return left;
79
+ }
80
+
81
+ export { clampToViewport, computeBlockControlsStyle, computeDropIndicatorStyle, computeDropTargetIndex, inlineStartAbsolute, inlineStartFixed, setInlineStart };
82
+ //# sourceMappingURL=chunk-22B454VC.mjs.map
83
+ //# sourceMappingURL=chunk-22B454VC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/position.ts"],"names":[],"mappings":"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","file":"chunk-22B454VC.mjs","sourcesContent":["/**\n * RTL-aware positioning utilities.\n *\n * getBoundingClientRect() always returns physical (left/right) coordinates.\n * In LTR we set `left`; in RTL we set `right` so the element anchors to the\n * correct edge.\n */\n\nfunction isRtl(): boolean {\n return document.documentElement.dir === 'rtl' || getComputedStyle(document.documentElement).direction === 'rtl';\n}\n\n/**\n * Returns an inline-start style for a **viewport-positioned** (fixed) element.\n * In LTR → { left: `${value}px` }\n * In RTL → { right: `${viewportWidth - value - elWidth}px` }\n */\nexport function inlineStartFixed(left: number, elWidth: number): Record<string, string> {\n if (!isRtl()) {\n return { left: `${left}px` };\n }\n\n return { right: `${window.innerWidth - left - elWidth}px` };\n}\n\n/**\n * Returns an inline-start style for an **absolutely-positioned** element\n * inside a container.\n *\n * @param offsetLeft Physical left offset relative to the container (e.g. elRect.left - containerRect.left)\n * @param elWidth Width of the positioned element (use 0 for point positioning like triggers)\n * @param containerWidth Width of the containing element\n */\nexport function inlineStartAbsolute(offsetLeft: number, elWidth: number, containerWidth: number): Record<string, string> {\n if (!isRtl()) {\n return { left: `${offsetLeft}px` };\n }\n\n return { right: `${containerWidth - offsetLeft - elWidth}px` };\n}\n\n/**\n * Sets inline-start on an HTMLElement's style directly (for imperative DOM code like tableOverlay).\n * Clears the opposite property to avoid conflicts.\n */\nexport function setInlineStart(el: HTMLElement, offsetLeft: number, containerWidth: number, elWidth: number = 0): void {\n if (!isRtl()) {\n el.style.left = `${offsetLeft}px`;\n el.style.right = '';\n } else {\n el.style.right = `${containerWidth - offsetLeft - elWidth}px`;\n el.style.left = '';\n }\n}\n\n/**\n * Computes absolute-positioned style for block controls anchored to a block element\n * within the editor container. Handles RTL by anchoring to inline-end (right) edge.\n */\nexport function computeBlockControlsStyle(blockEl: HTMLElement | null, editorEl: HTMLElement | null): Record<string, string> {\n if (!blockEl || !editorEl) return {};\n\n const blockRect = blockEl.getBoundingClientRect();\n const editorRect = editorEl.getBoundingClientRect();\n const rtl = isRtl();\n\n return {\n position: 'absolute',\n top: `${blockRect.top - editorRect.top + editorEl.scrollTop}px`,\n ...(rtl ? { right: `${editorRect.right - blockRect.right}px` } : { left: `${blockRect.left - editorRect.left}px` })\n };\n}\n\n/**\n * Computes absolute-positioned style for the block drop indicator line.\n * Position is between blocks (or after the last block when targetIndex >= block count).\n */\nexport function computeDropIndicatorStyle(editorEl: HTMLElement | null, dropTargetIndex: number, blockClassName: string): Record<string, string> {\n if (dropTargetIndex < 0 || !editorEl) return {};\n\n const blocks = editorEl.querySelectorAll(`.${blockClassName}`);\n const editorRect = editorEl.getBoundingClientRect();\n // The indicator is absolute-positioned inside editorEl, which is also the\n // scroll container, so its top must be in scrolled content coordinates —\n // add scrollTop, otherwise it drifts off-screen once the content is scrolled.\n const scrollTop = editorEl.scrollTop;\n let top: number;\n\n if (dropTargetIndex < blocks.length) {\n const blockRect = blocks[dropTargetIndex].getBoundingClientRect();\n\n top = blockRect.top - editorRect.top + scrollTop;\n } else {\n const lastBlock = blocks[blocks.length - 1];\n const blockRect = lastBlock.getBoundingClientRect();\n\n top = blockRect.bottom - editorRect.top + scrollTop;\n }\n\n return { top: `${top}px` };\n}\n\n/**\n * Computes the target drop index for block drag-and-drop based on mouse position.\n * Returns -1 if the target would be at the dragged block's current position or right after it\n * (no-op drop), otherwise returns the index where the block should be inserted.\n */\nexport function computeDropTargetIndex(event: DragEvent, editorEl: HTMLElement, draggedBlockIndex: number, blockClassName: string): number {\n const blocks = editorEl.querySelectorAll(`.${blockClassName}`);\n const mouseY = event.clientY;\n let targetIndex = blocks.length;\n\n for (let i = 0; i < blocks.length; i++) {\n const rect = blocks[i].getBoundingClientRect();\n const midY = rect.top + rect.height / 2;\n\n if (mouseY < midY) {\n targetIndex = i;\n break;\n }\n }\n\n // No-op drop positions\n if (targetIndex === draggedBlockIndex || targetIndex === draggedBlockIndex + 1) {\n return -1;\n }\n\n return targetIndex;\n}\n\n/**\n * Clamps a viewport-relative left value within margins, accounting for element width.\n * Returns the clamped physical left value (caller then passes to inlineStartFixed).\n */\nexport function clampToViewport(left: number, elWidth: number, margin: number): number {\n const viewportWidth = window.innerWidth;\n\n if (left < margin) {\n return margin;\n }\n\n if (left + elWidth > viewportWidth - margin) {\n return viewportWidth - elWidth - margin;\n }\n\n return left;\n}\n"]}
@@ -0,0 +1,320 @@
1
+ import { setInlineStart } from './chunk-22B454VC.mjs';
2
+ import { textEditorClasses } from './chunk-GG56GLXC.mjs';
3
+ import { PluginKey, Plugin } from 'prosemirror-state';
4
+ import { CellSelection } from 'prosemirror-tables';
5
+
6
+ var tableOverlayKey = new PluginKey("tableOverlay");
7
+ function getTableActiveState(view) {
8
+ const { $from } = view.state.selection;
9
+ for (let depth = $from.depth; depth > 0; depth--) {
10
+ const node = $from.node(depth);
11
+ if (node.type.name === "table_cell" || node.type.name === "table_header") {
12
+ for (let tableDepth = depth - 1; tableDepth > 0; tableDepth--) {
13
+ if ($from.node(tableDepth).type.name === "table") {
14
+ const tableNode = $from.node(tableDepth);
15
+ let tableDOM = view.nodeDOM($from.before(tableDepth));
16
+ if (!tableDOM) return null;
17
+ if (tableDOM.tagName !== "TABLE") {
18
+ tableDOM = tableDOM.querySelector("table");
19
+ }
20
+ if (!tableDOM) return null;
21
+ const cellDOM = view.nodeDOM($from.before(depth));
22
+ if (!cellDOM) return null;
23
+ const row = cellDOM.parentElement;
24
+ const colIndex = Array.from(row.cells).indexOf(cellDOM);
25
+ const rowIndex = Array.from(tableDOM.querySelectorAll("tr")).indexOf(row);
26
+ const rowCount = tableNode.childCount;
27
+ const colCount = tableNode.firstChild?.childCount || 0;
28
+ return { table: tableDOM, colIndex, rowIndex, colCount, rowCount };
29
+ }
30
+ }
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function computeOverlayRect(activeState) {
36
+ const { table, colIndex, rowIndex } = activeState;
37
+ const tableRect = table.getBoundingClientRect();
38
+ const rows = table.querySelectorAll("tr");
39
+ const currentRow = rows[rowIndex];
40
+ if (!currentRow) return null;
41
+ const currentCell = currentRow.cells[colIndex];
42
+ if (!currentCell) return null;
43
+ const cellRect = currentCell.getBoundingClientRect();
44
+ const columnBorders = [];
45
+ const firstRow = rows[0];
46
+ if (firstRow) {
47
+ let x = tableRect.left;
48
+ for (let i = 0; i < firstRow.cells.length; i++) {
49
+ x += firstRow.cells[i].getBoundingClientRect().width;
50
+ columnBorders.push(x);
51
+ }
52
+ }
53
+ return {
54
+ tableRect,
55
+ cellRect,
56
+ isLastColumn: colIndex === activeState.colCount - 1,
57
+ isLastRow: rowIndex === activeState.rowCount - 1,
58
+ columnBorders
59
+ };
60
+ }
61
+ function getTableWrapper(tableEl) {
62
+ const parent = tableEl.parentElement;
63
+ return parent?.classList.contains("tableWrapper") ? parent : null;
64
+ }
65
+ function createTrigger(className, onClick) {
66
+ const el = document.createElement("div");
67
+ el.className = className;
68
+ el.contentEditable = "false";
69
+ const handler = (event) => {
70
+ event.preventDefault();
71
+ event.stopPropagation();
72
+ onClick(event);
73
+ };
74
+ el.addEventListener("mousedown", handler);
75
+ el._teCleanup = () => el.removeEventListener("mousedown", handler);
76
+ return el;
77
+ }
78
+ function createTableOverlayPlugin(callbacks) {
79
+ let currentActiveState = null;
80
+ return new Plugin({
81
+ key: tableOverlayKey,
82
+ view() {
83
+ let overlayEl = null;
84
+ let cellTriggerEl = null;
85
+ let colTriggerEl = null;
86
+ let rowTriggerEl = null;
87
+ let addColEl = null;
88
+ let addRowEl = null;
89
+ let resizeObserver = null;
90
+ let observedTable = null;
91
+ let lastActiveState = null;
92
+ let isCellSelectionMode = false;
93
+ let currentWrapper = null;
94
+ let rafId = 0;
95
+ const removeAll = () => {
96
+ [overlayEl, cellTriggerEl, colTriggerEl, rowTriggerEl, addColEl, addRowEl].forEach((el) => {
97
+ el?._teCleanup?.();
98
+ });
99
+ overlayEl?.remove();
100
+ colTriggerEl?.remove();
101
+ rowTriggerEl?.remove();
102
+ addColEl?.remove();
103
+ addRowEl?.remove();
104
+ overlayEl = null;
105
+ cellTriggerEl = null;
106
+ colTriggerEl = null;
107
+ rowTriggerEl = null;
108
+ addColEl = null;
109
+ addRowEl = null;
110
+ currentWrapper = null;
111
+ lastActiveState = null;
112
+ if (resizeObserver && observedTable) {
113
+ resizeObserver.unobserve(observedTable);
114
+ observedTable = null;
115
+ }
116
+ };
117
+ const ensureElements = (wrapper) => {
118
+ if (currentWrapper === wrapper && overlayEl) return;
119
+ removeAll();
120
+ currentWrapper = wrapper;
121
+ overlayEl = document.createElement("div");
122
+ overlayEl.className = textEditorClasses.tableSelectionOutline;
123
+ overlayEl.style.visibility = "hidden";
124
+ cellTriggerEl = createTrigger(`${textEditorClasses.tableTrigger} ${textEditorClasses.tableTriggerCell}`, (event) => {
125
+ callbacks.onCellTriggerClick(event);
126
+ });
127
+ overlayEl.appendChild(cellTriggerEl);
128
+ wrapper.appendChild(overlayEl);
129
+ colTriggerEl = createTrigger(`${textEditorClasses.tableTrigger} ${textEditorClasses.tableTriggerCol}`, (event) => {
130
+ if (lastActiveState) callbacks.onColumnTriggerClick(lastActiveState.colIndex, event);
131
+ });
132
+ colTriggerEl.style.visibility = "hidden";
133
+ wrapper.appendChild(colTriggerEl);
134
+ rowTriggerEl = createTrigger(`${textEditorClasses.tableTrigger} ${textEditorClasses.tableTriggerRow}`, (event) => {
135
+ if (lastActiveState) callbacks.onRowTriggerClick(lastActiveState.rowIndex, event);
136
+ });
137
+ rowTriggerEl.style.visibility = "hidden";
138
+ wrapper.appendChild(rowTriggerEl);
139
+ addColEl = createTrigger(`${textEditorClasses.tableAdd} ${textEditorClasses.tableAddCol}`, () => {
140
+ callbacks.onAddColumn();
141
+ });
142
+ addColEl.style.visibility = "hidden";
143
+ addColEl.innerHTML = '<svg width="12" height="12" viewBox="0 0 12 12"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>';
144
+ wrapper.appendChild(addColEl);
145
+ addRowEl = createTrigger(`${textEditorClasses.tableAdd} ${textEditorClasses.tableAddRow}`, () => {
146
+ callbacks.onAddRow();
147
+ });
148
+ addRowEl.style.visibility = "hidden";
149
+ addRowEl.innerHTML = '<svg width="12" height="12" viewBox="0 0 12 12"><path d="M6 1v10M1 6h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>';
150
+ wrapper.appendChild(addRowEl);
151
+ };
152
+ const showElements = () => {
153
+ if (overlayEl) overlayEl.style.visibility = "";
154
+ if (colTriggerEl) colTriggerEl.style.visibility = "";
155
+ if (rowTriggerEl) rowTriggerEl.style.visibility = "";
156
+ if (addColEl) addColEl.style.visibility = "";
157
+ if (addRowEl) addRowEl.style.visibility = "";
158
+ };
159
+ const schedulePosition = () => {
160
+ if (rafId) cancelAnimationFrame(rafId);
161
+ rafId = requestAnimationFrame(() => {
162
+ rafId = 0;
163
+ positionElements();
164
+ });
165
+ };
166
+ const positionElements = () => {
167
+ if (!currentWrapper || !overlayEl) return;
168
+ const wrapperRect = currentWrapper.getBoundingClientRect();
169
+ const tableEl = currentWrapper.querySelector("table");
170
+ if (!tableEl) return;
171
+ const tableRect = tableEl.getBoundingClientRect();
172
+ const w = wrapperRect.width;
173
+ const sx = currentWrapper.scrollLeft;
174
+ const sy = currentWrapper.scrollTop;
175
+ if (tableRect.width === 0 || tableRect.height === 0) return;
176
+ if (isCellSelectionMode) {
177
+ const selectedCells = currentWrapper.querySelectorAll(".selectedCell");
178
+ if (selectedCells.length > 0) {
179
+ let minTop = Infinity;
180
+ let minLeft = Infinity;
181
+ let maxBottom = -Infinity;
182
+ let maxRight = -Infinity;
183
+ selectedCells.forEach((cell) => {
184
+ const rect = cell.getBoundingClientRect();
185
+ minTop = Math.min(minTop, rect.top);
186
+ minLeft = Math.min(minLeft, rect.left);
187
+ maxBottom = Math.max(maxBottom, rect.bottom);
188
+ maxRight = Math.max(maxRight, rect.right);
189
+ });
190
+ const selWidth = maxRight - minLeft;
191
+ overlayEl.style.top = `${minTop - wrapperRect.top + sy}px`;
192
+ setInlineStart(overlayEl, minLeft - wrapperRect.left + sx, w, selWidth);
193
+ overlayEl.style.width = `${selWidth}px`;
194
+ overlayEl.style.height = `${maxBottom - minTop}px`;
195
+ }
196
+ } else if (lastActiveState) {
197
+ const rows = tableEl.querySelectorAll("tr");
198
+ const row = rows[lastActiveState.rowIndex];
199
+ if (row) {
200
+ const cell = row.cells[lastActiveState.colIndex];
201
+ if (cell) {
202
+ const cellRect = cell.getBoundingClientRect();
203
+ overlayEl.style.top = `${cellRect.top - wrapperRect.top + sy}px`;
204
+ setInlineStart(overlayEl, cellRect.left - wrapperRect.left + sx, w, cellRect.width);
205
+ overlayEl.style.width = `${cellRect.width}px`;
206
+ overlayEl.style.height = `${cellRect.height}px`;
207
+ }
208
+ }
209
+ }
210
+ if (colTriggerEl && lastActiveState) {
211
+ const rows = tableEl.querySelectorAll("tr");
212
+ const firstRow = rows[0];
213
+ if (firstRow && firstRow.cells[lastActiveState.colIndex]) {
214
+ const cellRect = firstRow.cells[lastActiveState.colIndex].getBoundingClientRect();
215
+ colTriggerEl.style.top = `${cellRect.top - wrapperRect.top + sy}px`;
216
+ setInlineStart(colTriggerEl, cellRect.left - wrapperRect.left + sx + cellRect.width / 2, w);
217
+ colTriggerEl.style.display = "";
218
+ } else {
219
+ colTriggerEl.style.display = "none";
220
+ }
221
+ }
222
+ if (rowTriggerEl && lastActiveState) {
223
+ const rows = tableEl.querySelectorAll("tr");
224
+ const activeRow = rows[lastActiveState.rowIndex];
225
+ if (activeRow && activeRow.cells[0]) {
226
+ const cellRect = activeRow.cells[0].getBoundingClientRect();
227
+ rowTriggerEl.style.top = `${cellRect.top - wrapperRect.top + sy + cellRect.height / 2}px`;
228
+ setInlineStart(rowTriggerEl, cellRect.left - wrapperRect.left + sx, w);
229
+ rowTriggerEl.style.display = "";
230
+ } else {
231
+ rowTriggerEl.style.display = "none";
232
+ }
233
+ }
234
+ if (addColEl) {
235
+ const rtl = document.documentElement.dir === "rtl" || getComputedStyle(document.documentElement).direction === "rtl";
236
+ addColEl.style.top = `${tableRect.top - wrapperRect.top + sy}px`;
237
+ if (rtl) {
238
+ addColEl.style.right = `${wrapperRect.right - tableRect.left - sx + 4}px`;
239
+ addColEl.style.left = "";
240
+ } else {
241
+ addColEl.style.left = `${tableRect.right - wrapperRect.left + sx + 4}px`;
242
+ addColEl.style.right = "";
243
+ }
244
+ addColEl.style.height = `${tableRect.height}px`;
245
+ }
246
+ if (addRowEl) {
247
+ addRowEl.style.top = `${tableRect.bottom - wrapperRect.top + sy + 4}px`;
248
+ setInlineStart(addRowEl, tableRect.left - wrapperRect.left + sx, w, tableRect.width);
249
+ addRowEl.style.width = `${tableRect.width}px`;
250
+ }
251
+ showElements();
252
+ };
253
+ const observeTable = (tableEl) => {
254
+ if (observedTable === tableEl) return;
255
+ if (resizeObserver && observedTable) {
256
+ resizeObserver.unobserve(observedTable);
257
+ }
258
+ if (!resizeObserver) {
259
+ resizeObserver = new ResizeObserver(() => schedulePosition());
260
+ }
261
+ resizeObserver.observe(tableEl);
262
+ observedTable = tableEl;
263
+ };
264
+ return {
265
+ update(view) {
266
+ const isCellSel = view.state.selection instanceof CellSelection;
267
+ if (isCellSel) {
268
+ isCellSelectionMode = true;
269
+ if (currentWrapper) {
270
+ positionElements();
271
+ }
272
+ if (currentActiveState) {
273
+ currentActiveState = null;
274
+ callbacks.onActiveStateChange(null);
275
+ callbacks.onOverlayRectChange(null);
276
+ }
277
+ return;
278
+ }
279
+ isCellSelectionMode = false;
280
+ const newState = getTableActiveState(view);
281
+ if (newState) {
282
+ currentActiveState = newState;
283
+ callbacks.onActiveStateChange(newState);
284
+ callbacks.onOverlayRectChange(computeOverlayRect(newState));
285
+ const wrapper = getTableWrapper(newState.table);
286
+ if (wrapper) {
287
+ ensureElements(wrapper);
288
+ lastActiveState = newState;
289
+ positionElements();
290
+ schedulePosition();
291
+ observeTable(newState.table);
292
+ } else {
293
+ lastActiveState = newState;
294
+ }
295
+ } else {
296
+ removeAll();
297
+ if (currentActiveState) {
298
+ currentActiveState = null;
299
+ callbacks.onActiveStateChange(null);
300
+ callbacks.onOverlayRectChange(null);
301
+ }
302
+ }
303
+ },
304
+ destroy() {
305
+ if (rafId) cancelAnimationFrame(rafId);
306
+ removeAll();
307
+ resizeObserver?.disconnect();
308
+ resizeObserver = null;
309
+ currentActiveState = null;
310
+ callbacks.onActiveStateChange(null);
311
+ callbacks.onOverlayRectChange(null);
312
+ }
313
+ };
314
+ }
315
+ });
316
+ }
317
+
318
+ export { createTableOverlayPlugin };
319
+ //# sourceMappingURL=chunk-3RKMABZR.mjs.map
320
+ //# sourceMappingURL=chunk-3RKMABZR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/tableOverlay.ts"],"names":[],"mappings":"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","file":"chunk-3RKMABZR.mjs","sourcesContent":["import { Plugin, PluginKey } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport type { TableActiveState, TableOverlayRect } from '@primeui/texteditor-types';\nimport { CellSelection } from 'prosemirror-tables';\nimport { textEditorClasses as classes } from '../texteditor.classes';\nimport { setInlineStart } from '../utils/position';\n\nconst tableOverlayKey = new PluginKey('tableOverlay');\n\ninterface TableOverlayCallbacks {\n onActiveStateChange: (state: TableActiveState | null) => void;\n onOverlayRectChange: (rect: TableOverlayRect | null) => void;\n onColumnTriggerClick: (colIndex: number, event: MouseEvent) => void;\n onRowTriggerClick: (rowIndex: number, event: MouseEvent) => void;\n onCellTriggerClick: (event: MouseEvent) => void;\n onAddColumn: () => void;\n onAddRow: () => void;\n}\n\nfunction getTableActiveState(view: EditorView): TableActiveState | null {\n const { $from } = view.state.selection;\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n\n if (node.type.name === 'table_cell' || node.type.name === 'table_header') {\n for (let tableDepth = depth - 1; tableDepth > 0; tableDepth--) {\n if ($from.node(tableDepth).type.name === 'table') {\n const tableNode = $from.node(tableDepth);\n let tableDOM = view.nodeDOM($from.before(tableDepth)) as HTMLElement | null;\n\n if (!tableDOM) return null;\n\n if (tableDOM.tagName !== 'TABLE') {\n tableDOM = tableDOM.querySelector('table');\n }\n\n if (!tableDOM) return null;\n\n const cellDOM = view.nodeDOM($from.before(depth)) as HTMLTableCellElement | null;\n\n if (!cellDOM) return null;\n\n const row = cellDOM.parentElement as HTMLTableRowElement;\n const colIndex = Array.from(row.cells).indexOf(cellDOM);\n const rowIndex = Array.from(tableDOM.querySelectorAll('tr')).indexOf(row);\n const rowCount = tableNode.childCount;\n const colCount = tableNode.firstChild?.childCount || 0;\n\n return { table: tableDOM as HTMLTableElement, colIndex, rowIndex, colCount, rowCount };\n }\n }\n }\n }\n\n return null;\n}\n\nfunction computeOverlayRect(activeState: TableActiveState): TableOverlayRect | null {\n const { table, colIndex, rowIndex } = activeState;\n const tableRect = table.getBoundingClientRect();\n const rows = table.querySelectorAll('tr');\n const currentRow = rows[rowIndex];\n\n if (!currentRow) return null;\n\n const currentCell = currentRow.cells[colIndex];\n\n if (!currentCell) return null;\n\n const cellRect = currentCell.getBoundingClientRect();\n\n const columnBorders: number[] = [];\n const firstRow = rows[0];\n\n if (firstRow) {\n let x = tableRect.left;\n\n for (let i = 0; i < firstRow.cells.length; i++) {\n x += firstRow.cells[i].getBoundingClientRect().width;\n columnBorders.push(x);\n }\n }\n\n return {\n tableRect,\n cellRect,\n isLastColumn: colIndex === activeState.colCount - 1,\n isLastRow: rowIndex === activeState.rowCount - 1,\n columnBorders\n };\n}\n\nfunction getTableWrapper(tableEl: HTMLElement): HTMLElement | null {\n const parent = tableEl.parentElement;\n\n return parent?.classList.contains('tableWrapper') ? parent : null;\n}\n\ntype TriggerElement = HTMLDivElement & { _teCleanup?: () => void };\n\nfunction createTrigger(className: string, onClick: (event: MouseEvent) => void): TriggerElement {\n const el = document.createElement('div') as TriggerElement;\n\n el.className = className;\n el.contentEditable = 'false';\n\n const handler = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onClick(event);\n };\n\n el.addEventListener('mousedown', handler);\n el._teCleanup = () => el.removeEventListener('mousedown', handler);\n\n return el;\n}\n\nexport function createTableOverlayPlugin(callbacks: TableOverlayCallbacks) {\n let currentActiveState: TableActiveState | null = null;\n\n return new Plugin({\n key: tableOverlayKey,\n view() {\n // Selection outline\n let overlayEl: HTMLDivElement | null = null;\n let cellTriggerEl: HTMLDivElement | null = null;\n\n // Column/row triggers\n let colTriggerEl: HTMLDivElement | null = null;\n let rowTriggerEl: HTMLDivElement | null = null;\n\n // Add buttons\n let addColEl: HTMLDivElement | null = null;\n let addRowEl: HTMLDivElement | null = null;\n\n // ResizeObserver for live updates\n let resizeObserver: ResizeObserver | null = null;\n let observedTable: HTMLElement | null = null;\n let lastActiveState: TableActiveState | null = null;\n let isCellSelectionMode = false;\n\n let currentWrapper: HTMLElement | null = null;\n let rafId = 0;\n\n const removeAll = () => {\n [overlayEl, cellTriggerEl, colTriggerEl, rowTriggerEl, addColEl, addRowEl].forEach((el) => {\n (el as TriggerElement | null)?._teCleanup?.();\n });\n overlayEl?.remove();\n colTriggerEl?.remove();\n rowTriggerEl?.remove();\n addColEl?.remove();\n addRowEl?.remove();\n overlayEl = null;\n cellTriggerEl = null;\n colTriggerEl = null;\n rowTriggerEl = null;\n addColEl = null;\n addRowEl = null;\n currentWrapper = null;\n lastActiveState = null;\n\n if (resizeObserver && observedTable) {\n resizeObserver.unobserve(observedTable);\n observedTable = null;\n }\n };\n\n const ensureElements = (wrapper: HTMLElement) => {\n if (currentWrapper === wrapper && overlayEl) return;\n\n removeAll();\n currentWrapper = wrapper;\n\n // Selection outline with cell trigger (hidden until positioned)\n overlayEl = document.createElement('div');\n overlayEl.className = classes.tableSelectionOutline;\n overlayEl.style.visibility = 'hidden';\n\n cellTriggerEl = createTrigger(`${classes.tableTrigger} ${classes.tableTriggerCell}`, (event) => {\n callbacks.onCellTriggerClick(event);\n });\n overlayEl.appendChild(cellTriggerEl);\n wrapper.appendChild(overlayEl);\n\n // Column trigger\n colTriggerEl = createTrigger(`${classes.tableTrigger} ${classes.tableTriggerCol}`, (event) => {\n if (lastActiveState) callbacks.onColumnTriggerClick(lastActiveState.colIndex, event);\n });\n colTriggerEl.style.visibility = 'hidden';\n wrapper.appendChild(colTriggerEl);\n\n // Row trigger\n rowTriggerEl = createTrigger(`${classes.tableTrigger} ${classes.tableTriggerRow}`, (event) => {\n if (lastActiveState) callbacks.onRowTriggerClick(lastActiveState.rowIndex, event);\n });\n rowTriggerEl.style.visibility = 'hidden';\n wrapper.appendChild(rowTriggerEl);\n\n // Add column button\n addColEl = createTrigger(`${classes.tableAdd} ${classes.tableAddCol}`, () => {\n callbacks.onAddColumn();\n });\n addColEl.style.visibility = 'hidden';\n addColEl.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path d=\"M6 1v10M1 6h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>';\n wrapper.appendChild(addColEl);\n\n // Add row button\n addRowEl = createTrigger(`${classes.tableAdd} ${classes.tableAddRow}`, () => {\n callbacks.onAddRow();\n });\n addRowEl.style.visibility = 'hidden';\n addRowEl.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"><path d=\"M6 1v10M1 6h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>';\n wrapper.appendChild(addRowEl);\n };\n\n const showElements = () => {\n if (overlayEl) overlayEl.style.visibility = '';\n if (colTriggerEl) colTriggerEl.style.visibility = '';\n if (rowTriggerEl) rowTriggerEl.style.visibility = '';\n if (addColEl) addColEl.style.visibility = '';\n if (addRowEl) addRowEl.style.visibility = '';\n };\n\n // Defer to the next frame so element rects are read AFTER the table's\n // layout settles (e.g. right after a column is added or the table is\n // resized); otherwise triggers/handles latch onto a stale width.\n const schedulePosition = () => {\n if (rafId) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = 0;\n positionElements();\n });\n };\n\n const positionElements = () => {\n if (!currentWrapper || !overlayEl) return;\n\n const wrapperRect = currentWrapper.getBoundingClientRect();\n const tableEl = currentWrapper.querySelector('table');\n\n if (!tableEl) return;\n\n const tableRect = tableEl.getBoundingClientRect();\n const w = wrapperRect.width;\n // Absolutely-positioned elements live in the wrapper's scrolled\n // content box; viewport rects don't include that scroll, so add it\n // back or the handles latch to the wrong place once scrolled.\n const sx = currentWrapper.scrollLeft;\n const sy = currentWrapper.scrollTop;\n\n // Skip positioning if table hasn't been laid out yet\n if (tableRect.width === 0 || tableRect.height === 0) return;\n\n if (isCellSelectionMode) {\n // Multi-cell: outline from .selectedCell rects\n const selectedCells = currentWrapper.querySelectorAll('.selectedCell');\n\n if (selectedCells.length > 0) {\n let minTop = Infinity;\n let minLeft = Infinity;\n let maxBottom = -Infinity;\n let maxRight = -Infinity;\n\n selectedCells.forEach((cell) => {\n const rect = cell.getBoundingClientRect();\n\n minTop = Math.min(minTop, rect.top);\n minLeft = Math.min(minLeft, rect.left);\n maxBottom = Math.max(maxBottom, rect.bottom);\n maxRight = Math.max(maxRight, rect.right);\n });\n\n const selWidth = maxRight - minLeft;\n\n overlayEl.style.top = `${minTop - wrapperRect.top + sy}px`;\n setInlineStart(overlayEl, minLeft - wrapperRect.left + sx, w, selWidth);\n overlayEl.style.width = `${selWidth}px`;\n overlayEl.style.height = `${maxBottom - minTop}px`;\n }\n } else if (lastActiveState) {\n // Single cell outline\n const rows = tableEl.querySelectorAll('tr');\n const row = rows[lastActiveState.rowIndex];\n\n if (row) {\n const cell = row.cells[lastActiveState.colIndex];\n\n if (cell) {\n const cellRect = cell.getBoundingClientRect();\n\n overlayEl.style.top = `${cellRect.top - wrapperRect.top + sy}px`;\n setInlineStart(overlayEl, cellRect.left - wrapperRect.left + sx, w, cellRect.width);\n overlayEl.style.width = `${cellRect.width}px`;\n overlayEl.style.height = `${cellRect.height}px`;\n }\n }\n }\n\n // Column trigger — top center of active cell's column\n if (colTriggerEl && lastActiveState) {\n const rows = tableEl.querySelectorAll('tr');\n const firstRow = rows[0];\n\n if (firstRow && firstRow.cells[lastActiveState.colIndex]) {\n const cellRect = firstRow.cells[lastActiveState.colIndex].getBoundingClientRect();\n\n colTriggerEl.style.top = `${cellRect.top - wrapperRect.top + sy}px`;\n setInlineStart(colTriggerEl, cellRect.left - wrapperRect.left + sx + cellRect.width / 2, w);\n colTriggerEl.style.display = '';\n } else {\n colTriggerEl.style.display = 'none';\n }\n }\n\n // Row trigger — inline-start center of active cell's row\n if (rowTriggerEl && lastActiveState) {\n const rows = tableEl.querySelectorAll('tr');\n const activeRow = rows[lastActiveState.rowIndex];\n\n if (activeRow && activeRow.cells[0]) {\n const cellRect = activeRow.cells[0].getBoundingClientRect();\n\n rowTriggerEl.style.top = `${cellRect.top - wrapperRect.top + sy + cellRect.height / 2}px`;\n setInlineStart(rowTriggerEl, cellRect.left - wrapperRect.left + sx, w);\n rowTriggerEl.style.display = '';\n } else {\n rowTriggerEl.style.display = 'none';\n }\n }\n\n // Add column button — inline-end edge of table, full height\n if (addColEl) {\n const rtl = document.documentElement.dir === 'rtl' || getComputedStyle(document.documentElement).direction === 'rtl';\n\n addColEl.style.top = `${tableRect.top - wrapperRect.top + sy}px`;\n\n if (rtl) {\n addColEl.style.right = `${wrapperRect.right - tableRect.left - sx + 4}px`;\n addColEl.style.left = '';\n } else {\n addColEl.style.left = `${tableRect.right - wrapperRect.left + sx + 4}px`;\n addColEl.style.right = '';\n }\n\n addColEl.style.height = `${tableRect.height}px`;\n }\n\n // Add row button — bottom edge of table, full width\n if (addRowEl) {\n addRowEl.style.top = `${tableRect.bottom - wrapperRect.top + sy + 4}px`;\n setInlineStart(addRowEl, tableRect.left - wrapperRect.left + sx, w, tableRect.width);\n addRowEl.style.width = `${tableRect.width}px`;\n }\n\n showElements();\n };\n\n const observeTable = (tableEl: HTMLElement) => {\n if (observedTable === tableEl) return;\n\n if (resizeObserver && observedTable) {\n resizeObserver.unobserve(observedTable);\n }\n\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver(() => schedulePosition());\n }\n\n resizeObserver.observe(tableEl);\n observedTable = tableEl;\n };\n\n return {\n update(view) {\n const isCellSel = view.state.selection instanceof CellSelection;\n\n if (isCellSel) {\n isCellSelectionMode = true;\n\n // During CellSelection, keep elements but reposition\n if (currentWrapper) {\n positionElements();\n }\n\n if (currentActiveState) {\n currentActiveState = null;\n callbacks.onActiveStateChange(null);\n callbacks.onOverlayRectChange(null);\n }\n\n return;\n }\n\n isCellSelectionMode = false;\n\n const newState = getTableActiveState(view);\n\n if (newState) {\n currentActiveState = newState;\n callbacks.onActiveStateChange(newState);\n callbacks.onOverlayRectChange(computeOverlayRect(newState));\n\n const wrapper = getTableWrapper(newState.table);\n\n if (wrapper) {\n ensureElements(wrapper);\n lastActiveState = newState;\n positionElements();\n schedulePosition();\n observeTable(newState.table);\n } else {\n lastActiveState = newState;\n }\n } else {\n removeAll();\n\n if (currentActiveState) {\n currentActiveState = null;\n callbacks.onActiveStateChange(null);\n callbacks.onOverlayRectChange(null);\n }\n }\n },\n destroy() {\n if (rafId) cancelAnimationFrame(rafId);\n removeAll();\n resizeObserver?.disconnect();\n resizeObserver = null;\n currentActiveState = null;\n callbacks.onActiveStateChange(null);\n callbacks.onOverlayRectChange(null);\n }\n };\n }\n });\n}\n"]}
@@ -0,0 +1,18 @@
1
+ // src/plugins/registry.ts
2
+ function addProseMirrorPlugin(view, plugin) {
3
+ const current = view.state.plugins;
4
+ if (!current.includes(plugin)) {
5
+ view.updateState(view.state.reconfigure({ plugins: [...current, plugin] }));
6
+ }
7
+ return () => removeProseMirrorPlugin(view, plugin);
8
+ }
9
+ function removeProseMirrorPlugin(view, plugin) {
10
+ const next = view.state.plugins.filter((p) => p !== plugin);
11
+ if (next.length !== view.state.plugins.length) {
12
+ view.updateState(view.state.reconfigure({ plugins: next }));
13
+ }
14
+ }
15
+
16
+ export { addProseMirrorPlugin, removeProseMirrorPlugin };
17
+ //# sourceMappingURL=chunk-6GY64GPU.mjs.map
18
+ //# sourceMappingURL=chunk-6GY64GPU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/registry.ts"],"names":[],"mappings":";AAIO,SAAS,oBAAA,CAAqB,MAAkB,MAAA,EAA4B;AAC/E,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,OAAA;AAE3B,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,EAAE,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,MAAM,uBAAA,CAAwB,IAAA,EAAM,MAAM,CAAA;AACrD;AAEO,SAAS,uBAAA,CAAwB,MAAkB,MAAA,EAAsB;AAC5E,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AAE1D,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAA,CAAM,WAAA,CAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9D;AACJ","file":"chunk-6GY64GPU.mjs","sourcesContent":["import type { Plugin } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\n\n// Attaches a ProseMirror plugin to a live view (preserving doc/selection); returns a remover.\nexport function addProseMirrorPlugin(view: EditorView, plugin: Plugin): () => void {\n const current = view.state.plugins;\n\n if (!current.includes(plugin)) {\n view.updateState(view.state.reconfigure({ plugins: [...current, plugin] }));\n }\n\n return () => removeProseMirrorPlugin(view, plugin);\n}\n\nexport function removeProseMirrorPlugin(view: EditorView, plugin: Plugin): void {\n const next = view.state.plugins.filter((p) => p !== plugin);\n\n if (next.length !== view.state.plugins.length) {\n view.updateState(view.state.reconfigure({ plugins: next }));\n }\n}\n"]}