@lofcz/platejs-table 52.0.11
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 +24 -0
- package/README.md +11 -0
- package/dist/constants-B6Sm9BNa.js +2536 -0
- package/dist/constants-B6Sm9BNa.js.map +1 -0
- package/dist/index-CbSGuAlP.d.ts +638 -0
- package/dist/index-CbSGuAlP.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.d.ts +157 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +879 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-B6Sm9BNa.js","names":["SlateEditor","TElement","KEYS","CreateCellOptions","getEmptyCellNode","editor","children","header","row","every","c","type","getType","th","api","create","block","td","SlateEditor","KEYS","TableConfig","CreateCellOptions","GetEmptyRowNodeOptions","colCount","getEmptyRowNode","editor","cellOptions","api","getPlugin","key","table","children","Array","from","length","fill","map","create","tableCell","type","getType","tr","SlateEditor","TTableElement","KEYS","TableConfig","GetEmptyRowNodeOptions","GetEmptyTableNodeOptions","rowCount","getEmptyTableNode","editor","colCount","header","cellOptions","api","getPlugin","key","table","rows","Array","from","length","fill","map","_","index","create","tableRow","children","type","getType","Editor","NodeEntry","Path","TElement","PathApi","getCellInNextTableRow","editor","currentRowPath","nextRow","api","node","next","nextRowNode","nextRowPath","nextCell","children","nextCellPath","concat","Editor","NodeEntry","Path","TElement","PathApi","getCellInPreviousTableRow","editor","currentRowPath","prevPath","previous","previousRow","api","node","previousRowNode","previousRowPath","previousCell","children","length","previousCellPath","concat","TTableCellElement","getColSpan","cellElem","colSpan","Number","attributes","colspan","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","getEditorPlugin","KEYS","BaseTablePlugin","computeCellIndices","editor","all","cellNode","tableNode","api","getOptions","setOption","key","table","above","at","match","type","getType","_cellIndices","prevIndices","cellIndices","hasIndicesChanged","skipCells","targetIndices","col","row","rowIndex","children","length","colIndex","cellElement","currentIndices","prevIndicesForCell","id","colSpan","getColSpan","rowSpan","getRowSpan","r","c","SlateEditor","TTableCellElement","getEditorPlugin","KEYS","TableConfig","computeCellIndices","CellIndices","col","row","getCellIndices","editor","element","getOption","key","table","indices","id","cellNode","api","debug","warn","Path","getCellRowIndexByPath","cellPath","index","at","undefined","Error","SlateEditor","getPluginTypes","KEYS","getCellTypes","editor","td","th","Path","SlateEditor","TTableCellElement","PathApi","getCellTypes","getLeftTableCell","editor","at","cellPath","api","node","match","type","cellIndex","prevCellPath","previous","Editor","NodeEntry","Path","PathApi","getCellInNextTableRow","getNextTableCell","editor","_currentCell","currentPath","currentRow","cell","api","node","next","currentRowPath","Editor","NodeEntry","Path","PathApi","getCellInPreviousTableRow","getPreviousTableCell","editor","_currentCell","currentPath","currentRow","prevPath","previous","currentRowPath","cell","api","node","TTableCellElement","getRowSpan","cellElem","rowSpan","Number","attributes","rowspan","SlateEditor","TTableCellElement","getCellIndices","getColSpan","getRowSpan","getSelectedCellsBoundingBox","editor","cells","maxCol","maxRow","minCol","minRow","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","cell","col","row","cSpan","rSpan","endRow","endCol","Path","SlateEditor","TTableCellElement","PathApi","getCellTypes","getTopTableCell","editor","at","cellPath","api","node","match","type","cellIndex","rowIndex","cellAbovePath","parent","SlateEditor","TElement","TTableCellElement","BorderDirection","getCellIndices","getCellTypes","getColSpan","getLeftTableCell","getRowSpan","getSelectedCellsBoundingBox","getTopTableCell","GetSelectedCellsBordersOptions","select","none","outer","side","TableBorderStates","bottom","left","right","top","getSelectedCellsBorders","editor","selectedCells","options","cells","length","cell","api","block","match","type","cellElements","map","maxCol","maxRow","minCol","minRow","hasAnyBorder","allOuterBordersSet","borderStates","col","row","cellPath","findPath","cSpan","rSpan","isFirstRow","isFirstCell","borders","size","cellAboveEntry","at","prevCellEntry","rr","cc","cellAbove","prevCell","isSelectedCellBordersNone","every","isSelectedCellBordersOuter","isSelectedCellBorder","cellAboveNode","prevCellNode","EditorAboveOptions","SlateEditor","KEYS","getTableAbove","editor","options","api","block","above","match","type","getType","table","SlateEditor","TTableCellBorder","TTableCellElement","TTableElement","TTableRowElement","BorderDirection","CellIndices","getCellIndices","BorderStylesDefault","bottom","right","left","top","getTableCellBorders","editor","cellIndices","defaultBorder","size","element","cellPath","api","findPath","rowNode","rowPath","parent","tableNode","col","isFirstCell","isFirstRow","children","getBorder","dir","border","borders","color","style","undefined","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","getEditorPlugin","KEYS","CellIndices","TableConfig","getCellIndices","getTableOverriddenColSizes","getTableCellSize","editor","cellIndices","colSizes","element","rowSize","api","key","table","path","findPath","rowElement","parent","minHeight","width","size","rowPath","tableNode","colSpan","getColSpan","col","slice","reduce","total","w","TElement","getTableColumnCount","tableNode","children","map","element","colSpan","attributes","colspan","reduce","total","num","Number","SlateEditor","TLocation","KEYS","getCellTypes","getTableEntries","editor","at","selection","cellEntry","api","node","match","type","cellPath","rowEntry","above","getType","tr","rowPath","tableEntry","table","cell","row","TTableCellElement","getColSpan","getRowSpan","getCellIndicesWithSpans","col","row","endCell","SlateEditor","TTableCellElement","TTableElement","getCellIndices","getCellIndicesWithSpans","findCellByIndexes","editor","table","searchRowIndex","searchColIndex","allCells","children","flatMap","current","foundCell","find","cellNode","indices","col","_startColIndex","row","_startRowIndex","_endColIndex","_endRowIndex","ElementEntry","SlateEditor","TElement","TRange","TTableCellElement","TTableElement","TTableRowElement","getEditorPlugin","BaseTablePlugin","getCellTypes","getCellIndices","findCellByIndexes","getCellIndicesWithSpans","FormatType","GetTableGridByRangeOptions","at","format","T","GetTableGridReturnType","TableGridEntries","cellEntries","tableEntries","getTableMergeGridByRange","editor","api","type","startCellEntry","node","anchor","path","match","endCellEntry","focus","startCell","endCell","startCellPath","tablePath","slice","tableEntry","realTable","col","_startColIndex","row","_startRowIndex","_endColIndex","_endRowIndex","startRowIndex","Math","min","endRowIndex","max","startColIndex","endColIndex","relativeRowIndex","relativeColIndex","table","create","children","colCount","rowCount","cellsSet","WeakSet","rowIndex","colIndex","cell","indicies","cellColWithSpan","cellRowWithSpan","cellCol","cellRow","hasOverflowTop","hasOverflowBottom","hasOverflowLeft","hasOverflowRight","newRelativeRowIndex","newRelativeColIndex","has","add","rows","cellPath","findPath","push","formatType","forEach","rowEl","rowElement","filteredChildren","filter","cellEl","cellElement","getCellChildren","length","ElementEntry","SlateEditor","TElement","TRange","TTableElement","KEYS","NodeApi","TableConfig","BaseTablePlugin","getTableMergeGridByRange","GetTableGridByRangeOptions","at","format","getTableGridByRange","editor","api","getPlugin","key","table","disableMerge","getOptions","startCellPath","anchor","path","endCellPath","focus","_startRowIndex","_endRowIndex","_startColIndex","_endColIndex","startRowIndex","Math","min","endRowIndex","max","startColIndex","endColIndex","tablePath","slice","relativeRowIndex","relativeColIndex","create","children","colCount","rowCount","rowIndex","colIndex","cellEntries","cellPath","concat","cell","get","rows","push","EditorAboveOptions","ElementEntry","SlateEditor","KEYS","PathApi","TableConfig","getCellTypes","GetTableGridByRangeOptions","getTableGridByRange","GetTableGridAboveOptions","Pick","getTableGridAbove","editor","format","options","api","getPlugin","key","table","edges","edgeBlocks","match","type","start","end","equals","at","anchor","offset","path","focus","create","rowCount","children","slice","TTableElement","TableStoreSizeOverrides","getTableColumnCount","getTableOverriddenColSizes","tableNode","colSizeOverrides","colCount","colSizes","Array","from","length","fill","map","size","index","get","NodeEntry","PathRef","SlateEditor","TTableCellElement","KEYS","NodeApi","RangeApi","getTableGridAbove","deleteColumnWhenExpanded","editor","tableEntry","start","end","edges","selection","firstRow","child","lastRow","children","length","firstSelectionRow","api","above","at","match","n","type","tr","lastSelectionRow","id","deleteSelection","cells","format","pathRefs","forEach","_cell","cellPath","push","pathRef","tf","removeNodes","unref","NodeEntry","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","getCellIndices","getCellPath","editor","tableEntry","curRowIndex","curColIndex","tableNode","tablePath","rowElem","children","foundColIndex","findIndex","c","cE","col","colIndex","concat","Path","SlateEditor","TTableCellElement","TTableElement","cloneDeep","getEditorPlugin","KEYS","getCellIndices","getCellTypes","BaseTablePlugin","deleteColumnWhenExpanded","findCellByIndexes","getCellPath","deleteTableMergeColumn","editor","type","getType","table","tableEntry","api","above","match","tf","withoutNormalizing","isExpanded","selectedCellEntry","selectedCell","col","deletingColIndex","colsDeleteNumber","getColSpan","endingColIndex","rowNumber","children","length","affectedCellsSet","Set","rI","Array","from","_","i","cI","colIndex","found","add","affectedCells","squizeColSpanCells","reduce","acc","cur","currentCell","curColIndex","curColSpan","push","forEach","curCell","row","curColRowIndex","curCellPath","curCellEndingColIndex","Math","min","colsNumberAffected","colSpan","newCell","attributes","colspan","toString","setNodes","at","trEntry","tr","tableNode","tablePath","paths","curRowIndex","includes","cellPath","cellPaths","pathToDelete","removeNodes","colSizes","newColSizes","splice","NodeEntry","PathRef","SlateEditor","TTableCellElement","getEditorPlugin","BaseTablePlugin","getCellRowIndexByPath","getTableMergedColumnCount","getTableGridAbove","deleteRowWhenExpanded","editor","table","tablePath","api","columnCount","cells","format","firsRowIndex","acrossColumn","lastRowIndex","rowSpanCarry","acrossRow","forEach","cell","cellPath","at","colSpan","currentRowIndex","rowSpan","getRowSpan","pathRefs","i","removedPath","concat","push","pathRef","item","tf","removeNodes","unref","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","cloneDeep","getEditorPlugin","KEYS","TableConfig","findCellByIndexes","getCellIndices","getCellTypes","getTableColumnCount","deleteRowWhenExpanded","deleteTableMergeRow","editor","api","tf","type","key","table","some","match","currentTableItem","above","isExpanded","selectedCellEntry","selectedCell","row","deletingRowIndex","rowsDeleteNumber","getRowSpan","endingRowIndex","colNumber","affectedCellsSet","Set","cI","Array","from","length","_","i","rI","rowIndex","found","add","affectedCells","moveToNextRowCells","squizeRowSpanCells","reduce","acc","cur","currentCell","curRowIndex","curRowSpan","push","nextRowIndex","nextRow","children","undefined","remove","index","curRowCell","col","curRowCellColIndex","curRowCellRowIndex","curRowCellRowSpan","startingCellIndex","findIndex","curC","cell","curColIndex","startingCell","at","startingCellPath","findPath","tablePath","slice","colPath","nextRowStartCellPath","rowsNumberAffected","rowSpan","newCell","attributes","rowspan","toString","insertNodes","startingColIndex","incrementBy","forEach","curCellPath","curCellEndingRowIndex","Math","min","setNodes","rowToDelete","rowPath","removeNodes","TElement","getColSpan","getTableMergedColumnCount","tableNode","children","reduce","prev","cur","cloneDeep","Path","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","getEditorPlugin","KEYS","NodeApi","PathApi","BaseTablePlugin","getCellTypes","getCellIndices","findCellByIndexes","getCellPath","insertTableMergeColumn","editor","at","before","fromCell","header","select","shouldSelect","api","getOptions","type","initialTableWidth","minColumnWidth","table","get","getType","lastChild","concat","undefined","cellEntry","node","match","block","cellPath","cell","tableEntry","above","tableNode","tablePath","col","cellColIndex","cellColSpan","getColSpan","nextColIndex","checkingColIndex","isPath","rowNumber","children","length","firstCol","placementCorrection","affectedCellsSet","Set","Array","from","_","i","forEach","rI","found","add","affectedCells","curCell","curColIndex","row","curRowIndex","curRowSpan","getRowSpan","curColSpan","currentCellPath","endCurI","colSpan","newCell","attributes","colspan","toString","tf","setNodes","curRowPath","slice","curColPath","placementPath","parent","rowElement","emptyCell","create","tableCell","rowSpan","insertNodes","withoutNormalizing","colSizes","newColSizes","oldTotal","reduce","a","b","newTotal","maxTotal","Math","max","factor","map","size","floor","cloneDeep","Path","SlateEditor","TTableCellElement","TTableElement","TTableRowElement","getEditorPlugin","KEYS","NodeApi","PathApi","BaseTablePlugin","getTableColumnCount","getCellTypes","getCellIndices","findCellByIndexes","getCellPath","insertTableMergeRow","editor","at","before","fromRow","header","select","shouldSelect","api","type","table","get","getType","lastChild","undefined","trEntry","block","match","tr","trPath","tableEntry","above","tableNode","cellEntry","node","cellNode","cellPath","cellElement","cellRowSpan","getRowSpan","row","cellRowIndex","rowPath","tablePath","slice","nextRowIndex","checkingRowIndex","nextRowPath","isPath","firstRow","colCount","affectedCellsSet","Set","Array","from","length","_","i","forEach","cI","found","add","affectedCells","newRowChildren","cur","curCell","col","curColIndex","curRowIndex","curRowSpan","curColSpan","getColSpan","currentCellPath","endCurI","rowSpan","newCell","attributes","rowspan","toString","tf","setNodes","parent","rowElement","emptyCell","create","tableCell","push","colSpan","withoutNormalizing","insertNodes","children","nextCellPath","TTableCellElement","TTableElement","TTableRowElement","getColSpan","getRowSpan","allEqual","arr","every","val","isTableRectangular","table","children","forEach","row","rI","rowEl","cell","cellElem","Array","from","length","ArrayLike","_","i","Descendant","NodeEntry","SlateEditor","TTableCellElement","cloneDeep","getEditorPlugin","KEYS","getCellIndices","BaseTablePlugin","getTableGridAbove","mergeTableCells","editor","api","cellEntries","format","tf","withoutNormalizing","colSpan","entry","cell","path","rowIndex","at","cellColSpan","table","getColSpan","rowSpan","col","forEach","curCol","getRowSpan","mergingCellChildren","cellEntry","el","cellChildren","getCellChildren","length","isEmpty","push","cols","Record","_entry","Object","values","paths","removeNodes","mergedCell","create","tableCell","children","header","type","getType","th","insertNodes","select","end","Descendant","Path","SlateEditor","TTableCellElement","TTableRowElement","getEditorPlugin","KEYS","getCellIndices","BaseTablePlugin","getTableGridAbove","splitTableCell","editor","api","tableRowType","getType","tr","cellEntries","format","cellElem","path","tf","withoutNormalizing","createEmptyCell","children","create","tableCell","header","type","th","colSpan","rowSpan","tablePath","slice","cellPath","rowPath","colPath","table","getColSpan","getRowSpan","colPaths","i","push","col","removeNodes","at","getClosestColPathForRow","row","targetCol","rowEntry","node","match","rowEl","closestColPath","smallestDiff","Number","POSITIVE_INFINITY","isDirectionLeft","forEach","cell","cellElement","cellCol","diff","Math","abs","findPath","length","lastIndex","currentRowPath","pathForNextRows","newRowChildren","_rowPath","j","cellChildren","getCellChildren","cellToInsert","currentColPath","pathForNewCell","insertNodes","select","end","NormalizeInitialValue","TTableElement","TableConfig","computeCellIndices","normalizeInitialValueTable","editor","type","tables","api","nodes","at","match","table","tableNode","SlateEditor","TElement","TTableElement","getEditorPlugin","KEYS","TableConfig","deleteTableMergeColumn","deleteColumnWhenExpanded","getCellTypes","deleteColumn","editor","getOptions","type","key","table","disableMerge","tableEntry","api","above","match","tf","withoutNormalizing","isExpanded","tdEntry","trEntry","getType","tr","children","length","tableNode","tablePath","tdPath","colIndex","at","pathToDelete","slice","replacePathPos","forEach","row","rowIdx","removeNodes","colSizes","newColSizes","splice","setNodes","SlateEditor","TTableElement","getEditorPlugin","KEYS","TableConfig","deleteRowWhenExpanded","deleteTableMergeRow","deleteRow","editor","getOptions","type","key","table","disableMerge","api","some","match","currentTableItem","above","isExpanded","currentRowItem","getType","tr","children","length","tf","removeNodes","at","SlateEditor","KEYS","deleteTable","editor","api","some","match","type","getType","table","tableItem","above","tf","removeNodes","at","InsertNodesOptions","SlateEditor","TTableElement","KEYS","PathApi","GetEmptyTableNodeOptions","TableConfig","insertTable","editor","colCount","header","rowCount","select","shouldSelect","options","api","getPlugin","key","table","type","getType","tf","withoutNormalizing","newTable","create","at","currentTableEntry","block","match","tablePath","insertPath","next","insertNodes","selection","start","nextBlock","tableEntry","node","Path","SlateEditor","TElement","TTableElement","getEditorPlugin","KEYS","NodeApi","PathApi","BaseTablePlugin","insertTableMergeColumn","getCellTypes","insertTableColumn","editor","options","at","before","fromCell","header","select","api","getOptions","type","disableMerge","initialTableWidth","minColumnWidth","shouldSelect","table","get","getType","lastChild","concat","undefined","cellEntry","block","match","cellPath","tableEntry","above","tableNode","tablePath","nextCellPath","nextColIndex","isPath","next","currentRowIndex","tf","withoutNormalizing","children","forEach","row","rowIndex","insertCellPath","length","isHeaderRow","every","c","th","insertNodes","create","tableCell","colSizes","newColSizes","slice","oldTotal","reduce","a","b","newTotal","maxTotal","Math","max","factor","map","size","floor","setNodes","Path","SlateEditor","TElement","TTableElement","getEditorPlugin","KEYS","NodeApi","PathApi","BaseTablePlugin","insertTableMergeRow","getCellTypes","insertTableRow","editor","options","at","before","fromRow","header","select","api","getOptions","type","disableMerge","shouldSelect","table","get","getType","lastChild","undefined","trEntry","block","match","tr","trNode","trPath","tableEntry","above","getEmptyRowNode","children","map","_","i","hasSingleRow","length","isHeaderColumn","every","n","th","create","tableCell","tf","withoutNormalizing","insertNodes","isPath","next","cellEntry","nextCellPath","SlateEditor","TLocation","NodeApi","getTableGridAbove","getCellTypes","moveSelectionFromCell","editor","at","edge","fromOneCell","reverse","cellEntries","format","minCell","length","firstCellPath","lastCellPath","anchorPath","focusPath","has","tf","select","anchor","api","start","focus","cellEntry","block","match","type","cellPath","nextCellPath","offset","tablePath","slice","withoutNormalizing","move","end","SlateEditor","TRange","isHotkey","getCellTypes","KEY_SHIFT_EDGES","moveSelectionFromCell","overrideSelectionFromCell","editor","newSelection","hotkey","dom","currentKeyboardEvent","some","key","valid","selection","focus","api","isAt","at","anchor","blocks","match","type","edge","block","prevSelection","reverse","includes","setTimeout","fromOneCell","Path","SetNodesOptions","SlateEditor","TTableCellBorder","TTableCellElement","ElementApi","BorderDirection","getLeftTableCell","getTopTableCell","getCellTypes","setBorderSize","editor","size","at","border","cellEntry","api","node","match","type","cellNode","cellPath","cellIndex","rowIndex","borderStyle","setNodesOptions","n","isElement","includes","isFirstRow","newBorders","borders","top","tf","setNodes","cellAboveEntry","cellAboveNode","cellAbovePath","bottom","isFirstCell","left","prevCellEntry","prevCellNode","prevCellPath","right","withoutNormalizing","EditorAboveOptions","SlateEditor","TTableElement","KEYS","getTableColumnCount","setTableColSize","editor","colIndex","width","options","table","api","node","match","type","tableNode","tablePath","colSizes","Array","from","length","fill","tf","setNodes","at","EditorAboveOptions","SlateEditor","TTableElement","KEYS","setTableMarginLeft","editor","marginLeft","options","table","api","node","match","type","tablePath","tf","setNodes","at","EditorAboveOptions","SlateEditor","TTableElement","TTableRowElement","KEYS","setTableRowSize","editor","height","rowIndex","options","table","api","node","match","type","tablePath","tableRowPath","tf","setNodes","size","at","OverrideEditor","TElement","TRange","TTableCellElement","TTableElement","TTableRowElement","KEYS","RangeApi","TableConfig","overrideSelectionFromCell","computeCellIndices","getCellTypes","withApplyTable","api","_api","editor","getOptions","tf","apply","type","tableType","transforms","op","newProperties","newSelection","selection","isRange","isAt","at","blocks","match","n","anchorEntry","block","anchor","anchorPath","isBackward","focus","start","pointBefore","before","end","focusEntry","focusPath","startPoint","opType","node","path","undefined","isTableOperation","getType","tr","includes","cells","nodes","cellIndices","_cellIndices","forEach","cell","id","table","newPath","tableNode","OverrideEditor","SlateEditor","PointApi","TableConfig","getCellTypes","getTableGridAbove","preventDeleteTableCell","editor","reverse","unit","selection","getNextPoint","api","after","before","isCollapsed","cellEntry","block","match","type","cellPath","start","end","equals","anchor","nextPoint","nextCellEntry","at","tf","move","withDeleteTable","deleteFragment","transforms","direction","isAt","n","cellEntries","format","length","withoutNormalizing","forEach","replaceNodes","create","children","select","focus","Descendant","OverrideEditor","TElement","TTableCellElement","TTableRowElement","TableConfig","getTableGridAbove","withGetFragmentTable","api","getFragment","editor","type","fragment","newFragment","forEach","node","rows","children","rowCount","length","colCount","hasOneCell","cell","cellChildren","table","getCellChildren","push","subTable","cloneDeep","OverrideEditor","Path","TElement","TTableCellElement","TTableElement","TTableRowElement","KEYS","NodeApi","TableConfig","getTableAbove","getTableGridAbove","withInsertFragmentTable","api","editor","getOptions","tf","insert","insertFragment","type","transforms","fragment","insertedTable","find","n","tableEntry","at","selection","anchor","cellEntries","format","length","forEach","cellEntry","cellPath","replaceNodes","children","select","start","focus","end","withoutNormalizing","startCellPath","startColIndex","lastCellPath","initRow","insertedRows","row","fromRow","slice","has","disableExpandOnInsert","tableRow","insertedCells","initCell","cell","fromCell","tableColumn","cellChildren","table","getCellChildren","insertNodes","OverrideEditor","TableConfig","getTableAbove","getTableGridAbove","withInsertTextTable","editor","tf","insertText","transforms","text","options","api","isExpanded","entry","at","selection","anchor","cellEntries","format","length","collapse","edge","OverrideEditor","TElement","TTableCellElement","TTableElement","ElementApi","KEYS","TextApi","TableConfig","getTableColumnCount","computeCellIndices","getCellTypes","withNormalizeTable","editor","getOption","getOptions","tf","normalizeNode","type","transforms","n","path","enableUnsetSingleColSize","initialTableWidth","isElement","node","children","some","child","getType","tr","removeNodes","at","colSizes","length","unsetNodes","tableEntry","api","block","above","match","unwrapNodes","tableNode","colCount","i","push","size","forEach","colSize","setNodes","parentEntry","parent","includes","cellIndices","id","all","cellNode","isText","wrapNodes","create","OverrideEditor","TElement","TTableCellElement","TTableElement","KEYS","TableConfig","getTableGridAbove","withSetFragmentDataTable","api","editor","plugin","tf","setFragmentData","transforms","data","originEvent","tableEntry","format","selectedCellEntries","initialSelection","selection","tableNode","tablePath","tableRows","children","filter","v","length","textCsv","textTsv","divElement","document","createElement","tableElement","withoutNormalizing","forEach","row","rowCells","cellStrings","rowElement","type","getType","th","cell","clearData","cellPath","findPath","select","anchor","start","focus","end","push","getData","cellElement","colSpan","table","getColSpan","rowSpan","getRowSpan","innerHTML","append","join","_tableEntry","node","at","match","realTable","attributes","Object","entries","key","value","dangerouslyAllowAttributes","includes","setAttribute","String","setData","selectedFragmentStr","JSON","stringify","encodedFragment","window","btoa","encodeURIComponent","OverrideEditor","combineTransformMatchOptions","PathApi","RangeApi","TextApi","TableConfig","getTableGridAbove","withTableCellSelection","api","marks","editor","tf","addMark","removeMark","setNodes","apply","selection","isCollapsed","matchesCell","format","length","markCounts","Record","totalMarks","totalNodes","forEach","_cell","cellPath","textNodeEntry","nodes","at","match","n","isText","Array","from","item","keys","Object","splice","indexOf","k","mark","result","transforms","key","value","meta","isNormalizing","split","voids","props","options","range","includes","_","p","some","isCommon","OverrideEditor","TElement","TableConfig","getNextTableCell","getPreviousTableCell","getTableEntries","getCellTypes","withApplyTable","withDeleteTable","withGetFragmentTable","withInsertFragmentTable","withInsertTextTable","withNormalizeTable","withSetFragmentDataTable","withTableCellSelection","withTable","ctx","editor","tf","selectAll","tab","type","cellSelection","api","transforms","apply","table","above","match","tablePath","select","options","selection","isExpanded","tdEntries","Array","from","nodes","at","length","collapse","edge","entries","cell","row","cellPath","reverse","previousCell","previousCellPath","nextCell","nextCellPath","Descendant","HtmlDeserializer","OmitFirst","PluginConfig","TElement","TTableCellElement","bindFirst","createSlatePlugin","createTSlatePlugin","KEYS","CellIndices","getEmptyCellNode","getEmptyRowNode","getEmptyTableNode","mergeTableCells","splitTableCell","normalizeInitialValueTable","getColSpan","getRowSpan","getTableCellBorders","getTableCellSize","deleteColumn","deleteRow","deleteTable","insertTable","insertTableColumn","insertTableRow","withTable","parse","element","type","background","style","backgroundColor","BaseTableRowPlugin","key","tr","node","isContainer","isElement","isStrictSiblings","parsers","html","deserializer","rules","validNodeName","BaseTableCellPlugin","td","dangerouslyAllowAttributes","props","colSpan","attributes","colspan","rowSpan","rowspan","attributeNames","merge","removeEmpty","BaseTableCellHeaderPlugin","th","TableConfig","_cellIndices","Record","col","row","selectedCells","selectedTables","disableExpandOnInsert","disableMarginLeft","disableMerge","enableUnsetSingleColSize","initialTableWidth","minColumnWidth","create","table","tableCell","tableRow","getCellBorders","getCellSize","getCellChildren","cell","insert","tableColumn","remove","split","cellIndices","id","BaseTablePlugin","normalizeInitialValue","options","plugins","extendSelectors","getOptions","extendEditorApi","editor","children","extendEditorTransforms","overrideEditor","KEY_SHIFT_EDGES"],"sources":["../src/lib/api/getEmptyCellNode.ts","../src/lib/api/getEmptyRowNode.ts","../src/lib/api/getEmptyTableNode.ts","../src/lib/queries/getCellInNextTableRow.ts","../src/lib/queries/getCellInPreviousTableRow.ts","../src/lib/queries/getColSpan.ts","../src/lib/utils/computeCellIndices.ts","../src/lib/utils/getCellIndices.ts","../src/lib/utils/getCellRowIndexByPath.ts","../src/lib/utils/getCellType.ts","../src/lib/queries/getLeftTableCell.ts","../src/lib/queries/getNextTableCell.ts","../src/lib/queries/getPreviousTableCell.ts","../src/lib/queries/getRowSpan.ts","../src/lib/queries/getSelectedCellsBoundingBox.ts","../src/lib/queries/getTopTableCell.ts","../src/lib/queries/getSelectedCellsBorders.ts","../src/lib/queries/getTableAbove.ts","../src/lib/queries/getTableCellBorders.ts","../src/lib/queries/getTableCellSize.ts","../src/lib/queries/getTableColumnCount.ts","../src/lib/queries/getTableEntries.ts","../src/lib/merge/getCellIndicesWithSpans.ts","../src/lib/merge/findCellByIndexes.ts","../src/lib/merge/getTableGridByRange.ts","../src/lib/queries/getTableGridByRange.ts","../src/lib/queries/getTableGridAbove.ts","../src/lib/queries/getTableOverriddenColSizes.ts","../src/lib/merge/deleteColumnWhenExpanded.ts","../src/lib/merge/getCellPath.ts","../src/lib/merge/deleteColumn.ts","../src/lib/merge/deleteRowWhenExpanded.ts","../src/lib/merge/deleteRow.ts","../src/lib/merge/getTableMergedColumnCount.ts","../src/lib/merge/insertTableColumn.ts","../src/lib/merge/insertTableRow.ts","../src/lib/merge/isTableRectangular.ts","../src/lib/merge/mergeTableCells.ts","../src/lib/merge/splitTableCell.ts","../src/lib/normalizeInitialValueTable.ts","../src/lib/transforms/deleteColumn.ts","../src/lib/transforms/deleteRow.ts","../src/lib/transforms/deleteTable.ts","../src/lib/transforms/insertTable.ts","../src/lib/transforms/insertTableColumn.ts","../src/lib/transforms/insertTableRow.ts","../src/lib/transforms/moveSelectionFromCell.ts","../src/lib/transforms/overrideSelectionFromCell.ts","../src/lib/transforms/setBorderSize.ts","../src/lib/transforms/setTableColSize.ts","../src/lib/transforms/setTableMarginLeft.ts","../src/lib/transforms/setTableRowSize.ts","../src/lib/withApplyTable.ts","../src/lib/withDeleteTable.ts","../src/lib/withGetFragmentTable.ts","../src/lib/withInsertFragmentTable.ts","../src/lib/withInsertTextTable.ts","../src/lib/withNormalizeTable.ts","../src/lib/withSetFragmentDataTable.ts","../src/lib/withTableCellSelection.tsx","../src/lib/withTable.ts","../src/lib/BaseTablePlugin.ts","../src/lib/constants.ts"],"sourcesContent":["import type { SlateEditor, TElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport type { CreateCellOptions } from '../types';\n\nexport const getEmptyCellNode = (\n editor: SlateEditor,\n { children, header, row }: CreateCellOptions = {}\n) => {\n header =\n header ??\n (row\n ? (row as TElement).children.every(\n (c) => c.type === editor.getType(KEYS.th)\n )\n : false);\n\n return {\n children: children ?? [editor.api.create.block()],\n type: header ? editor.getType(KEYS.th) : editor.getType(KEYS.td),\n };\n};\n","import type { SlateEditor } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\nimport type { CreateCellOptions } from '../types';\n\nexport interface GetEmptyRowNodeOptions extends CreateCellOptions {\n colCount?: number;\n}\n\nexport const getEmptyRowNode = (\n editor: SlateEditor,\n { colCount = 1, ...cellOptions }: GetEmptyRowNodeOptions = {}\n) => {\n const { api } = editor.getPlugin<TableConfig>({ key: KEYS.table });\n\n return {\n children: Array.from({ length: colCount })\n .fill(colCount)\n .map(() => api.create.tableCell(cellOptions)),\n type: editor.getType(KEYS.tr),\n };\n};\n","import type { SlateEditor, TTableElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\nimport type { GetEmptyRowNodeOptions } from './getEmptyRowNode';\n\nexport interface GetEmptyTableNodeOptions extends GetEmptyRowNodeOptions {\n rowCount?: number;\n}\n\nexport const getEmptyTableNode = (\n editor: SlateEditor,\n {\n colCount,\n header,\n rowCount = 0,\n ...cellOptions\n }: GetEmptyTableNodeOptions = {}\n): TTableElement => {\n const { api } = editor.getPlugin<TableConfig>({ key: KEYS.table });\n\n const rows = Array.from({ length: rowCount })\n .fill(rowCount)\n .map((_, index) =>\n api.create.tableRow({\n colCount,\n ...cellOptions,\n header: header && index === 0,\n })\n );\n\n return {\n children: rows,\n type: editor.getType(KEYS.table),\n };\n};\n","import {\n type Editor,\n type NodeEntry,\n type Path,\n type TElement,\n PathApi,\n} from 'platejs';\n\nexport const getCellInNextTableRow = (\n editor: Editor,\n currentRowPath: Path\n): NodeEntry | undefined => {\n const nextRow = editor.api.node<TElement>(PathApi.next(currentRowPath));\n\n if (!nextRow) return;\n\n // TODO: Many tables in rich text editors (Google Docs, Word),\n // add a new row if we're in the last cell. Should we do the same?\n const [nextRowNode, nextRowPath] = nextRow;\n const nextCell = nextRowNode?.children?.[0];\n const nextCellPath = nextRowPath.concat(0);\n\n if (nextCell && nextCellPath) {\n return editor.api.node(nextCellPath);\n }\n};\n","import {\n type Editor,\n type NodeEntry,\n type Path,\n type TElement,\n PathApi,\n} from 'platejs';\n\nexport const getCellInPreviousTableRow = (\n editor: Editor,\n currentRowPath: Path\n): NodeEntry | undefined => {\n const prevPath = PathApi.previous(currentRowPath);\n\n if (!prevPath) return;\n\n const previousRow = editor.api.node<TElement>(prevPath);\n\n if (!previousRow) return;\n\n const [previousRowNode, previousRowPath] = previousRow;\n const previousCell =\n previousRowNode?.children?.[previousRowNode.children.length - 1];\n const previousCellPath = previousRowPath.concat(\n previousRowNode.children.length - 1\n );\n\n if (previousCell && previousCellPath) {\n return editor.api.node(previousCellPath);\n }\n};\n","import type { TTableCellElement } from 'platejs';\n\n/**\n * Returns the colspan attribute of the table cell element.\n *\n * @default 1 if undefined.\n */\nexport const getColSpan = (cellElem: TTableCellElement) =>\n cellElem.colSpan || Number(cellElem.attributes?.colspan) || 1;\n","import {\n type SlateEditor,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n getEditorPlugin,\n KEYS,\n} from 'platejs';\n\nimport type { BaseTablePlugin } from '../BaseTablePlugin';\n\nexport function computeCellIndices(\n editor: SlateEditor,\n {\n all,\n cellNode,\n tableNode,\n }: {\n all?: boolean;\n cellNode?: TTableCellElement;\n tableNode?: TTableElement;\n }\n) {\n const { api, getOptions, setOption } = getEditorPlugin<\n typeof BaseTablePlugin\n >(editor, {\n key: KEYS.table,\n });\n\n if (!tableNode) {\n if (!cellNode) return;\n\n tableNode = editor.api.above<TTableElement>({\n at: cellNode,\n match: { type: editor.getType(KEYS.table) },\n })?.[0];\n\n if (!tableNode) return;\n }\n\n const { _cellIndices: prevIndices } = getOptions();\n\n // Store previous indices to check for changes\n const cellIndices = { ...prevIndices };\n let hasIndicesChanged = false;\n\n const skipCells: boolean[][] = [];\n let targetIndices: { col: number; row: number } | undefined;\n\n for (let rowIndex = 0; rowIndex < tableNode.children.length; rowIndex++) {\n const row = tableNode.children[rowIndex] as TTableRowElement;\n let colIndex = 0;\n\n for (const cellElement of row.children as TTableCellElement[]) {\n while (skipCells[rowIndex]?.[colIndex]) {\n colIndex++;\n }\n\n const currentIndices = { col: colIndex, row: rowIndex };\n const prevIndicesForCell = prevIndices[cellElement.id!];\n\n // Check if indices changed for this cell\n if (\n prevIndicesForCell?.col !== currentIndices.col ||\n prevIndicesForCell?.row !== currentIndices.row\n ) {\n hasIndicesChanged = true;\n }\n\n cellIndices[cellElement.id!] = currentIndices;\n\n if (cellElement.id === cellNode?.id) {\n targetIndices = currentIndices;\n\n if (!all) break;\n }\n\n const colSpan = api.table.getColSpan(cellElement);\n const rowSpan = api.table.getRowSpan(cellElement);\n\n for (let r = 0; r < rowSpan; r++) {\n skipCells[rowIndex + r] = skipCells[rowIndex + r] || [];\n\n for (let c = 0; c < colSpan; c++) {\n skipCells[rowIndex + r][colIndex + c] = true;\n }\n }\n\n colIndex += colSpan;\n }\n }\n\n if (hasIndicesChanged) {\n setOption('_cellIndices', cellIndices);\n }\n\n return targetIndices;\n}\n","import {\n type SlateEditor,\n type TTableCellElement,\n getEditorPlugin,\n KEYS,\n} from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\n\nimport { computeCellIndices } from './computeCellIndices';\n\nexport type CellIndices = {\n col: number;\n row: number;\n};\n\nexport const getCellIndices = (\n editor: SlateEditor,\n element: TTableCellElement\n): CellIndices => {\n const { getOption } = getEditorPlugin<TableConfig>(editor, {\n key: KEYS.table,\n });\n\n let indices = getOption('cellIndices', element.id!);\n\n if (!indices) {\n indices = computeCellIndices(editor, {\n cellNode: element,\n })!;\n\n if (!indices) {\n editor.api.debug.warn(\n 'No cell indices found for element. Make sure all table cells have an id.',\n 'TABLE_CELL_INDICES'\n );\n }\n }\n\n return indices ?? { col: 0, row: 0 };\n};\n","import type { Path } from 'platejs';\n\nexport const getCellRowIndexByPath = (cellPath: Path): number => {\n const index = cellPath.at(-2);\n\n if (index === undefined)\n throw new Error(`can not get rowIndex of path ${cellPath}`);\n\n return index;\n};\n","import { type SlateEditor, getPluginTypes, KEYS } from 'platejs';\n\n/** Get td and th types */\nexport const getCellTypes = (editor: SlateEditor) =>\n getPluginTypes(editor, [KEYS.td, KEYS.th]);\n","import type { Path, SlateEditor, TTableCellElement } from 'platejs';\n\nimport { PathApi } from 'platejs';\n\nimport { getCellTypes } from '../utils';\n\n// Get cell to the left of the current cell\nexport const getLeftTableCell = (\n editor: SlateEditor,\n {\n at: cellPath,\n }: {\n at?: Path;\n } = {}\n) => {\n if (!cellPath) {\n cellPath = editor.api.node<TTableCellElement>({\n match: { type: getCellTypes(editor) },\n })?.[1];\n\n if (!cellPath) return;\n }\n\n const cellIndex = cellPath.at(-1);\n\n if (!cellIndex) return;\n\n const prevCellPath = PathApi.previous(cellPath)!;\n\n return editor.api.node<TTableCellElement>(prevCellPath);\n};\n","import { type Editor, type NodeEntry, type Path, PathApi } from 'platejs';\n\nimport { getCellInNextTableRow } from './getCellInNextTableRow';\n\nexport const getNextTableCell = (\n editor: Editor,\n _currentCell: NodeEntry,\n currentPath: Path,\n currentRow: NodeEntry\n): NodeEntry | undefined => {\n const cell = editor.api.node(PathApi.next(currentPath));\n\n if (cell) return cell;\n\n const [, currentRowPath] = currentRow;\n\n return getCellInNextTableRow(editor, currentRowPath);\n};\n","import { type Editor, type NodeEntry, type Path, PathApi } from 'platejs';\n\nimport { getCellInPreviousTableRow } from './getCellInPreviousTableRow';\n\nexport const getPreviousTableCell = (\n editor: Editor,\n _currentCell: NodeEntry,\n currentPath: Path,\n currentRow: NodeEntry\n): NodeEntry | undefined => {\n const prevPath = PathApi.previous(currentPath);\n\n if (!prevPath) {\n const [, currentRowPath] = currentRow;\n\n return getCellInPreviousTableRow(editor, currentRowPath);\n }\n\n const cell = editor.api.node(prevPath);\n\n if (cell) return cell;\n};\n","import type { TTableCellElement } from 'platejs';\n\n/**\n * Returns the rowspan attribute of the table cell element.\n *\n * @default 1 if undefined\n */\nexport const getRowSpan = (cellElem: TTableCellElement) =>\n cellElem.rowSpan || Number(cellElem.attributes?.rowspan) || 1;\n","import type { SlateEditor, TTableCellElement } from 'platejs';\n\nimport { getCellIndices } from '../utils';\nimport { getColSpan } from './getColSpan';\nimport { getRowSpan } from './getRowSpan';\n\n/** Return bounding box [minRow..maxRow, minCol..maxCol] of all selected cells. */\nexport function getSelectedCellsBoundingBox(\n editor: SlateEditor,\n cells: TTableCellElement[]\n): { maxCol: number; maxRow: number; minCol: number; minRow: number } {\n let minRow = Number.POSITIVE_INFINITY;\n let maxRow = Number.NEGATIVE_INFINITY;\n let minCol = Number.POSITIVE_INFINITY;\n let maxCol = Number.NEGATIVE_INFINITY;\n\n for (const cell of cells) {\n const { col, row } = getCellIndices(editor, cell);\n const cSpan = getColSpan(cell);\n const rSpan = getRowSpan(cell);\n const endRow = row + rSpan - 1;\n const endCol = col + cSpan - 1;\n\n if (row < minRow) minRow = row;\n if (endRow > maxRow) maxRow = endRow;\n if (col < minCol) minCol = col;\n if (endCol > maxCol) maxCol = endCol;\n }\n\n return { maxCol, maxRow, minCol, minRow };\n}\n","import {\n type Path,\n type SlateEditor,\n type TTableCellElement,\n PathApi,\n} from 'platejs';\n\nimport { getCellTypes } from '../utils/index';\n\n// Get cell to the top of the current cell\nexport const getTopTableCell = (\n editor: SlateEditor,\n {\n at: cellPath,\n }: {\n at?: Path;\n } = {}\n) => {\n if (!cellPath) {\n cellPath = editor.api.node<TTableCellElement>({\n match: { type: getCellTypes(editor) },\n })?.[1];\n\n if (!cellPath) return;\n }\n\n const cellIndex = cellPath.at(-1)!;\n const rowIndex = cellPath.at(-2)!;\n\n // If the current cell is in the first row, there is no cell above it\n if (rowIndex === 0) return;\n\n const cellAbovePath = [\n ...PathApi.parent(PathApi.parent(cellPath)),\n rowIndex - 1,\n cellIndex,\n ];\n\n return editor.api.node<TTableCellElement>(cellAbovePath);\n};\n","import type { SlateEditor, TElement, TTableCellElement } from 'platejs';\n\nimport type { BorderDirection } from '../types';\n\nimport { getCellIndices, getCellTypes } from '../utils';\nimport { getColSpan } from './getColSpan';\nimport { getLeftTableCell } from './getLeftTableCell';\nimport { getRowSpan } from './getRowSpan';\nimport { getSelectedCellsBoundingBox } from './getSelectedCellsBoundingBox';\nimport { getTopTableCell } from './getTopTableCell';\n\nexport type GetSelectedCellsBordersOptions = {\n select?: {\n none?: boolean;\n outer?: boolean;\n side?: boolean;\n };\n};\n\nexport type TableBorderStates = {\n bottom: boolean;\n left: boolean;\n none: boolean;\n outer: boolean;\n right: boolean;\n top: boolean;\n};\n\n/**\n * Get all border states for the selected cells at once. Returns an object with\n * boolean flags for each border state:\n *\n * - Top/bottom/left/right: true if border is visible (size > 0)\n * - Outer: true if all outer borders are visible\n * - None: true if all borders are hidden (size === 0)\n */\nexport const getSelectedCellsBorders = (\n editor: SlateEditor,\n selectedCells?: TElement[] | null,\n options: GetSelectedCellsBordersOptions = {}\n): TableBorderStates => {\n const { select = { none: true, outer: true, side: true } } = options;\n\n // If no cells are selected, try to get the current cell\n let cells = selectedCells;\n\n if (!cells || cells.length === 0) {\n const cell = editor.api.block({ match: { type: getCellTypes(editor) } });\n\n if (cell) {\n cells = [cell[0]];\n } else {\n return {\n bottom: true,\n left: true,\n none: false,\n outer: true,\n right: true,\n top: true,\n };\n }\n }\n\n // Convert to TTableCellElement\n const cellElements = cells.map((cell) => cell as TTableCellElement);\n\n // Get bounding box once\n const { maxCol, maxRow, minCol, minRow } = getSelectedCellsBoundingBox(\n editor,\n cellElements\n );\n\n // Track border states\n let hasAnyBorder = false;\n let allOuterBordersSet = true;\n const borderStates = {\n bottom: false,\n left: false,\n right: false,\n top: false,\n };\n\n // Single pass through cells to check all border conditions\n for (const cell of cellElements) {\n const { col, row } = getCellIndices(editor, cell);\n const cellPath = editor.api.findPath(cell);\n const cSpan = getColSpan(cell);\n const rSpan = getRowSpan(cell);\n const isFirstRow = row === 0;\n const isFirstCell = col === 0;\n\n if (!cellPath) continue;\n // Check borders for 'none' state\n if (select.none && !hasAnyBorder) {\n // Check own borders\n if (isFirstRow && (cell.borders?.top?.size ?? 1) > 0) hasAnyBorder = true;\n if (isFirstCell && (cell.borders?.left?.size ?? 1) > 0)\n hasAnyBorder = true;\n if ((cell.borders?.bottom?.size ?? 1) > 0) hasAnyBorder = true;\n if ((cell.borders?.right?.size ?? 1) > 0) hasAnyBorder = true;\n // Check adjacent cells if still no border found\n if (!hasAnyBorder) {\n if (!isFirstRow) {\n const cellAboveEntry = getTopTableCell(editor, { at: cellPath });\n\n if (\n cellAboveEntry &&\n (cellAboveEntry[0].borders?.bottom?.size ?? 1) > 0\n ) {\n hasAnyBorder = true;\n }\n }\n if (!isFirstCell) {\n const prevCellEntry = getLeftTableCell(editor, { at: cellPath });\n\n if (\n prevCellEntry &&\n (prevCellEntry[0].borders?.right?.size ?? 1) > 0\n ) {\n hasAnyBorder = true;\n }\n }\n }\n }\n // Only check borders if side or outer is requested\n if (select.side || select.outer) {\n // Check outer borders state\n for (let rr = row; rr < row + rSpan; rr++) {\n for (let cc = col; cc < col + cSpan; cc++) {\n // Top border\n if (rr === minRow) {\n if (isFirstRow) {\n if ((cell.borders?.top?.size ?? 1) < 1) {\n borderStates.top = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.top) {\n borderStates.top = true;\n }\n } else {\n const cellAboveEntry = getTopTableCell(editor, { at: cellPath });\n\n if (cellAboveEntry) {\n const [cellAbove] = cellAboveEntry;\n\n if ((cellAbove.borders?.bottom?.size ?? 1) < 1) {\n borderStates.top = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.top) {\n borderStates.top = true;\n }\n }\n }\n }\n // Bottom border\n if (rr === maxRow) {\n if ((cell.borders?.bottom?.size ?? 1) < 1) {\n borderStates.bottom = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.bottom) {\n borderStates.bottom = true;\n }\n }\n // Left border\n if (cc === minCol) {\n if (isFirstCell) {\n if ((cell.borders?.left?.size ?? 1) < 1) {\n borderStates.left = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.left) {\n borderStates.left = true;\n }\n } else {\n const prevCellEntry = getLeftTableCell(editor, { at: cellPath });\n\n if (prevCellEntry) {\n const [prevCell] = prevCellEntry;\n\n if ((prevCell.borders?.right?.size ?? 1) < 1) {\n borderStates.left = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.left) {\n borderStates.left = true;\n }\n }\n }\n }\n // Right border\n if (cc === maxCol) {\n if ((cell.borders?.right?.size ?? 1) < 1) {\n borderStates.right = false;\n\n if (select.outer) allOuterBordersSet = false;\n } else if (!borderStates.right) {\n borderStates.right = true;\n }\n }\n }\n }\n }\n }\n\n return {\n ...(select.side\n ? borderStates\n : { bottom: true, left: true, right: true, top: true }),\n none: select.none ? !hasAnyBorder : false,\n outer: select.outer ? allOuterBordersSet : true,\n };\n};\n\n/**\n * Tells if the entire selection is currently borderless (size=0 on all edges).\n * If **any** edge is > 0, returns false.\n */\nexport function isSelectedCellBordersNone(\n editor: SlateEditor,\n cells: TTableCellElement[]\n): boolean {\n return cells.every((cell) => {\n const { borders } = cell;\n const { col, row } = getCellIndices(editor, cell);\n const cellPath = editor.api.findPath(cell);\n\n if (!cellPath) return true;\n\n // Check own borders\n const isFirstRow = row === 0;\n const isFirstCell = col === 0;\n\n if (isFirstRow && (borders?.top?.size ?? 1) > 0) return false;\n if (isFirstCell && (borders?.left?.size ?? 1) > 0) return false;\n if ((borders?.bottom?.size ?? 1) > 0) return false;\n if ((borders?.right?.size ?? 1) > 0) return false;\n // Check adjacent cells' borders\n if (!isFirstRow) {\n const cellAboveEntry = getTopTableCell(editor, { at: cellPath });\n\n if (cellAboveEntry) {\n const [cellAbove] = cellAboveEntry;\n\n if ((cellAbove.borders?.bottom?.size ?? 1) > 0) return false;\n }\n }\n if (!isFirstCell) {\n const prevCellEntry = getLeftTableCell(editor, { at: cellPath });\n\n if (prevCellEntry) {\n const [prevCell] = prevCellEntry;\n\n if ((prevCell.borders?.right?.size ?? 1) > 0) return false;\n }\n }\n\n return true;\n });\n}\n\n/**\n * Tells if the bounding rectangle for the entire selection is fully set for the\n * **outer** edges, i.e. top/left/bottom/right edges have size=1. We ignore\n * internal edges, only bounding rectangle edges.\n */\nexport function isSelectedCellBordersOuter(\n editor: SlateEditor,\n cells: TTableCellElement[]\n): boolean {\n const { maxCol, maxRow, minCol, minRow } = getSelectedCellsBoundingBox(\n editor,\n cells\n );\n\n // For each cell, figure out which edges are relevant on the bounding rect\n // and confirm they are all size=1\n for (const cell of cells) {\n const { col, row } = getCellIndices(editor, cell);\n const cSpan = getColSpan(cell);\n const rSpan = getRowSpan(cell);\n\n for (let rr = row; rr < row + rSpan; rr++) {\n for (let cc = col; cc < col + cSpan; cc++) {\n // If on top boundary => must have top=1, etc.\n if (rr === minRow && (cell.borders?.top?.size ?? 1) < 1) return false;\n if (rr === maxRow && (cell.borders?.bottom?.size ?? 1) < 1)\n return false;\n if (cc === minCol && (cell.borders?.left?.size ?? 1) < 1) return false;\n if (cc === maxCol && (cell.borders?.right?.size ?? 1) < 1) return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Tells if the bounding rectangle for the entire selection is fully set for\n * that single side. Example: border='top' => if every cell that sits along the\n * top boundary has top=1.\n */\nexport function isSelectedCellBorder(\n editor: SlateEditor,\n cells: TTableCellElement[],\n side: BorderDirection\n): boolean {\n const { maxCol, maxRow, minCol, minRow } = getSelectedCellsBoundingBox(\n editor,\n cells\n );\n\n return cells.every((cell) => {\n const { col, row } = getCellIndices(editor, cell);\n const cSpan = getColSpan(cell);\n const rSpan = getRowSpan(cell);\n const cellPath = editor.api.findPath(cell);\n\n if (!cellPath) return true;\n\n for (let rr = row; rr < row + rSpan; rr++) {\n for (let cc = col; cc < col + cSpan; cc++) {\n if (side === 'top' && rr === minRow) {\n const isFirstRow = row === 0;\n\n if (isFirstRow) {\n return (cell.borders?.top?.size ?? 1) >= 1;\n }\n\n const cellAboveEntry = getTopTableCell(editor, { at: cellPath });\n\n if (!cellAboveEntry) return true;\n\n const [cellAboveNode] = cellAboveEntry;\n\n return (cellAboveNode.borders?.bottom?.size ?? 1) >= 1;\n }\n if (side === 'bottom' && rr === maxRow) {\n return (cell.borders?.bottom?.size ?? 1) >= 1;\n }\n if (side === 'left' && cc === minCol) {\n const isFirstCell = col === 0;\n\n if (isFirstCell) {\n return (cell.borders?.left?.size ?? 1) >= 1;\n }\n\n const prevCellEntry = getLeftTableCell(editor, { at: cellPath });\n\n if (!prevCellEntry) return true;\n\n const [prevCellNode] = prevCellEntry;\n\n return (prevCellNode.borders?.right?.size ?? 1) >= 1;\n }\n if (side === 'right' && cc === maxCol) {\n return (cell.borders?.right?.size ?? 1) >= 1;\n }\n }\n }\n\n return true;\n });\n}\n","import type { EditorAboveOptions, SlateEditor } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const getTableAbove = (\n editor: SlateEditor,\n options?: EditorAboveOptions\n) =>\n editor.api.block({\n above: true,\n match: {\n type: editor.getType(KEYS.table),\n },\n ...options,\n });\n","import type {\n SlateEditor,\n TTableCellBorder,\n TTableCellElement,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport type { BorderDirection } from '../types';\n\nimport { type CellIndices, getCellIndices } from '../utils/getCellIndices';\n\nexport type BorderStylesDefault = {\n bottom: TTableCellBorder;\n right: TTableCellBorder;\n left?: TTableCellBorder;\n top?: TTableCellBorder;\n};\n\nexport const getTableCellBorders = (\n editor: SlateEditor,\n {\n cellIndices,\n defaultBorder = {\n size: 1,\n },\n element,\n }: {\n element: TTableCellElement;\n cellIndices?: CellIndices;\n defaultBorder?: TTableCellBorder;\n }\n): BorderStylesDefault => {\n const cellPath = editor.api.findPath(element)!;\n const [rowNode, rowPath] =\n editor.api.parent<TTableRowElement>(cellPath) ?? [];\n if (!rowNode || !rowPath) {\n return {\n bottom: defaultBorder,\n right: defaultBorder,\n };\n }\n const [tableNode] = editor.api.parent<TTableElement>(rowPath)!;\n\n const { col } = cellIndices ?? getCellIndices(editor, element);\n const isFirstCell = col === 0;\n const isFirstRow = tableNode.children?.[0] === rowNode;\n\n const getBorder = (dir: BorderDirection) => {\n const border = element.borders?.[dir];\n\n return {\n color: border?.color ?? defaultBorder.color,\n size: border?.size ?? defaultBorder.size,\n style: border?.style ?? defaultBorder.style,\n };\n };\n\n return {\n bottom: getBorder('bottom'),\n left: isFirstCell ? getBorder('left') : undefined,\n right: getBorder('right'),\n top: isFirstRow ? getBorder('top') : undefined,\n };\n};\n","import type {\n SlateEditor,\n TTableCellElement,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport {\n type CellIndices,\n type TableConfig,\n getCellIndices,\n getTableOverriddenColSizes,\n} from '..';\n\n/** Get the width of a cell with colSpan support. */\nexport const getTableCellSize = (\n editor: SlateEditor,\n {\n cellIndices,\n colSizes,\n element,\n rowSize,\n }: {\n element: TTableCellElement;\n cellIndices?: CellIndices;\n colSizes?: number[];\n rowSize?: number;\n }\n) => {\n const { api } = getEditorPlugin<TableConfig>(editor, {\n key: KEYS.table,\n });\n const path = editor.api.findPath(element)!;\n\n if (!rowSize) {\n const [rowElement] = editor.api.parent<TTableRowElement>(path) ?? [];\n\n if (!rowElement) return { minHeight: 0, width: 0 };\n\n rowSize = rowElement.size;\n }\n if (!colSizes) {\n const [, rowPath] = editor.api.parent<TTableRowElement>(path)!;\n const [tableNode] = editor.api.parent<TTableElement>(rowPath)!;\n colSizes = getTableOverriddenColSizes(tableNode);\n }\n\n const colSpan = api.table.getColSpan(element);\n\n const { col } = cellIndices ?? getCellIndices(editor, element);\n\n const width = (colSizes ?? [])\n .slice(col, col + colSpan)\n .reduce((total, w) => total + (w || 0), 0);\n\n return { minHeight: rowSize, width };\n};\n","import type { TElement } from 'platejs';\n\nexport const getTableColumnCount = (tableNode: TElement): number => {\n if ((tableNode.children as TElement[])?.[0]?.children) {\n return (tableNode.children as TElement[])[0].children\n .map(\n (element) =>\n element.colSpan || (element?.attributes as any)?.colspan || 1\n )\n .reduce((total: number, num: number) => Number(total) + Number(num));\n }\n\n return 0;\n};\n","import { type SlateEditor, type TLocation, KEYS } from 'platejs';\n\nimport { getCellTypes } from '../utils';\n\n/**\n * If at (default = selection) is in table>tr>td|th, return table, row, and cell\n * node entries.\n */\nexport const getTableEntries = (\n editor: SlateEditor,\n { at = editor.selection }: { at?: TLocation | null } = {}\n) => {\n if (!at) return;\n\n const cellEntry = editor.api.node({\n at,\n match: {\n type: getCellTypes(editor),\n },\n });\n\n if (!cellEntry) return;\n\n const [, cellPath] = cellEntry;\n\n const rowEntry = editor.api.above({\n at: cellPath,\n match: { type: editor.getType(KEYS.tr) },\n });\n\n if (!rowEntry) return;\n\n const [, rowPath] = rowEntry;\n\n const tableEntry = editor.api.above({\n at: rowPath,\n match: { type: editor.getType(KEYS.table) },\n });\n\n if (!tableEntry) return;\n\n return {\n cell: cellEntry,\n row: rowEntry,\n table: tableEntry,\n };\n};\n","import type { TTableCellElement } from 'platejs';\n\nimport { getColSpan } from '../queries/getColSpan';\nimport { getRowSpan } from '../queries/getRowSpan';\n\nexport const getCellIndicesWithSpans = (\n { col, row }: { col: number; row: number },\n endCell: TTableCellElement\n) => ({\n col: col + getColSpan(endCell) - 1,\n row: row + getRowSpan(endCell) - 1,\n});\n","import type { SlateEditor, TTableCellElement, TTableElement } from 'platejs';\n\nimport { getCellIndices } from '../utils/getCellIndices';\nimport { getCellIndicesWithSpans } from './getCellIndicesWithSpans';\n\nexport const findCellByIndexes = (\n editor: SlateEditor,\n table: TTableElement,\n searchRowIndex: number,\n searchColIndex: number\n) => {\n const allCells = table.children.flatMap(\n (current) => current.children\n ) as TTableCellElement[];\n\n const foundCell = allCells.find((cellNode) => {\n const indices = getCellIndices(editor, cellNode);\n\n const { col: _startColIndex, row: _startRowIndex } = indices;\n const { col: _endColIndex, row: _endRowIndex } = getCellIndicesWithSpans(\n indices,\n cellNode\n );\n\n if (\n searchColIndex >= _startColIndex &&\n searchColIndex <= _endColIndex &&\n searchRowIndex >= _startRowIndex &&\n searchRowIndex <= _endRowIndex\n ) {\n return true;\n }\n\n return false;\n });\n\n return foundCell;\n};\n","import {\n type ElementEntry,\n type SlateEditor,\n type TElement,\n type TRange,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n getEditorPlugin,\n} from 'platejs';\n\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { getCellTypes } from '../utils';\nimport { getCellIndices } from '../utils/getCellIndices';\nimport { findCellByIndexes } from './findCellByIndexes';\nimport { getCellIndicesWithSpans } from './getCellIndicesWithSpans';\n\ntype FormatType = 'all' | 'cell' | 'table';\n\ntype GetTableGridByRangeOptions<T extends FormatType> = {\n at: TRange;\n\n /**\n * Format of the output:\n *\n * - Table element\n * - Array of cells\n */\n format?: T;\n};\n\ntype GetTableGridReturnType<T> = T extends 'all'\n ? TableGridEntries\n : ElementEntry[];\n\ntype TableGridEntries = {\n cellEntries: ElementEntry[];\n tableEntries: ElementEntry[];\n};\n\n/**\n * Get sub table between 2 cell paths. Ensure that the selection is always a\n * valid table grid.\n */\nexport const getTableMergeGridByRange = <T extends FormatType>(\n editor: SlateEditor,\n { at, format }: GetTableGridByRangeOptions<T>\n): GetTableGridReturnType<T> => {\n const { api, type } = getEditorPlugin(editor, BaseTablePlugin);\n\n const startCellEntry = editor.api.node<TTableCellElement>({\n at: at.anchor.path,\n match: { type: getCellTypes(editor) },\n })!;\n const endCellEntry = editor.api.node<TTableCellElement>({\n at: at.focus.path,\n match: { type: getCellTypes(editor) },\n })!;\n\n const startCell = startCellEntry[0];\n const endCell = endCellEntry[0];\n\n const startCellPath = at.anchor.path;\n const tablePath = startCellPath.slice(0, -2);\n\n const tableEntry = editor.api.node<TTableElement>({\n at: tablePath,\n match: { type },\n })!;\n const realTable = tableEntry[0];\n\n const { col: _startColIndex, row: _startRowIndex } = getCellIndicesWithSpans(\n getCellIndices(editor, startCell),\n startCell\n );\n\n const { col: _endColIndex, row: _endRowIndex } = getCellIndicesWithSpans(\n getCellIndices(editor, endCell),\n endCell\n );\n\n let startRowIndex = Math.min(_startRowIndex, _endRowIndex);\n let endRowIndex = Math.max(_startRowIndex, _endRowIndex);\n let startColIndex = Math.min(_startColIndex, _endColIndex);\n let endColIndex = Math.max(_startColIndex, _endColIndex);\n\n const relativeRowIndex = endRowIndex - startRowIndex;\n const relativeColIndex = endColIndex - startColIndex;\n\n let table: TTableElement = api.create.table({\n children: [],\n colCount: relativeColIndex + 1,\n rowCount: relativeRowIndex + 1,\n });\n\n let cellEntries: ElementEntry[] = [];\n let cellsSet = new WeakSet();\n\n let rowIndex = startRowIndex;\n let colIndex = startColIndex;\n\n while (true) {\n const cell = findCellByIndexes(editor, realTable, rowIndex, colIndex);\n\n if (!cell) {\n break;\n }\n\n const indicies = getCellIndices(editor, cell);\n const { col: cellColWithSpan, row: cellRowWithSpan } =\n getCellIndicesWithSpans(indicies, cell);\n const { col: cellCol, row: cellRow } = indicies;\n\n // check if cell is still in range\n const hasOverflowTop = cellRow < startRowIndex;\n const hasOverflowBottom = cellRowWithSpan > endRowIndex;\n const hasOverflowLeft = cellCol < startColIndex;\n const hasOverflowRight = cellColWithSpan > endColIndex;\n\n if (\n hasOverflowTop ||\n hasOverflowBottom ||\n hasOverflowLeft ||\n hasOverflowRight\n ) {\n // reset the cycle if has overflow\n cellsSet = new WeakSet();\n cellEntries = [];\n startRowIndex = Math.min(startRowIndex, cellRow);\n endRowIndex = Math.max(endRowIndex, cellRowWithSpan);\n startColIndex = Math.min(startColIndex, cellCol);\n endColIndex = Math.max(endColIndex, cellColWithSpan);\n rowIndex = startRowIndex;\n colIndex = startColIndex;\n const newRelativeRowIndex = endRowIndex - startRowIndex;\n const newRelativeColIndex = endColIndex - startColIndex;\n table = api.create.table({\n children: [],\n colCount: newRelativeColIndex + 1,\n rowCount: newRelativeRowIndex + 1,\n });\n\n continue;\n }\n if (!cellsSet.has(cell)) {\n cellsSet.add(cell);\n\n const rows = table.children[rowIndex - startRowIndex]\n .children as TElement[];\n rows[colIndex - startColIndex] = cell;\n\n const cellPath = editor.api.findPath(cell)!;\n\n cellEntries.push([cell, cellPath]);\n }\n if (colIndex + 1 <= endColIndex) {\n colIndex += 1;\n } else if (rowIndex + 1 <= endRowIndex) {\n colIndex = startColIndex;\n rowIndex += 1;\n } else {\n break;\n }\n }\n\n const formatType = (format as string) || 'table';\n\n if (formatType === 'cell') {\n return cellEntries as GetTableGridReturnType<T>;\n }\n\n // clear redundant cells\n table.children?.forEach((rowEl) => {\n const rowElement = rowEl as TTableRowElement;\n\n const filteredChildren = rowElement.children?.filter((cellEl) => {\n const cellElement = cellEl as TTableCellElement;\n\n return api.table.getCellChildren!(cellElement).length > 0;\n });\n\n rowElement.children = filteredChildren;\n });\n\n if (formatType === 'table') {\n return [[table, tablePath]] as GetTableGridReturnType<T>;\n }\n\n return {\n cellEntries,\n tableEntries: [[table, tablePath]],\n } as GetTableGridReturnType<T>;\n};\n","import {\n type ElementEntry,\n type SlateEditor,\n type TElement,\n type TRange,\n type TTableElement,\n KEYS,\n NodeApi,\n} from 'platejs';\n\nimport { type TableConfig, BaseTablePlugin } from '../../lib/BaseTablePlugin';\nimport { getTableMergeGridByRange } from '../merge/getTableGridByRange';\n\nexport type GetTableGridByRangeOptions = {\n at: TRange;\n\n /**\n * Format of the output:\n *\n * - Table element\n * - Array of cells\n */\n format?: 'cell' | 'table';\n};\n\n/** Get sub table between 2 cell paths. */\nexport const getTableGridByRange = (\n editor: SlateEditor,\n { at, format = 'table' }: GetTableGridByRangeOptions\n): ElementEntry[] => {\n const { api } = editor.getPlugin<TableConfig>({ key: KEYS.table });\n const { disableMerge } = editor.getOptions(BaseTablePlugin);\n\n if (!disableMerge) {\n return getTableMergeGridByRange(editor, { at, format });\n }\n\n const startCellPath = at.anchor.path;\n const endCellPath = at.focus.path;\n\n const _startRowIndex = startCellPath.at(-2)!;\n const _endRowIndex = endCellPath.at(-2)!;\n const _startColIndex = startCellPath.at(-1)!;\n const _endColIndex = endCellPath.at(-1)!;\n\n const startRowIndex = Math.min(_startRowIndex, _endRowIndex);\n const endRowIndex = Math.max(_startRowIndex, _endRowIndex);\n const startColIndex = Math.min(_startColIndex, _endColIndex);\n const endColIndex = Math.max(_startColIndex, _endColIndex);\n\n const tablePath = startCellPath.slice(0, -2);\n\n const relativeRowIndex = endRowIndex - startRowIndex;\n const relativeColIndex = endColIndex - startColIndex;\n\n const table: TTableElement = api.create.table({\n children: [],\n colCount: relativeColIndex + 1,\n rowCount: relativeRowIndex + 1,\n });\n\n let rowIndex = startRowIndex;\n let colIndex = startColIndex;\n\n const cellEntries: ElementEntry[] = [];\n\n while (true) {\n const cellPath = tablePath.concat([rowIndex, colIndex]);\n\n const cell = NodeApi.get<TElement>(editor, cellPath);\n\n if (!cell) break;\n\n const rows = table.children[rowIndex - startRowIndex]\n .children as TElement[];\n\n rows[colIndex - startColIndex] = cell;\n\n cellEntries.push([cell, cellPath]);\n\n if (colIndex + 1 <= endColIndex) {\n colIndex += 1;\n } else if (rowIndex + 1 <= endRowIndex) {\n colIndex = startColIndex;\n rowIndex += 1;\n } else {\n break;\n }\n }\n\n if (format === 'cell') {\n return cellEntries;\n }\n\n return [[table, tablePath]];\n};\n","import {\n type EditorAboveOptions,\n type ElementEntry,\n type SlateEditor,\n KEYS,\n PathApi,\n} from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\n\nimport { getCellTypes } from '../../lib/utils';\nimport {\n type GetTableGridByRangeOptions,\n getTableGridByRange,\n} from './getTableGridByRange';\n\nexport type GetTableGridAboveOptions = EditorAboveOptions &\n Pick<GetTableGridByRangeOptions, 'format'>;\n\n/** Get sub table above anchor and focus. Format: tables or cells. */\nexport const getTableGridAbove = (\n editor: SlateEditor,\n { format = 'table', ...options }: GetTableGridAboveOptions = {}\n): ElementEntry[] => {\n const { api } = editor.getPlugin<TableConfig>({ key: KEYS.table });\n\n const edges = editor.api.edgeBlocks({\n match: {\n type: getCellTypes(editor),\n },\n ...options,\n });\n\n if (edges) {\n const [start, end] = edges;\n\n if (!PathApi.equals(start[1], end[1])) {\n return getTableGridByRange(editor, {\n at: {\n anchor: {\n offset: 0,\n path: start[1],\n },\n focus: {\n offset: 0,\n path: end[1],\n },\n },\n format,\n });\n }\n if (format === 'table') {\n const table = api.create.table({ rowCount: 1 });\n table.children[0].children = [start[0]];\n\n return [[table, start[1].slice(0, -2)]];\n }\n\n return [start];\n }\n\n return [];\n};\n","import type { TTableElement } from 'platejs';\n\nimport type { TableStoreSizeOverrides } from '../types';\n\nimport { getTableColumnCount } from './index';\n\n/**\n * Returns node.colSizes if it exists, applying overrides, otherwise returns a\n * 0-filled array.\n */\nexport const getTableOverriddenColSizes = (\n tableNode: TTableElement,\n colSizeOverrides?: TableStoreSizeOverrides\n): number[] => {\n const colCount = getTableColumnCount(tableNode);\n\n const colSizes = (\n tableNode.colSizes\n ? [...tableNode.colSizes]\n : (Array.from({ length: colCount }).fill(0) as number[])\n ).map((size, index) => colSizeOverrides?.get?.(index) ?? size);\n\n return colSizes;\n};\n","import {\n type NodeEntry,\n type PathRef,\n type SlateEditor,\n type TTableCellElement,\n KEYS,\n NodeApi,\n RangeApi,\n} from 'platejs';\n\nimport { getTableGridAbove } from '../queries';\n\nexport const deleteColumnWhenExpanded = (\n editor: SlateEditor,\n tableEntry: NodeEntry<TTableCellElement>\n) => {\n const [start, end] = RangeApi.edges(editor.selection!);\n const firstRow = NodeApi.child(tableEntry[0], 0) as TTableCellElement;\n const lastRow = NodeApi.child(\n tableEntry[0],\n tableEntry[0].children.length - 1\n ) as TTableCellElement;\n\n const firstSelectionRow = editor.api.above({\n at: start,\n match: (n) => n.type === KEYS.tr,\n });\n\n const lastSelectionRow = editor.api.above({\n at: end,\n match: (n) => n.type === KEYS.tr,\n });\n\n if (!firstSelectionRow || !lastSelectionRow) return;\n if (\n firstRow.id === firstSelectionRow[0].id &&\n lastSelectionRow[0].id === lastRow.id\n )\n deleteSelection(editor);\n};\n\nconst deleteSelection = (editor: SlateEditor) => {\n const cells = getTableGridAbove(editor, {\n format: 'cell',\n }) as NodeEntry<TTableCellElement>[];\n\n const pathRefs: PathRef[] = [];\n\n cells.forEach(([_cell, cellPath]) => {\n pathRefs.push(editor.api.pathRef(cellPath));\n });\n\n pathRefs.forEach((pathRef) => {\n editor.tf.removeNodes({ at: pathRef.unref()! });\n });\n};\n","import type {\n NodeEntry,\n SlateEditor,\n TTableCellElement,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport { getCellIndices } from '../utils/getCellIndices';\n\nexport const getCellPath = (\n editor: SlateEditor,\n tableEntry: NodeEntry<TTableElement>,\n curRowIndex: number,\n curColIndex: number\n) => {\n const [tableNode, tablePath] = tableEntry;\n\n const rowElem = tableNode.children[curRowIndex] as TTableRowElement;\n const foundColIndex = rowElem.children.findIndex((c) => {\n const cE = c as TTableCellElement;\n const { col: colIndex } = getCellIndices(editor, cE);\n\n return colIndex === curColIndex;\n });\n\n return tablePath.concat([curRowIndex, foundColIndex]);\n};\n","import type {\n Path,\n SlateEditor,\n TTableCellElement,\n TTableElement,\n} from 'platejs';\n\nimport cloneDeep from 'lodash/cloneDeep.js';\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport { getCellIndices, getCellTypes } from '..';\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { deleteColumnWhenExpanded } from './deleteColumnWhenExpanded';\nimport { findCellByIndexes } from './findCellByIndexes';\nimport { getCellPath } from './getCellPath';\n\nexport const deleteTableMergeColumn = (editor: SlateEditor) => {\n const type = editor.getType(KEYS.table);\n const tableEntry = editor.api.above<TTableElement>({\n match: { type },\n });\n\n if (!tableEntry) return;\n\n editor.tf.withoutNormalizing(() => {\n const { api } = getEditorPlugin(editor, BaseTablePlugin);\n\n if (editor.api.isExpanded()) {\n return deleteColumnWhenExpanded(editor, tableEntry);\n }\n\n const table = tableEntry[0] as TTableElement;\n\n const selectedCellEntry = editor.api.above({\n match: {\n type: getCellTypes(editor),\n },\n });\n\n if (!selectedCellEntry) return;\n\n const selectedCell = selectedCellEntry[0] as TTableCellElement;\n\n const { col: deletingColIndex } = getCellIndices(editor, selectedCell);\n const colsDeleteNumber = api.table.getColSpan(selectedCell);\n\n const endingColIndex = deletingColIndex + colsDeleteNumber - 1;\n\n const rowNumber = table.children.length;\n const affectedCellsSet = new Set();\n // iterating by rows is important here to keep the order of affected cells\n for (const rI of Array.from({ length: rowNumber }, (_, i) => i)) {\n for (const cI of Array.from({ length: colsDeleteNumber }, (_, i) => i)) {\n const colIndex = deletingColIndex + cI;\n const found = findCellByIndexes(editor, table, rI, colIndex);\n\n if (found) {\n affectedCellsSet.add(found);\n }\n }\n }\n const affectedCells = Array.from(affectedCellsSet) as TTableCellElement[];\n\n const { squizeColSpanCells } = affectedCells.reduce<{\n squizeColSpanCells: TTableCellElement[];\n }>(\n (acc, cur) => {\n if (!cur) return acc;\n\n const currentCell = cur as TTableCellElement;\n const { col: curColIndex } = getCellIndices(editor, currentCell);\n const curColSpan = api.table.getColSpan(currentCell);\n\n if (curColIndex < deletingColIndex && curColSpan > 1) {\n acc.squizeColSpanCells.push(currentCell);\n } else if (\n curColSpan > 1 &&\n curColIndex + curColSpan - 1 > endingColIndex\n ) {\n acc.squizeColSpanCells.push(currentCell);\n }\n\n return acc;\n },\n { squizeColSpanCells: [] }\n );\n\n /** Change colSpans */\n squizeColSpanCells.forEach((cur) => {\n const curCell = cur as TTableCellElement;\n\n const { col: curColIndex, row: curColRowIndex } = getCellIndices(\n editor,\n curCell\n );\n const curColSpan = api.table.getColSpan(curCell);\n\n const curCellPath = getCellPath(\n editor,\n tableEntry,\n curColRowIndex,\n curColIndex\n );\n\n const curCellEndingColIndex = Math.min(\n curColIndex + curColSpan - 1,\n endingColIndex\n );\n const colsNumberAffected = curCellEndingColIndex - deletingColIndex + 1;\n const colSpan = curColSpan - colsNumberAffected;\n const newCell = cloneDeep({ ...curCell, colSpan });\n\n if (newCell.attributes?.colspan) {\n newCell.attributes.colspan = colSpan.toString();\n }\n\n editor.tf.setNodes<TTableCellElement>(newCell, { at: curCellPath });\n });\n\n const trEntry = editor.api.above({\n match: { type: editor.getType(KEYS.tr) },\n });\n\n /** Remove cells */\n if (\n selectedCell &&\n trEntry &&\n tableEntry &&\n // Cannot delete the last cell\n trEntry[0].children.length > 1\n ) {\n const [tableNode, tablePath] = tableEntry;\n\n // calc paths to delete\n const paths: Path[][] = [];\n affectedCells.forEach((cur) => {\n const curCell = cur as TTableCellElement;\n const { col: curColIndex, row: curRowIndex } = getCellIndices(\n editor,\n curCell\n );\n\n if (\n !squizeColSpanCells.includes(curCell) &&\n curColIndex >= deletingColIndex &&\n curColIndex <= endingColIndex\n ) {\n const cellPath = getCellPath(\n editor,\n tableEntry,\n curRowIndex,\n curColIndex\n );\n\n if (!paths[curRowIndex]) {\n paths[curRowIndex] = [];\n }\n\n paths[curRowIndex].push(cellPath);\n }\n });\n\n paths.forEach((cellPaths) => {\n const pathToDelete = cellPaths[0];\n cellPaths.forEach(() => {\n editor.tf.removeNodes({\n at: pathToDelete,\n });\n });\n });\n\n const { colSizes } = tableNode;\n\n if (colSizes) {\n const newColSizes = [...colSizes];\n newColSizes.splice(deletingColIndex, 1);\n\n editor.tf.setNodes<TTableElement>(\n { colSizes: newColSizes },\n { at: tablePath }\n );\n }\n }\n });\n};\n","import type {\n NodeEntry,\n PathRef,\n SlateEditor,\n TTableCellElement,\n} from 'platejs';\n\nimport { getEditorPlugin } from 'platejs';\n\nimport {\n BaseTablePlugin,\n getCellRowIndexByPath,\n getTableMergedColumnCount,\n} from '..';\nimport { getTableGridAbove } from '../queries';\n\nexport const deleteRowWhenExpanded = (\n editor: SlateEditor,\n [table, tablePath]: NodeEntry<TTableCellElement>\n) => {\n const { api } = getEditorPlugin(editor, BaseTablePlugin);\n const columnCount = getTableMergedColumnCount(table);\n\n const cells = getTableGridAbove(editor, {\n format: 'cell',\n }) as NodeEntry<TTableCellElement>[];\n\n const firsRowIndex = getCellRowIndexByPath(cells[0][1]);\n\n if (firsRowIndex === null) return;\n\n let acrossColumn = 0;\n let lastRowIndex = -1;\n let rowSpanCarry = 0;\n let acrossRow = 0;\n\n cells.forEach(([cell, cellPath]) => {\n if (cellPath.at(-2) === firsRowIndex) {\n acrossColumn += cell.colSpan ?? 1;\n }\n\n const currentRowIndex = getCellRowIndexByPath(cellPath);\n\n if (lastRowIndex !== currentRowIndex) {\n if (rowSpanCarry !== 0) {\n rowSpanCarry--;\n\n return;\n }\n\n const rowSpan = api.table.getRowSpan(cell);\n\n rowSpanCarry = rowSpan && rowSpan > 1 ? rowSpan - 1 : 0;\n acrossRow += rowSpan ?? 1;\n }\n\n lastRowIndex = currentRowIndex;\n });\n\n if (acrossColumn === columnCount) {\n const pathRefs: PathRef[] = [];\n\n for (let i = firsRowIndex; i < firsRowIndex + acrossRow; i++) {\n const removedPath = tablePath.concat(i);\n pathRefs.push(editor.api.pathRef(removedPath));\n }\n\n pathRefs.forEach((item) => {\n editor.tf.removeNodes({ at: item.unref()! });\n });\n }\n};\n","import type {\n SlateEditor,\n TTableCellElement,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport cloneDeep from 'lodash/cloneDeep.js';\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\n\nimport {\n findCellByIndexes,\n getCellIndices,\n getCellTypes,\n getTableColumnCount,\n} from '..';\nimport { deleteRowWhenExpanded } from './deleteRowWhenExpanded';\n\nexport const deleteTableMergeRow = (editor: SlateEditor) => {\n const { api, tf, type } = getEditorPlugin<TableConfig>(editor, {\n key: KEYS.table,\n });\n\n if (\n editor.api.some({\n match: { type },\n })\n ) {\n const currentTableItem = editor.api.above<TTableElement>({\n match: { type },\n });\n\n if (!currentTableItem) return;\n if (editor.api.isExpanded())\n return deleteRowWhenExpanded(editor, currentTableItem);\n\n const table = currentTableItem[0] as TTableElement;\n\n const selectedCellEntry = editor.api.above({\n match: { type: getCellTypes(editor) },\n });\n\n if (!selectedCellEntry) return;\n\n const selectedCell = selectedCellEntry[0] as TTableCellElement;\n const { row: deletingRowIndex } = getCellIndices(editor, selectedCell);\n const rowsDeleteNumber = api.table.getRowSpan(selectedCell);\n const endingRowIndex = deletingRowIndex + rowsDeleteNumber - 1;\n\n const colNumber = getTableColumnCount(table);\n const affectedCellsSet = new Set();\n // iterating by columns is important here to keep the order of affected cells\n for (const cI of Array.from({ length: colNumber }, (_, i) => i)) {\n for (const rI of Array.from({ length: rowsDeleteNumber }, (_, i) => i)) {\n const rowIndex = deletingRowIndex + rI;\n const found = findCellByIndexes(editor, table, rowIndex, cI);\n affectedCellsSet.add(found);\n }\n }\n const affectedCells = Array.from(affectedCellsSet) as TTableCellElement[];\n\n const { moveToNextRowCells, squizeRowSpanCells } = affectedCells.reduce<{\n moveToNextRowCells: TTableCellElement[];\n squizeRowSpanCells: TTableCellElement[];\n }>(\n (acc, cur) => {\n if (!cur) return acc;\n\n const currentCell = cur as TTableCellElement;\n const { row: curRowIndex } = getCellIndices(editor, currentCell);\n const curRowSpan = api.table.getRowSpan(currentCell);\n\n // if (!curRowIndex || !curRowSpan) return acc;\n\n if (curRowIndex < deletingRowIndex && curRowSpan > 1) {\n acc.squizeRowSpanCells.push(currentCell);\n } else if (\n curRowSpan > 1 &&\n curRowIndex + curRowSpan - 1 > endingRowIndex\n ) {\n acc.moveToNextRowCells.push(currentCell);\n }\n\n return acc;\n },\n { moveToNextRowCells: [], squizeRowSpanCells: [] }\n );\n\n const nextRowIndex = deletingRowIndex + rowsDeleteNumber;\n const nextRow = table.children[nextRowIndex] as\n | TTableCellElement\n | undefined;\n\n if (nextRow === undefined && deletingRowIndex === 0) {\n tf.remove.table();\n\n return;\n }\n if (nextRow) {\n for (let index = 0; index < moveToNextRowCells.length; index++) {\n const curRowCell = moveToNextRowCells[index] as TTableCellElement;\n const { col: curRowCellColIndex, row: curRowCellRowIndex } =\n getCellIndices(editor, curRowCell);\n const curRowCellRowSpan = api.table.getRowSpan(curRowCell);\n\n // search for anchor cell where to place current cell\n const startingCellIndex = nextRow.children.findIndex((curC) => {\n const cell = curC as TTableCellElement;\n const { col: curColIndex } = getCellIndices(editor, cell);\n\n return curColIndex >= curRowCellColIndex;\n });\n\n if (startingCellIndex === -1) {\n const startingCell = nextRow.children.at(-1) as TTableCellElement;\n const startingCellPath = editor.api.findPath(startingCell)!;\n const tablePath = startingCellPath.slice(0, -2);\n const colPath = startingCellPath.at(-1)! + index + 1;\n const nextRowStartCellPath = [...tablePath, nextRowIndex, colPath];\n\n const rowsNumberAffected = endingRowIndex - curRowCellRowIndex + 1;\n const rowSpan = curRowCellRowSpan - rowsNumberAffected;\n const newCell = cloneDeep({ ...curRowCell, rowSpan });\n\n if (newCell.attributes?.rowspan) {\n newCell.attributes.rowspan = rowSpan.toString();\n }\n\n editor.tf.insertNodes(newCell, {\n at: nextRowStartCellPath,\n });\n\n continue;\n }\n\n const startingCell = nextRow.children[\n startingCellIndex\n ] as TTableCellElement;\n const { col: startingColIndex } = getCellIndices(editor, startingCell);\n\n // consider already inserted cell by adding index each time to the col path\n let incrementBy = index;\n\n if (startingColIndex < curRowCellColIndex) {\n // place current cell after starting cell, if placing cell col index is grather than col index of starting cell\n incrementBy += 1;\n }\n\n const startingCellPath = editor.api.findPath(startingCell)!;\n const tablePath = startingCellPath.slice(0, -2);\n const colPath = startingCellPath.at(-1)!;\n\n const nextRowStartCellPath = [\n ...tablePath,\n nextRowIndex,\n colPath + incrementBy,\n ];\n\n const rowsNumberAffected = endingRowIndex - curRowCellRowIndex + 1;\n const rowSpan = curRowCellRowSpan - rowsNumberAffected;\n const newCell = cloneDeep({ ...curRowCell, rowSpan });\n\n if (newCell.attributes?.rowspan) {\n newCell.attributes.rowspan = rowSpan.toString();\n }\n\n editor.tf.insertNodes(newCell, {\n at: nextRowStartCellPath,\n });\n }\n }\n\n squizeRowSpanCells.forEach((cur) => {\n const curRowCell = cur as TTableCellElement;\n const { row: curRowCellRowIndex } = getCellIndices(editor, curRowCell);\n const curRowCellRowSpan = api.table.getRowSpan(curRowCell);\n\n const curCellPath = editor.api.findPath(curRowCell)!;\n\n const curCellEndingRowIndex = Math.min(\n curRowCellRowIndex + curRowCellRowSpan - 1,\n endingRowIndex\n );\n const rowsNumberAffected = curCellEndingRowIndex - deletingRowIndex + 1;\n const rowSpan = curRowCellRowSpan - rowsNumberAffected;\n const newCell = cloneDeep({ ...curRowCell, rowSpan });\n\n if (newCell.attributes?.rowspan) {\n newCell.attributes.rowspan = rowSpan.toString();\n }\n\n editor.tf.setNodes<TTableCellElement>(newCell, { at: curCellPath });\n });\n\n const rowToDelete = table.children[deletingRowIndex] as TTableRowElement;\n const rowPath = editor.api.findPath(rowToDelete);\n Array.from({ length: rowsDeleteNumber }).forEach(() => {\n editor.tf.removeNodes({\n at: rowPath,\n });\n });\n }\n};\n","import type { TElement } from 'platejs';\n\nimport { getColSpan } from '../queries';\n\nexport const getTableMergedColumnCount = (tableNode: TElement) =>\n (tableNode.children as TElement[])?.[0]?.children?.reduce(\n (prev, cur) => prev + (getColSpan(cur as any) ?? 1),\n 0\n );\n","import cloneDeep from 'lodash/cloneDeep.js';\nimport {\n type Path,\n type SlateEditor,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n getEditorPlugin,\n KEYS,\n NodeApi,\n PathApi,\n} from 'platejs';\n\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { getCellTypes } from '../utils';\nimport { getCellIndices } from '../utils/getCellIndices';\nimport { findCellByIndexes } from './findCellByIndexes';\nimport { getCellPath } from './getCellPath';\n\nexport const insertTableMergeColumn = (\n editor: SlateEditor,\n {\n at,\n before,\n fromCell,\n header,\n select: shouldSelect,\n }: {\n /** Exact path of the cell to insert the column at. Will overrule `fromCell`. */\n at?: Path;\n /** Insert the column before the current column instead of after */\n before?: boolean;\n /** Path of the cell to insert the column from. */\n fromCell?: Path;\n header?: boolean;\n select?: boolean;\n } = {}\n) => {\n const { api, getOptions, type } = getEditorPlugin(editor, BaseTablePlugin);\n const { initialTableWidth, minColumnWidth } = getOptions();\n\n if (at && !fromCell) {\n const table = NodeApi.get<TTableElement>(editor, at);\n\n if (table?.type === editor.getType(KEYS.table)) {\n fromCell = NodeApi.lastChild(editor, at.concat([0]))![1];\n at = undefined;\n }\n }\n\n const cellEntry = fromCell\n ? editor.api.node<TTableCellElement>({\n at: fromCell,\n match: { type: getCellTypes(editor) },\n })\n : editor.api.block<TTableCellElement>({\n match: { type: getCellTypes(editor) },\n });\n\n if (!cellEntry) return;\n\n const [, cellPath] = cellEntry;\n const cell = cellEntry[0];\n\n const tableEntry = editor.api.block<TTableElement>({\n above: true,\n at: cellPath,\n match: { type },\n });\n\n if (!tableEntry) return;\n\n const [tableNode, tablePath] = tableEntry;\n\n const { col: cellColIndex } = getCellIndices(editor, cell);\n const cellColSpan = api.table.getColSpan(cell);\n\n let nextColIndex: number;\n let checkingColIndex: number;\n\n if (PathApi.isPath(at)) {\n nextColIndex = cellColIndex;\n checkingColIndex = cellColIndex - 1;\n } else {\n nextColIndex = before ? cellColIndex : cellColIndex + cellColSpan;\n checkingColIndex = before ? cellColIndex : cellColIndex + cellColSpan - 1;\n }\n\n const rowNumber = tableNode.children.length;\n const firstCol = nextColIndex <= 0;\n\n let placementCorrection = before ? 0 : 1;\n\n if (firstCol) {\n checkingColIndex = 0;\n placementCorrection = 0;\n }\n\n const affectedCellsSet = new Set();\n Array.from({ length: rowNumber }, (_, i) => i).forEach((rI) => {\n const found = findCellByIndexes(editor, tableNode, rI, checkingColIndex);\n\n if (found) {\n affectedCellsSet.add(found);\n }\n });\n const affectedCells = Array.from(affectedCellsSet) as TTableCellElement[];\n\n affectedCells.forEach((curCell) => {\n const { col: curColIndex, row: curRowIndex } = getCellIndices(\n editor,\n curCell\n );\n\n const curRowSpan = api.table.getRowSpan(curCell);\n const curColSpan = api.table.getColSpan(curCell);\n\n const currentCellPath = getCellPath(\n editor,\n tableEntry,\n curRowIndex,\n curColIndex\n );\n\n const endCurI = curColIndex + curColSpan - 1;\n\n if (endCurI >= nextColIndex && !firstCol && !before) {\n const colSpan = curColSpan + 1;\n const newCell = cloneDeep({ ...curCell, colSpan });\n\n if (newCell.attributes?.colspan) {\n newCell.attributes.colspan = colSpan.toString();\n }\n\n editor.tf.setNodes<TTableCellElement>(newCell, { at: currentCellPath });\n } else {\n const curRowPath = currentCellPath.slice(0, -1);\n const curColPath = currentCellPath.at(-1)!;\n const placementPath = [\n ...curRowPath,\n before ? curColPath : curColPath + placementCorrection,\n ];\n\n const row = editor.api.parent(currentCellPath)!;\n const rowElement = row[0] as TTableRowElement;\n const emptyCell = {\n ...api.create.tableCell({ header, row: rowElement }),\n colSpan: 1,\n rowSpan: curRowSpan,\n };\n editor.tf.insertNodes(emptyCell, {\n at: placementPath,\n select: shouldSelect,\n });\n }\n });\n\n editor.tf.withoutNormalizing(() => {\n const { colSizes } = tableNode;\n\n if (colSizes) {\n let newColSizes = [\n ...colSizes.slice(0, nextColIndex),\n 0,\n ...colSizes.slice(nextColIndex),\n ];\n\n if (initialTableWidth) {\n newColSizes[nextColIndex] =\n colSizes[nextColIndex] ??\n colSizes[nextColIndex - 1] ??\n initialTableWidth / colSizes.length;\n\n const oldTotal = colSizes.reduce((a, b) => a + b, 0);\n const newTotal = newColSizes.reduce((a, b) => a + b, 0);\n const maxTotal = Math.max(oldTotal, initialTableWidth);\n\n if (newTotal > maxTotal) {\n const factor = maxTotal / newTotal;\n newColSizes = newColSizes.map((size) =>\n Math.max(minColumnWidth ?? 0, Math.floor(size * factor))\n );\n }\n }\n\n editor.tf.setNodes<TTableElement>(\n {\n colSizes: newColSizes,\n },\n {\n at: tablePath,\n }\n );\n }\n });\n};\n","import cloneDeep from 'lodash/cloneDeep.js';\nimport {\n type Path,\n type SlateEditor,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n getEditorPlugin,\n KEYS,\n NodeApi,\n PathApi,\n} from 'platejs';\n\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { getTableColumnCount } from '../queries';\nimport { getCellTypes } from '../utils';\nimport { getCellIndices } from '../utils/getCellIndices';\nimport { findCellByIndexes } from './findCellByIndexes';\nimport { getCellPath } from './getCellPath';\n\nexport const insertTableMergeRow = (\n editor: SlateEditor,\n {\n at,\n before,\n fromRow,\n header,\n select: shouldSelect,\n }: {\n /** Exact path of the row to insert the column at. Will overrule `fromRow`. */\n at?: Path;\n /** Insert the row before the current row instead of after */\n before?: boolean;\n fromRow?: Path;\n header?: boolean;\n select?: boolean;\n } = {}\n) => {\n const { api, type } = getEditorPlugin(editor, BaseTablePlugin);\n\n if (at && !fromRow) {\n const table = NodeApi.get<TTableElement>(editor, at);\n\n if (table?.type === editor.getType(KEYS.table)) {\n fromRow = NodeApi.lastChild(editor, at)![1];\n at = undefined;\n }\n }\n\n const trEntry = editor.api.block({\n at: fromRow,\n match: { type: editor.getType(KEYS.tr) },\n });\n\n if (!trEntry) return;\n\n const [, trPath] = trEntry;\n\n const tableEntry = editor.api.block<TTableElement>({\n above: true,\n at: trPath,\n match: { type },\n });\n\n if (!tableEntry) return;\n\n const tableNode = tableEntry[0] as TTableElement;\n\n const cellEntry = editor.api.node({\n at: fromRow,\n match: { type: getCellTypes(editor) },\n });\n\n if (!cellEntry) return;\n\n const [cellNode, cellPath] = cellEntry;\n const cellElement = cellNode as TTableCellElement;\n const cellRowSpan = api.table.getRowSpan(cellElement);\n const { row: cellRowIndex } = getCellIndices(editor, cellElement);\n\n const rowPath = cellPath.at(-2)!;\n const tablePath = cellPath.slice(0, -2)!;\n\n let nextRowIndex: number;\n let checkingRowIndex: number;\n let nextRowPath: number[];\n\n if (PathApi.isPath(at)) {\n nextRowIndex = at.at(-1)!;\n checkingRowIndex = cellRowIndex - 1;\n nextRowPath = at;\n } else {\n nextRowIndex = before ? cellRowIndex : cellRowIndex + cellRowSpan;\n checkingRowIndex = before\n ? cellRowIndex - 1\n : cellRowIndex + cellRowSpan - 1;\n nextRowPath = [...tablePath, before ? rowPath : rowPath + cellRowSpan];\n }\n\n const firstRow = nextRowIndex === 0;\n\n if (firstRow) {\n checkingRowIndex = 0;\n }\n\n const colCount = getTableColumnCount(tableNode);\n const affectedCellsSet = new Set();\n Array.from({ length: colCount }, (_, i) => i).forEach((cI) => {\n const found = findCellByIndexes(editor, tableNode, checkingRowIndex, cI);\n\n if (found) {\n affectedCellsSet.add(found);\n }\n });\n const affectedCells = Array.from(affectedCellsSet) as TTableCellElement[];\n\n const newRowChildren: TTableCellElement[] = [];\n affectedCells.forEach((cur) => {\n if (!cur) return;\n\n const curCell = cur as TTableCellElement;\n const { col: curColIndex, row: curRowIndex } = getCellIndices(\n editor,\n curCell\n );\n\n const curRowSpan = api.table.getRowSpan(curCell);\n const curColSpan = api.table.getColSpan(curCell);\n const currentCellPath = getCellPath(\n editor,\n tableEntry,\n curRowIndex,\n curColIndex\n );\n\n const endCurI = curRowIndex + curRowSpan - 1;\n\n if (endCurI >= nextRowIndex && !firstRow) {\n const rowSpan = curRowSpan + 1;\n const newCell = cloneDeep({ ...curCell, rowSpan });\n\n if (newCell.attributes?.rowspan) {\n newCell.attributes.rowspan = rowSpan.toString();\n }\n\n // make higher\n editor.tf.setNodes<TTableCellElement>(newCell, { at: currentCellPath });\n } else {\n // add new\n const row = editor.api.parent(currentCellPath)!;\n const rowElement = row[0] as TTableRowElement;\n const emptyCell = api.create.tableCell({ header, row: rowElement });\n\n newRowChildren.push({\n ...emptyCell,\n colSpan: curColSpan,\n rowSpan: 1,\n });\n }\n });\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(\n {\n children: newRowChildren,\n type: editor.getType(KEYS.tr),\n },\n {\n at: nextRowPath,\n select: false,\n }\n );\n\n if (shouldSelect) {\n const cellEntry = editor.api.node({\n at: nextRowPath,\n match: { type: getCellTypes(editor) },\n });\n\n if (cellEntry) {\n const [, nextCellPath] = cellEntry;\n editor.tf.select(nextCellPath);\n }\n }\n });\n};\n","import type {\n TTableCellElement,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport { getColSpan } from '../queries';\nimport { getRowSpan } from '../queries/getRowSpan';\n\nconst allEqual = (arr: number[]) => arr.every((val) => val === arr[0]);\n\n/**\n * Checks if the given table is rectangular, meaning all rows have the same\n * effective number of cells, considering colspan and rowspan.\n */\nexport const isTableRectangular = (table?: TTableElement) => {\n const arr: number[] = [];\n table?.children?.forEach((row, rI) => {\n const rowEl = row as TTableRowElement;\n\n rowEl.children?.forEach((cell) => {\n const cellElem = cell as TTableCellElement;\n\n Array.from({\n length: getRowSpan(cellElem) || 1,\n } as ArrayLike<number>).forEach((_, i) => {\n if (!arr[rI + i]) {\n arr[rI + i] = 0;\n }\n\n arr[rI + i] += getColSpan(cellElem);\n });\n });\n });\n\n return allEqual(arr);\n};\n","import type {\n Descendant,\n NodeEntry,\n SlateEditor,\n TTableCellElement,\n} from 'platejs';\n\nimport cloneDeep from 'lodash/cloneDeep.js';\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport { getCellIndices } from '..';\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { getTableGridAbove } from '../queries';\n\n/** Merges multiple selected cells into one. */\nexport const mergeTableCells = (editor: SlateEditor) => {\n const { api } = getEditorPlugin(editor, BaseTablePlugin);\n\n const cellEntries = getTableGridAbove(editor, {\n format: 'cell',\n }) as NodeEntry<TTableCellElement>[];\n\n editor.tf.withoutNormalizing(() => {\n // calculate the colSpan which is the number of horizontal cells that a cell should span.\n let colSpan = 0;\n\n for (const entry of cellEntries) {\n const [cell, path] = entry;\n\n const rowIndex = path.at(-2)!;\n\n // count only those cells that are in the first selected row.\n if (rowIndex === cellEntries[0][1].at(-2)!) {\n const cellColSpan = api.table.getColSpan(cell);\n colSpan += cellColSpan;\n }\n }\n\n // calculate the rowSpan which is the number of vertical cells that a cell should span.\n let rowSpan = 0;\n const { col } = getCellIndices(editor, cellEntries[0][0]);\n cellEntries.forEach((entry) => {\n const cell = entry[0];\n const { col: curCol } = getCellIndices(editor, cell);\n\n if (col === curCol) {\n rowSpan += api.table.getRowSpan(cell);\n }\n });\n\n // This will store the content of all cells we are merging\n const mergingCellChildren: Descendant[] = [];\n\n for (const cellEntry of cellEntries) {\n const [el] = cellEntry;\n\n const cellChildren = api.table.getCellChildren!(el);\n\n if (\n cellChildren.length !== 1 ||\n !editor.api.isEmpty(cellChildren[0] as any)\n ) {\n mergingCellChildren.push(...cloneDeep(cellChildren));\n }\n }\n\n // Create a hash map where keys are col paths,\n // and values are an array of all paths with that column\n const cols: Record<string, number[][]> = {};\n\n cellEntries.forEach(([_entry, path]) => {\n const rowIndex = path.at(-2)!;\n\n if (cols[rowIndex]) {\n cols[rowIndex].push(path);\n } else {\n cols[rowIndex] = [path];\n }\n });\n\n // removes multiple cells with on same path.\n // once cell removed, next cell in the row will settle down on that path\n Object.values(cols).forEach((paths) => {\n paths?.forEach(() => {\n editor.tf.removeNodes({ at: paths[0] });\n });\n });\n\n // Create a new cell to replace the merged cells, with\n // calculated colSpan and rowSpan attributes and combined content\n const mergedCell = {\n ...api.create.tableCell({\n children: mergingCellChildren,\n header: cellEntries[0][0].type === editor.getType(KEYS.th),\n }),\n colSpan,\n rowSpan,\n };\n\n // insert the new merged cell in place of the first cell in the selection\n editor.tf.insertNodes(mergedCell, { at: cellEntries[0][1] });\n });\n\n editor.tf.select(editor.api.end(cellEntries[0][1])!);\n};\n","import type {\n Descendant,\n Path,\n SlateEditor,\n TTableCellElement,\n TTableRowElement,\n} from 'platejs';\n\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport { getCellIndices } from '..';\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { getTableGridAbove } from '../queries';\n\nexport const splitTableCell = (editor: SlateEditor) => {\n const { api } = getEditorPlugin(editor, BaseTablePlugin);\n const tableRowType = editor.getType(KEYS.tr);\n\n const cellEntries = getTableGridAbove(editor, { format: 'cell' });\n const [[cellElem, path]] = cellEntries;\n\n editor.tf.withoutNormalizing(() => {\n // creating new object per iteration is essential here\n const createEmptyCell = (children?: Descendant[]) => ({\n ...api.create.tableCell({\n children,\n header: cellElem.type === editor.getType(KEYS.th),\n }),\n colSpan: 1,\n rowSpan: 1,\n });\n\n const tablePath = path.slice(0, -2);\n\n const cellPath = path.slice(-2);\n const [rowPath, colPath] = cellPath;\n const colSpan = api.table.getColSpan(cellElem);\n const rowSpan = api.table.getRowSpan(cellElem);\n\n // Generate an array of column paths from the colspan\n const colPaths: number[] = [];\n\n for (let i = 0; i < colSpan; i++) {\n colPaths.push(colPath + i);\n }\n\n const { col } = getCellIndices(editor, cellElem);\n\n // Remove the original merged cell from the editor\n editor.tf.removeNodes({ at: path });\n\n const getClosestColPathForRow = (row: number, targetCol: number) => {\n const rowEntry = editor.api.node({\n at: [...tablePath, row],\n match: { type: tableRowType },\n });\n\n if (!rowEntry) {\n return 0;\n }\n\n const rowEl = rowEntry[0] as TTableRowElement;\n let closestColPath: Path = [];\n let smallestDiff = Number.POSITIVE_INFINITY;\n let isDirectionLeft = false;\n\n rowEl.children.forEach((cell) => {\n const cellElement = cell as TTableCellElement;\n const { col: cellCol } = getCellIndices(editor, cellElement);\n\n const diff = Math.abs(cellCol - targetCol);\n\n if (diff < smallestDiff) {\n smallestDiff = diff;\n closestColPath = editor.api.findPath(cellElement)!;\n isDirectionLeft = cellCol < targetCol;\n }\n });\n\n if (closestColPath.length > 0) {\n const lastIndex = closestColPath.at(-1)!;\n\n if (isDirectionLeft) {\n return lastIndex + 1;\n }\n\n return lastIndex;\n }\n\n return 1;\n };\n\n // Generate an array of cell paths from the row and col spans and then insert empty cells at those paths\n for (let i = 0; i < rowSpan; i++) {\n const currentRowPath = rowPath + i;\n const pathForNextRows = getClosestColPathForRow(currentRowPath, col);\n const newRowChildren: TTableRowElement[] = [];\n const _rowPath = [...tablePath, currentRowPath];\n const rowEntry = editor.api.node({\n at: _rowPath,\n match: { type: tableRowType },\n });\n\n for (let j = 0; j < colPaths.length; j++) {\n const cellChildren = api.table.getCellChildren!(cellElem);\n\n const cellToInsert =\n i === 0 && j === 0\n ? createEmptyCell(cellChildren)\n : createEmptyCell();\n\n // if row exists, insert into it, otherwise insert row\n if (rowEntry) {\n const currentColPath = i === 0 ? colPaths[j] : pathForNextRows;\n const pathForNewCell = [...tablePath, currentRowPath, currentColPath];\n\n editor.tf.insertNodes(cellToInsert, { at: pathForNewCell });\n } else {\n newRowChildren.push(cellToInsert);\n }\n }\n\n if (!rowEntry) {\n editor.tf.insertNodes(\n {\n children: newRowChildren,\n type: editor.getType(KEYS.tr),\n },\n { at: _rowPath }\n );\n }\n }\n });\n\n editor.tf.select(editor.api.end(path)!);\n};\n","import type { NormalizeInitialValue, TTableElement } from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport { computeCellIndices } from './utils';\n\nexport const normalizeInitialValueTable: NormalizeInitialValue<TableConfig> = ({\n editor,\n type,\n}) => {\n const tables = editor.api.nodes<TTableElement>({\n at: [],\n match: { type },\n });\n\n for (const [table] of tables) {\n computeCellIndices(editor, {\n tableNode: table,\n });\n }\n};\n","import type { SlateEditor, TElement, TTableElement } from 'platejs';\n\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport type { TableConfig } from '../BaseTablePlugin';\n\nimport { deleteTableMergeColumn } from '../merge/deleteColumn';\nimport { deleteColumnWhenExpanded } from '../merge/deleteColumnWhenExpanded';\nimport { getCellTypes } from '../utils';\n\nexport const deleteColumn = (editor: SlateEditor) => {\n const { getOptions, type } = getEditorPlugin<TableConfig>(editor, {\n key: KEYS.table,\n });\n const { disableMerge } = getOptions();\n\n const tableEntry = editor.api.above<TTableElement>({\n match: { type },\n });\n\n if (!tableEntry) return;\n\n editor.tf.withoutNormalizing(() => {\n if (!disableMerge) {\n deleteTableMergeColumn(editor);\n\n return;\n }\n if (editor.api.isExpanded())\n return deleteColumnWhenExpanded(editor, tableEntry);\n\n const tdEntry = editor.api.above({\n match: { type: getCellTypes(editor) },\n });\n const trEntry = editor.api.above({\n match: { type: editor.getType(KEYS.tr) },\n });\n\n if (\n tdEntry &&\n trEntry &&\n tableEntry &&\n // Cannot delete the last cell\n trEntry[0].children.length > 1\n ) {\n const [tableNode, tablePath] = tableEntry;\n\n const tdPath = tdEntry[1];\n const colIndex = tdPath.at(-1)!;\n\n const pathToDelete = tdPath.slice();\n const replacePathPos = pathToDelete.length - 2;\n\n tableNode.children.forEach((row, rowIdx) => {\n pathToDelete[replacePathPos] = rowIdx;\n\n // for tables containing rows of different lengths\n // - don't delete if only one cell in row\n // - don't delete if row doesn't have this cell\n if (\n (row.children as TElement[]).length === 1 ||\n colIndex > (row.children as TElement[]).length - 1\n )\n return;\n\n editor.tf.removeNodes({ at: pathToDelete });\n });\n\n const { colSizes } = tableNode;\n\n if (colSizes) {\n const newColSizes = [...colSizes];\n newColSizes.splice(colIndex, 1);\n\n editor.tf.setNodes<TTableElement>(\n { colSizes: newColSizes },\n { at: tablePath }\n );\n }\n }\n });\n\n // computeCellIndices(editor, {\n // tableNode: tableEntry[0],\n // });\n};\n","import type { SlateEditor, TTableElement } from 'platejs';\n\nimport { getEditorPlugin, KEYS } from 'platejs';\n\nimport type { TableConfig } from '..';\n\nimport { deleteRowWhenExpanded } from '../merge';\nimport { deleteTableMergeRow } from '../merge/deleteRow';\n\nexport const deleteRow = (editor: SlateEditor) => {\n const { getOptions, type } = getEditorPlugin<TableConfig>(editor, {\n key: KEYS.table,\n });\n const { disableMerge } = getOptions();\n\n if (!disableMerge) {\n return deleteTableMergeRow(editor);\n }\n if (\n editor.api.some({\n match: { type },\n })\n ) {\n const currentTableItem = editor.api.above<TTableElement>({\n match: { type },\n });\n\n if (!currentTableItem) return;\n if (editor.api.isExpanded())\n return deleteRowWhenExpanded(editor, currentTableItem);\n\n const currentRowItem = editor.api.above({\n match: { type: editor.getType(KEYS.tr) },\n });\n\n if (\n currentRowItem &&\n currentTableItem &&\n // Cannot delete the last row\n currentTableItem[0].children.length > 1\n ) {\n editor.tf.removeNodes({\n at: currentRowItem[1],\n });\n }\n }\n};\n","import { type SlateEditor, KEYS } from 'platejs';\n\nexport const deleteTable = (editor: SlateEditor) => {\n if (\n editor.api.some({\n match: { type: editor.getType(KEYS.table) },\n })\n ) {\n const tableItem = editor.api.above({\n match: { type: editor.getType(KEYS.table) },\n });\n\n if (tableItem) {\n editor.tf.removeNodes({\n at: tableItem[1],\n });\n }\n }\n};\n","import {\n type InsertNodesOptions,\n type SlateEditor,\n type TTableElement,\n KEYS,\n PathApi,\n} from 'platejs';\n\nimport type { GetEmptyTableNodeOptions } from '../api/getEmptyTableNode';\nimport type { TableConfig } from '../BaseTablePlugin';\n\n/**\n * Insert table. If selection in table and no 'at' specified, insert after\n * current table. Select start of new table.\n */\nexport const insertTable = (\n editor: SlateEditor,\n { colCount = 2, header, rowCount = 2 }: GetEmptyTableNodeOptions = {},\n { select: shouldSelect, ...options }: InsertNodesOptions = {}\n) => {\n const { api } = editor.getPlugin<TableConfig>({ key: KEYS.table });\n const type = editor.getType(KEYS.table);\n\n editor.tf.withoutNormalizing(() => {\n const newTable = api.create.table({\n colCount,\n header,\n rowCount,\n });\n\n if (!options.at) {\n const currentTableEntry = editor.api.block({\n match: { type },\n });\n\n if (currentTableEntry) {\n // Insert after current table\n const [, tablePath] = currentTableEntry;\n const insertPath = PathApi.next(tablePath);\n\n editor.tf.insertNodes<TTableElement>(newTable, {\n at: insertPath,\n ...(options as any),\n });\n\n if (editor.selection) {\n editor.tf.select(editor.api.start(insertPath)!);\n }\n\n return;\n }\n }\n\n // Use specified path or insert at current selection\n editor.tf.insertNodes<TTableElement>(newTable, {\n nextBlock: !options.at,\n select: shouldSelect,\n ...(options as any),\n });\n\n if (shouldSelect) {\n const tableEntry = editor.api.node({\n at: options.at,\n match: { type },\n });\n\n if (!tableEntry) return;\n\n editor.tf.select(editor.api.start(tableEntry[1])!);\n }\n });\n};\n","import type { Path, SlateEditor, TElement, TTableElement } from 'platejs';\n\nimport { getEditorPlugin, KEYS, NodeApi, PathApi } from 'platejs';\n\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { insertTableMergeColumn } from '../merge/insertTableColumn';\nimport { getCellTypes } from '../utils/index';\n\nexport const insertTableColumn = (\n editor: SlateEditor,\n options: {\n /** Exact path of the cell to insert the column at. Will overrule `fromCell`. */\n at?: Path;\n /** Insert the column before the current column instead of after */\n before?: boolean;\n /** Path of the cell to insert the column from. */\n fromCell?: Path;\n header?: boolean;\n select?: boolean;\n } = {}\n) => {\n const { api, getOptions, type } = getEditorPlugin(editor, BaseTablePlugin);\n\n const { disableMerge, initialTableWidth, minColumnWidth } = getOptions();\n\n if (!disableMerge) {\n return insertTableMergeColumn(editor, options);\n }\n\n const { before, header, select: shouldSelect } = options;\n let { at, fromCell } = options;\n\n if (at && !fromCell) {\n const table = NodeApi.get<TTableElement>(editor, at);\n\n if (table?.type === editor.getType(KEYS.table)) {\n fromCell = NodeApi.lastChild(editor, at.concat([0]))![1];\n at = undefined;\n }\n }\n\n const cellEntry = editor.api.block({\n at: fromCell,\n match: { type: getCellTypes(editor) },\n });\n\n if (!cellEntry) return;\n\n const [, cellPath] = cellEntry;\n\n const tableEntry = editor.api.block<TTableElement>({\n above: true,\n at: cellPath,\n match: { type },\n });\n\n if (!tableEntry) return;\n\n const [tableNode, tablePath] = tableEntry;\n\n let nextCellPath: Path;\n let nextColIndex: number;\n\n if (PathApi.isPath(at)) {\n nextCellPath = at;\n nextColIndex = at.at(-1)!;\n } else {\n nextCellPath = before ? cellPath : PathApi.next(cellPath);\n nextColIndex = before ? cellPath.at(-1)! : cellPath.at(-1)! + 1;\n }\n\n const currentRowIndex = cellPath.at(-2);\n\n editor.tf.withoutNormalizing(() => {\n // for each row, insert a new cell\n tableNode.children.forEach((row, rowIndex) => {\n const insertCellPath = [...nextCellPath];\n\n if (PathApi.isPath(at)) {\n insertCellPath[at.length - 2] = rowIndex;\n } else {\n insertCellPath[cellPath.length - 2] = rowIndex;\n }\n\n const isHeaderRow =\n header === undefined\n ? (row as TElement).children.every(\n (c) => c.type === editor.getType(KEYS.th)\n )\n : header;\n\n editor.tf.insertNodes(\n api.create.tableCell({\n header: isHeaderRow,\n }),\n {\n at: insertCellPath,\n select: shouldSelect && rowIndex === currentRowIndex,\n }\n );\n });\n\n const { colSizes } = tableNode;\n\n if (colSizes) {\n let newColSizes = [\n ...colSizes.slice(0, nextColIndex),\n 0,\n ...colSizes.slice(nextColIndex),\n ];\n\n if (initialTableWidth) {\n newColSizes[nextColIndex] =\n colSizes[nextColIndex] ??\n colSizes[nextColIndex - 1] ??\n initialTableWidth / colSizes.length;\n\n const oldTotal = colSizes.reduce((a, b) => a + b, 0);\n const newTotal = newColSizes.reduce((a, b) => a + b, 0);\n const maxTotal = Math.max(oldTotal, initialTableWidth);\n\n if (newTotal > maxTotal) {\n const factor = maxTotal / newTotal;\n newColSizes = newColSizes.map((size) =>\n Math.max(minColumnWidth ?? 0, Math.floor(size * factor))\n );\n }\n }\n\n editor.tf.setNodes<TTableElement>(\n {\n colSizes: newColSizes,\n },\n {\n at: tablePath,\n }\n );\n }\n });\n};\n","import {\n type Path,\n type SlateEditor,\n type TElement,\n type TTableElement,\n getEditorPlugin,\n KEYS,\n NodeApi,\n PathApi,\n} from 'platejs';\n\nimport { BaseTablePlugin } from '../BaseTablePlugin';\nimport { insertTableMergeRow } from '../merge/insertTableRow';\nimport { getCellTypes } from '../utils/index';\n\nexport const insertTableRow = (\n editor: SlateEditor,\n options: {\n /**\n * Exact path of the row to insert the column at. Pass the table path to\n * insert at the end of the table. Will overrule `fromRow`.\n */\n at?: Path;\n /** Insert the row before the current row instead of after */\n before?: boolean;\n fromRow?: Path;\n header?: boolean;\n select?: boolean;\n } = {}\n) => {\n const { api, getOptions, type } = getEditorPlugin(editor, BaseTablePlugin);\n\n const { disableMerge } = getOptions();\n\n if (!disableMerge) {\n return insertTableMergeRow(editor, options);\n }\n\n const { before, header, select: shouldSelect } = options;\n let { at, fromRow } = options;\n\n if (at && !fromRow) {\n const table = NodeApi.get<TTableElement>(editor, at);\n\n if (table?.type === editor.getType(KEYS.table)) {\n fromRow = NodeApi.lastChild(editor, at)![1];\n at = undefined;\n }\n }\n\n const trEntry = editor.api.block({\n at: fromRow,\n match: { type: editor.getType(KEYS.tr) },\n });\n\n if (!trEntry) return;\n\n const [trNode, trPath] = trEntry;\n\n const tableEntry = editor.api.block({\n above: true,\n at: trPath,\n match: { type },\n });\n\n if (!tableEntry) return;\n\n const getEmptyRowNode = () => ({\n children: (trNode.children as TElement[]).map((_, i) => {\n const hasSingleRow = tableEntry[0].children.length === 1;\n const isHeaderColumn =\n !hasSingleRow &&\n (tableEntry[0].children as TElement[]).every(\n (n) => n.children[i].type === editor.getType(KEYS.th)\n );\n\n return api.create.tableCell({\n header: header ?? isHeaderColumn,\n });\n }),\n type: editor.getType(KEYS.tr),\n });\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes(getEmptyRowNode(), {\n at: PathApi.isPath(at) ? at : before ? trPath : PathApi.next(trPath),\n });\n });\n\n if (shouldSelect) {\n const cellEntry = editor.api.block({\n match: { type: getCellTypes(editor) },\n });\n\n if (!cellEntry) return;\n\n const [, nextCellPath] = cellEntry;\n\n if (PathApi.isPath(at)) {\n nextCellPath[nextCellPath.length - 2] = at.at(-2)!;\n } else {\n nextCellPath[nextCellPath.length - 2] = before\n ? nextCellPath.at(-2)!\n : nextCellPath.at(-2)! + 1;\n }\n\n editor.tf.select(nextCellPath);\n }\n};\n","import { type SlateEditor, type TLocation, NodeApi } from 'platejs';\n\nimport { getTableGridAbove } from '../queries/getTableGridAbove';\nimport { getCellTypes } from '../utils/getCellType';\n\n/** Move selection by cell unit. */\nexport const moveSelectionFromCell = (\n editor: SlateEditor,\n {\n at,\n edge,\n fromOneCell,\n reverse,\n }: {\n at?: TLocation;\n /** Expand cell selection to an edge. */\n edge?: 'bottom' | 'left' | 'right' | 'top';\n /** Move selection from one selected cell */\n fromOneCell?: boolean;\n /** False: move selection to cell below true: move selection to cell above */\n reverse?: boolean;\n } = {}\n) => {\n if (edge) {\n const cellEntries = getTableGridAbove(editor, { at, format: 'cell' });\n\n const minCell = fromOneCell ? 0 : 1;\n\n if (cellEntries.length > minCell) {\n const [, firstCellPath] = cellEntries[0];\n const [, lastCellPath] = cellEntries.at(-1)!;\n\n const anchorPath = [...firstCellPath];\n const focusPath = [...lastCellPath];\n\n switch (edge) {\n case 'bottom': {\n focusPath[focusPath.length - 2] += 1;\n\n break;\n }\n case 'left': {\n anchorPath[anchorPath.length - 1] -= 1;\n\n break;\n }\n case 'right': {\n focusPath[focusPath.length - 1] += 1;\n\n break;\n }\n case 'top': {\n anchorPath[anchorPath.length - 2] -= 1;\n\n break;\n }\n // No default\n }\n\n if (NodeApi.has(editor, anchorPath) && NodeApi.has(editor, focusPath)) {\n editor.tf.select({\n anchor: editor.api.start(anchorPath)!,\n focus: editor.api.start(focusPath)!,\n });\n }\n\n return true;\n }\n\n return;\n }\n\n const cellEntry = editor.api.block({\n at,\n match: { type: getCellTypes(editor) },\n });\n\n if (cellEntry) {\n const [, cellPath] = cellEntry;\n\n const nextCellPath = [...cellPath];\n\n const offset = reverse ? -1 : 1;\n\n nextCellPath[nextCellPath.length - 2] += offset;\n\n if (NodeApi.has(editor, nextCellPath)) {\n editor.tf.select(editor.api.start(nextCellPath)!);\n } else {\n const tablePath = cellPath.slice(0, -2);\n\n if (reverse) {\n editor.tf.withoutNormalizing(() => {\n editor.tf.select(editor.api.start(tablePath)!);\n editor.tf.move({ reverse: true });\n });\n } else {\n editor.tf.withoutNormalizing(() => {\n editor.tf.select(editor.api.end(tablePath)!);\n editor.tf.move();\n });\n }\n }\n\n return true;\n }\n};\n","import { type SlateEditor, type TRange, isHotkey } from 'platejs';\n\nimport { getCellTypes, KEY_SHIFT_EDGES } from '..';\nimport { moveSelectionFromCell } from './moveSelectionFromCell';\n\n/**\n * Override the new selection if the previous selection and the new one are in\n * different cells.\n */\nexport const overrideSelectionFromCell = (\n editor: SlateEditor,\n newSelection?: TRange | null\n) => {\n let hotkey: string | undefined;\n\n if (\n !editor.dom.currentKeyboardEvent ||\n !['up', 'down', 'shift+up', 'shift+right', 'shift+down', 'shift+left'].some(\n (key) => {\n const valid = isHotkey(key, editor.dom.currentKeyboardEvent!);\n\n if (valid) hotkey = key;\n\n return valid;\n }\n ) ||\n !editor.selection?.focus ||\n !newSelection?.focus ||\n !editor.api.isAt({\n at: {\n anchor: editor.selection.focus,\n focus: newSelection.focus,\n },\n blocks: true,\n match: { type: getCellTypes(editor) },\n })\n ) {\n return;\n }\n if (!hotkey) return;\n\n const edge = (KEY_SHIFT_EDGES as any)[hotkey];\n\n // if the previous selection was in many cells, return\n if (\n edge &&\n !editor.api.isAt({ block: true, match: { type: getCellTypes(editor) } })\n ) {\n return;\n }\n\n const prevSelection = editor.selection;\n const reverse = ['shift+up', 'up'].includes(hotkey);\n\n setTimeout(() => {\n moveSelectionFromCell(editor, {\n at: prevSelection,\n edge,\n fromOneCell: true,\n reverse,\n });\n }, 0);\n};\n","import type {\n Path,\n SetNodesOptions,\n SlateEditor,\n TTableCellBorder,\n TTableCellElement,\n} from 'platejs';\n\nimport { ElementApi } from 'platejs';\n\nimport type { BorderDirection } from '../types';\n\nimport { getLeftTableCell } from '../queries/getLeftTableCell';\nimport { getTopTableCell } from '../queries/getTopTableCell';\nimport { getCellTypes } from '../utils/index';\n\nexport const setBorderSize = (\n editor: SlateEditor,\n size: number,\n {\n at,\n border = 'all',\n }: {\n at?: Path;\n border?: BorderDirection | 'all';\n } = {}\n) => {\n const cellEntry = editor.api.node<TTableCellElement>({\n at,\n match: { type: getCellTypes(editor) },\n });\n\n if (!cellEntry) return;\n\n const [cellNode, cellPath] = cellEntry;\n\n const cellIndex = cellPath.at(-1);\n const rowIndex = cellPath.at(-2);\n\n // Default hidden border style\n const borderStyle: TTableCellBorder = {\n size,\n };\n\n const setNodesOptions: SetNodesOptions = {\n match: (n) =>\n ElementApi.isElement(n) && getCellTypes(editor).includes(n.type),\n };\n\n if (border === 'top') {\n const isFirstRow = rowIndex === 0;\n\n if (isFirstRow) {\n const newBorders: TTableCellElement['borders'] = {\n ...cellNode.borders,\n top: borderStyle,\n };\n\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: cellPath,\n ...setNodesOptions,\n }\n );\n\n return;\n }\n\n const cellAboveEntry = getTopTableCell(editor, { at: cellPath });\n\n if (!cellAboveEntry) return;\n\n const [cellAboveNode, cellAbovePath] = cellAboveEntry;\n\n const newBorders: TTableCellElement['borders'] = {\n ...cellAboveNode.borders,\n bottom: borderStyle,\n };\n\n // Update the bottom border of the cell above\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: cellAbovePath,\n ...setNodesOptions,\n }\n );\n } else if (border === 'bottom') {\n const newBorders: TTableCellElement['borders'] = {\n ...cellNode.borders,\n bottom: borderStyle,\n };\n\n // Update the bottom border of the current cell\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: cellPath,\n ...setNodesOptions,\n }\n );\n }\n if (border === 'left') {\n const isFirstCell = cellIndex === 0;\n\n if (isFirstCell) {\n const newBorders: TTableCellElement['borders'] = {\n ...cellNode.borders,\n left: borderStyle,\n };\n\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: cellPath,\n ...setNodesOptions,\n }\n );\n\n return;\n }\n\n const prevCellEntry = getLeftTableCell(editor, { at: cellPath });\n\n if (!prevCellEntry) return;\n\n const [prevCellNode, prevCellPath] = prevCellEntry;\n\n const newBorders: TTableCellElement['borders'] = {\n ...prevCellNode.borders,\n right: borderStyle,\n };\n\n // Update the bottom border of the cell above\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: prevCellPath,\n ...setNodesOptions,\n }\n );\n } else if (border === 'right') {\n const newBorders: TTableCellElement['borders'] = {\n ...cellNode.borders,\n right: borderStyle,\n };\n\n // Update the right border of the current cell\n editor.tf.setNodes<TTableCellElement>(\n { borders: newBorders },\n {\n at: cellPath,\n ...setNodesOptions,\n }\n );\n }\n if (border === 'all') {\n editor.tf.withoutNormalizing(() => {\n setBorderSize(editor, size, { at, border: 'top' });\n setBorderSize(editor, size, { at, border: 'bottom' });\n setBorderSize(editor, size, { at, border: 'left' });\n setBorderSize(editor, size, { at, border: 'right' });\n });\n }\n};\n","import type { EditorAboveOptions, SlateEditor, TTableElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport { getTableColumnCount } from '../queries/getTableColumnCount';\n\nexport const setTableColSize = (\n editor: SlateEditor,\n { colIndex, width }: { colIndex: number; width: number },\n options: EditorAboveOptions = {}\n) => {\n const table = editor.api.node<TTableElement>({\n match: { type: KEYS.table },\n ...options,\n });\n\n if (!table) return;\n\n const [tableNode, tablePath] = table;\n\n const colSizes = tableNode.colSizes\n ? [...tableNode.colSizes]\n : Array.from({ length: getTableColumnCount(tableNode) }).fill(0);\n\n colSizes[colIndex] = width;\n\n editor.tf.setNodes<TTableElement>({ colSizes }, { at: tablePath });\n};\n","import type { EditorAboveOptions, SlateEditor, TTableElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const setTableMarginLeft = (\n editor: SlateEditor,\n { marginLeft }: { marginLeft: number },\n options: EditorAboveOptions = {}\n) => {\n const table = editor.api.node<TTableElement>({\n match: { type: KEYS.table },\n ...options,\n });\n\n if (!table) return;\n\n const [, tablePath] = table;\n\n editor.tf.setNodes<TTableElement>({ marginLeft }, { at: tablePath });\n};\n","import type {\n EditorAboveOptions,\n SlateEditor,\n TTableElement,\n TTableRowElement,\n} from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const setTableRowSize = (\n editor: SlateEditor,\n { height, rowIndex }: { height: number; rowIndex: number },\n options: EditorAboveOptions = {}\n) => {\n const table = editor.api.node<TTableElement>({\n match: { type: KEYS.table },\n ...options,\n });\n\n if (!table) return;\n\n const [, tablePath] = table;\n const tableRowPath = [...tablePath, rowIndex];\n\n editor.tf.setNodes<TTableRowElement>({ size: height }, { at: tableRowPath });\n};\n","import {\n type OverrideEditor,\n type TElement,\n type TRange,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n KEYS,\n RangeApi,\n} from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport { overrideSelectionFromCell } from './transforms/overrideSelectionFromCell';\nimport { computeCellIndices, getCellTypes } from './utils';\n\n// TODO: tests\n\n/**\n * Selection table:\n *\n * - If anchor is in table, focus in a block before: set focus to start of table\n * - If anchor is in table, focus in a block after: set focus to end of table\n * - If focus is in table, anchor in a block before: set focus to end of table\n * - If focus is in table, anchor in a block after: set focus to the point before\n * start of table\n */\nexport const withApplyTable: OverrideEditor<TableConfig> = ({\n api: _api,\n editor,\n getOptions,\n tf: { apply },\n type: tableType,\n}) => ({\n transforms: {\n apply(op) {\n if (op.type === 'set_selection' && op.newProperties) {\n const newSelection = {\n ...editor.selection,\n ...op.newProperties,\n } as TRange | null;\n\n if (\n RangeApi.isRange(newSelection) &&\n editor.api.isAt({\n at: newSelection,\n blocks: true,\n match: (n) => n.type === tableType,\n })\n ) {\n const anchorEntry = editor.api.block({\n at: newSelection.anchor,\n match: (n) => n.type === tableType,\n });\n\n if (anchorEntry) {\n const [, anchorPath] = anchorEntry;\n const isBackward = RangeApi.isBackward(newSelection);\n\n if (isBackward) {\n op.newProperties.focus = editor.api.start(anchorPath);\n } else {\n const pointBefore = editor.api.before(anchorPath);\n\n // if the table is the first block\n if (pointBefore) {\n op.newProperties.focus = editor.api.end(anchorPath);\n }\n }\n } else {\n const focusEntry = editor.api.block({\n at: newSelection.focus,\n match: (n) => n.type === tableType,\n });\n\n if (focusEntry) {\n const [, focusPath] = focusEntry;\n const isBackward = RangeApi.isBackward(newSelection);\n\n if (isBackward) {\n const startPoint = editor.api.start(focusPath)!;\n const pointBefore = editor.api.before(startPoint);\n op.newProperties.focus = pointBefore ?? startPoint;\n } else {\n op.newProperties.focus = editor.api.end(focusPath);\n }\n }\n }\n }\n\n overrideSelectionFromCell(editor, newSelection);\n }\n\n const opType =\n op.type === 'remove_node'\n ? (op.node.type as string)\n : op.type === 'move_node'\n ? editor.api.node<TElement>(op.path)?.[0].type\n : undefined;\n\n const isTableOperation =\n (op.type === 'remove_node' || op.type === 'move_node') &&\n opType &&\n [editor.getType(KEYS.tr), tableType, ...getCellTypes(editor)].includes(\n opType as string\n );\n\n // Cleanup cell indices when removing a table cell\n if (isTableOperation && op.type === 'remove_node') {\n const cells = [\n ...editor.api.nodes<TTableCellElement>({\n at: op.path,\n match: { type: getCellTypes(editor) },\n }),\n ];\n\n const cellIndices = getOptions()._cellIndices;\n\n cells.forEach(([cell]) => {\n delete cellIndices[cell.id as string];\n });\n }\n\n apply(op);\n\n let table: TTableElement | undefined;\n\n if (\n isTableOperation &&\n // There is no new indices when moving/removing a table\n opType !== tableType\n ) {\n table = editor.api.node<TTableRowElement>({\n at: op.type === 'move_node' ? op.newPath : op.path,\n match: { type: tableType },\n })?.[0];\n\n if (table) {\n computeCellIndices(editor, {\n tableNode: table,\n });\n }\n }\n },\n },\n});\n","import { type OverrideEditor, type SlateEditor, PointApi } from 'platejs';\n\nimport { type TableConfig, getCellTypes } from '.';\nimport { getTableGridAbove } from './queries/getTableGridAbove';\n\n/**\n * Return true if:\n *\n * - At start/end of a cell.\n * - Next to a table cell. Move selection to the table cell.\n */\nexport const preventDeleteTableCell = (\n editor: SlateEditor,\n {\n reverse,\n unit,\n }: {\n reverse?: boolean;\n unit?: 'block' | 'character' | 'line' | 'word';\n }\n) => {\n const { selection } = editor;\n const getNextPoint = reverse ? editor.api.after : editor.api.before;\n\n if (editor.api.isCollapsed()) {\n const cellEntry = editor.api.block({\n match: { type: getCellTypes(editor) },\n });\n\n if (cellEntry) {\n // Prevent deleting cell at the start or end of a cell\n const [, cellPath] = cellEntry;\n const start = reverse\n ? editor.api.end(cellPath)\n : editor.api.start(cellPath);\n\n if (selection && PointApi.equals(selection.anchor, start!)) {\n return true;\n }\n } else {\n // Prevent deleting cell when selection is before or after a table\n const nextPoint = getNextPoint(selection!, { unit });\n const nextCellEntry = editor.api.block({\n at: nextPoint,\n match: { type: getCellTypes(editor) },\n });\n\n if (nextCellEntry) {\n editor.tf.move({ reverse: !reverse });\n\n return true;\n }\n }\n }\n};\n\n/** Prevent cell deletion. */\nexport const withDeleteTable: OverrideEditor<TableConfig> = ({\n editor,\n tf: { deleteFragment },\n type,\n}) => ({\n transforms: {\n deleteFragment(direction) {\n if (editor.api.isAt({ block: true, match: (n) => n.type === type })) {\n const cellEntries = getTableGridAbove(editor, { format: 'cell' });\n\n if (cellEntries.length > 1) {\n editor.tf.withoutNormalizing(() => {\n cellEntries.forEach(([, cellPath]) => {\n editor.tf.replaceNodes(editor.api.create.block(), {\n at: cellPath,\n children: true,\n });\n });\n\n // set back the selection\n editor.tf.select({\n anchor: editor.api.start(cellEntries[0][1])!,\n focus: editor.api.end(cellEntries.at(-1)![1])!,\n });\n });\n\n return;\n }\n }\n\n deleteFragment(direction);\n },\n },\n});\n","import type {\n Descendant,\n OverrideEditor,\n TElement,\n TTableCellElement,\n TTableRowElement,\n} from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport { getTableGridAbove } from './queries/getTableGridAbove';\n\n/** If selection is in a table, get subtable above. */\nexport const withGetFragmentTable: OverrideEditor<TableConfig> = ({\n api,\n api: { getFragment },\n editor,\n type,\n}) => ({\n api: {\n getFragment() {\n const fragment = getFragment();\n const newFragment: Descendant[] = [];\n\n fragment.forEach((node) => {\n if (node.type === type) {\n const rows = node.children as TTableRowElement[];\n const rowCount = rows.length;\n\n if (!rowCount) return;\n\n const colCount = rows[0].children.length;\n const hasOneCell = rowCount <= 1 && colCount <= 1;\n\n if (hasOneCell) {\n const cell = rows[0] as TTableCellElement;\n const cellChildren = api.table.getCellChildren!(cell);\n newFragment.push(...(cellChildren[0].children as TElement[]));\n\n return;\n }\n const subTable = getTableGridAbove(editor);\n\n if (subTable.length > 0) {\n newFragment.push(subTable[0][0]);\n\n return;\n }\n }\n\n newFragment.push(node);\n });\n\n return newFragment;\n },\n },\n});\n","import cloneDeep from 'lodash/cloneDeep.js';\nimport {\n type OverrideEditor,\n type Path,\n type TElement,\n type TTableCellElement,\n type TTableElement,\n type TTableRowElement,\n KEYS,\n NodeApi,\n} from 'platejs';\n\nimport { type TableConfig, getTableAbove } from '.';\nimport { getTableGridAbove } from './queries/getTableGridAbove';\n\n/**\n * If inserting a table, If block above anchor is a table,\n *\n * - Replace each cell above by the inserted table until out of bounds.\n * - Select the inserted cells.\n */\nexport const withInsertFragmentTable: OverrideEditor<TableConfig> = ({\n api,\n editor,\n getOptions,\n tf: { insert, insertFragment },\n type,\n}) => ({\n transforms: {\n insertFragment(fragment) {\n const insertedTable = fragment.find(\n (n) => (n as TElement).type === type\n ) as TTableElement | undefined;\n\n if (!insertedTable) {\n const tableEntry = getTableAbove(editor, {\n at: editor.selection?.anchor,\n });\n\n if (tableEntry) {\n const cellEntries = getTableGridAbove(editor, {\n format: 'cell',\n });\n\n if (cellEntries.length > 1) {\n cellEntries.forEach((cellEntry) => {\n if (cellEntry) {\n const [, cellPath] = cellEntry;\n\n editor.tf.replaceNodes(cloneDeep(fragment) as any, {\n at: cellPath,\n children: true,\n });\n }\n });\n\n editor.tf.select({\n anchor: editor.api.start(cellEntries[0][1])!,\n focus: editor.api.end(cellEntries.at(-1)![1])!,\n });\n\n return;\n }\n }\n }\n if (insertedTable) {\n const tableEntry = getTableAbove(editor, {\n at: editor.selection?.anchor,\n });\n\n // inserting inside table\n if (tableEntry) {\n const [cellEntry] = getTableGridAbove(editor, {\n at: editor.selection?.anchor,\n format: 'cell',\n });\n\n if (cellEntry) {\n editor.tf.withoutNormalizing(() => {\n const [, startCellPath] = cellEntry;\n const cellPath = [...startCellPath];\n\n const startColIndex = cellPath.at(-1)!;\n let lastCellPath: Path | null = null;\n\n let initRow = true;\n const insertedRows = insertedTable.children as TTableRowElement[];\n insertedRows.forEach((row) => {\n cellPath[cellPath.length - 1] = startColIndex;\n\n // last inserted row\n if (!initRow) {\n const fromRow = cellPath.slice(0, -1);\n cellPath[cellPath.length - 2] += 1;\n\n if (!NodeApi.has(editor, cellPath)) {\n if (getOptions().disableExpandOnInsert) {\n return;\n }\n insert.tableRow({\n fromRow,\n });\n }\n }\n\n initRow = false;\n\n const insertedCells = row.children as TTableCellElement[];\n let initCell = true;\n\n insertedCells.forEach((cell) => {\n if (!initCell) {\n const fromCell = [...cellPath];\n cellPath[cellPath.length - 1] += 1;\n\n if (!NodeApi.has(editor, cellPath)) {\n if (getOptions().disableExpandOnInsert) {\n return;\n }\n insert.tableColumn({\n fromCell,\n });\n }\n }\n\n initCell = false;\n\n const cellChildren = api.table.getCellChildren!(\n cell\n ) as TTableCellElement[];\n\n editor.tf.replaceNodes(cloneDeep(cellChildren as any), {\n at: cellPath,\n children: true,\n });\n\n lastCellPath = [...cellPath];\n });\n });\n\n if (lastCellPath) {\n editor.tf.select({\n anchor: editor.api.start(startCellPath)!,\n focus: editor.api.end(lastCellPath)!,\n });\n }\n });\n\n return;\n }\n } else if (fragment.length === 1 && fragment[0].type === KEYS.table) {\n // needed to insert as node, otherwise it will be inserted as text\n editor.tf.insertNodes(fragment[0]);\n\n return;\n }\n }\n\n insertFragment(fragment);\n },\n },\n});\n","import type { OverrideEditor } from 'platejs';\n\nimport { type TableConfig, getTableAbove } from '.';\nimport { getTableGridAbove } from './queries';\n\nexport const withInsertTextTable: OverrideEditor<TableConfig> = ({\n editor,\n tf: { insertText },\n}) => ({\n transforms: {\n insertText(text, options) {\n if (editor.api.isExpanded()) {\n const entry = getTableAbove(editor, {\n at: editor.selection?.anchor,\n });\n\n if (entry) {\n const cellEntries = getTableGridAbove(editor, {\n format: 'cell',\n });\n\n if (cellEntries.length > 1) {\n editor.tf.collapse({\n edge: 'focus',\n });\n }\n }\n }\n\n insertText(text, options);\n },\n },\n});\n","import {\n type OverrideEditor,\n type TElement,\n type TTableCellElement,\n type TTableElement,\n ElementApi,\n KEYS,\n TextApi,\n} from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport { getTableColumnCount } from './queries';\nimport { computeCellIndices, getCellTypes } from './utils/index';\n\n/**\n * Normalize table:\n *\n * - Wrap cell children in a paragraph if they are texts.\n */\nexport const withNormalizeTable: OverrideEditor<TableConfig> = ({\n editor,\n getOption,\n getOptions,\n tf: { normalizeNode },\n type,\n}) => ({\n transforms: {\n normalizeNode([n, path]) {\n const { enableUnsetSingleColSize, initialTableWidth } = getOptions();\n\n if (ElementApi.isElement(n)) {\n if (n.type === type) {\n const node = n as TTableElement;\n\n if (\n !node.children.some(\n (child) =>\n ElementApi.isElement(child) &&\n child.type === editor.getType(KEYS.tr)\n )\n ) {\n editor.tf.removeNodes({ at: path });\n\n return;\n }\n if (\n node.colSizes &&\n node.colSizes.length > 0 &&\n enableUnsetSingleColSize &&\n getTableColumnCount(node) < 2\n ) {\n editor.tf.unsetNodes('colSizes', {\n at: path,\n });\n\n return;\n }\n\n const tableEntry = editor.api.block({\n above: true,\n at: path,\n match: { type },\n });\n\n if (tableEntry) {\n editor.tf.unwrapNodes({\n at: path,\n });\n\n return;\n }\n if (initialTableWidth) {\n const tableNode = node as TTableElement;\n const colCount = (\n tableNode.children[0]?.children as TElement[] | undefined\n )?.length;\n\n if (colCount) {\n const colSizes: number[] = [];\n\n if (!tableNode.colSizes) {\n for (let i = 0; i < colCount; i++) {\n colSizes.push(initialTableWidth / colCount);\n }\n } else if (tableNode.colSizes.some((size) => !size)) {\n tableNode.colSizes.forEach((colSize) => {\n colSizes.push(colSize || initialTableWidth / colCount);\n });\n }\n if (colSizes.length > 0) {\n editor.tf.setNodes<TTableElement>({ colSizes }, { at: path });\n\n return;\n }\n }\n }\n }\n if (n.type === editor.getType(KEYS.tr)) {\n const parentEntry = editor.api.parent(path);\n\n if (parentEntry?.[0].type !== type) {\n editor.tf.unwrapNodes({\n at: path,\n });\n\n return;\n }\n }\n if (getCellTypes(editor).includes(n.type)) {\n const node = n as TTableCellElement;\n const cellIndices = getOption('cellIndices', node.id as string);\n\n if (node.id && !cellIndices) {\n computeCellIndices(editor, {\n all: true,\n cellNode: node,\n });\n }\n\n const { children } = node;\n const parentEntry = editor.api.parent(path);\n\n if (parentEntry?.[0].type !== editor.getType(KEYS.tr)) {\n editor.tf.unwrapNodes({\n at: path,\n });\n\n return;\n }\n if (TextApi.isText(children[0])) {\n editor.tf.wrapNodes(editor.api.create.block({}, path), {\n at: path,\n children: true,\n });\n\n return;\n }\n }\n }\n\n normalizeNode([n, path]);\n },\n },\n});\n","import type {\n OverrideEditor,\n TElement,\n TTableCellElement,\n TTableElement,\n} from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport { getTableGridAbove } from './queries';\n\nexport const withSetFragmentDataTable: OverrideEditor<TableConfig> = ({\n api,\n editor,\n plugin,\n tf: { setFragmentData },\n}) => ({\n transforms: {\n setFragmentData(data, originEvent) {\n const tableEntry = getTableGridAbove(editor, {\n format: 'table',\n })?.[0];\n const selectedCellEntries = getTableGridAbove(editor, {\n format: 'cell',\n });\n\n const initialSelection = editor.selection;\n\n if (!tableEntry || !initialSelection) {\n setFragmentData(data, originEvent);\n\n return;\n }\n\n const [tableNode, tablePath] = tableEntry;\n const tableRows = tableNode.children as TElement[];\n tableNode.children = tableNode.children.filter(\n (v) => (v as TTableCellElement).children.length > 0\n );\n\n let textCsv = '';\n let textTsv = '';\n\n const divElement = document.createElement('div');\n const tableElement = document.createElement('table');\n\n /**\n * Cover single cell copy | cut operation. In this case, copy cell content\n * instead of table structure.\n */\n if (\n tableEntry &&\n initialSelection &&\n selectedCellEntries.length === 1 &&\n (originEvent === 'copy' || originEvent === 'cut')\n ) {\n setFragmentData(data);\n\n return;\n }\n\n editor.tf.withoutNormalizing(() => {\n tableRows.forEach((row) => {\n const rowCells = row.children as TTableCellElement[];\n const cellStrings: string[] = [];\n const rowElement =\n row.type === editor.getType(KEYS.th)\n ? document.createElement('th')\n : document.createElement('tr');\n\n rowCells.forEach((cell) => {\n // need to clean data before every iteration\n data.clearData();\n\n const cellPath = editor.api.findPath(cell)!;\n\n // select cell by cell\n editor.tf.select({\n anchor: editor.api.start(cellPath)!,\n focus: editor.api.end(cellPath)!,\n });\n\n // set data from selection\n setFragmentData(data);\n\n // get plain text\n cellStrings.push(data.getData('text/plain'));\n\n const cellElement = document.createElement('td');\n\n const colSpan = api.table.getColSpan(cell);\n cellElement.colSpan = colSpan;\n const rowSpan = api.table.getRowSpan(cell);\n cellElement.rowSpan = rowSpan;\n\n cellElement.innerHTML = data.getData('text/html');\n rowElement.append(cellElement);\n });\n\n tableElement.append(rowElement);\n\n textCsv += `${cellStrings.join(',')}\\n`;\n textTsv += `${cellStrings.join('\\t')}\\n`;\n });\n\n const _tableEntry = editor.api.node<TTableElement>({\n at: tablePath,\n match: { type: KEYS.table },\n });\n\n if (_tableEntry != null && _tableEntry.length > 0) {\n const realTable = _tableEntry[0];\n\n if (realTable.attributes != null) {\n Object.entries(realTable.attributes).forEach(([key, value]) => {\n if (\n value != null &&\n plugin.node.dangerouslyAllowAttributes?.includes(key)\n ) {\n tableElement.setAttribute(key, String(value));\n }\n });\n }\n }\n\n // select back original cells\n editor.tf.select(initialSelection!);\n\n divElement.append(tableElement);\n });\n\n data.setData('text/csv', textCsv);\n data.setData('text/tsv', textTsv);\n data.setData('text/plain', textTsv);\n data.setData('text/html', divElement.innerHTML);\n\n // set slate fragment\n const selectedFragmentStr = JSON.stringify([tableNode]);\n const encodedFragment = window.btoa(\n encodeURIComponent(selectedFragmentStr)\n );\n data.setData('application/x-slate-fragment', encodedFragment);\n },\n },\n});\n","import {\n type OverrideEditor,\n combineTransformMatchOptions,\n PathApi,\n RangeApi,\n TextApi,\n} from 'platejs';\n\nimport type { TableConfig } from '.';\n\nimport { getTableGridAbove } from './queries';\n\nexport const withTableCellSelection: OverrideEditor<TableConfig> = ({\n api: { marks },\n editor,\n tf: { addMark, removeMark, setNodes },\n}) => {\n return {\n api: {\n marks() {\n const apply = () => {\n const { selection } = editor;\n\n if (!selection || editor.api.isCollapsed()) return;\n\n const matchesCell = getTableGridAbove(editor, { format: 'cell' });\n\n if (matchesCell.length <= 1) return;\n\n const markCounts: Record<string, number> = {};\n const totalMarks: Record<string, any> = {};\n let totalNodes = 0;\n\n matchesCell.forEach(([_cell, cellPath]) => {\n const textNodeEntry = editor.api.nodes({\n at: cellPath,\n match: (n) => TextApi.isText(n),\n });\n\n Array.from(textNodeEntry, (item) => item[0]).forEach((item) => {\n totalNodes++;\n const keys = Object.keys(item);\n\n if (keys.length === 1) return;\n\n keys.splice(keys.indexOf('text'), 1);\n\n keys.forEach((k) => {\n markCounts[k] = (markCounts[k] || 0) + 1;\n totalMarks[k] = item[k];\n });\n });\n });\n\n Object.keys(markCounts).forEach((mark) => {\n if (markCounts[mark] !== totalNodes) {\n delete totalMarks[mark];\n }\n });\n\n return totalMarks;\n };\n\n const result = apply();\n if (result) return result;\n\n return marks();\n },\n },\n transforms: {\n addMark(key, value) {\n const apply = () => {\n const { selection } = editor;\n\n if (\n !selection ||\n editor.api.isCollapsed() ||\n editor.meta.isNormalizing\n )\n return;\n\n const matchesCell = getTableGridAbove(editor, { format: 'cell' });\n\n if (matchesCell.length <= 1) return;\n\n matchesCell.forEach(([_cell, cellPath]) => {\n editor.tf.setNodes(\n {\n [key]: value,\n },\n {\n at: cellPath,\n split: true,\n voids: true,\n match: (n) => TextApi.isText(n),\n }\n );\n });\n\n return true;\n };\n\n if (apply()) return;\n\n return addMark(key, value);\n },\n\n removeMark(key: string) {\n const apply = () => {\n const { selection } = editor;\n\n if (\n !selection ||\n editor.api.isCollapsed() ||\n editor.meta.isNormalizing\n )\n return;\n\n const matchesCell = getTableGridAbove(editor, { format: 'cell' });\n\n if (matchesCell.length <= 1) return;\n\n matchesCell.forEach(([_cell, cellPath]) => {\n editor.tf.setNodes(\n { [key]: null },\n {\n at: cellPath,\n split: true,\n voids: true,\n match: (n) => TextApi.isText(n),\n }\n );\n });\n\n return true;\n };\n\n if (apply()) return;\n\n return removeMark(key);\n },\n\n setNodes(props, options) {\n const apply = () => {\n const { selection } = editor;\n\n if (\n !selection ||\n editor.api.isCollapsed() ||\n editor.meta.isNormalizing\n ) {\n return;\n }\n\n // If options.at is specified and it's not within the current selection, skip our override\n // This is important for normalization and other operations that target specific paths\n if (options?.at) {\n const range = editor.api.range(options.at);\n\n if (range && !RangeApi.includes(selection, range)) {\n return;\n }\n }\n\n const matchesCell = getTableGridAbove(editor, { format: 'cell' });\n if (matchesCell.length <= 1) return;\n\n setNodes(props, {\n ...options,\n match: combineTransformMatchOptions(\n editor,\n (_, p) =>\n matchesCell.some(([_, cellPath]) =>\n PathApi.isCommon(cellPath, p)\n ),\n options\n ),\n });\n\n return true;\n };\n\n if (apply()) return;\n\n return setNodes(props, options);\n },\n },\n };\n};\n","import type { OverrideEditor, TElement } from 'platejs';\n\nimport type { TableConfig } from './BaseTablePlugin';\n\nimport {\n getNextTableCell,\n getPreviousTableCell,\n getTableEntries,\n} from './queries';\nimport { getCellTypes } from './utils';\nimport { withApplyTable } from './withApplyTable';\nimport { withDeleteTable } from './withDeleteTable';\nimport { withGetFragmentTable } from './withGetFragmentTable';\nimport { withInsertFragmentTable } from './withInsertFragmentTable';\nimport { withInsertTextTable } from './withInsertTextTable';\nimport { withNormalizeTable } from './withNormalizeTable';\nimport { withSetFragmentDataTable } from './withSetFragmentDataTable';\nimport { withTableCellSelection } from './withTableCellSelection';\n\nexport const withTable: OverrideEditor<TableConfig> = (ctx) => {\n const {\n editor,\n tf: { selectAll, tab },\n type,\n } = ctx;\n const cellSelection = withTableCellSelection(ctx);\n\n return {\n api: {\n // getFragment\n ...withGetFragmentTable(ctx).api,\n ...cellSelection.api,\n },\n transforms: {\n selectAll: () => {\n const apply = () => {\n const table = editor.api.above<TElement>({ match: { type } });\n\n if (!table) return;\n\n const [, tablePath] = table;\n\n // select the whole table\n editor.tf.select(tablePath);\n\n return true;\n };\n\n if (apply()) return true;\n\n return selectAll();\n },\n tab: (options) => {\n const apply = () => {\n if (editor.selection && editor.api.isExpanded()) {\n // fix the exception of inputting Chinese when selecting multiple cells\n const tdEntries = Array.from(\n editor.api.nodes({\n at: editor.selection,\n match: { type: getCellTypes(editor) },\n })\n );\n\n if (tdEntries.length > 1) {\n editor.tf.collapse({\n edge: 'end',\n });\n\n return true;\n }\n }\n\n const entries = getTableEntries(editor);\n\n if (!entries) return;\n\n const { cell, row } = entries;\n const [, cellPath] = cell;\n\n if (options.reverse) {\n // move left with shift+tab\n const previousCell = getPreviousTableCell(\n editor,\n cell,\n cellPath,\n row\n );\n\n if (previousCell) {\n const [, previousCellPath] = previousCell;\n editor.tf.select(previousCellPath);\n }\n } else {\n // move right with tab\n const nextCell = getNextTableCell(editor, cell, cellPath, row);\n\n if (nextCell) {\n const [, nextCellPath] = nextCell;\n editor.tf.select(nextCellPath);\n }\n }\n\n return true;\n };\n\n if (apply()) return true;\n\n return tab(options);\n },\n // normalize\n ...withNormalizeTable(ctx).transforms,\n // delete\n ...withDeleteTable(ctx).transforms,\n // insertFragment\n ...withInsertFragmentTable(ctx).transforms,\n // insertText\n ...withInsertTextTable(ctx).transforms,\n // apply\n ...withApplyTable(ctx).transforms,\n // setFragmentData\n ...withSetFragmentDataTable(ctx).transforms,\n // addMark, removeMark, setNodes, unsetNodes\n ...cellSelection.transforms,\n },\n };\n};\n","import {\n type Descendant,\n type HtmlDeserializer,\n type OmitFirst,\n type PluginConfig,\n type TElement,\n type TTableCellElement,\n bindFirst,\n createSlatePlugin,\n createTSlatePlugin,\n KEYS,\n} from 'platejs';\n\nimport type { CellIndices } from './utils';\n\nimport { getEmptyCellNode, getEmptyRowNode, getEmptyTableNode } from './api';\nimport { mergeTableCells, splitTableCell } from './merge';\nimport { normalizeInitialValueTable } from './normalizeInitialValueTable';\nimport {\n getColSpan,\n getRowSpan,\n getTableCellBorders,\n getTableCellSize,\n} from './queries';\nimport {\n deleteColumn,\n deleteRow,\n deleteTable,\n insertTable,\n insertTableColumn,\n insertTableRow,\n} from './transforms/index';\nimport { withTable } from './withTable';\n\nconst parse: HtmlDeserializer['parse'] = ({ element, type }) => {\n const background = element.style.background || element.style.backgroundColor;\n\n if (background) {\n return {\n background,\n type,\n };\n }\n\n return { type };\n};\n\nexport const BaseTableRowPlugin = createSlatePlugin({\n key: KEYS.tr,\n node: { isContainer: true, isElement: true, isStrictSiblings: true },\n parsers: {\n html: {\n deserializer: {\n rules: [{ validNodeName: 'TR' }],\n },\n },\n },\n});\n\nexport const BaseTableCellPlugin = createSlatePlugin({\n key: KEYS.td,\n node: {\n dangerouslyAllowAttributes: ['colspan', 'rowspan'],\n isContainer: true,\n isElement: true,\n isStrictSiblings: true,\n props: ({ element }) => ({\n colSpan: (element?.attributes as any)?.colspan,\n rowSpan: (element?.attributes as any)?.rowspan,\n }),\n },\n parsers: {\n html: {\n deserializer: {\n attributeNames: ['rowspan', 'colspan'],\n parse,\n rules: [{ validNodeName: 'TD' }],\n },\n },\n },\n rules: {\n merge: { removeEmpty: false },\n },\n});\n\nexport const BaseTableCellHeaderPlugin = createSlatePlugin({\n key: KEYS.th,\n node: {\n dangerouslyAllowAttributes: ['colspan', 'rowspan'],\n isContainer: true,\n isElement: true,\n isStrictSiblings: true,\n props: ({ element }) => ({\n colSpan: (element?.attributes as any)?.colspan,\n rowSpan: (element?.attributes as any)?.rowspan,\n }),\n },\n parsers: {\n html: {\n deserializer: {\n attributeNames: ['rowspan', 'colspan'],\n parse,\n rules: [{ validNodeName: 'TH' }],\n },\n },\n },\n rules: {\n merge: { removeEmpty: false },\n },\n});\n\nexport type TableConfig = PluginConfig<\n 'table',\n {\n /** @private Keeps Track of cell indices by id. */\n _cellIndices: Record<string, { col: number; row: number }>;\n /** The currently selected cells. */\n selectedCells: TElement[] | null;\n /** The currently selected tables. */\n selectedTables: TElement[] | null;\n /** Disable expanding the table when inserting cells. */\n disableExpandOnInsert?: boolean;\n // Disable first column left resizer.\n disableMarginLeft?: boolean;\n /**\n * Disable cell merging functionality.\n *\n * @default false\n */\n disableMerge?: boolean;\n /**\n * Disable unsetting the first column width when the table has one column.\n * Set it to true if you want to resize the table width when there is only\n * one column. Keep it false if you have a full-width table.\n */\n enableUnsetSingleColSize?: boolean;\n /**\n * If defined, a normalizer will set each undefined table `colSizes` to this\n * value divided by the number of columns. Merged cells not supported.\n */\n initialTableWidth?: number;\n /**\n * The minimum width of a column.\n *\n * @default 48\n */\n minColumnWidth?: number;\n },\n {\n create: {\n table: OmitFirst<typeof getEmptyTableNode>;\n /** Cell node factory used each time a cell is created. */\n tableCell: OmitFirst<typeof getEmptyCellNode>;\n tableRow: OmitFirst<typeof getEmptyRowNode>;\n };\n table: {\n getCellBorders: OmitFirst<typeof getTableCellBorders>;\n getCellSize: OmitFirst<typeof getTableCellSize>;\n getColSpan: typeof getColSpan;\n getRowSpan: typeof getRowSpan;\n getCellChildren: (cell: TTableCellElement) => Descendant[];\n };\n },\n {\n insert: {\n table: OmitFirst<typeof insertTable>;\n tableColumn: OmitFirst<typeof insertTableColumn>;\n tableRow: OmitFirst<typeof insertTableRow>;\n };\n remove: {\n table: OmitFirst<typeof deleteTable>;\n tableColumn: OmitFirst<typeof deleteColumn>;\n tableRow: OmitFirst<typeof deleteRow>;\n };\n table: {\n merge: OmitFirst<typeof mergeTableCells>;\n split: OmitFirst<typeof splitTableCell>;\n };\n },\n {\n cellIndices?: (id: string) => CellIndices;\n }\n>;\n\n/** Enables support for tables. */\nexport const BaseTablePlugin = createTSlatePlugin<TableConfig>({\n key: KEYS.table,\n node: {\n isContainer: true,\n isElement: true,\n },\n normalizeInitialValue: normalizeInitialValueTable,\n options: {\n _cellIndices: {},\n disableMerge: false,\n minColumnWidth: 48,\n selectedCells: null as TElement[] | null,\n selectedTables: null as TElement[] | null,\n },\n parsers: {\n html: {\n deserializer: {\n rules: [{ validNodeName: 'TABLE' }],\n },\n },\n },\n plugins: [BaseTableRowPlugin, BaseTableCellPlugin, BaseTableCellHeaderPlugin],\n})\n .extendSelectors<TableConfig['selectors']>(({ getOptions }) => ({\n cellIndices: (id) => getOptions()._cellIndices[id],\n }))\n .extendEditorApi<TableConfig['api']>(({ editor }) => ({\n create: {\n table: bindFirst(getEmptyTableNode, editor),\n tableCell: bindFirst(getEmptyCellNode, editor),\n tableRow: bindFirst(getEmptyRowNode, editor),\n },\n table: {\n getCellBorders: bindFirst(getTableCellBorders, editor),\n getCellSize: bindFirst(getTableCellSize, editor),\n getColSpan,\n getRowSpan,\n getCellChildren: (cell) => cell.children,\n },\n }))\n .extendEditorTransforms<TableConfig['transforms']>(({ editor }) => ({\n insert: {\n table: bindFirst(insertTable, editor),\n tableColumn: bindFirst(insertTableColumn, editor),\n tableRow: bindFirst(insertTableRow, editor),\n },\n remove: {\n table: bindFirst(deleteTable, editor),\n tableColumn: bindFirst(deleteColumn, editor),\n tableRow: bindFirst(deleteRow, editor),\n },\n table: {\n merge: bindFirst(mergeTableCells, editor),\n split: bindFirst(splitTableCell, editor),\n },\n }))\n .overrideEditor(withTable);\n","export const KEY_SHIFT_EDGES = {\n 'shift+down': 'bottom',\n 'shift+left': 'left',\n 'shift+right': 'right',\n 'shift+up': 'top',\n};\n"],"mappings":"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"}
|