@domternal/extension-table 0.2.0
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/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/index.cjs +1734 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +273 -0
- package/dist/index.d.ts +273 -0
- package/dist/index.js +1719 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers/constrainedColumn.ts","../src/icons.ts","../src/TableView.ts","../src/helpers/createTable.ts","../src/helpers/deleteTableWhenAllCellsSelected.ts","../src/plugins/resizeSuppressionPlugin.ts","../src/plugins/cellSelectionPlugin.ts","../src/TableRow.ts","../src/helpers/cellAttributes.ts","../src/TableCell.ts","../src/TableHeader.ts","../src/Table.ts"],"names":["TableMap","CellSelection","TextSelection","Plugin","Node","deleteTable","addRowBefore","addRowAfter","isInTable","selectedRect","deleteRow","addColumnBefore","addColumnAfter","deleteColumn","toggleHeaderCell","mergeCells","splitCell","setCellAttr"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared helpers for constraining table columns within container width.\n *\n * Used by both Table.ts (editor commands) and TableView.ts (dropdown)\n * to prevent add-column operations from causing table overflow.\n */\n\nimport type { EditorState, Transaction } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { TableMap } from '@domternal/pm/tables';\n\nexport interface TableInfo {\n tableStart: number;\n oldWidths: number[];\n allFrozen: boolean;\n}\n\n/**\n * Read table metadata from the current selection.\n * Returns null if the cursor is not inside a table.\n */\nexport function getTableInfo(state: EditorState): TableInfo | null {\n const $from = state.selection.$from;\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n if (node.type.name !== 'table') continue;\n\n const tableStart = $from.start(d);\n const map = TableMap.get(node);\n const oldWidths: number[] = [];\n let allFrozen = true;\n\n for (let col = 0; col < map.width; col++) {\n const cellOffset = map.map[col] ?? 0;\n const cell = node.nodeAt(cellOffset);\n if (!cell) { allFrozen = false; oldWidths.push(0); continue; }\n\n const colInCell = col - map.colCount(cellOffset);\n const colwidth = cell.attrs['colwidth'] as number[] | null;\n const w = colwidth?.[colInCell];\n if (w) {\n oldWidths.push(w);\n } else {\n allFrozen = false;\n oldWidths.push(0);\n }\n }\n\n return { tableStart, oldWidths, allFrozen };\n }\n return null;\n}\n\n/**\n * Walk up from a position inside a table to find the TABLE element in the DOM.\n * Returns null if the DOM is unavailable.\n */\nexport function findTableDom(view: EditorView, tableStart: number): HTMLTableElement | null {\n try {\n let node = view.domAtPos(tableStart).node as HTMLElement | null;\n while (node && node.nodeName !== 'TABLE') {\n node = node.parentNode as HTMLElement | null;\n }\n return node as HTMLTableElement | null;\n } catch { return null; }\n}\n\n/**\n * Measure the container (.tableWrapper) width from the DOM.\n * Subtracts 1 for the collapsed outer border (border-collapse adds ~1px\n * to table.offsetWidth beyond the sum of colwidths).\n * Returns 0 if the DOM is unavailable.\n */\nexport function getContainerWidth(view: EditorView, tableStart: number): number {\n const tableDom = findTableDom(view, tableStart);\n const wrapper = tableDom?.closest('.tableWrapper') as HTMLElement | null;\n if (wrapper) return Math.floor(wrapper.getBoundingClientRect().width) - 1;\n return 0;\n}\n\n/**\n * Redistribute all column widths equally in a captured transaction.\n * Modifies the transaction in-place.\n */\nexport function redistributeColumns(\n tr: Transaction,\n tableStartPos: number,\n targetWidth: number,\n cellMinWidth: number,\n): void {\n // Resolve the table in the new (post-addColumn) document\n const $pos = tr.doc.resolve(tableStartPos);\n let tableDepth = -1;\n for (let d = $pos.depth; d > 0; d--) {\n if ($pos.node(d).type.name === 'table') {\n tableDepth = d;\n break;\n }\n }\n if (tableDepth === -1) return;\n\n const table = $pos.node(tableDepth);\n const tableStart = $pos.start(tableDepth);\n const map = TableMap.get(table);\n const colCount = map.width;\n\n // Equal distribution, clamped at cellMinWidth\n const baseWidth = Math.max(cellMinWidth, Math.floor(targetWidth / colCount));\n const newWidths: number[] = new Array(colCount).fill(baseWidth) as number[];\n\n // Adjust last column for rounding remainder\n const used = baseWidth * colCount;\n const diff = targetWidth - used;\n if (diff !== 0 && colCount > 0) {\n const lastIdx = colCount - 1;\n newWidths[lastIdx] = Math.max(cellMinWidth, (newWidths[lastIdx] ?? baseWidth) + diff);\n }\n\n // Apply widths to all cells via setNodeMarkup\n for (let col = 0; col < map.width; col++) {\n const targetW = newWidths[col]!;\n for (let row = 0; row < map.height; row++) {\n const mapIndex = row * map.width + col;\n // Skip if same cell as row above (rowspan)\n if (row > 0 && map.map[mapIndex] === map.map[mapIndex - map.width]) continue;\n\n const pos = map.map[mapIndex] ?? 0;\n const cellNode = table.nodeAt(pos);\n if (!cellNode) continue;\n\n const colspan = (cellNode.attrs['colspan'] as number) || 1;\n const index = colspan === 1 ? 0 : col - map.colCount(pos);\n const colwidth = cellNode.attrs['colwidth'] as number[] | null;\n\n if (colwidth?.[index] === targetW) continue;\n\n const newColwidth = colwidth ? colwidth.slice() : new Array(colspan).fill(0) as number[];\n newColwidth[index] = targetW;\n tr.setNodeMarkup(tableStart + pos, null, { ...cellNode.attrs, colwidth: newColwidth });\n }\n }\n}\n\ntype PMCommand = (\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n) => boolean;\n\n/**\n * Execute an addColumn command with container constraint.\n * If columns are frozen and adding would overflow, redistributes.\n * Otherwise delegates to the PM command normally.\n */\nexport function constrainedAddColumn(\n pmCommand: PMCommand,\n view: EditorView,\n cellMinWidth: number,\n defaultCellMinWidth: number,\n): boolean {\n const state = view.state;\n const info = getTableInfo(state);\n\n if (!info?.allFrozen) {\n return pmCommand(state, view.dispatch.bind(view));\n }\n\n const containerWidth = getContainerWidth(view, info.tableStart);\n if (containerWidth <= 0) {\n return pmCommand(state, view.dispatch.bind(view));\n }\n\n const oldTotal = info.oldWidths.reduce((a, b) => a + b, 0);\n // If table + new min column still fits, let PM handle normally\n if (oldTotal + defaultCellMinWidth <= containerWidth) {\n return pmCommand(state, view.dispatch.bind(view));\n }\n\n // Would overflow — capture transaction, redistribute, then dispatch\n let captured: Transaction | undefined;\n pmCommand(state, (tr) => { captured = tr; });\n if (!captured) return false;\n\n redistributeColumns(captured, info.tableStart, Math.min(oldTotal, containerWidth), cellMinWidth);\n view.dispatch(captured);\n return true;\n}\n","// Table SVG Icons & Colors\n// Extracted from TableView for readability.\n\n// Handle buttons (three dots)\nexport const DOTS_H =\n '<svg width=\"10\" height=\"4\" viewBox=\"0 0 10 4\"><circle cx=\"2\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"8\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/></svg>';\nexport const DOTS_V =\n '<svg width=\"4\" height=\"10\" viewBox=\"0 0 4 10\"><circle cx=\"2\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"2\" cy=\"5\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"2\" cy=\"8\" r=\"1.2\" fill=\"currentColor\"/></svg>';\n\n// Chevron-down for dropdown buttons\nexport const CHEVRON_DOWN =\n '<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 2.5l3 3 3-3\"/></svg>';\n\n// Cell toolbar icons (16×16 Phosphor-style)\nexport const ICON_COLOR =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\"/></svg>';\nexport const ICON_ALIGNMENT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z\"/></svg>';\nexport const ICON_HEADER =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H48V48H208V208ZM72,96V80a8,8,0,0,1,16,0V96a8,8,0,0,1-16,0Zm96,0V80a8,8,0,0,1,16,0V96a8,8,0,0,1-16,0Zm-48,0V80a8,8,0,0,1,16,0V96a8,8,0,0,1-16,0Z\"/></svg>';\n\n// Merge/split icons (16×16)\nexport const ICON_MERGE =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,16V96H136V56ZM56,56h64V96H56ZM56,200V112H200v88Z\"/></svg>';\nexport const ICON_SPLIT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,16V96H136V56ZM56,56h64V96H56ZM56,136V112h64v24Zm0,64V152h64v48Zm144,0H136V152h64Zm0-48H136V112h64Z\"/></svg>';\n\n// Horizontal alignment icons (Phosphor, 16×16)\nexport const ICON_ALIGN_LEFT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z\"/></svg>';\nexport const ICON_ALIGN_CENTER =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM64,96a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Zm152,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-24,40H64a8,8,0,0,0,0,16H192a8,8,0,0,0,0-16Z\"/></svg>';\nexport const ICON_ALIGN_RIGHT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64ZM216,96H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,40H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\"/></svg>';\n\n// Vertical alignment icons (16×16)\nexport const ICON_ALIGN_TOP =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M40,40H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88,16a8,8,0,0,0-8,8v96a8,8,0,0,0,16,0V64A8,8,0,0,0,128,56Zm40,16a8,8,0,0,0-8,8v64a8,8,0,0,0,16,0V80A8,8,0,0,0,168,72ZM88,72a8,8,0,0,0-8,8v64a8,8,0,0,0,16,0V80A8,8,0,0,0,88,72Z\"/></svg>';\nexport const ICON_ALIGN_MIDDLE =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M40,136H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88-80a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V64A8,8,0,0,0,128,56Zm0,104a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V168A8,8,0,0,0,128,160Zm40-80a8,8,0,0,0-8,8v16a8,8,0,0,0,16,0V88A8,8,0,0,0,168,80Zm0,56a8,8,0,0,0-8,8v16a8,8,0,0,0,16,0V144A8,8,0,0,0,168,136ZM88,80a8,8,0,0,0-8,8v16a8,8,0,0,0,16,0V88A8,8,0,0,0,88,80Zm0,56a8,8,0,0,0-8,8v16a8,8,0,0,0,16,0V144A8,8,0,0,0,88,136Z\"/></svg>';\nexport const ICON_ALIGN_BOTTOM =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M40,232H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88-32a8,8,0,0,0,8-8V96a8,8,0,0,0-16,0v96A8,8,0,0,0,128,200Zm40-16a8,8,0,0,0,8-8V112a8,8,0,0,0-16,0v64A8,8,0,0,0,168,184ZM88,184a8,8,0,0,0,8-8V112a8,8,0,0,0-16,0v64A8,8,0,0,0,88,184Z\"/></svg>';\n\n// Cell handle icon (2×2 grid dots)\nexport const CELL_ICON =\n '<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\"><circle cx=\"2\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"6\" cy=\"2\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"2\" cy=\"6\" r=\"1.2\" fill=\"currentColor\"/><circle cx=\"6\" cy=\"6\" r=\"1.2\" fill=\"currentColor\"/></svg>';\n\n// Row/column handle dropdown icons (Phosphor, 16×16)\nexport const ICON_ROW_PLUS_TOP =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,160H48a16,16,0,0,0-16,16v24a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V176A16,16,0,0,0,208,160Zm0,40H48V176H208v24Zm0-112H48a16,16,0,0,0-16,16v24a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104A16,16,0,0,0,208,88Zm0,40H48V104H208v24ZM96,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H136V64a8,8,0,0,1-16,0V48H104A8,8,0,0,1,96,40Z\"/></svg>';\nexport const ICON_ROW_PLUS_BOTTOM =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,112H48a16,16,0,0,0-16,16v24a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V128A16,16,0,0,0,208,112Zm0,40H48V128H208v24Zm0-112H48A16,16,0,0,0,32,56V80A16,16,0,0,0,48,96H208a16,16,0,0,0,16-16V56A16,16,0,0,0,208,40Zm0,40H48V56H208V80ZM160,216a8,8,0,0,1-8,8H136v16a8,8,0,0,1-16,0V224H104a8,8,0,0,1,0-16h16V192a8,8,0,0,1,16,0v16h16A8,8,0,0,1,160,216Z\"/></svg>';\nexport const ICON_DELETE_ROW =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M208,136H48a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V152A16,16,0,0,0,208,136Zm0,56H48V152H208v40Zm0-144H48A16,16,0,0,0,32,64v40a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V64A16,16,0,0,0,208,48Zm0,56H48V64H208v40Z\"/></svg>';\nexport const ICON_COL_PLUS_LEFT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M128,32H104A16,16,0,0,0,88,48V208a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V48A16,16,0,0,0,128,32Zm0,176H104V48h24ZM200,32H176a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm0,176H176V48h24ZM72,128a8,8,0,0,1-8,8H48v16a8,8,0,0,1-16,0V136H16a8,8,0,0,1,0-16H32V104a8,8,0,0,1,16,0v16H64A8,8,0,0,1,72,128Z\"/></svg>';\nexport const ICON_COL_PLUS_RIGHT =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M80,32H56A16,16,0,0,0,40,48V208a16,16,0,0,0,16,16H80a16,16,0,0,0,16-16V48A16,16,0,0,0,80,32Zm0,176H56V48H80ZM152,32H128a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h24a16,16,0,0,0,16-16V48A16,16,0,0,0,152,32Zm0,176H128V48h24Zm96-80a8,8,0,0,1-8,8H224v16a8,8,0,0,1-16,0V136H192a8,8,0,0,1,0-16h16V104a8,8,0,0,1,16,0v16h16A8,8,0,0,1,248,128Z\"/></svg>';\nexport const ICON_DELETE_COL =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 256 256\" fill=\"currentColor\"><path d=\"M104,32H64A16,16,0,0,0,48,48V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,104,32Zm0,176H64V48h40ZM192,32H152a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,192,32Zm0,176H152V48h40Z\"/></svg>';\n\n// Default cell background colors (4 rows × 4 columns)\nexport const CELL_COLORS = [\n // Row 1 — Warm highlights\n '#fef08a', '#fed7aa', '#fecaca', '#fbcfe8',\n // Row 2 — Cool highlights\n '#a7f3d0', '#a5f3fc', '#bfdbfe', '#c4b5fd',\n // Row 3 — Light pastels\n '#fef9c3', '#ffedd5', '#dbeafe', '#ede9fe',\n // Row 4 — Neutrals\n '#e5e7eb', '#d1d5db', '#f3f4f6', '#ffffff',\n];\n","/**\n * TableView - Custom NodeView for table rendering\n *\n * Creates: div.dm-table-container > [handles] + div.tableWrapper > table > colgroup + tbody\n * - Container enables row/column hover controls (handles with dropdown menus)\n * - Wrapper div enables horizontal scrolling for wide tables\n * - Colgroup reflects column widths from the columnResizing plugin\n * - ContentDOM = tbody (ProseMirror renders row content into tbody)\n */\n\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { EditorView, NodeView } from '@domternal/pm/view';\nimport { TextSelection } from '@domternal/pm/state';\nimport {\n TableMap,\n CellSelection,\n addRowBefore,\n addRowAfter,\n deleteRow,\n addColumnBefore,\n addColumnAfter,\n deleteColumn,\n deleteTable,\n mergeCells,\n splitCell,\n setCellAttr,\n toggleHeaderCell,\n isInTable,\n selectedRect,\n} from '@domternal/pm/tables';\n\nimport { constrainedAddColumn } from './helpers/constrainedColumn.js';\n\nimport {\n DOTS_H, DOTS_V, CHEVRON_DOWN,\n ICON_COLOR, ICON_ALIGNMENT, ICON_HEADER, ICON_MERGE, ICON_SPLIT,\n ICON_ALIGN_LEFT, ICON_ALIGN_CENTER, ICON_ALIGN_RIGHT,\n ICON_ALIGN_TOP, ICON_ALIGN_MIDDLE, ICON_ALIGN_BOTTOM,\n ICON_ROW_PLUS_TOP, ICON_ROW_PLUS_BOTTOM, ICON_DELETE_ROW,\n ICON_COL_PLUS_LEFT, ICON_COL_PLUS_RIGHT, ICON_DELETE_COL,\n CELL_ICON, CELL_COLORS,\n} from './icons.js';\n\ntype PMCommand = (\n state: Parameters<typeof addRowBefore>[0],\n dispatch?: Parameters<typeof addRowBefore>[1],\n) => boolean;\n\n/** Type-safe lookup from container DOM element → TableView instance. */\nexport const tableViewMap = new WeakMap<HTMLElement, TableView>();\n\nexport class TableView implements NodeView {\n node: PMNode;\n cellMinWidth: number;\n defaultCellMinWidth: number;\n view: EditorView;\n constrainToContainer: boolean;\n\n dom: HTMLElement;\n table: HTMLTableElement;\n colgroup: HTMLTableColElement;\n contentDOM: HTMLElement;\n\n private wrapper: HTMLElement;\n private colHandle: HTMLButtonElement;\n private rowHandle: HTMLButtonElement;\n private cellToolbar: HTMLElement;\n private colorBtn: HTMLButtonElement | null = null;\n private alignBtn: HTMLButtonElement | null = null;\n private mergeBtn: HTMLButtonElement | null = null;\n private splitBtn: HTMLButtonElement | null = null;\n private headerBtn: HTMLButtonElement | null = null;\n private cellHandle: HTMLButtonElement;\n private cellHandleCell: HTMLTableCellElement | null = null;\n private dropdown: HTMLElement | null = null;\n /** When true, the plugin skips showing the cell toolbar (row/col dropdown is open). */\n suppressCellToolbar = false;\n /** When true, column resize drag is active — all handles/menus are hidden. */\n private _resizeDragging = false;\n\n private hoveredCell: HTMLTableCellElement | null = null;\n private hoveredRow = -1;\n private hoveredCol = -1;\n private hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Bound handlers for cleanup\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseLeave: () => void;\n private boundCancelHide: () => void;\n private boundDocMouseDown: (e: MouseEvent) => void;\n private boundDocKeyDown: (e: KeyboardEvent) => void;\n private boundScroll: () => void;\n\n constructor(node: PMNode, cellMinWidth: number, view: EditorView, defaultCellMinWidth = 100, constrainToContainer = true) {\n this.node = node;\n this.cellMinWidth = cellMinWidth;\n this.defaultCellMinWidth = defaultCellMinWidth;\n this.view = view;\n this.constrainToContainer = constrainToContainer;\n\n // Bind handlers\n this.boundMouseMove = this.onMouseMove.bind(this);\n this.boundMouseLeave = this.onMouseLeave.bind(this);\n this.boundCancelHide = this.cancelHide.bind(this);\n this.boundDocMouseDown = this.onDocMouseDown.bind(this);\n this.boundDocKeyDown = this.onDocKeyDown.bind(this);\n this.boundScroll = () => { this.closeDropdown(); };\n // Create outer container (position: relative, overflow: visible)\n this.dom = document.createElement('div');\n this.dom.className = 'dm-table-container';\n tableViewMap.set(this.dom, this);\n\n // Create column handle\n this.colHandle = this.createHandle('dm-table-col-handle', 'Column options', DOTS_H);\n this.colHandle.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onColClick();\n });\n this.dom.appendChild(this.colHandle);\n\n // Create row handle\n this.rowHandle = this.createHandle('dm-table-row-handle', 'Row options', DOTS_V);\n this.rowHandle.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onRowClick();\n });\n this.dom.appendChild(this.rowHandle);\n\n // Create cell toolbar (floating strip, shown by plugin when CellSelection is active)\n this.cellToolbar = this.buildCellToolbar();\n this.dom.appendChild(this.cellToolbar);\n\n // Create cell handle (small circle — appears when cursor is in a cell)\n this.cellHandle = document.createElement('button');\n this.cellHandle.type = 'button';\n this.cellHandle.className = 'dm-table-cell-handle';\n this.cellHandle.setAttribute('aria-label', 'Cell options');\n this.cellHandle.innerHTML = CELL_ICON;\n this.cellHandle.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n this.cellHandle.addEventListener('click', (e) => {\n e.stopPropagation();\n this.onCellHandleClick();\n });\n this.dom.appendChild(this.cellHandle);\n\n // Create wrapper div (overflow-x: auto for horizontal scrolling)\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'tableWrapper';\n this.dom.appendChild(this.wrapper);\n\n // Create table\n this.table = document.createElement('table');\n this.wrapper.appendChild(this.table);\n\n // Create colgroup\n this.colgroup = document.createElement('colgroup');\n this.updateColumns(node);\n this.table.appendChild(this.colgroup);\n\n // Create tbody (contentDOM)\n this.contentDOM = document.createElement('tbody');\n this.table.appendChild(this.contentDOM);\n\n // Hover tracking\n this.dom.addEventListener('mousemove', this.boundMouseMove);\n this.dom.addEventListener('mouseleave', this.boundMouseLeave);\n this.colHandle.addEventListener('mouseenter', this.boundCancelHide);\n this.rowHandle.addEventListener('mouseenter', this.boundCancelHide);\n this.cellHandle.addEventListener('mouseenter', this.boundCancelHide);\n }\n\n // ─── NodeView interface ───────────────────────────────────────────────\n\n update(node: PMNode): boolean {\n if (node.type !== this.node.type) {\n return false;\n }\n this.node = node;\n this.updateColumns(node);\n\n // Reset stale hover references (handles reposition on next mousemove)\n this.hoveredCell = null;\n this.hoveredRow = -1;\n this.hoveredCol = -1;\n\n if (this.cellHandleCell && !this.table.contains(this.cellHandleCell)) {\n this.hideCellHandle();\n }\n\n return true;\n }\n\n destroy(): void {\n this.dom.removeEventListener('mousemove', this.boundMouseMove);\n this.dom.removeEventListener('mouseleave', this.boundMouseLeave);\n this.colHandle.removeEventListener('mouseenter', this.boundCancelHide);\n this.rowHandle.removeEventListener('mouseenter', this.boundCancelHide);\n this.cellHandle.removeEventListener('mouseenter', this.boundCancelHide);\n this.closeDropdown();\n if (this.hideTimeout) clearTimeout(this.hideTimeout);\n tableViewMap.delete(this.dom);\n }\n\n ignoreMutation(mutation: MutationRecord | { type: 'selection' }): boolean {\n if (mutation.type === 'selection') {\n return false;\n }\n\n // Ignore attribute mutations (style changes from updateColumns, selectedCell, etc.)\n if (mutation.type === 'attributes') {\n return true;\n }\n\n // Ignore mutations outside contentDOM (handles, dropdown, colgroup, container itself)\n if (mutation instanceof MutationRecord && !this.contentDOM.contains(mutation.target)) {\n return true;\n }\n\n return false;\n }\n\n // ─── Handle creation ──────────────────────────────────────────────────\n\n private createHandle(className: string, label: string, icon: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = className;\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = icon;\n btn.addEventListener('mousedown', (e) => {\n e.preventDefault(); // prevent editor blur\n e.stopPropagation();\n });\n return btn;\n }\n\n // ─── Cell toolbar (floating strip for CellSelection) ──────────────────\n\n private buildCellToolbar(): HTMLElement {\n const toolbar = document.createElement('div');\n toolbar.className = 'dm-table-cell-toolbar';\n toolbar.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n\n // Color button (with dropdown)\n this.colorBtn = this.createToolbarButton(ICON_COLOR, 'Cell color', CHEVRON_DOWN);\n this.colorBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.colorBtn) this.showColorDropdown(this.colorBtn);\n });\n toolbar.appendChild(this.colorBtn);\n\n // Alignment button (with dropdown)\n this.alignBtn = this.createToolbarButton(ICON_ALIGNMENT, 'Alignment', CHEVRON_DOWN);\n this.alignBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.alignBtn) this.showAlignmentDropdown(this.alignBtn);\n });\n toolbar.appendChild(this.alignBtn);\n\n // Separator\n const sep1 = document.createElement('span');\n sep1.className = 'dm-table-cell-toolbar-sep';\n toolbar.appendChild(sep1);\n\n // Merge cells button\n this.mergeBtn = this.createToolbarButton(ICON_MERGE, 'Merge cells');\n this.mergeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n mergeCells(this.view.state, this.view.dispatch);\n });\n toolbar.appendChild(this.mergeBtn);\n\n // Split cell button\n this.splitBtn = this.createToolbarButton(ICON_SPLIT, 'Split cell');\n this.splitBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n splitCell(this.view.state, this.view.dispatch);\n });\n toolbar.appendChild(this.splitBtn);\n\n // Separator\n const sep2 = document.createElement('span');\n sep2.className = 'dm-table-cell-toolbar-sep';\n toolbar.appendChild(sep2);\n\n // Toggle header button (direct action, no dropdown)\n this.headerBtn = this.createToolbarButton(ICON_HEADER, 'Toggle header cell');\n this.headerBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n toggleHeaderCell(this.view.state, this.view.dispatch);\n });\n toolbar.appendChild(this.headerBtn);\n\n return toolbar;\n }\n\n private createToolbarButton(icon: string, label: string, chevron?: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-table-cell-toolbar-btn';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = icon + (chevron ? `<span class=\"dm-table-cell-toolbar-chevron\">${chevron}</span>` : '');\n return btn;\n }\n\n // ─── Hover tracking ──────────────────────────────────────────────────\n\n private onMouseMove(e: MouseEvent): void {\n if (this._resizeDragging) return;\n\n const target = e.target;\n if (!(target instanceof HTMLElement)) return;\n\n const cell = target.closest<HTMLTableCellElement>('td, th');\n if (!cell || !this.table.contains(cell)) return;\n if (cell === this.hoveredCell) return;\n\n this.hoveredCell = cell;\n const { row, col } = this.getCellIndices(cell);\n this.hoveredRow = row;\n this.hoveredCol = col;\n this.positionHandles(cell);\n this.showHandles();\n this.cancelHide();\n }\n\n private onMouseLeave(): void {\n if (this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = setTimeout(() => {\n this.hideHandles();\n this.hoveredCell = null;\n }, 200);\n }\n\n private cancelHide(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n\n private showHandles(): void {\n this.colHandle.style.display = 'flex';\n this.rowHandle.style.display = 'flex';\n }\n\n private hideHandles(): void {\n if (this.dropdown) return; // keep visible while dropdown is open\n this.colHandle.style.display = '';\n this.rowHandle.style.display = '';\n }\n\n private positionHandles(cell: HTMLTableCellElement): void {\n const containerRect = this.dom.getBoundingClientRect();\n const tableRect = this.table.getBoundingClientRect();\n const cellRect = cell.getBoundingClientRect();\n\n // Column handle: above the table, centered on the hovered cell\n this.colHandle.style.left = String(cellRect.left - containerRect.left + cellRect.width / 2 - 12) + 'px';\n this.colHandle.style.top = String(tableRect.top - containerRect.top - 16) + 'px';\n\n // Row handle: left of the table, centered on the hovered row.\n // For merged cells (rowspan > 1), use the cell rect (spans all rows)\n // instead of the <tr> rect (only the first row of the span).\n this.rowHandle.style.left = String(tableRect.left - containerRect.left - 16) + 'px';\n if (cell.rowSpan > 1) {\n this.rowHandle.style.top = String(cellRect.top - containerRect.top + cellRect.height / 2 - 12) + 'px';\n } else {\n const tr = cell.closest('tr');\n if (tr) {\n const trRect = tr.getBoundingClientRect();\n this.rowHandle.style.top = String(trRect.top - containerRect.top + trRect.height / 2 - 12) + 'px';\n }\n }\n }\n\n private getCellIndices(cell: HTMLTableCellElement): { row: number; col: number } {\n const tr = cell.closest('tr');\n if (!tr) return { row: 0, col: 0 };\n\n const row = Array.from(this.contentDOM.querySelectorAll('tr')).indexOf(tr);\n\n let col = 0;\n let sibling = cell.previousElementSibling;\n while (sibling) {\n col += (sibling as HTMLTableCellElement).colSpan || 1;\n sibling = sibling.previousElementSibling;\n }\n\n return { row, col };\n }\n\n // ─── Cell toolbar positioning (driven by CellSelection plugin) ────────\n\n /** Called by the cellHandlePlugin when CellSelection changes. */\n updateCellHandle(active: boolean): void {\n if (!active || this._resizeDragging) {\n this.cellToolbar.style.display = '';\n this.closeDropdown();\n return;\n }\n\n // Compute bounding box of ALL selected cells → position toolbar centered above\n const selectedCells = this.table.querySelectorAll('.selectedCell');\n if (selectedCells.length === 0) {\n this.cellToolbar.style.display = '';\n return;\n }\n\n let top = Infinity;\n let left = Infinity;\n let right = -Infinity;\n selectedCells.forEach((c) => {\n const r = c.getBoundingClientRect();\n if (r.top < top) top = r.top;\n if (r.left < left) left = r.left;\n if (r.right > right) right = r.right;\n });\n\n const containerRect = this.dom.getBoundingClientRect();\n\n // Show toolbar first so offsetWidth is accurate (avoids jump on subsequent updates)\n this.cellToolbar.style.display = 'flex';\n const toolbarWidth = this.cellToolbar.offsetWidth;\n const selectionCenter = (left + right) / 2;\n let toolbarLeft = selectionCenter - containerRect.left - toolbarWidth / 2;\n\n // Clamp to container bounds\n toolbarLeft = Math.max(0, Math.min(toolbarLeft, containerRect.width - toolbarWidth));\n\n this.cellToolbar.style.left = String(toolbarLeft) + 'px';\n this.cellToolbar.style.top = String(top - containerRect.top - 36) + 'px';\n\n // Disable merge/split based on whether command can execute (dry-run without dispatch)\n const canMerge = mergeCells(this.view.state);\n const canSplit = splitCell(this.view.state);\n if (this.mergeBtn) this.mergeBtn.disabled = !canMerge;\n if (this.splitBtn) this.splitBtn.disabled = !canSplit;\n\n // Highlight trigger buttons based on selected cell attributes\n const sel = this.view.state.selection;\n if (sel instanceof CellSelection) {\n let hasCustomAlign = false;\n let hasCustomColor = false;\n let allHeaders = true;\n sel.forEachCell((node) => {\n if (node.attrs['textAlign'] || node.attrs['verticalAlign']) hasCustomAlign = true;\n if (node.attrs['background']) hasCustomColor = true;\n if (node.type.name !== 'tableHeader') allHeaders = false;\n });\n this.alignBtn?.classList.toggle('dm-table-cell-toolbar-btn--active', hasCustomAlign);\n this.colorBtn?.classList.toggle('dm-table-cell-toolbar-btn--active', hasCustomColor);\n this.headerBtn?.classList.toggle('dm-table-cell-toolbar-btn--active', allHeaders);\n }\n }\n\n // ─── Cell handle (small circle for single-cell operations) ──────────\n\n /** Hide all controls during column resize drag. Called by the plugin. */\n hideForResize(): void {\n this._resizeDragging = true;\n this.cellHandle.style.display = '';\n this.colHandle.style.display = '';\n this.rowHandle.style.display = '';\n this.cellToolbar.style.display = '';\n this.closeDropdown();\n }\n\n /** Re-enable controls after column resize drag ends. Called by the plugin. */\n showAfterResize(): void {\n this._resizeDragging = false;\n }\n\n /** Show cell handle at the top-center of the given cell. Always repositions (no early return). */\n showCellHandle(cell: HTMLTableCellElement): void {\n if (this._resizeDragging) return;\n this.cellHandleCell = cell;\n const containerRect = this.dom.getBoundingClientRect();\n const cellRect = cell.getBoundingClientRect();\n this.cellHandle.style.left = String(cellRect.left - containerRect.left - 7) + 'px';\n this.cellHandle.style.top = String(cellRect.top - containerRect.top - 7) + 'px';\n this.cellHandle.style.display = 'flex';\n }\n\n /** Hide cell handle. */\n hideCellHandle(): void {\n this.cellHandle.style.display = '';\n this.cellHandleCell = null;\n }\n\n /** Click on cell handle → create CellSelection for that cell. */\n private onCellHandleClick(): void {\n if (!this.cellHandleCell) return;\n this.dismissOverlays();\n const pos = this.view.posAtDOM(this.cellHandleCell, 0);\n const $pos = this.view.state.doc.resolve(pos);\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n const cellPos = $pos.before(d);\n const sel = CellSelection.create(this.view.state.doc, cellPos, cellPos);\n this.dispatchCellSelection(sel);\n break;\n }\n }\n }\n\n // ─── Handle clicks ───────────────────────────────────────────────────\n\n /** Dismiss other floating overlays (bubble menu, etc.) */\n private dismissOverlays(): void {\n this.dom.closest('.dm-editor')?.dispatchEvent(\n new Event('dm:dismiss-overlays', { bubbles: false }),\n );\n }\n\n private onColClick(): void {\n this.suppressCellToolbar = true;\n this.cellToolbar.style.display = '';\n this.dismissOverlays();\n this.selectColumn(this.hoveredCol);\n this.showDropdown('column');\n }\n\n private onRowClick(): void {\n this.suppressCellToolbar = true;\n this.cellToolbar.style.display = '';\n this.dismissOverlays();\n this.selectRow(this.hoveredRow);\n this.showDropdown('row');\n }\n\n private getTablePos(): number {\n const pos = this.view.posAtDOM(this.table, 0);\n const $pos = this.view.state.doc.resolve(pos);\n for (let d = $pos.depth; d > 0; d--) {\n if ($pos.node(d).type.name === 'table') {\n return $pos.before(d);\n }\n }\n return pos;\n }\n\n /** Dispatch a CellSelection and focus the editor. */\n private dispatchCellSelection(sel: CellSelection): void {\n this.view.dispatch(\n this.view.state.tr.setSelection(sel as unknown as ReturnType<typeof TextSelection.create>),\n );\n this.view.focus();\n }\n\n private selectRow(row: number): void {\n const tablePos = this.getTablePos();\n const tableStart = tablePos + 1;\n const map = TableMap.get(this.node);\n if (row < 0 || row >= map.height) return;\n\n const anchorOffset = map.map[row * map.width];\n const headOffset = map.map[row * map.width + map.width - 1];\n if (anchorOffset === undefined || headOffset === undefined) return;\n const sel = CellSelection.create(this.view.state.doc, tableStart + anchorOffset, tableStart + headOffset);\n this.dispatchCellSelection(sel);\n }\n\n private selectColumn(col: number): void {\n const tablePos = this.getTablePos();\n const tableStart = tablePos + 1;\n const map = TableMap.get(this.node);\n if (col < 0 || col >= map.width) return;\n\n const anchorOffset = map.map[col];\n const headOffset = map.map[(map.height - 1) * map.width + col];\n if (anchorOffset === undefined || headOffset === undefined) return;\n const sel = CellSelection.create(this.view.state.doc, tableStart + anchorOffset, tableStart + headOffset);\n this.dispatchCellSelection(sel);\n }\n\n private setCursorInCell(row: number, col: number): void {\n const tablePos = this.getTablePos();\n const tableStart = tablePos + 1;\n const map = TableMap.get(this.node);\n if (row < 0 || row >= map.height || col < 0 || col >= map.width) return;\n\n const cellOffset = map.map[row * map.width + col];\n if (cellOffset === undefined) return;\n const $pos = this.view.state.doc.resolve(tableStart + cellOffset + 1);\n const sel = TextSelection.near($pos);\n this.view.dispatch(this.view.state.tr.setSelection(sel));\n }\n\n // ─── Dropdown ────────────────────────────────────────────────────────\n\n private showDropdown(type: 'row' | 'column'): void {\n this.closeDropdown();\n\n const dropdown = document.createElement('div');\n dropdown.className = 'dm-table-controls-dropdown';\n dropdown.addEventListener('mouseenter', this.boundCancelHide);\n dropdown.addEventListener('mousedown', (e) => { e.preventDefault(); });\n\n const items: { icon: string; label: string; action: () => void }[] =\n type === 'row'\n ? [\n { icon: ICON_ROW_PLUS_TOP, label: 'Insert Row Above', action: () => { this.execRowCmd(addRowBefore); } },\n { icon: ICON_ROW_PLUS_BOTTOM, label: 'Insert Row Below', action: () => { this.execRowCmd(addRowAfter); } },\n { icon: ICON_DELETE_ROW, label: 'Delete Row', action: () => { this.execRowCmd(deleteRow); } },\n ]\n : [\n { icon: ICON_COL_PLUS_LEFT, label: 'Insert Column Left', action: () => { this.execColCmd(addColumnBefore); } },\n { icon: ICON_COL_PLUS_RIGHT, label: 'Insert Column Right', action: () => { this.execColCmd(addColumnAfter); } },\n { icon: ICON_DELETE_COL, label: 'Delete Column', action: () => { this.execColCmd(deleteColumn); } },\n ];\n\n for (const item of items) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.innerHTML = `<span class=\"dm-table-controls-dropdown-icon\">${item.icon}</span>${item.label}`;\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n item.action();\n this.closeDropdown();\n this.hideHandles();\n });\n dropdown.appendChild(btn);\n }\n\n // Position below the handle — fixed to viewport so it escapes overflow containers\n const handle = type === 'row' ? this.rowHandle : this.colHandle;\n const handleRect = handle.getBoundingClientRect();\n dropdown.style.position = 'fixed';\n dropdown.style.left = String(handleRect.left) + 'px';\n dropdown.style.top = String(handleRect.bottom + 4) + 'px';\n\n document.body.appendChild(dropdown);\n this.dropdown = dropdown;\n this.addDropdownListeners();\n }\n\n // ─── Cell toolbar dropdowns ──────────────────────────────────────────\n\n /** Shared open/toggle for toolbar dropdown buttons. */\n private openToolbarDropdown(triggerBtn: HTMLButtonElement, className: string, buildContent: (dropdown: HTMLElement) => void): void {\n if (this.dropdown && triggerBtn.classList.contains('dm-table-cell-toolbar-btn--open')) {\n this.closeDropdown();\n return;\n }\n this.closeDropdown();\n triggerBtn.classList.add('dm-table-cell-toolbar-btn--open');\n\n const dropdown = document.createElement('div');\n dropdown.className = className;\n dropdown.addEventListener('mousedown', (e) => { e.preventDefault(); });\n buildContent(dropdown);\n this.positionToolbarDropdown(dropdown, triggerBtn);\n }\n\n private showColorDropdown(triggerBtn: HTMLButtonElement): void {\n this.openToolbarDropdown(triggerBtn, 'dm-table-controls-dropdown dm-table-cell-dropdown', (dropdown) => {\n const palette = document.createElement('div');\n palette.className = 'dm-color-palette';\n palette.style.setProperty('--dm-palette-columns', '4');\n\n const resetBtn = document.createElement('button');\n resetBtn.type = 'button';\n resetBtn.className = 'dm-color-palette-reset';\n resetBtn.innerHTML =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" fill=\"currentColor\" width=\"14\" height=\"14\"><path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.56,87.56,0,0,1-20.41,56.28L71.72,60.41A88,88,0,0,1,216,128ZM40,128A87.56,87.56,0,0,1,60.41,71.72L184.28,195.59A88,88,0,0,1,40,128Z\"/></svg>' +\n ' Default';\n resetBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n setCellAttr('background', null)(this.view.state, this.view.dispatch);\n this.closeDropdown();\n });\n palette.appendChild(resetBtn);\n\n for (const color of CELL_COLORS) {\n const swatch = document.createElement('button');\n swatch.type = 'button';\n swatch.className = 'dm-color-swatch';\n swatch.style.backgroundColor = color;\n swatch.setAttribute('aria-label', color);\n swatch.addEventListener('click', (e) => {\n e.stopPropagation();\n setCellAttr('background', color)(this.view.state, this.view.dispatch);\n this.closeDropdown();\n });\n palette.appendChild(swatch);\n }\n dropdown.appendChild(palette);\n });\n }\n\n private showAlignmentDropdown(triggerBtn: HTMLButtonElement): void {\n this.openToolbarDropdown(triggerBtn, 'dm-table-controls-dropdown dm-table-cell-align-dropdown', (dropdown) => {\n // Read current alignment from the anchor cell in ProseMirror state\n // (the cell toolbar is only visible during CellSelection)\n const sel = this.view.state.selection as CellSelection;\n const cellNode = this.view.state.doc.nodeAt(sel.$anchorCell.pos);\n const curTextAlign = (cellNode?.attrs['textAlign'] as string | undefined) ?? null;\n const curVerticalAlign = (cellNode?.attrs['verticalAlign'] as string | undefined) ?? null;\n\n const hAligns: { value: string; label: string; icon: string }[] = [\n { value: 'left', label: 'Align left', icon: ICON_ALIGN_LEFT },\n { value: 'center', label: 'Align center', icon: ICON_ALIGN_CENTER },\n { value: 'right', label: 'Align right', icon: ICON_ALIGN_RIGHT },\n ];\n\n const vAligns: { value: string; label: string; icon: string }[] = [\n { value: 'top', label: 'Align top', icon: ICON_ALIGN_TOP },\n { value: 'middle', label: 'Align middle', icon: ICON_ALIGN_MIDDLE },\n { value: 'bottom', label: 'Align bottom', icon: ICON_ALIGN_BOTTOM },\n ];\n\n for (const a of hAligns) {\n const isActive = curTextAlign === a.value || (!curTextAlign && a.value === 'left');\n dropdown.appendChild(this.createAlignItem(a.icon, a.label, isActive, () => {\n setCellAttr('textAlign', a.value === 'left' ? null : a.value)(this.view.state, this.view.dispatch);\n this.closeDropdown();\n }));\n }\n\n const sep = document.createElement('div');\n sep.className = 'dm-table-cell-dropdown-separator';\n dropdown.appendChild(sep);\n\n for (const a of vAligns) {\n const isActive = curVerticalAlign === a.value || (!curVerticalAlign && a.value === 'top');\n dropdown.appendChild(this.createAlignItem(a.icon, a.label, isActive, () => {\n setCellAttr('verticalAlign', a.value === 'top' ? null : a.value)(this.view.state, this.view.dispatch);\n this.closeDropdown();\n }));\n }\n });\n }\n\n private createAlignItem(icon: string, label: string, active: boolean, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-table-align-item' + (active ? ' dm-table-align-item--active' : '');\n btn.innerHTML = `<span class=\"dm-table-align-item-icon\">${icon}</span><span>${label}</span>`;\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick();\n });\n return btn;\n }\n\n private positionToolbarDropdown(dropdown: HTMLElement, triggerBtn: HTMLButtonElement): void {\n const btnRect = triggerBtn.getBoundingClientRect();\n\n // Fixed position so dropdown escapes overflow containers\n dropdown.style.position = 'fixed';\n dropdown.style.top = String(btnRect.bottom + 4) + 'px';\n\n // Append to body first to measure\n document.body.appendChild(dropdown);\n this.dropdown = dropdown;\n\n // Try left-aligned to button; if overflows viewport, shift left\n const dropdownWidth = dropdown.offsetWidth;\n let leftPos = btnRect.left;\n if (leftPos + dropdownWidth > window.innerWidth) {\n leftPos = window.innerWidth - dropdownWidth - 4;\n }\n dropdown.style.left = String(Math.max(0, leftPos)) + 'px';\n\n this.addDropdownListeners();\n }\n\n private addDropdownListeners(): void {\n document.addEventListener('mousedown', this.boundDocMouseDown, true);\n document.addEventListener('keydown', this.boundDocKeyDown);\n // Close on any scroll (editor or page) so fixed dropdown doesn't drift\n window.addEventListener('scroll', this.boundScroll, true);\n }\n\n private removeDropdownListeners(): void {\n document.removeEventListener('mousedown', this.boundDocMouseDown, true);\n document.removeEventListener('keydown', this.boundDocKeyDown);\n window.removeEventListener('scroll', this.boundScroll, true);\n }\n\n private closeDropdown(): void {\n if (!this.dropdown) return;\n this.dropdown.remove();\n this.dropdown = null;\n this.suppressCellToolbar = false;\n // Clear open state from toolbar buttons\n this.cellToolbar.querySelectorAll('.dm-table-cell-toolbar-btn--open').forEach(\n (el) => { el.classList.remove('dm-table-cell-toolbar-btn--open'); },\n );\n this.removeDropdownListeners();\n }\n\n private onDocMouseDown(e: MouseEvent): void {\n const target = e.target as Node;\n if (\n this.dropdown?.contains(target) ||\n this.cellToolbar.contains(target) ||\n this.colHandle.contains(target) ||\n this.rowHandle.contains(target)\n ) {\n return;\n }\n this.closeDropdown();\n }\n\n private onDocKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n this.closeDropdown();\n }\n }\n\n private execRowCmd(cmd: PMCommand): void {\n this.setCursorInCell(this.hoveredRow, 0);\n const state = this.view.state;\n if (cmd === deleteRow && isInTable(state)) {\n const rect = selectedRect(state);\n if (rect.top === 0 && rect.bottom === rect.map.height) {\n deleteTable(state, this.view.dispatch);\n return;\n }\n }\n cmd(state, this.view.dispatch);\n }\n\n private execColCmd(cmd: PMCommand): void {\n this.setCursorInCell(0, this.hoveredCol);\n if (this.constrainToContainer && (cmd === addColumnBefore || cmd === addColumnAfter)) {\n constrainedAddColumn(cmd, this.view, this.cellMinWidth, this.defaultCellMinWidth);\n return;\n }\n const state = this.view.state;\n if (cmd === deleteColumn && isInTable(state)) {\n const rect = selectedRect(state);\n if (rect.left === 0 && rect.right === rect.map.width) {\n deleteTable(state, this.view.dispatch);\n return;\n }\n }\n cmd(state, this.view.dispatch);\n }\n\n // ─── Column management ───────────────────────────────────────────────\n\n /**\n * Update colgroup col elements based on cell widths.\n * Matches prosemirror-tables' updateColumnsOnResize behavior:\n * - Reuses existing col elements (avoids DOM churn during resize)\n * - Uses defaultCellMinWidth for totalWidth calc (matches columnResizing plugin)\n * - Columns without explicit widths get empty style.width (table-layout: fixed distributes)\n */\n private updateColumns(node: PMNode): void {\n let totalWidth = 0;\n let fixedWidth = true;\n let nextDOM = this.colgroup.firstChild as HTMLElement | null;\n const firstRow = node.firstChild;\n if (!firstRow) return;\n\n for (let i = 0; i < firstRow.childCount; i++) {\n const cell = firstRow.child(i);\n const colspan = (cell.attrs['colspan'] as number) || 1;\n const colwidth = cell.attrs['colwidth'] as number[] | null;\n\n for (let j = 0; j < colspan; j++) {\n const hasWidth = colwidth?.[j];\n const cssWidth = hasWidth ? String(hasWidth) + 'px' : '';\n totalWidth += hasWidth ?? this.defaultCellMinWidth;\n if (!hasWidth) fixedWidth = false;\n\n if (!nextDOM) {\n const colEl = document.createElement('col');\n colEl.style.width = cssWidth;\n this.colgroup.appendChild(colEl);\n } else {\n if (nextDOM.style.width !== cssWidth) {\n nextDOM.style.width = cssWidth;\n }\n nextDOM = nextDOM.nextElementSibling as HTMLElement | null;\n }\n }\n }\n\n // Remove excess col elements\n while (nextDOM) {\n const after = nextDOM.nextElementSibling as HTMLElement | null;\n nextDOM.remove();\n nextDOM = after;\n }\n\n if (fixedWidth && totalWidth > 0) {\n this.table.style.width = String(totalWidth) + 'px';\n this.table.style.minWidth = '';\n } else {\n this.table.style.width = '';\n this.table.style.minWidth = this.constrainToContainer ? '' : String(totalWidth) + 'px';\n }\n }\n}\n","/**\n * Creates a table node from schema types.\n *\n * Builds table → rows → cells structure.\n * First row gets tableHeader cells if withHeaderRow is true.\n */\n\nimport type { Node as PMNode, Schema } from '@domternal/pm/model';\nimport { tableNodeTypes } from '@domternal/pm/tables';\n\nexport function createTable(\n schema: Schema,\n rows: number,\n cols: number,\n withHeaderRow: boolean,\n cellContent?: PMNode,\n): PMNode {\n const types = tableNodeTypes(schema);\n\n const headerCells: PMNode[] = [];\n const cells: PMNode[] = [];\n\n for (let col = 0; col < cols; col++) {\n const cell = cellContent\n ? types.cell.createChecked(null, cellContent)\n : types.cell.createAndFill();\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = cellContent\n ? types.header_cell.createChecked(null, cellContent)\n : types.header_cell.createAndFill();\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const tableRows: PMNode[] = [];\n\n for (let row = 0; row < rows; row++) {\n const rowCells = withHeaderRow && row === 0 ? headerCells : cells;\n tableRows.push(types.row.createChecked(null, rowCells));\n }\n\n return types.table.createChecked(null, tableRows);\n}\n","/**\n * Keyboard handler that deletes the table when all cells are selected.\n *\n * Used for Backspace, Delete, Mod-Backspace, Mod-Delete.\n * When a CellSelection covers all cells in a table, delete the entire table.\n */\n\nimport { CellSelection, findTable } from '@domternal/pm/tables';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { EditorState, Transaction } from '@domternal/pm/state';\n\nexport function deleteTableWhenAllCellsSelected({\n state,\n dispatch,\n}: {\n state: EditorState;\n dispatch?: (tr: Transaction) => void;\n}): boolean {\n const { selection } = state;\n\n if (!(selection instanceof CellSelection)) {\n return false;\n }\n\n // Check: is the full table selected?\n let cellCount = 0;\n const table = findTable(selection.$anchorCell);\n\n if (!table) {\n return false;\n }\n\n table.node.descendants((node) => {\n const role = (node.type.spec as Record<string, unknown>)['tableRole'];\n if (role === 'cell' || role === 'header_cell') {\n cellCount++;\n }\n });\n\n const selectionCellCount = selection.ranges.length;\n\n if (cellCount !== selectionCellCount) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.delete(table.pos, table.pos + table.node.nodeSize);\n\n // Place cursor at the position where the table was\n const $pos = tr.doc.resolve(Math.min(table.pos, tr.doc.content.size));\n const newSelection = TextSelection.near($pos);\n tr.setSelection(newSelection);\n\n dispatch(tr);\n }\n\n return true;\n}\n","/**\n * Suppress column-resize handle during non-resize mouse drags and\n * implement configurable column resize behavior.\n *\n * The columnResizing plugin detects cell borders on every mousemove and\n * shows a blue resize line — confusing when the user is dragging to\n * select cells or text, not to resize a column. This plugin adds a\n * `dm-mouse-drag` CSS class during non-resize drags and blocks\n * columnResizing's mousemove handler from detecting borders.\n *\n * Resize behaviors:\n * - `neighbor`: adjacent column compensates, table width stays constant (Google Docs style)\n * - `independent`: all columns freeze, only dragged column changes, table width grows/shrinks\n * - `redistribute`: original prosemirror-tables behavior, columns redistribute to fill width\n */\n\nimport { Plugin } from '@domternal/pm/state';\nimport type { Transaction } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { EditorView } from '@domternal/pm/view';\nimport { columnResizingPluginKey, TableMap } from '@domternal/pm/tables';\nimport { findTableDom, getContainerWidth } from '../helpers/constrainedColumn.js';\n\nexport interface ResizeSuppressionOptions {\n resizeBehavior: 'neighbor' | 'independent' | 'redistribute';\n cellMinWidth: number;\n defaultCellMinWidth: number;\n constrainToContainer: boolean;\n}\n\nexport function createResizeSuppressionPlugin(options: ResizeSuppressionOptions): Plugin {\n const { resizeBehavior, cellMinWidth, defaultCellMinWidth, constrainToContainer } = options;\n\n return new Plugin({\n props: {\n handleDOMEvents: {\n mousedown: (view, event) => {\n if (event.button !== 0) return false;\n const resizeState = columnResizingPluginKey.getState(view.state) as\n | { activeHandle: number; dragging: unknown } | undefined;\n\n if (!resizeState || resizeState.activeHandle === -1) {\n // Non-resize drag — suppress columnResizing border detection\n view.dom.classList.add('dm-mouse-drag');\n document.addEventListener('mouseup', () => {\n view.dom.classList.remove('dm-mouse-drag');\n }, { once: true });\n return false;\n }\n\n // Resize handle mousedown — branch by behavior\n if (resizeBehavior === 'redistribute' || resizeBehavior === 'independent') {\n if (resizeBehavior === 'independent') {\n freezeColumnWidths(view, resizeState.activeHandle, cellMinWidth, defaultCellMinWidth);\n }\n // ProseMirror's columnResizing handles the drag but never clears\n // activeHandle on mouseup, so the blue decoration persists if the\n // mouse is released outside the editor. Clear it ourselves.\n const win = view.dom.ownerDocument.defaultView ?? window;\n win.addEventListener('mouseup', () => {\n const st = columnResizingPluginKey.getState(view.state) as\n | { activeHandle: number; dragging: unknown } | undefined;\n if (st && st.activeHandle > -1 && !st.dragging) {\n view.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setHandle: -1 }));\n }\n }, { once: true });\n return false;\n }\n\n // 'neighbor' mode — intercept and handle the drag ourselves\n return handleNeighborResize(view, event, resizeState.activeHandle, cellMinWidth, defaultCellMinWidth, constrainToContainer);\n },\n mousemove: (view, event) => {\n if (event.buttons !== 1) return false;\n // Allow columnResizing to process during active column resize\n const resizeState = columnResizingPluginKey.getState(view.state) as\n | { activeHandle: number; dragging: unknown } | undefined;\n if (resizeState?.dragging) return false;\n // Block columnResizing from detecting borders during drag\n return true;\n },\n },\n },\n });\n}\n\n// ─── Neighbor resize ──────────────────────────────────────────────────────────\n\n/**\n * Google Docs-style resize: the adjacent column compensates so total table\n * width stays constant. Fully intercepts the drag from columnResizing.\n */\nfunction handleNeighborResize(\n view: EditorView,\n event: MouseEvent,\n activeHandle: number,\n cellMinWidth: number,\n defaultCellMinWidth: number,\n constrainToContainer: boolean,\n): boolean {\n // Step 1 — freeze all columns so every col has an explicit width\n freezeColumnWidths(view, activeHandle, cellMinWidth, defaultCellMinWidth);\n\n // Step 2 — re-read state after freeze dispatch\n const state = view.state;\n const resizeState = columnResizingPluginKey.getState(state) as\n | { activeHandle: number; dragging: unknown } | undefined;\n const handle = resizeState?.activeHandle ?? -1;\n if (handle === -1) return false;\n\n const $cell = state.doc.resolve(handle);\n const table = $cell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $cell.start(-1);\n const nodeAfter = $cell.nodeAfter;\n if (!nodeAfter) return false;\n const draggedCol = map.colCount($cell.pos - tableStart) + ((nodeAfter.attrs['colspan'] as number) || 1) - 1;\n const neighborCol = draggedCol + 1;\n\n // Step 3 — last column: no neighbor\n if (neighborCol >= map.width) {\n if (!constrainToContainer) return false; // old behavior: independent resize\n return handleLastColumnResize(view, event, table, map, tableStart, draggedCol, cellMinWidth, defaultCellMinWidth);\n }\n\n // Step 4 — read starting widths from frozen attrs\n const startWidth = readColWidth(table, map, draggedCol, defaultCellMinWidth);\n const neighborStartWidth = readColWidth(table, map, neighborCol, defaultCellMinWidth);\n const startX = event.clientX;\n\n // Step 5 — set dragging meta (triggers decorations + cellSelectionPlugin hideForResize)\n view.dispatch(state.tr.setMeta(columnResizingPluginKey, {\n setDragging: { startX, startWidth },\n }));\n\n // Step 6 — find table DOM for direct col manipulation\n const tableDom = findTableDom(view, tableStart);\n const colgroup = tableDom?.querySelector('colgroup')?.children;\n if (!colgroup) return false;\n const cols = colgroup;\n\n const win = view.dom.ownerDocument.defaultView ?? window;\n\n function move(e: MouseEvent): void {\n if (!e.buttons) {\n finish(e);\n return;\n }\n\n const offset = e.clientX - startX;\n // Clamp so both columns stay >= cellMinWidth and their sum stays constant\n const clamped = Math.max(\n -(startWidth - cellMinWidth),\n Math.min(offset, neighborStartWidth - cellMinWidth),\n );\n const newDraggedW = startWidth + clamped;\n const newNeighborW = neighborStartWidth - clamped;\n\n (cols[draggedCol] as HTMLElement).style.width = String(newDraggedW) + 'px';\n (cols[neighborCol] as HTMLElement).style.width = String(newNeighborW) + 'px';\n }\n\n function finish(e: MouseEvent): void {\n win.removeEventListener('mouseup', finish);\n win.removeEventListener('mousemove', move);\n\n const pluginState = columnResizingPluginKey.getState(view.state) as\n | { activeHandle: number; dragging: { startX: number; startWidth: number } | null } | undefined;\n if (!pluginState?.dragging) return;\n\n // Calculate final widths\n const offset = e.clientX - startX;\n const clamped = Math.max(\n -(startWidth - cellMinWidth),\n Math.min(offset, neighborStartWidth - cellMinWidth),\n );\n const finalDraggedW = Math.round(startWidth + clamped);\n const finalNeighborW = Math.round(neighborStartWidth - clamped);\n\n // Re-resolve table from current state (may have changed during drag)\n const curState = view.state;\n const curHandle = pluginState.activeHandle;\n const $curCell = curState.doc.resolve(curHandle);\n const curTable = $curCell.node(-1);\n const curMap = TableMap.get(curTable);\n const curStart = $curCell.start(-1);\n\n // Store both column widths + clear dragging in one atomic transaction\n const tr = curState.tr;\n storeColWidth(tr, curTable, curMap, curStart, draggedCol, finalDraggedW);\n storeColWidth(tr, curTable, curMap, curStart, neighborCol, finalNeighborW);\n tr.setMeta(columnResizingPluginKey, { setDragging: null });\n view.dispatch(tr);\n\n // Clear activeHandle so the blue decoration disappears even if the\n // mouse was released outside the editor (mouseleave won't fire).\n view.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setHandle: -1 }));\n }\n\n win.addEventListener('mouseup', finish);\n win.addEventListener('mousemove', move);\n event.preventDefault();\n return true;\n}\n\n// ─── Last-column constrained resize ──────────────────────────────────────────\n\n/**\n * Constrained last-column resize: allows shrinking but caps growing so the\n * table never exceeds the container (.tableWrapper) width.\n */\nfunction handleLastColumnResize(\n view: EditorView,\n event: MouseEvent,\n table: PMNode,\n map: TableMap,\n tableStart: number,\n draggedCol: number,\n cellMinWidth: number,\n defaultCellMinWidth: number,\n): boolean {\n const startWidth = readColWidth(table, map, draggedCol, defaultCellMinWidth);\n const startX = event.clientX;\n\n // Find table DOM and colgroup\n const tableDom = findTableDom(view, tableStart);\n const colgroupChildren = tableDom?.querySelector('colgroup')?.children;\n if (!colgroupChildren) return false;\n const cols = colgroupChildren;\n\n // Compute total width from frozen attrs\n let totalWidth = 0;\n for (let c = 0; c < map.width; c++) {\n totalWidth += readColWidth(table, map, c, defaultCellMinWidth);\n }\n\n // Compute max growth before hitting container edge\n const containerWidth = getContainerWidth(view, tableStart);\n const maxGrow = containerWidth > 0 ? containerWidth - totalWidth : 0;\n\n // Set dragging meta (triggers decorations + cellSelectionPlugin hideForResize)\n view.dispatch(view.state.tr.setMeta(columnResizingPluginKey, {\n setDragging: { startX, startWidth },\n }));\n\n const win = view.dom.ownerDocument.defaultView ?? window;\n\n function move(e: MouseEvent): void {\n if (!e.buttons) { finish(e); return; }\n const offset = e.clientX - startX;\n const clamped = Math.max(-(startWidth - cellMinWidth), Math.min(offset, maxGrow));\n (cols[draggedCol] as HTMLElement).style.width = String(startWidth + clamped) + 'px';\n if (tableDom) tableDom.style.width = String(totalWidth + clamped) + 'px';\n }\n\n function finish(e: MouseEvent): void {\n win.removeEventListener('mouseup', finish);\n win.removeEventListener('mousemove', move);\n\n const pluginState = columnResizingPluginKey.getState(view.state) as\n | { activeHandle: number; dragging: { startX: number; startWidth: number } | null } | undefined;\n if (!pluginState?.dragging) return;\n\n const offset = e.clientX - startX;\n const clamped = Math.max(-(startWidth - cellMinWidth), Math.min(offset, maxGrow));\n const finalWidth = Math.round(startWidth + clamped);\n\n const curState = view.state;\n const $curCell = curState.doc.resolve(pluginState.activeHandle);\n const curTable = $curCell.node(-1);\n const curMap = TableMap.get(curTable);\n const curStart = $curCell.start(-1);\n\n const tr = curState.tr;\n storeColWidth(tr, curTable, curMap, curStart, draggedCol, finalWidth);\n tr.setMeta(columnResizingPluginKey, { setDragging: null });\n view.dispatch(tr);\n\n // Clear activeHandle so the blue decoration disappears even if the\n // mouse was released outside the editor (mouseleave won't fire).\n view.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setHandle: -1 }));\n }\n\n win.addEventListener('mouseup', finish);\n win.addEventListener('mousemove', move);\n event.preventDefault();\n return true;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Read the effective column width from the first-row cell at the given column index. */\nfunction readColWidth(table: PMNode, map: TableMap, col: number, fallback: number): number {\n const offset = map.map[col] ?? 0;\n const cell = table.nodeAt(offset);\n if (!cell) return fallback;\n const idx = col - map.colCount(offset);\n const colwidth = cell.attrs['colwidth'] as number[] | null;\n return colwidth?.[idx] ?? fallback;\n}\n\n/**\n * Store a single column's width across all rows in a transaction.\n * Same pattern as prosemirror-tables' updateColumnWidth.\n */\nfunction storeColWidth(\n tr: Transaction,\n table: PMNode,\n map: TableMap,\n tableStart: number,\n col: number,\n width: number,\n): void {\n for (let row = 0; row < map.height; row++) {\n const mapIndex = row * map.width + col;\n // Skip if same cell as row above (rowspan)\n if (row > 0 && map.map[mapIndex] === map.map[mapIndex - map.width]) continue;\n\n const pos = map.map[mapIndex] ?? 0;\n const cellNode = table.nodeAt(pos);\n if (!cellNode) continue;\n\n const attrs = cellNode.attrs;\n const colspan = (attrs['colspan'] as number) || 1;\n const index = colspan === 1 ? 0 : col - map.colCount(pos);\n const colwidth = attrs['colwidth'] as number[] | null;\n\n if (colwidth?.[index] === width) continue;\n\n const newColwidth = colwidth ? colwidth.slice() : new Array(colspan).fill(0) as number[];\n newColwidth[index] = width;\n tr.setNodeMarkup(tableStart + pos, null, { ...attrs, colwidth: newColwidth });\n }\n}\n\n// ─── Freeze all columns ──────────────────────────────────────────────────────\n\n/**\n * Measure all column widths from the DOM and store them as colwidth attributes\n * on every cell. Converts the table from CSS-distributed widths to fixed pixel\n * widths so columns don't redistribute during resize.\n */\nfunction freezeColumnWidths(view: EditorView, handlePos: number, cellMinWidth: number, defaultCellMinWidth: number): void {\n const state = view.state;\n const $cell = state.doc.resolve(handlePos);\n\n // Find the table node\n let tableDepth = -1;\n for (let d = $cell.depth; d > 0; d--) {\n if ($cell.node(d).type.name === 'table') {\n tableDepth = d;\n break;\n }\n }\n if (tableDepth === -1) return;\n\n const table = $cell.node(tableDepth);\n const tableStart = $cell.start(tableDepth);\n const map = TableMap.get(table);\n const firstRow = table.firstChild;\n if (!firstRow) return;\n\n // Check which columns need width measurement (don't have explicit colwidth)\n const colNeedsWidth: boolean[] = [];\n let anyNeedsWidth = false;\n\n for (let col = 0; col < map.width; col++) {\n const cellOffset = map.map[col] ?? 0;\n const cellNode = table.nodeAt(cellOffset);\n if (!cellNode) {\n colNeedsWidth.push(true);\n anyNeedsWidth = true;\n continue;\n }\n const colWithinCell = col - map.colCount(cellOffset);\n const colwidth = cellNode.attrs['colwidth'] as number[] | null;\n if (colwidth?.[colWithinCell]) {\n colNeedsWidth.push(false);\n } else {\n colNeedsWidth.push(true);\n anyNeedsWidth = true;\n }\n }\n\n if (!anyNeedsWidth) return;\n\n // Measure column widths from DOM (same approach as prosemirror-tables' currentColWidth)\n const measuredWidths: number[] = new Array(map.width) as number[];\n\n for (let col = 0; col < map.width; col++) {\n const cellOffset = map.map[col] ?? 0;\n const cellNode = table.nodeAt(cellOffset);\n if (!cellNode) {\n measuredWidths[col] = defaultCellMinWidth;\n continue;\n }\n const colspan = (cellNode.attrs['colspan'] as number) || 1;\n const colwidth = cellNode.attrs['colwidth'] as number[] | null;\n const colWithinCell = col - map.colCount(cellOffset);\n\n if (!colNeedsWidth[col]) {\n measuredWidths[col] = colwidth?.[colWithinCell] ?? defaultCellMinWidth;\n continue;\n }\n\n // Measure from DOM\n try {\n const dom = view.domAtPos(tableStart + cellOffset);\n const cellDom = dom.node.childNodes[dom.offset] as HTMLElement | undefined;\n if (cellDom) {\n let domWidth = cellDom.offsetWidth;\n let parts = colspan;\n if (colwidth) {\n for (let j = 0; j < colspan; j++) {\n const cw = colwidth[j];\n if (cw) {\n domWidth -= cw;\n parts--;\n }\n }\n }\n measuredWidths[col] = Math.max(cellMinWidth, Math.round(domWidth / parts));\n } else {\n measuredWidths[col] = defaultCellMinWidth;\n }\n } catch {\n measuredWidths[col] = defaultCellMinWidth;\n }\n }\n\n // Prevent table growth from sub-pixel border rounding in border-collapse.\n // Each cell.offsetWidth rounds independently, so their sum can exceed\n // the table's content area by 1-2px. Additionally, border-collapse adds\n // the outer collapsed border (~1px) on top of the content width, so\n // frozen colwidths must sum to content_area, not border-box width.\n // We subtract 1 from floor(BCR) to account for the collapsed border.\n try {\n const tableDom = findTableDom(view, tableStart);\n if (tableDom) {\n const actualWidth = Math.floor(tableDom.getBoundingClientRect().width) - 1;\n if (actualWidth > 0) {\n let measuredTotal = 0;\n for (let col = 0; col < map.width; col++) measuredTotal += (measuredWidths[col] ?? 0);\n const diff = measuredTotal - actualWidth;\n if (diff > 0) {\n for (let col = map.width - 1; col >= 0; col--) {\n if (colNeedsWidth[col]) {\n measuredWidths[col] = Math.max(cellMinWidth, (measuredWidths[col] ?? 0) - diff);\n break;\n }\n }\n }\n }\n }\n } catch { /* DOM lookup failed — continue with unadjusted widths */ }\n\n // Accumulate colwidth arrays per cell (handles colspan cells visited multiple times)\n const cellColwidths = new Map<number, number[]>();\n\n for (let col = 0; col < map.width; col++) {\n if (!colNeedsWidth[col]) continue;\n\n const width = measuredWidths[col] ?? 0;\n\n for (let row = 0; row < map.height; row++) {\n const mapIndex = row * map.width + col;\n // Skip if same cell as row above (rowspan)\n if (row > 0 && map.map[mapIndex] === map.map[mapIndex - map.width]) continue;\n\n const pos = map.map[mapIndex] ?? 0;\n const cellNode = table.nodeAt(pos);\n if (!cellNode) continue;\n\n const attrs = cellNode.attrs;\n const colspan = (attrs['colspan'] as number) || 1;\n const index = colspan === 1 ? 0 : col - map.colCount(pos);\n\n if (!cellColwidths.has(pos)) {\n const existing = attrs['colwidth'] as number[] | null;\n cellColwidths.set(pos, existing ? existing.slice() : new Array(colspan).fill(0) as number[]);\n }\n const arr = cellColwidths.get(pos);\n if (arr) arr[index] = width;\n }\n }\n\n // Apply accumulated changes in a single transaction\n const tr = state.tr;\n\n for (const [pos, colwidth] of cellColwidths) {\n const cellNode = table.nodeAt(pos);\n if (!cellNode) continue;\n tr.setNodeMarkup(tableStart + pos, null, {\n ...cellNode.attrs,\n colwidth,\n });\n }\n\n if (tr.docChanged) {\n view.dispatch(tr);\n }\n}\n","/**\n * Cell-selection UI plugin.\n *\n * Responsibilities:\n * 1. Focused-cell decoration — adds `dm-cell-focused` class on the cell\n * containing the cursor (not during CellSelection).\n * 2. Cell toolbar visibility — shows/hides the floating cell toolbar strip\n * when CellSelection is active.\n * 3. Cell handle visibility — shows/hides the small circle handle when the\n * cursor rests inside a single table cell.\n * 4. Column-resize coordination — hides all handles/menus during active\n * column resize drag.\n */\n\nimport { Plugin, PluginKey, type PluginView } from '@domternal/pm/state';\nimport { Decoration, DecorationSet, type EditorView } from '@domternal/pm/view';\nimport { CellSelection } from '@domternal/pm/tables';\nimport { type TableView, tableViewMap } from '../TableView.js';\n\nconst pluginKey = new PluginKey<DecorationSet>('cellSelection');\n\n/** Resolve the DOM element at a ProseMirror position (text nodes → parentElement). */\nfunction domElementAt(view: EditorView, pos: number): HTMLElement | null {\n const { node } = view.domAtPos(pos);\n return node instanceof HTMLElement ? node : node.parentElement;\n}\n\nexport function createCellSelectionPlugin(): Plugin {\n return new Plugin({\n key: pluginKey,\n state: {\n init() { return DecorationSet.empty; },\n apply(_tr, _set, _oldState, newState) {\n const sel = newState.selection;\n if (sel instanceof CellSelection) return DecorationSet.empty;\n const $from = sel.$from;\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') {\n const pos = $from.before(d);\n const deco = Decoration.node(pos, pos + $from.node(d).nodeSize, { class: 'dm-cell-focused' });\n return DecorationSet.create(newState.doc, [deco]);\n }\n }\n return DecorationSet.empty;\n },\n },\n props: {\n decorations(state) { return pluginKey.getState(state); },\n },\n view: (): PluginView => {\n let lastToolbarView: TableView | null = null;\n let lastHandleView: TableView | null = null;\n let resizingView: TableView | null = null;\n return {\n update: (view: EditorView) => {\n // Detect column resize drag (prosemirror-tables adds column-resize-dragging\n // decoration only during active drag, not on mere hover near border)\n const draggingCell = view.dom.querySelector('.column-resize-dragging');\n if (draggingCell) {\n const container = draggingCell.closest<HTMLElement>('.dm-table-container');\n const tv = container ? tableViewMap.get(container) : undefined;\n if (tv && tv !== resizingView) {\n tv.hideForResize();\n resizingView = tv;\n }\n return; // skip all handle/toolbar logic during resize\n } else if (resizingView) {\n resizingView.showAfterResize();\n resizingView = null;\n }\n\n const sel = view.state.selection;\n if (sel instanceof CellSelection) {\n // CellSelection → show toolbar (unless suppressed by row/col handle), hide cell handle\n const anchorPos = sel.$anchorCell.pos;\n const el = domElementAt(view, anchorPos + 1);\n const container = el?.closest<HTMLElement>('.dm-table-container');\n const tv = container ? tableViewMap.get(container) : undefined;\n if (tv) {\n if (!tv.suppressCellToolbar) {\n tv.updateCellHandle(true);\n }\n tv.hideCellHandle();\n lastToolbarView = tv;\n }\n if (lastHandleView && lastHandleView !== tv) {\n lastHandleView.hideCellHandle();\n }\n lastHandleView = null;\n } else {\n // Not CellSelection → hide toolbar\n if (lastToolbarView) {\n lastToolbarView.updateCellHandle(false);\n lastToolbarView = null;\n }\n\n // Check if TextSelection is inside a table cell → show cell handle\n const $from = sel.$from;\n let inCell = false;\n for (let d = $from.depth; d > 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') {\n inCell = true;\n break;\n }\n }\n\n if (inCell && sel.empty) {\n // Only show cell handle for cursor (empty selection).\n // During text selection the handle would be distracting.\n const domEl = domElementAt(view, $from.pos);\n const cellEl = domEl?.closest<HTMLTableCellElement>('td, th');\n const container = cellEl?.closest<HTMLElement>('.dm-table-container');\n const tv = container ? tableViewMap.get(container) : undefined;\n if (tv && cellEl) {\n tv.showCellHandle(cellEl);\n if (lastHandleView && lastHandleView !== tv) {\n lastHandleView.hideCellHandle();\n }\n lastHandleView = tv;\n }\n } else {\n if (lastHandleView) {\n lastHandleView.hideCellHandle();\n lastHandleView = null;\n }\n }\n }\n },\n };\n },\n });\n}\n","/**\n * TableRow Node\n *\n * Table row (<tr>). Contains table cells and/or table header cells.\n */\n\nimport { Node } from '@domternal/core';\n\nexport interface TableRowOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TableRow = Node.create<TableRowOptions>({\n name: 'tableRow',\n content: '(tableCell | tableHeader)*',\n tableRole: 'row',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'tr' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['tr', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n});\n","/**\n * Shared cell attributes for TableCell and TableHeader.\n * Both node types support the same colspan, rowspan, colwidth, background,\n * textAlign and verticalAlign attributes.\n *\n * Note: textAlign and verticalAlign use data-* attributes (not inline style)\n * to avoid overwriting the background inline style. CSS attribute selectors\n * in _table-controls.scss apply the actual text-align / vertical-align.\n */\nimport type { AttributeSpecs } from '@domternal/core';\n\nexport function cellAttributes(): AttributeSpecs {\n return {\n colspan: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const colspan = element.getAttribute('colspan');\n return colspan ? Number(colspan) : 1;\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const colspan = attrs['colspan'] as number;\n if (colspan === 1) return null;\n return { colspan };\n },\n },\n rowspan: {\n default: 1,\n parseHTML: (element: HTMLElement) => {\n const rowspan = element.getAttribute('rowspan');\n return rowspan ? Number(rowspan) : 1;\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const rowspan = attrs['rowspan'] as number;\n if (rowspan === 1) return null;\n return { rowspan };\n },\n },\n colwidth: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const colwidth = element.getAttribute('data-colwidth');\n return colwidth ? colwidth.split(',').map(Number) : null;\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const colwidth = attrs['colwidth'] as number[] | null;\n if (!colwidth) return null;\n return { 'data-colwidth': colwidth.join(',') };\n },\n },\n background: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.getAttribute('data-background') ?? (element.style.backgroundColor || null);\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const bg = attrs['background'] as string | null;\n if (!bg) return null;\n return { 'data-background': bg, style: `background-color: ${bg}` };\n },\n },\n textAlign: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.getAttribute('data-text-align') ?? null;\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const align = attrs['textAlign'] as string | null;\n if (!align) return null;\n return { 'data-text-align': align };\n },\n },\n verticalAlign: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n return element.getAttribute('data-vertical-align') ?? null;\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const align = attrs['verticalAlign'] as string | null;\n if (!align) return null;\n return { 'data-vertical-align': align };\n },\n },\n };\n}\n","/**\n * TableCell Node\n *\n * Table data cell (<td>). Contains block content.\n * Supports colspan, rowspan, colwidth, and background attributes.\n */\n\nimport { Node } from '@domternal/core';\nimport { cellAttributes } from './helpers/cellAttributes.js';\n\nexport interface TableCellOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TableCell = Node.create<TableCellOptions>({\n name: 'tableCell',\n content: 'block+',\n tableRole: 'cell',\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return cellAttributes();\n },\n\n parseHTML() {\n return [{ tag: 'td' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['td', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n});\n","/**\n * TableHeader Node\n *\n * Table header cell (<th>). Contains block content.\n * Same attributes as TableCell (colspan, rowspan, colwidth, background).\n */\n\nimport { Node } from '@domternal/core';\nimport { cellAttributes } from './helpers/cellAttributes.js';\n\nexport interface TableHeaderOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const TableHeader = Node.create<TableHeaderOptions>({\n name: 'tableHeader',\n content: 'block+',\n tableRole: 'header_cell',\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return cellAttributes();\n },\n\n parseHTML() {\n return [{ tag: 'th' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['th', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n});\n","/**\n * Table Node\n *\n * Block-level table container using HTML <table>.\n * Built on prosemirror-tables for cell selection, keyboard nav, and table editing.\n *\n * Commands (18):\n * - insertTable: Insert new table with configurable rows/cols/header\n * - deleteTable: Delete entire table\n * - addRowBefore / addRowAfter: Insert row\n * - deleteRow: Delete current row\n * - addColumnBefore / addColumnAfter: Insert column\n * - deleteColumn: Delete current column\n * - mergeCells: Merge selected cells into one\n * - splitCell: Split a merged cell back to individual cells\n * - toggleHeaderRow / toggleHeaderColumn / toggleHeaderCell: Toggle header\n * - setCellAttribute: Set cell attribute\n * - goToNextCell / goToPreviousCell: Cell navigation\n * - fixTables: Repair malformed tables\n * - setCellSelection: Programmatic cell selection\n *\n * Features:\n * - goToNextCell/goToPreviousCell exposed as standalone commands\n * - fixTables exposed as command\n * - setCellSelection for programmatic cell range selection\n * - Fully typed options and command params\n * - Framework-agnostic: TableView isolated for wrapper replacement\n */\n\nimport { Node } from '@domternal/core';\nimport type { CommandSpec, ToolbarItem } from '@domternal/core';\nimport { TextSelection } from '@domternal/pm/state';\nimport type { Transaction } from '@domternal/pm/state';\nimport type { Node as PMNode } from '@domternal/pm/model';\nimport type { EditorView, NodeView, NodeViewConstructor } from '@domternal/pm/view';\nimport {\n tableEditing,\n columnResizing,\n addColumnBefore,\n addColumnAfter,\n deleteColumn,\n addRowBefore,\n addRowAfter,\n deleteRow,\n deleteTable,\n mergeCells,\n splitCell,\n toggleHeader,\n toggleHeaderCell,\n setCellAttr,\n goToNextCell,\n fixTables,\n CellSelection,\n selectedRect,\n TableMap,\n isInTable,\n} from '@domternal/pm/tables';\n\nimport { TableView } from './TableView.js';\nimport { createTable } from './helpers/createTable.js';\nimport { deleteTableWhenAllCellsSelected } from './helpers/deleteTableWhenAllCellsSelected.js';\nimport { constrainedAddColumn } from './helpers/constrainedColumn.js';\nimport { createResizeSuppressionPlugin } from './plugins/resizeSuppressionPlugin.js';\nimport { createCellSelectionPlugin } from './plugins/cellSelectionPlugin.js';\nimport { TableRow } from './TableRow.js';\nimport { TableCell } from './TableCell.js';\nimport { TableHeader } from './TableHeader.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n insertTable: CommandSpec<[options?: { rows?: number; cols?: number; withHeaderRow?: boolean }]>;\n deleteTable: CommandSpec;\n addRowBefore: CommandSpec;\n addRowAfter: CommandSpec;\n deleteRow: CommandSpec;\n addColumnBefore: CommandSpec;\n addColumnAfter: CommandSpec;\n deleteColumn: CommandSpec;\n toggleHeaderRow: CommandSpec;\n toggleHeaderColumn: CommandSpec;\n toggleHeaderCell: CommandSpec;\n mergeCells: CommandSpec;\n splitCell: CommandSpec;\n setCellAttribute: CommandSpec<[name: string, value: unknown]>;\n goToNextCell: CommandSpec;\n goToPreviousCell: CommandSpec;\n fixTables: CommandSpec;\n setCellSelection: CommandSpec<[position: { anchorCell: number; headCell?: number }]>;\n }\n}\n\nexport interface TableOptions {\n /**\n * Custom HTML attributes for the rendered table element.\n */\n HTMLAttributes: Record<string, unknown>;\n\n /**\n * Minimum cell width in pixels (floor when dragging).\n * @default 25\n */\n cellMinWidth: number;\n\n /**\n * Default width for columns without an explicit colwidth attribute.\n * Must match the columnResizing plugin default for consistent resize behavior.\n * @default 100\n */\n defaultCellMinWidth: number;\n\n /**\n * Column resize behavior when dragging a column border.\n * - `'neighbor'`: adjacent column compensates, table width stays constant (Google Docs style)\n * - `'independent'`: only dragged column changes, table width grows/shrinks\n * - `'redistribute'`: all columns redistribute to fill available width (prosemirror-tables default)\n * @default 'neighbor'\n */\n resizeBehavior: 'neighbor' | 'independent' | 'redistribute';\n\n /**\n * Prevent the table from exceeding its container (.tableWrapper) width.\n * When true: last-column resize is capped, add-column redistributes if needed.\n * When false: original behavior (table can grow beyond container).\n * @default true\n */\n constrainToContainer: boolean;\n\n /**\n * Allow selecting the entire table as a node selection.\n * @default false\n */\n allowTableNodeSelection: boolean;\n\n /**\n * Custom NodeView constructor. Override to provide framework-specific rendering.\n * Set to null to disable custom NodeView.\n */\n View: (new (node: PMNode, cellMinWidth: number, view: EditorView, defaultCellMinWidth?: number, constrainToContainer?: boolean) => NodeView) | null;\n}\n\nexport const Table = Node.create<TableOptions>({\n name: 'table',\n group: 'block',\n content: 'tableRow+',\n tableRole: 'table',\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n cellMinWidth: 25,\n defaultCellMinWidth: 100,\n resizeBehavior: 'neighbor',\n constrainToContainer: true,\n allowTableNodeSelection: false,\n View: TableView,\n };\n },\n\n parseHTML() {\n return [{ tag: 'table' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['table', { ...this.options.HTMLAttributes, ...HTMLAttributes }, ['tbody', 0]];\n },\n\n addExtensions() {\n return [TableRow, TableCell, TableHeader];\n },\n\n addNodeView() {\n const ViewClass = this.options.View;\n const cellMinWidth = this.options.cellMinWidth;\n const defaultCellMinWidth = this.options.defaultCellMinWidth;\n const constrainToContainer = this.options.constrainToContainer;\n\n if (!ViewClass) {\n return undefined as unknown as NodeViewConstructor;\n }\n\n return ((node: PMNode, view: EditorView) =>\n new ViewClass(node, cellMinWidth, view, defaultCellMinWidth, constrainToContainer)) as unknown as NodeViewConstructor;\n },\n\n addCommands() {\n return {\n insertTable:\n (options?: { rows?: number; cols?: number; withHeaderRow?: boolean }) =>\n ({ state, tr, dispatch }) => {\n // Prevent insertion inside tables and code blocks\n const $from = state.selection.$from;\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n if (node.type.name === 'table') return false;\n if (node.type.spec.code) return false;\n }\n\n const rows = options?.rows ?? 3;\n const cols = options?.cols ?? 3;\n const withHeaderRow = options?.withHeaderRow ?? true;\n const table = createTable(state.schema, rows, cols, withHeaderRow);\n\n if (!dispatch) {\n return true;\n }\n\n const offset = tr.selection.from + 1;\n tr.replaceSelectionWith(table)\n .scrollIntoView()\n .setSelection(TextSelection.near(tr.doc.resolve(offset)));\n dispatch(tr);\n\n return true;\n },\n\n deleteTable:\n () =>\n ({ state, dispatch }) => {\n return deleteTable(state, dispatch);\n },\n\n addRowBefore:\n () =>\n ({ state, dispatch }) => {\n return addRowBefore(state, dispatch);\n },\n\n addRowAfter:\n () =>\n ({ state, dispatch }) => {\n return addRowAfter(state, dispatch);\n },\n\n deleteRow:\n () =>\n ({ state, dispatch }) => {\n if (!isInTable(state)) return false;\n const rect = selectedRect(state);\n if (rect.top === 0 && rect.bottom === rect.map.height) {\n return deleteTable(state, dispatch);\n }\n return deleteRow(state, dispatch);\n },\n\n addColumnBefore:\n () =>\n ({ state, dispatch, editor }) => {\n if (!this.options.constrainToContainer || !dispatch) {\n return addColumnBefore(state, dispatch);\n }\n const view = editor.view as EditorView;\n return constrainedAddColumn(addColumnBefore, view, this.options.cellMinWidth, this.options.defaultCellMinWidth);\n },\n\n addColumnAfter:\n () =>\n ({ state, dispatch, editor }) => {\n if (!this.options.constrainToContainer || !dispatch) {\n return addColumnAfter(state, dispatch);\n }\n const view = editor.view as EditorView;\n return constrainedAddColumn(addColumnAfter, view, this.options.cellMinWidth, this.options.defaultCellMinWidth);\n },\n\n deleteColumn:\n () =>\n ({ state, dispatch }) => {\n if (!isInTable(state)) return false;\n const rect = selectedRect(state);\n if (rect.left === 0 && rect.right === rect.map.width) {\n return deleteTable(state, dispatch);\n }\n if (!dispatch) return true;\n\n let captured: Transaction | undefined;\n deleteColumn(state, (tr) => { captured = tr; });\n if (!captured) return false;\n\n const table = captured.doc.nodeAt(rect.tableStart - 1);\n if (table) {\n const map = TableMap.get(table);\n const targetCol = Math.min(rect.left, map.width - 1);\n const cellOffset = map.map[targetCol];\n if (cellOffset !== undefined) {\n const $pos = captured.doc.resolve(rect.tableStart + cellOffset + 1);\n captured.setSelection(TextSelection.near($pos));\n }\n }\n\n dispatch(captured);\n return true;\n },\n\n toggleHeaderRow:\n () =>\n ({ state, dispatch }) => {\n return toggleHeader('row')(state, dispatch);\n },\n\n toggleHeaderColumn:\n () =>\n ({ state, dispatch }) => {\n return toggleHeader('column')(state, dispatch);\n },\n\n toggleHeaderCell:\n () =>\n ({ state, dispatch }) => {\n return toggleHeaderCell(state, dispatch);\n },\n\n mergeCells:\n () =>\n ({ state, dispatch }) => {\n return mergeCells(state, dispatch);\n },\n\n splitCell:\n () =>\n ({ state, dispatch }) => {\n return splitCell(state, dispatch);\n },\n\n setCellAttribute:\n (name: string, value: unknown) =>\n ({ state, dispatch }) => {\n return setCellAttr(name, value)(state, dispatch);\n },\n\n goToNextCell:\n () =>\n ({ state, dispatch }) => {\n return goToNextCell(1)(state, dispatch);\n },\n\n goToPreviousCell:\n () =>\n ({ state, dispatch }) => {\n return goToNextCell(-1)(state, dispatch);\n },\n\n fixTables:\n () =>\n ({ state, dispatch }) => {\n if (dispatch) {\n const tr = fixTables(state);\n if (tr) dispatch(tr);\n }\n return true;\n },\n\n setCellSelection:\n (position: { anchorCell: number; headCell?: number }) =>\n ({ tr, dispatch }) => {\n const selection = CellSelection.create(\n tr.doc,\n position.anchorCell,\n position.headCell,\n );\n tr.setSelection(selection as unknown as typeof tr.selection);\n if (dispatch) {\n dispatch(tr);\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n const editor = this.editor;\n\n /** Check if cursor is inside a list item (defer Tab/Shift-Tab to list extensions). */\n const isInListItem = (): boolean => {\n if (!editor) return false;\n const { $from } = editor.state.selection;\n for (let d = $from.depth; d >= 0; d--) {\n const name = $from.node(d).type.name;\n if (name === 'listItem' || name === 'taskItem') return true;\n }\n return false;\n };\n\n /** Delete the entire table when all cells are selected (Backspace/Delete). */\n const deleteTableHandler = (): boolean => {\n if (!editor) return false;\n return deleteTableWhenAllCellsSelected({\n state: editor.state,\n dispatch: editor.view.dispatch,\n });\n };\n\n return {\n Tab: () => {\n if (!editor || isInListItem()) return false;\n\n // Try to move to next cell\n if (editor.commands['goToNextCell']?.()) {\n return true;\n }\n\n // If no next cell, add a row and move into it\n if (editor.commands['addRowAfter']?.()) {\n editor.commands['goToNextCell']?.();\n return true;\n }\n\n return false;\n },\n\n 'Shift-Tab': () => {\n if (!editor || isInListItem()) return false;\n return editor.commands['goToPreviousCell']?.() ?? false;\n },\n\n Backspace: deleteTableHandler,\n 'Mod-Backspace': deleteTableHandler,\n Delete: deleteTableHandler,\n 'Mod-Delete': deleteTableHandler,\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'insertTable',\n command: 'insertTable',\n icon: 'table',\n label: 'Insert Table',\n group: 'insert',\n priority: 140,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n return [\n createResizeSuppressionPlugin({\n resizeBehavior: this.options.resizeBehavior,\n cellMinWidth: this.options.cellMinWidth,\n defaultCellMinWidth: this.options.defaultCellMinWidth,\n constrainToContainer: this.options.constrainToContainer,\n }),\n\n columnResizing({\n cellMinWidth: this.options.cellMinWidth,\n defaultCellMinWidth: this.options.defaultCellMinWidth,\n }),\n\n tableEditing({\n allowTableNodeSelection: this.options.allowTableNodeSelection,\n }),\n\n createCellSelectionPlugin(),\n ];\n },\n});\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@domternal/extension-table",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Table extension for Domternal editor",
|
|
5
|
+
"author": "https://github.com/ThomasNowHere",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.cjs",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"require": {
|
|
22
|
+
"types": "./dist/index.d.cts",
|
|
23
|
+
"default": "./dist/index.cjs"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup --clean",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"lint": "eslint src",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"prepublishOnly": "node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));delete p.devDependencies;if(p.dependencies){for(const[k,v]of Object.entries(p.dependencies)){if(v==='workspace:*')p.dependencies[k]='>=0.2.0'}}require('fs').writeFileSync('package.json',JSON.stringify(p,null,2)+'\\n')\"",
|
|
38
|
+
"postpublish": "git checkout package.json"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@domternal/core": ">=0.2.0",
|
|
42
|
+
"@domternal/pm": ">=0.2.0"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"prosemirror",
|
|
46
|
+
"editor",
|
|
47
|
+
"table",
|
|
48
|
+
"domternal"
|
|
49
|
+
],
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/domternal/domternal.git",
|
|
53
|
+
"directory": "packages/extension-table"
|
|
54
|
+
},
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/domternal/domternal/issues"
|
|
57
|
+
},
|
|
58
|
+
"homepage": "https://domternal.dev"
|
|
59
|
+
}
|