@kopexa/extension-table 17.0.46 → 17.1.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 (209) hide show
  1. package/dist/chunk-2NBDRVYL.mjs +428 -0
  2. package/dist/chunk-3SWV7BGP.mjs +638 -0
  3. package/dist/chunk-4JC7NB5Y.mjs +96 -0
  4. package/dist/{chunk-2L3HZWWG.mjs → chunk-4XRAUUXQ.mjs} +7 -8
  5. package/dist/chunk-5B5XIL2G.mjs +457 -0
  6. package/dist/chunk-6FHFDGJO.mjs +251 -0
  7. package/dist/chunk-CD62W5C3.mjs +165 -0
  8. package/dist/chunk-CN73TYHV.mjs +190 -0
  9. package/dist/chunk-CPDSPBS6.mjs +276 -0
  10. package/dist/chunk-E7W2KRZG.mjs +49 -0
  11. package/dist/chunk-G6GHC2WO.mjs +276 -0
  12. package/dist/chunk-GBTQVIN5.mjs +174 -0
  13. package/dist/chunk-GDEXPEW5.mjs +52 -0
  14. package/dist/chunk-GQLZBIWF.mjs +198 -0
  15. package/dist/chunk-J4VOSZCZ.mjs +59 -0
  16. package/dist/chunk-JQEUL3LT.mjs +276 -0
  17. package/dist/chunk-JSUVBKCI.mjs +116 -0
  18. package/dist/chunk-KIYFW7MP.mjs +122 -0
  19. package/dist/chunk-KTRZVXJC.mjs +306 -0
  20. package/dist/chunk-LUA32VH4.mjs +35 -0
  21. package/dist/chunk-LULO6UOC.mjs +603 -0
  22. package/dist/chunk-PTX5UYV6.mjs +10 -0
  23. package/dist/chunk-QI7CA4YV.mjs +149 -0
  24. package/dist/chunk-VIBVRWS4.mjs +197 -0
  25. package/dist/chunk-VQV757EG.mjs +113 -0
  26. package/dist/chunk-ZVPJDJBO.mjs +134 -0
  27. package/dist/{kit.d.mts → extensions/kit.d.mts} +1 -3
  28. package/dist/{kit.d.ts → extensions/kit.d.ts} +1 -3
  29. package/dist/extensions/kit.js +1041 -0
  30. package/dist/extensions/kit.mjs +15 -0
  31. package/dist/extensions/table-cell.d.mts +6 -0
  32. package/dist/extensions/table-cell.d.ts +6 -0
  33. package/dist/extensions/table-cell.js +70 -0
  34. package/dist/extensions/table-cell.mjs +8 -0
  35. package/dist/extensions/table-handle-plugin.d.mts +46 -0
  36. package/dist/extensions/table-handle-plugin.d.ts +46 -0
  37. package/dist/extensions/table-handle-plugin.js +1100 -0
  38. package/dist/extensions/table-handle-plugin.mjs +18 -0
  39. package/dist/extensions/table-handle.d.mts +19 -0
  40. package/dist/extensions/table-handle.d.ts +19 -0
  41. package/dist/extensions/table-handle.js +865 -0
  42. package/dist/extensions/table-handle.mjs +11 -0
  43. package/dist/{table → extensions}/table.d.mts +2 -2
  44. package/dist/{table → extensions}/table.d.ts +2 -2
  45. package/dist/extensions/table.js +138 -0
  46. package/dist/extensions/table.mjs +9 -0
  47. package/dist/hooks/use-resize-overlay.d.mts +5 -0
  48. package/dist/hooks/use-resize-overlay.d.ts +5 -0
  49. package/dist/hooks/use-resize-overlay.js +83 -0
  50. package/dist/hooks/use-resize-overlay.mjs +9 -0
  51. package/dist/hooks/use-table-add-row-column.d.mts +57 -0
  52. package/dist/hooks/use-table-add-row-column.d.ts +57 -0
  53. package/dist/hooks/use-table-add-row-column.js +551 -0
  54. package/dist/hooks/use-table-add-row-column.mjs +11 -0
  55. package/dist/hooks/use-table-align-cell.d.mts +148 -0
  56. package/dist/hooks/use-table-align-cell.d.ts +148 -0
  57. package/dist/hooks/use-table-align-cell.js +655 -0
  58. package/dist/hooks/use-table-align-cell.mjs +13 -0
  59. package/dist/hooks/use-table-clear-row-column-content.d.mts +103 -0
  60. package/dist/hooks/use-table-clear-row-column-content.d.ts +103 -0
  61. package/dist/hooks/use-table-clear-row-column-content.js +681 -0
  62. package/dist/hooks/use-table-clear-row-column-content.mjs +11 -0
  63. package/dist/hooks/use-table-delete-row-column.d.mts +87 -0
  64. package/dist/hooks/use-table-delete-row-column.d.ts +87 -0
  65. package/dist/hooks/use-table-delete-row-column.js +459 -0
  66. package/dist/hooks/use-table-delete-row-column.mjs +11 -0
  67. package/dist/hooks/use-table-duplicate-row-column.d.mts +49 -0
  68. package/dist/hooks/use-table-duplicate-row-column.d.ts +49 -0
  69. package/dist/hooks/use-table-duplicate-row-column.js +758 -0
  70. package/dist/hooks/use-table-duplicate-row-column.mjs +11 -0
  71. package/dist/hooks/use-table-handle-positioning.d.mts +42 -0
  72. package/dist/hooks/use-table-handle-positioning.d.ts +42 -0
  73. package/dist/hooks/use-table-handle-positioning.js +190 -0
  74. package/dist/hooks/use-table-handle-positioning.mjs +10 -0
  75. package/dist/hooks/use-table-handle-state.d.mts +28 -0
  76. package/dist/hooks/use-table-handle-state.d.ts +28 -0
  77. package/dist/hooks/use-table-handle-state.js +76 -0
  78. package/dist/hooks/use-table-handle-state.mjs +9 -0
  79. package/dist/hooks/use-table-header-row-column.d.mts +58 -0
  80. package/dist/hooks/use-table-header-row-column.d.ts +58 -0
  81. package/dist/hooks/use-table-header-row-column.js +603 -0
  82. package/dist/hooks/use-table-header-row-column.mjs +13 -0
  83. package/dist/hooks/use-table-merge-split-cell.d.mts +123 -0
  84. package/dist/hooks/use-table-merge-split-cell.d.ts +123 -0
  85. package/dist/hooks/use-table-merge-split-cell.js +331 -0
  86. package/dist/hooks/use-table-merge-split-cell.mjs +12 -0
  87. package/dist/hooks/use-table-move-row-column.d.mts +101 -0
  88. package/dist/hooks/use-table-move-row-column.d.ts +101 -0
  89. package/dist/hooks/use-table-move-row-column.js +621 -0
  90. package/dist/hooks/use-table-move-row-column.mjs +13 -0
  91. package/dist/hooks/use-table-sort-row-column.d.mts +118 -0
  92. package/dist/hooks/use-table-sort-row-column.d.ts +118 -0
  93. package/dist/hooks/use-table-sort-row-column.js +623 -0
  94. package/dist/hooks/use-table-sort-row-column.mjs +13 -0
  95. package/dist/index.d.mts +17 -6
  96. package/dist/index.d.ts +17 -6
  97. package/dist/index.js +4947 -660
  98. package/dist/index.mjs +43 -21
  99. package/dist/lib/constants.d.mts +4 -0
  100. package/dist/lib/constants.d.ts +4 -0
  101. package/dist/{table/lib/is-cell-selection.js → lib/constants.js} +10 -10
  102. package/dist/lib/constants.mjs +10 -0
  103. package/dist/lib/create-image.d.mts +12 -0
  104. package/dist/lib/create-image.d.ts +12 -0
  105. package/dist/lib/create-image.js +221 -0
  106. package/dist/lib/create-image.mjs +8 -0
  107. package/dist/lib/table-utils.d.mts +263 -0
  108. package/dist/lib/table-utils.d.ts +263 -0
  109. package/dist/lib/table-utils.js +488 -0
  110. package/dist/lib/table-utils.mjs +40 -0
  111. package/dist/messages.d.mts +174 -0
  112. package/dist/messages.d.ts +174 -0
  113. package/dist/messages.js +213 -0
  114. package/dist/{table-row.mjs → messages.mjs} +3 -3
  115. package/dist/ui/table-alignment-menu.d.mts +25 -0
  116. package/dist/ui/table-alignment-menu.d.ts +25 -0
  117. package/dist/ui/table-alignment-menu.js +758 -0
  118. package/dist/ui/table-alignment-menu.mjs +14 -0
  119. package/dist/ui/table-cell-handle-menu.d.mts +12 -0
  120. package/dist/ui/table-cell-handle-menu.d.ts +12 -0
  121. package/dist/ui/table-cell-handle-menu.js +1317 -0
  122. package/dist/ui/table-cell-handle-menu.mjs +17 -0
  123. package/dist/ui/table-handle-menu.d.mts +23 -0
  124. package/dist/ui/table-handle-menu.d.ts +23 -0
  125. package/dist/ui/table-handle-menu.js +2598 -0
  126. package/dist/ui/table-handle-menu.mjs +21 -0
  127. package/dist/ui/table-handle.d.mts +48 -0
  128. package/dist/ui/table-handle.d.ts +48 -0
  129. package/dist/ui/table-handle.js +3126 -0
  130. package/dist/ui/table-handle.mjs +22 -0
  131. package/dist/ui/table-selection-overlay.d.mts +14 -0
  132. package/dist/ui/table-selection-overlay.d.ts +14 -0
  133. package/dist/ui/table-selection-overlay.js +553 -0
  134. package/dist/ui/table-selection-overlay.mjs +11 -0
  135. package/package.json +12 -7
  136. package/dist/chunk-3XEOCAHB.mjs +0 -41
  137. package/dist/chunk-5W5ARI64.mjs +0 -11
  138. package/dist/chunk-BTJ3DCGC.mjs +0 -113
  139. package/dist/chunk-DR2GZJH6.mjs +0 -70
  140. package/dist/chunk-GHOJLOCF.mjs +0 -247
  141. package/dist/chunk-HWVA6DOK.mjs +0 -20
  142. package/dist/chunk-KLUH6EZS.mjs +0 -40
  143. package/dist/chunk-KNOMCS6F.mjs +0 -57
  144. package/dist/chunk-LPHCE6EI.mjs +0 -92
  145. package/dist/chunk-POJFNXG7.mjs +0 -44
  146. package/dist/chunk-QHD3QTD2.mjs +0 -61
  147. package/dist/chunk-RPPUD4R5.mjs +0 -1
  148. package/dist/kit.js +0 -764
  149. package/dist/kit.mjs +0 -19
  150. package/dist/table/index.d.mts +0 -6
  151. package/dist/table/index.d.ts +0 -6
  152. package/dist/table/index.js +0 -625
  153. package/dist/table/index.mjs +0 -18
  154. package/dist/table/lib/col-style.d.mts +0 -3
  155. package/dist/table/lib/col-style.d.ts +0 -3
  156. package/dist/table/lib/col-style.js +0 -36
  157. package/dist/table/lib/col-style.mjs +0 -13
  158. package/dist/table/lib/delete-table-when-all-cells-selected.d.mts +0 -5
  159. package/dist/table/lib/delete-table-when-all-cells-selected.d.ts +0 -5
  160. package/dist/table/lib/delete-table-when-all-cells-selected.js +0 -66
  161. package/dist/table/lib/delete-table-when-all-cells-selected.mjs +0 -40
  162. package/dist/table/lib/get-table-node-types.d.mts +0 -7
  163. package/dist/table/lib/get-table-node-types.d.ts +0 -7
  164. package/dist/table/lib/get-table-node-types.js +0 -44
  165. package/dist/table/lib/get-table-node-types.mjs +0 -21
  166. package/dist/table/lib/icons.d.mts +0 -13
  167. package/dist/table/lib/icons.d.ts +0 -13
  168. package/dist/table/lib/icons.js +0 -81
  169. package/dist/table/lib/icons.mjs +0 -58
  170. package/dist/table/lib/insert-line-above-table-action.d.mts +0 -5
  171. package/dist/table/lib/insert-line-above-table-action.d.ts +0 -5
  172. package/dist/table/lib/insert-line-above-table-action.js +0 -64
  173. package/dist/table/lib/insert-line-above-table-action.mjs +0 -8
  174. package/dist/table/lib/insert-line-below-table-action.d.mts +0 -5
  175. package/dist/table/lib/insert-line-below-table-action.d.ts +0 -5
  176. package/dist/table/lib/insert-line-below-table-action.js +0 -63
  177. package/dist/table/lib/insert-line-below-table-action.mjs +0 -8
  178. package/dist/table/lib/is-cell-selection.d.mts +0 -5
  179. package/dist/table/lib/is-cell-selection.d.ts +0 -5
  180. package/dist/table/lib/is-cell-selection.mjs +0 -8
  181. package/dist/table/lib/table-controls.d.mts +0 -15
  182. package/dist/table/lib/table-controls.d.ts +0 -15
  183. package/dist/table/lib/table-controls.js +0 -131
  184. package/dist/table/lib/table-controls.mjs +0 -8
  185. package/dist/table/table.js +0 -621
  186. package/dist/table/table.mjs +0 -14
  187. package/dist/table/views/table-column-menu.d.mts +0 -11
  188. package/dist/table/views/table-column-menu.d.ts +0 -11
  189. package/dist/table/views/table-column-menu.js +0 -84
  190. package/dist/table/views/table-column-menu.mjs +0 -8
  191. package/dist/table/views/table-node-view.d.mts +0 -25
  192. package/dist/table/views/table-node-view.d.ts +0 -25
  193. package/dist/table/views/table-node-view.js +0 -370
  194. package/dist/table/views/table-node-view.mjs +0 -10
  195. package/dist/table/views/table-row-menu.d.mts +0 -11
  196. package/dist/table/views/table-row-menu.d.ts +0 -11
  197. package/dist/table/views/table-row-menu.js +0 -80
  198. package/dist/table/views/table-row-menu.mjs +0 -8
  199. package/dist/table-cell.d.mts +0 -8
  200. package/dist/table-cell.d.ts +0 -8
  201. package/dist/table-cell.js +0 -93
  202. package/dist/table-cell.mjs +0 -8
  203. package/dist/table-header.d.mts +0 -6
  204. package/dist/table-header.d.ts +0 -6
  205. package/dist/table-header.js +0 -67
  206. package/dist/table-header.mjs +0 -8
  207. package/dist/table-row.d.mts +0 -6
  208. package/dist/table-row.d.ts +0 -6
  209. package/dist/table-row.js +0 -43
@@ -1,41 +0,0 @@
1
- "use client";
2
-
3
- // src/table/lib/insert-line-above-table-action.ts
4
- import { findParentNodeOfType } from "@kopexa/editor-utils";
5
- var insertLineAboveTableAction = ({
6
- editor
7
- }) => {
8
- if (!editor.isActive("table")) return false;
9
- try {
10
- const { selection } = editor.state;
11
- const tableNode = findParentNodeOfType(selection, "table");
12
- if (!tableNode) return false;
13
- const tablePos = tableNode.pos;
14
- const firstRow = tableNode.node.child(0);
15
- const selectionPath = selection.$anchor.path;
16
- const selectionInFirstRow = selectionPath.includes(firstRow);
17
- if (!selectionInFirstRow) return false;
18
- if (tablePos === 0) {
19
- editor.chain().insertContentAt(tablePos, { type: "paragraph" }).run();
20
- editor.chain().setTextSelection(tablePos + 1).run();
21
- } else {
22
- const prevNodePos = tablePos - 1;
23
- if (prevNodePos <= 0) return false;
24
- const prevNode = editor.state.doc.nodeAt(prevNodePos - 1);
25
- if (prevNode && prevNode.type.name === "paragraph") {
26
- const endOfParagraphPos = tablePos - prevNode.nodeSize;
27
- editor.chain().setTextSelection(endOfParagraphPos).run();
28
- } else {
29
- return false;
30
- }
31
- }
32
- return true;
33
- } catch (e) {
34
- console.error("failed to insert line above table", e);
35
- return false;
36
- }
37
- };
38
-
39
- export {
40
- insertLineAboveTableAction
41
- };
@@ -1,11 +0,0 @@
1
- "use client";
2
-
3
- // src/table/lib/is-cell-selection.ts
4
- import { CellSelection } from "@tiptap/pm/tables";
5
- function isCellSelection(value) {
6
- return value instanceof CellSelection;
7
- }
8
-
9
- export {
10
- isCellSelection
11
- };
@@ -1,113 +0,0 @@
1
- "use client";
2
- import {
3
- __publicField
4
- } from "./chunk-WKV76XOR.mjs";
5
-
6
- // src/table/lib/table-controls.ts
7
- import { findParentNode } from "@tiptap/core";
8
- import {
9
- Plugin,
10
- PluginKey,
11
- TextSelection
12
- } from "@tiptap/pm/state";
13
- import { Decoration, DecorationSet } from "@tiptap/pm/view";
14
- function tableControls() {
15
- const key = new PluginKey("tableControls");
16
- return new Plugin({
17
- key,
18
- state: {
19
- init() {
20
- return new TableControlsState(key);
21
- },
22
- apply(tr, prev) {
23
- return prev.apply(tr);
24
- }
25
- },
26
- props: {
27
- handleDOMEvents: {
28
- mousemove: (view, event) => {
29
- var _a;
30
- const pluginState = key.getState(view.state);
31
- if (!event.target.closest(".table-node-view") && pluginState.values.hoveredTable) {
32
- return view.dispatch(
33
- view.state.tr.setMeta(key, {
34
- setHoveredTable: null,
35
- setHoveredCell: null
36
- })
37
- );
38
- }
39
- const pos = view.posAtCoords({
40
- left: event.clientX,
41
- top: event.clientY
42
- });
43
- if (!pos || pos.pos < 0 || pos.pos > view.state.doc.content.size)
44
- return;
45
- const table = findParentNode((node) => node.type.name === "table")(
46
- TextSelection.create(view.state.doc, pos.pos)
47
- );
48
- const cell = findParentNode(
49
- (node) => node.type.name === "tableCell" || node.type.name === "tableHeader"
50
- )(TextSelection.create(view.state.doc, pos.pos));
51
- if (!table || !cell) return;
52
- if (((_a = pluginState.values.hoveredCell) == null ? void 0 : _a.pos) !== cell.pos) {
53
- return view.dispatch(
54
- view.state.tr.setMeta(key, {
55
- setHoveredTable: table,
56
- setHoveredCell: cell
57
- })
58
- );
59
- }
60
- }
61
- },
62
- decorations: (state) => {
63
- const pluginState = key.getState(state);
64
- if (!pluginState) {
65
- return null;
66
- }
67
- const { hoveredTable, hoveredCell } = pluginState.values;
68
- const docSize = state.doc.content.size;
69
- if (hoveredTable && hoveredCell && hoveredTable.pos < docSize && hoveredCell.pos < docSize) {
70
- const decorations = [
71
- Decoration.node(
72
- hoveredTable.pos,
73
- hoveredTable.pos + hoveredTable.node.nodeSize,
74
- {},
75
- {
76
- hoveredTable,
77
- hoveredCell
78
- }
79
- )
80
- ];
81
- return DecorationSet.create(state.doc, decorations);
82
- }
83
- return null;
84
- }
85
- }
86
- });
87
- }
88
- var TableControlsState = class {
89
- constructor(key, props = {}) {
90
- __publicField(this, "values");
91
- __publicField(this, "key");
92
- this.key = key;
93
- this.values = {
94
- hoveredTable: null,
95
- hoveredCell: null,
96
- ...props
97
- };
98
- }
99
- apply(tr) {
100
- const actions = tr.getMeta(this.key);
101
- if ((actions == null ? void 0 : actions.setHoveredTable) !== void 0) {
102
- this.values.hoveredTable = actions.setHoveredTable;
103
- }
104
- if ((actions == null ? void 0 : actions.setHoveredCell) !== void 0) {
105
- this.values.hoveredCell = actions.setHoveredCell;
106
- }
107
- return this;
108
- }
109
- };
110
-
111
- export {
112
- tableControls
113
- };
@@ -1,70 +0,0 @@
1
- "use client";
2
-
3
- // src/table-cell.ts
4
- import { mergeAttributes, Node } from "@tiptap/core";
5
- var TableCell = Node.create({
6
- name: "tableCell",
7
- content: "block+",
8
- tableRole: "cell",
9
- isolating: true,
10
- addOptions() {
11
- return {
12
- HTMLAttributes: {}
13
- };
14
- },
15
- parseHTML() {
16
- return [{ tag: "td" }];
17
- },
18
- renderHTML({ node, HTMLAttributes }) {
19
- const attrs = {};
20
- if (node.attrs.align) {
21
- attrs["data-align"] = node.attrs.align;
22
- attrs.style = `text-align: ${node.attrs.align}`;
23
- }
24
- if (node.attrs.backgroundColor) {
25
- attrs["data-background-color"] = node.attrs.backgroundColor;
26
- }
27
- return [
28
- "td",
29
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, attrs),
30
- 0
31
- ];
32
- },
33
- addAttributes() {
34
- return {
35
- colspan: {
36
- default: 1,
37
- parseHTML: (element) => {
38
- const colspan = element.getAttribute("colspan");
39
- return colspan ? Number.parseInt(colspan, 10) : 1;
40
- }
41
- },
42
- rowspan: {
43
- default: 1,
44
- parseHTML: (element) => {
45
- const rowspan = element.getAttribute("rowspan");
46
- return rowspan ? Number.parseInt(rowspan, 10) : 1;
47
- }
48
- },
49
- colwidth: {
50
- default: null,
51
- parseHTML: (element) => {
52
- const colwidth = element.getAttribute("colwidth");
53
- return colwidth ? colwidth.split(",").map((w) => Number.parseInt(w, 10)) : null;
54
- }
55
- },
56
- align: {
57
- default: null,
58
- parseHTML: (element) => element.getAttribute("data-align")
59
- },
60
- backgroundColor: {
61
- default: null,
62
- parseHTML: (element) => element.getAttribute("data-background-color")
63
- }
64
- };
65
- }
66
- });
67
-
68
- export {
69
- TableCell
70
- };
@@ -1,247 +0,0 @@
1
- "use client";
2
- import {
3
- TableRowMenu
4
- } from "./chunk-KNOMCS6F.mjs";
5
- import {
6
- TableColumnMenu
7
- } from "./chunk-QHD3QTD2.mjs";
8
-
9
- // src/table/views/table-node-view.tsx
10
- import { TableMap, updateColumnsOnResize } from "@tiptap/pm/tables";
11
- import {
12
- NodeViewContent,
13
- NodeViewWrapper,
14
- useEditorState
15
- } from "@tiptap/react";
16
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
- import { jsx, jsxs } from "react/jsx-runtime";
18
- function extractHoverInfo(decorations) {
19
- const info = {};
20
- for (const dec of decorations) {
21
- const spec = dec.spec;
22
- if ((spec == null ? void 0 : spec.hoveredCell) !== void 0)
23
- info.hoveredCell = spec.hoveredCell;
24
- if ((spec == null ? void 0 : spec.hoveredTable) !== void 0)
25
- info.hoveredTable = spec.hoveredTable;
26
- }
27
- return info;
28
- }
29
- function TableNodeView({
30
- editor,
31
- node,
32
- decorations,
33
- getPos
34
- }) {
35
- const wrapperRef = useRef(null);
36
- const scrollRef = useRef(null);
37
- const isEditable = useEditorState({
38
- editor,
39
- selector: ({ editor: e }) => {
40
- var _a;
41
- return (_a = e == null ? void 0 : e.isEditable) != null ? _a : false;
42
- }
43
- });
44
- const cellMinWidth = useMemo(() => {
45
- var _a, _b, _c;
46
- return (_c = (_b = (_a = editor.extensionManager.extensions.find((ext) => ext.name === "table")) == null ? void 0 : _a.options) == null ? void 0 : _b.cellMinWidth) != null ? _c : 100;
47
- }, [editor]);
48
- const map = useMemo(() => TableMap.get(node), [node]);
49
- const [isSideHovered, setIsSideHovered] = useState(false);
50
- const [isBottomHovered, setIsBottomHovered] = useState(false);
51
- const { hoveredTable, hoveredCell } = useMemo(
52
- () => extractHoverInfo(decorations),
53
- [decorations]
54
- );
55
- const controlsDisabled = !hoveredTable || !hoveredCell;
56
- useEffect(() => {
57
- var _a;
58
- const table = (_a = scrollRef.current) == null ? void 0 : _a.querySelector("table");
59
- if (!table) return;
60
- let colgroup = table.querySelector("colgroup");
61
- if (!colgroup) {
62
- colgroup = document.createElement("colgroup");
63
- table.insertBefore(colgroup, table.firstChild);
64
- }
65
- const width = map.width;
66
- while (colgroup.children.length < width) {
67
- colgroup.appendChild(document.createElement("col"));
68
- }
69
- while (colgroup.children.length > width) {
70
- if (colgroup.lastChild) colgroup.removeChild(colgroup.lastChild);
71
- }
72
- updateColumnsOnResize(node, colgroup, table, cellMinWidth);
73
- }, [node, map.width, cellMinWidth]);
74
- const [controlPos, setControlPos] = useState(null);
75
- const updatePositions = useCallback(() => {
76
- if (!hoveredCell || !wrapperRef.current) {
77
- setControlPos(null);
78
- return;
79
- }
80
- const cellDom = editor.view.nodeDOM(hoveredCell.pos);
81
- if (!cellDom) {
82
- setControlPos(null);
83
- return;
84
- }
85
- const wrapperRect = wrapperRef.current.getBoundingClientRect();
86
- const cellRect = cellDom.getBoundingClientRect();
87
- setControlPos({
88
- columnLeft: cellRect.left - wrapperRect.left,
89
- columnWidth: cellRect.width,
90
- rowTop: cellRect.top - wrapperRect.top,
91
- rowHeight: cellRect.height
92
- });
93
- }, [hoveredCell, editor.view]);
94
- useEffect(() => {
95
- updatePositions();
96
- const scrollEl = scrollRef.current;
97
- if (!scrollEl) return;
98
- scrollEl.addEventListener("scroll", updatePositions, { passive: true });
99
- return () => scrollEl.removeEventListener("scroll", updatePositions);
100
- }, [updatePositions]);
101
- const handleMouseMove = useCallback(
102
- (e) => {
103
- if (!isEditable) return;
104
- const rect = e.currentTarget.getBoundingClientRect();
105
- const x = e.clientX - rect.left;
106
- const y = e.clientY - rect.top;
107
- const threshold = 50;
108
- setIsSideHovered(x >= rect.width - threshold);
109
- setIsBottomHovered(y >= rect.height - threshold);
110
- },
111
- [isEditable]
112
- );
113
- const handleMouseLeave = useCallback((e) => {
114
- const relatedTarget = e.relatedTarget;
115
- const currentTarget = e.currentTarget;
116
- if (relatedTarget instanceof Node && currentTarget instanceof Node && currentTarget.contains(relatedTarget)) {
117
- return;
118
- }
119
- if (wrapperRef.current && relatedTarget instanceof Node && wrapperRef.current.contains(relatedTarget)) {
120
- return;
121
- }
122
- setIsSideHovered(false);
123
- setIsBottomHovered(false);
124
- }, []);
125
- const focusTable = useCallback(() => {
126
- const pos = getPos();
127
- if (pos === void 0) return false;
128
- try {
129
- const resolvedPos = editor.state.doc.resolve(pos + 1);
130
- const table = resolvedPos.node(1);
131
- if ((table == null ? void 0 : table.type.name) === "table") {
132
- let cellPos = pos + 1;
133
- table.descendants((n, nodePos) => {
134
- if (n.type.name === "tableCell" || n.type.name === "tableHeader") {
135
- cellPos = pos + 1 + nodePos + 1;
136
- return false;
137
- }
138
- return true;
139
- });
140
- editor.chain().focus().setTextSelection(cellPos).run();
141
- return true;
142
- }
143
- } catch {
144
- }
145
- return false;
146
- }, [editor, getPos]);
147
- const handleAddColumn = useCallback(() => {
148
- if (focusTable()) {
149
- editor.chain().addColumnAfter().run();
150
- } else {
151
- editor.chain().focus().addColumnAfter().run();
152
- }
153
- }, [editor, focusTable]);
154
- const handleAddRow = useCallback(() => {
155
- if (focusTable()) {
156
- editor.chain().addRowAfter().run();
157
- } else {
158
- editor.chain().focus().addRowAfter().run();
159
- }
160
- }, [editor, focusTable]);
161
- return /* @__PURE__ */ jsxs(
162
- NodeViewWrapper,
163
- {
164
- ref: wrapperRef,
165
- className: [
166
- "table-node-view pr-6 pb-6",
167
- controlsDisabled ? "controls--disabled" : ""
168
- ].join(" "),
169
- onMouseEnter: handleMouseMove,
170
- onMouseMove: handleMouseMove,
171
- onMouseLeave: handleMouseLeave,
172
- "data-type": "table",
173
- children: [
174
- isEditable && /* @__PURE__ */ jsxs("div", { className: "table-controls", contentEditable: false, children: [
175
- /* @__PURE__ */ jsx(
176
- "div",
177
- {
178
- className: "rows-control",
179
- style: controlPos ? {
180
- top: `${controlPos.rowTop}px`,
181
- height: `${controlPos.rowHeight}px`
182
- } : void 0,
183
- children: /* @__PURE__ */ jsx(TableRowMenu, { editor, cellPos: hoveredCell == null ? void 0 : hoveredCell.pos })
184
- }
185
- ),
186
- /* @__PURE__ */ jsx(
187
- "div",
188
- {
189
- className: "columns-control",
190
- style: controlPos ? {
191
- left: `${controlPos.columnLeft}px`,
192
- width: `${controlPos.columnWidth}px`
193
- } : void 0,
194
- children: /* @__PURE__ */ jsx(TableColumnMenu, { editor, cellPos: hoveredCell == null ? void 0 : hoveredCell.pos })
195
- }
196
- )
197
- ] }),
198
- /* @__PURE__ */ jsx(
199
- "div",
200
- {
201
- ref: scrollRef,
202
- className: "table-wrapper horizontal-scrollbar scrollbar-md",
203
- children: /* @__PURE__ */ jsx(NodeViewContent, { as: "table" })
204
- }
205
- ),
206
- isEditable && isSideHovered && /* @__PURE__ */ jsx(
207
- "div",
208
- {
209
- className: "absolute -right-6 top-0 h-full flex items-center",
210
- contentEditable: false,
211
- children: /* @__PURE__ */ jsx(
212
- "button",
213
- {
214
- type: "button",
215
- className: "w-4 h-full hover:bg-accent cursor-pointer flex items-center justify-center rounded-sm transition-colors text-muted-foreground text-xs",
216
- onClick: handleAddColumn,
217
- "aria-label": "Add column",
218
- children: "+"
219
- }
220
- )
221
- }
222
- ),
223
- isEditable && isBottomHovered && /* @__PURE__ */ jsx(
224
- "div",
225
- {
226
- className: "absolute -bottom-6 left-0 w-full flex justify-center",
227
- contentEditable: false,
228
- children: /* @__PURE__ */ jsx(
229
- "button",
230
- {
231
- type: "button",
232
- className: "h-4 w-full hover:bg-accent cursor-pointer flex items-center justify-center rounded-sm transition-colors text-muted-foreground text-xs",
233
- onClick: handleAddRow,
234
- "aria-label": "Add row",
235
- children: "+"
236
- }
237
- )
238
- }
239
- )
240
- ]
241
- }
242
- );
243
- }
244
-
245
- export {
246
- TableNodeView
247
- };
@@ -1,20 +0,0 @@
1
- "use client";
2
-
3
- // src/table-row.ts
4
- import { TableRow as TiptapTableRow } from "@tiptap/extension-table";
5
- var TableRow = TiptapTableRow.extend({
6
- content: "(tableCell | tableHeader)*",
7
- addOptions() {
8
- var _a;
9
- return {
10
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
11
- HTMLAttributes: {
12
- class: "min-w-full"
13
- }
14
- };
15
- }
16
- });
17
-
18
- export {
19
- TableRow
20
- };
@@ -1,40 +0,0 @@
1
- "use client";
2
-
3
- // src/table/lib/insert-line-below-table-action.ts
4
- import { findParentNodeOfType } from "@kopexa/editor-utils";
5
- var insertLineBelowTableAction = ({
6
- editor
7
- }) => {
8
- if (!editor.isActive("table")) return false;
9
- try {
10
- const { selection } = editor.state;
11
- const tableNode = findParentNodeOfType(selection, "table");
12
- if (!tableNode) return false;
13
- const tablePos = tableNode.pos;
14
- const table = tableNode.node;
15
- const rowCount = table.childCount;
16
- const lastRow = table.child(rowCount - 1);
17
- const selectionPath = selection.$anchor.path;
18
- const selectionInLastRow = selectionPath.includes(lastRow);
19
- if (!selectionInLastRow) return false;
20
- const nextNodePos = tablePos + table.nodeSize;
21
- const nextNode = editor.state.doc.nodeAt(nextNodePos);
22
- if (nextNode && nextNode.type.name === "paragraph") {
23
- const endOfParagraphPos = nextNodePos + nextNode.nodeSize - 1;
24
- editor.chain().setTextSelection(endOfParagraphPos).run();
25
- } else if (!nextNode) {
26
- editor.chain().insertContentAt(nextNodePos, { type: "paragraph" }).run();
27
- editor.chain().setTextSelection(nextNodePos + 1).run();
28
- } else {
29
- return false;
30
- }
31
- return true;
32
- } catch (e) {
33
- console.error("failed to insert line above table", e);
34
- return false;
35
- }
36
- };
37
-
38
- export {
39
- insertLineBelowTableAction
40
- };
@@ -1,57 +0,0 @@
1
- "use client";
2
-
3
- // src/table/views/table-row-menu.tsx
4
- import { DropdownMenu } from "@kopexa/dropdown-menu";
5
- import { toggleHeaderRow as pmToggleHeaderRow } from "@tiptap/pm/tables";
6
- import { useCallback, useState } from "react";
7
- import { jsx, jsxs } from "react/jsx-runtime";
8
- function TableRowMenu({ editor, cellPos, style }) {
9
- const [open, setOpen] = useState(false);
10
- const chainAtCell = useCallback(() => {
11
- const chain = editor.chain().focus();
12
- if (cellPos != null) {
13
- return chain.setTextSelection(cellPos + 1);
14
- }
15
- return chain;
16
- }, [editor, cellPos]);
17
- const handleToggleHeader = useCallback(() => {
18
- chainAtCell().command(({ state, dispatch }) => pmToggleHeaderRow(state, dispatch)).run();
19
- setOpen(false);
20
- }, [chainAtCell]);
21
- const handleAddAbove = useCallback(() => {
22
- chainAtCell().addRowBefore().run();
23
- setOpen(false);
24
- }, [chainAtCell]);
25
- const handleAddBelow = useCallback(() => {
26
- chainAtCell().addRowAfter().run();
27
- setOpen(false);
28
- }, [chainAtCell]);
29
- const handleDelete = useCallback(() => {
30
- chainAtCell().deleteRow().run();
31
- setOpen(false);
32
- }, [chainAtCell]);
33
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
34
- /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
35
- "button",
36
- {
37
- type: "button",
38
- className: "rows-control-div",
39
- "aria-label": "Row actions",
40
- style
41
- }
42
- ) }),
43
- /* @__PURE__ */ jsxs(DropdownMenu.Content, { children: [
44
- /* @__PURE__ */ jsxs(DropdownMenu.Group, { children: [
45
- /* @__PURE__ */ jsx(DropdownMenu.Item, { onSelect: handleToggleHeader, children: "Toggle header row" }),
46
- /* @__PURE__ */ jsx(DropdownMenu.Item, { onSelect: handleAddAbove, children: "Insert row above" }),
47
- /* @__PURE__ */ jsx(DropdownMenu.Item, { onSelect: handleAddBelow, children: "Insert row below" })
48
- ] }),
49
- /* @__PURE__ */ jsx(DropdownMenu.Separator, {}),
50
- /* @__PURE__ */ jsx(DropdownMenu.Item, { variant: "destructive", onSelect: handleDelete, children: "Delete row" })
51
- ] })
52
- ] });
53
- }
54
-
55
- export {
56
- TableRowMenu
57
- };
@@ -1,92 +0,0 @@
1
- "use client";
2
- import {
3
- TableNodeView
4
- } from "./chunk-GHOJLOCF.mjs";
5
- import {
6
- insertLineAboveTableAction
7
- } from "./chunk-3XEOCAHB.mjs";
8
- import {
9
- insertLineBelowTableAction
10
- } from "./chunk-KLUH6EZS.mjs";
11
- import {
12
- tableControls
13
- } from "./chunk-BTJ3DCGC.mjs";
14
-
15
- // src/table/table.ts
16
- import { Table as TiptapTable } from "@tiptap/extension-table";
17
- import { columnResizing, tableEditing } from "@tiptap/pm/tables";
18
- import { ReactNodeViewRenderer } from "@tiptap/react";
19
- var Table = TiptapTable.extend({
20
- addOptions() {
21
- var _a;
22
- return {
23
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
24
- HTMLAttributes: {},
25
- resizable: true,
26
- handleWidth: 5,
27
- cellMinWidth: 100,
28
- lastColumnResizable: true,
29
- allowTableNodeSelection: true,
30
- renderWrapper: true,
31
- View: null
32
- };
33
- },
34
- addKeyboardShortcuts() {
35
- var _a;
36
- return {
37
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
38
- Tab: () => {
39
- if (this.editor.isActive("table")) {
40
- if (this.editor.isActive("listItem") || this.editor.isActive("taskItem")) {
41
- return false;
42
- }
43
- if (this.editor.commands.goToNextCell()) {
44
- return true;
45
- }
46
- if (!this.editor.can().addRowAfter()) {
47
- return false;
48
- }
49
- return this.editor.chain().addRowAfter().goToNextCell().run();
50
- }
51
- return false;
52
- },
53
- ArrowDown: insertLineBelowTableAction,
54
- ArrowUp: insertLineAboveTableAction
55
- };
56
- },
57
- addNodeView() {
58
- return ReactNodeViewRenderer(TableNodeView, {
59
- contentDOMElementTag: "tbody",
60
- stopEvent: ({ event }) => {
61
- const target = event.target;
62
- if (target.closest("button, [role='button'], input, a")) {
63
- return true;
64
- }
65
- return false;
66
- }
67
- });
68
- },
69
- addProseMirrorPlugins() {
70
- const isResizable = this.options.resizable && this.editor.isEditable;
71
- const plugins = [
72
- tableEditing({
73
- allowTableNodeSelection: this.options.allowTableNodeSelection
74
- }),
75
- tableControls()
76
- ];
77
- if (isResizable) {
78
- plugins.unshift(
79
- columnResizing({
80
- handleWidth: this.options.handleWidth,
81
- cellMinWidth: this.options.cellMinWidth,
82
- lastColumnResizable: this.options.lastColumnResizable
83
- })
84
- );
85
- }
86
- return plugins;
87
- }
88
- });
89
-
90
- export {
91
- Table
92
- };