@lofcz/platejs-layout 52.0.11 → 52.3.6
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/dist/{BaseColumnPlugin-BFM6r9Zm.js → BaseColumnPlugin-z1GRkW4o.js} +6 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -3
- package/dist/react/index.d.ts +7 -5
- package/dist/react/index.js +2 -3
- package/package.json +3 -2
- package/dist/BaseColumnPlugin-BFM6r9Zm.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js.map +0 -1
|
@@ -6,9 +6,12 @@ const withColumn = ({ editor, tf: { normalizeNode, selectAll }, type }) => ({ tr
|
|
|
6
6
|
if (ElementApi.isElement(n) && n.type === editor.getType(KEYS.columnGroup)) {
|
|
7
7
|
const node = n;
|
|
8
8
|
const firstChild = node.children[0];
|
|
9
|
-
if (node.children.length === 1 && firstChild.type === editor.getType(KEYS.p))
|
|
9
|
+
if (node.children.length === 1 && firstChild.type === editor.getType(KEYS.p)) {
|
|
10
|
+
editor.tf.unwrapNodes({ at: path });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
10
13
|
if (!node.children.some((child) => ElementApi.isElement(child) && child.type === type)) {
|
|
11
|
-
editor.tf.
|
|
14
|
+
editor.tf.unwrapNodes({ at: path });
|
|
12
15
|
return;
|
|
13
16
|
}
|
|
14
17
|
if (node.children.length < 2) {
|
|
@@ -80,5 +83,4 @@ const BaseColumnPlugin = createSlatePlugin({
|
|
|
80
83
|
});
|
|
81
84
|
|
|
82
85
|
//#endregion
|
|
83
|
-
export { BaseColumnPlugin as n, withColumn as r, BaseColumnItemPlugin as t };
|
|
84
|
-
//# sourceMappingURL=BaseColumnPlugin-BFM6r9Zm.js.map
|
|
86
|
+
export { BaseColumnPlugin as n, withColumn as r, BaseColumnItemPlugin as t };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import * as platejs1 from "platejs";
|
|
1
2
|
import { At, InsertNodesOptions, NodeEntry, OverrideEditor, ReplaceNodesOptions, SlateEditor, TColumnGroupElement, TNode } from "platejs";
|
|
2
3
|
|
|
3
4
|
//#region src/lib/BaseColumnPlugin.d.ts
|
|
4
|
-
declare const BaseColumnItemPlugin:
|
|
5
|
-
declare const BaseColumnPlugin:
|
|
5
|
+
declare const BaseColumnItemPlugin: platejs1.SlatePlugin<platejs1.PluginConfig<"column", {}, {}, {}, {}>>;
|
|
6
|
+
declare const BaseColumnPlugin: platejs1.SlatePlugin<platejs1.PluginConfig<"column_group", {}, {}, {}, {}>>;
|
|
6
7
|
//#endregion
|
|
7
8
|
//#region src/lib/withColumn.d.ts
|
|
8
9
|
declare const withColumn: OverrideEditor;
|
|
@@ -65,5 +66,4 @@ declare const columnsToWidths: ({
|
|
|
65
66
|
columns?: number;
|
|
66
67
|
}) => string[];
|
|
67
68
|
//#endregion
|
|
68
|
-
export { BaseColumnItemPlugin, BaseColumnPlugin, columnsToWidths, insertColumn, insertColumnGroup, moveMiddleColumn, resizeColumn, setColumns, toggleColumnGroup, withColumn };
|
|
69
|
-
//# sourceMappingURL=index.d.ts.map
|
|
69
|
+
export { BaseColumnItemPlugin, BaseColumnPlugin, columnsToWidths, insertColumn, insertColumnGroup, moveMiddleColumn, resizeColumn, setColumns, toggleColumnGroup, withColumn };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as BaseColumnPlugin, r as withColumn, t as BaseColumnItemPlugin } from "./BaseColumnPlugin-
|
|
1
|
+
import { n as BaseColumnPlugin, r as withColumn, t as BaseColumnItemPlugin } from "./BaseColumnPlugin-z1GRkW4o.js";
|
|
2
2
|
import { KEYS, NodeApi } from "platejs";
|
|
3
3
|
|
|
4
4
|
//#region src/lib/transforms/insertColumn.ts
|
|
@@ -186,5 +186,4 @@ const toggleColumnGroup = (editor, { at, columns = 2, widths } = {}) => {
|
|
|
186
186
|
};
|
|
187
187
|
|
|
188
188
|
//#endregion
|
|
189
|
-
export { BaseColumnItemPlugin, BaseColumnPlugin, columnsToWidths, insertColumn, insertColumnGroup, moveMiddleColumn, resizeColumn, setColumns, toggleColumnGroup, withColumn };
|
|
190
|
-
//# sourceMappingURL=index.js.map
|
|
189
|
+
export { BaseColumnItemPlugin, BaseColumnPlugin, columnsToWidths, insertColumn, insertColumnGroup, moveMiddleColumn, resizeColumn, setColumns, toggleColumnGroup, withColumn };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import * as platejs0 from "platejs";
|
|
2
|
+
import * as platejs_react0 from "platejs/react";
|
|
3
|
+
|
|
1
4
|
//#region src/react/ColumnPlugin.d.ts
|
|
2
|
-
declare const ColumnItemPlugin:
|
|
5
|
+
declare const ColumnItemPlugin: platejs_react0.PlatePlugin<platejs0.PluginConfig<"column", {}, {}, {}, {}>>;
|
|
3
6
|
/** Enables support for columns with React-specific features. */
|
|
4
|
-
declare const ColumnPlugin:
|
|
7
|
+
declare const ColumnPlugin: platejs_react0.PlatePlugin<platejs0.PluginConfig<"column_group", {}, {}, {}, {}>>;
|
|
5
8
|
//#endregion
|
|
6
9
|
//#region src/react/hooks/useDebouncePopoverOpen.d.ts
|
|
7
|
-
declare const useDebouncePopoverOpen: () =>
|
|
10
|
+
declare const useDebouncePopoverOpen: () => boolean;
|
|
8
11
|
//#endregion
|
|
9
|
-
export { ColumnItemPlugin, ColumnPlugin, useDebouncePopoverOpen };
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
|
12
|
+
export { ColumnItemPlugin, ColumnPlugin, useDebouncePopoverOpen };
|
package/dist/react/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as BaseColumnPlugin, t as BaseColumnItemPlugin } from "../BaseColumnPlugin-
|
|
1
|
+
import { n as BaseColumnPlugin, t as BaseColumnItemPlugin } from "../BaseColumnPlugin-z1GRkW4o.js";
|
|
2
2
|
import { toPlatePlugin, useEditorSelector, useReadOnly, useSelected } from "platejs/react";
|
|
3
3
|
import { c } from "react-compiler-runtime";
|
|
4
4
|
|
|
@@ -26,5 +26,4 @@ function _temp(editor) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
//#endregion
|
|
29
|
-
export { ColumnItemPlugin, ColumnPlugin, useDebouncePopoverOpen };
|
|
30
|
-
//# sourceMappingURL=index.js.map
|
|
29
|
+
export { ColumnItemPlugin, ColumnPlugin, useDebouncePopoverOpen };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lofcz/platejs-layout",
|
|
3
|
-
"version": "52.
|
|
3
|
+
"version": "52.3.6",
|
|
4
4
|
"description": "Layout plugin for Plate",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plate",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"dist/**/*"
|
|
30
30
|
],
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@plate/scripts": "1.0.0"
|
|
32
|
+
"@plate/scripts": "1.0.0",
|
|
33
|
+
"platejs": "npm:@lofcz/platejs@52.3.6"
|
|
33
34
|
},
|
|
34
35
|
"peerDependencies": {
|
|
35
36
|
"platejs": ">=52.0.11",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseColumnPlugin-BFM6r9Zm.js","names":["OverrideEditor","TColumnElement","TColumnGroupElement","ElementApi","KEYS","PathApi","withColumn","editor","tf","normalizeNode","selectAll","type","transforms","n","path","isElement","getType","columnGroup","node","firstChild","children","length","p","unwrapNodes","at","child","some","removeNodes","withoutNormalizing","totalColumns","widths","map","col","parsed","Number","parseFloat","width","isNaN","sum","reduce","acc","w","diff","adjustment","forEach","i","columnPath","concat","setNodes","apply","selection","column","api","above","match","targetPath","isStart","start","isEnd","end","parent","select","createSlatePlugin","KEYS","withColumn","BaseColumnItemPlugin","key","column","node","isContainer","isElement","isStrictSiblings","overrideEditor","BaseColumnPlugin","columnGroup","plugins"],"sources":["../src/lib/withColumn.ts","../src/lib/BaseColumnPlugin.ts"],"sourcesContent":["import {\n type OverrideEditor,\n type TColumnElement,\n type TColumnGroupElement,\n ElementApi,\n KEYS,\n PathApi,\n} from 'platejs';\n\nexport const withColumn: OverrideEditor = ({\n editor,\n tf: { normalizeNode, selectAll },\n type,\n}) => ({\n transforms: {\n normalizeNode([n, path]) {\n // If it's a column group, ensure it has valid children\n if (\n ElementApi.isElement(n) &&\n n.type === editor.getType(KEYS.columnGroup)\n ) {\n const node = n as TColumnGroupElement;\n\n // If the first child is a p, unwrap it\n const firstChild = node.children[0];\n if (\n node.children.length === 1 &&\n firstChild.type === editor.getType(KEYS.p)\n ) {\n editor.tf.unwrapNodes({ at: PathApi.child(path, 0) });\n }\n\n // If no columns found, unwrap the column group\n if (\n !node.children.some(\n (child) => ElementApi.isElement(child) && child.type === type\n )\n ) {\n editor.tf.removeNodes({ at: path });\n\n return;\n }\n // If only one column remains, unwrap the group (optional logic)\n if (node.children.length < 2) {\n editor.tf.withoutNormalizing(() => {\n editor.tf.unwrapNodes({ at: path });\n editor.tf.unwrapNodes({ at: path });\n });\n\n return;\n }\n\n // PERF: only run when the number of columns changes\n editor.tf.withoutNormalizing(() => {\n // Add new width normalization logic\n const totalColumns = node.children.length;\n let widths = node.children.map((col) => {\n const parsed = Number.parseFloat(col.width);\n\n return Number.isNaN(parsed) ? 0 : parsed;\n });\n\n const sum = widths.reduce((acc, w) => acc + w, 0);\n\n if (sum !== 100) {\n const diff = 100 - sum;\n const adjustment = diff / totalColumns;\n\n widths = widths.map((w) => w + adjustment);\n\n // Update the columns with the new widths\n widths.forEach((w, i) => {\n const columnPath = path.concat([i]);\n editor.tf.setNodes<TColumnElement>(\n { width: `${w}%` },\n { at: columnPath }\n );\n });\n }\n });\n }\n // If it's a column, ensure it has at least one block (optional)\n if (ElementApi.isElement(n) && n.type === type) {\n const node = n as TColumnElement;\n\n // node.children.forEach((child, index) => {\n // if (TextApi.isText(child)) {\n // editor.tf.wrapNodes(\n // { children: [], type: editor.getType(KEYS.p) },\n // {\n // at: PathApi.child(path, index),\n // }\n // );\n // }\n // });\n\n if (node.children.length === 0) {\n editor.tf.removeNodes({ at: path });\n\n return;\n }\n }\n\n return normalizeNode([n, path]);\n },\n selectAll: () => {\n const apply = () => {\n const at = editor.selection;\n\n if (!at) return;\n\n const column = editor.api.above({\n match: { type },\n });\n\n if (!column) return;\n\n let targetPath = column[1];\n\n if (\n editor.api.isStart(editor.api.start(at), targetPath) &&\n editor.api.isEnd(editor.api.end(at), targetPath)\n ) {\n targetPath = PathApi.parent(targetPath);\n }\n\n if (targetPath.length === 0) return;\n\n editor.tf.select(targetPath);\n\n return true;\n };\n\n if (apply()) return true;\n\n return selectAll();\n },\n },\n});\n","import { createSlatePlugin, KEYS } from 'platejs';\n\nimport { withColumn } from './withColumn';\n\nexport const BaseColumnItemPlugin = createSlatePlugin({\n key: KEYS.column,\n node: { isContainer: true, isElement: true, isStrictSiblings: true },\n}).overrideEditor(withColumn);\n\nexport const BaseColumnPlugin = createSlatePlugin({\n key: KEYS.columnGroup,\n node: { isContainer: true, isElement: true },\n plugins: [BaseColumnItemPlugin],\n});\n"],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib/BaseColumnPlugin.ts","../src/lib/withColumn.ts","../src/lib/transforms/insertColumn.ts","../src/lib/transforms/insertColumnGroup.ts","../src/lib/transforms/moveMiddleColumn.ts","../src/lib/transforms/resizeColumn.ts","../src/lib/transforms/setColumns.ts","../src/lib/transforms/toggleColumnGroup.ts","../src/lib/utils/columnsToWidths.ts"],"sourcesContent":[],"mappings":";;;cAIa;cAKA;;;cCAA,YAAY;;;cCLZ,uBACH;;;AFDG,CAAA;;AAAb,CAAA,GEEsD,kBFFzC,EAAA,GAGgB,IAAA;;;cGChB,4BACH;;UACR;;AHNF,CAAA,GGUK;;AHVL,CAAA,EAAA,GAAa,IAAA;;;;;AAAb;AAKA;cIGa,6BAA8B,eACjC,2BACM,UAAU;;;;;iBCZV,YAAA,cACD,iEAGZ;;;cCKU,qBACH;;;;;;ENRG,EAAA,CAAA,EMeJ,ENfI;EAKA,OAAA,CAAA,EAAA,MAAA;;;;;cOFA,4BACH;;;;APCV,CAAA,GOIK,QAAQ;;EPTA,MAAA,CAAA,EAAA,MAAA,EAAA;AAKb,CAAA,EAAA,GAAa,IAAA;;;cQTA"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["InsertNodesOptions","SlateEditor","TColumnElement","KEYS","insertColumn","editor","width","options","tf","insertNodes","children","api","create","block","type","getType","column","InsertNodesOptions","SlateEditor","TColumnGroupElement","KEYS","insertColumnGroup","editor","columns","select","selectProp","options","width","tf","withoutNormalizing","insertNodes","children","Array","fill","map","api","create","block","type","getType","column","columnGroup","entry","node","at","match","concat","NodeEntry","SlateEditor","TColumnElement","TNode","NodeApi","moveMiddleColumn","editor","node","path","N","options","direction","DESCENDANT_PATH","middleChildNode","get","isEmpty","string","middleChildPathRef","api","pathRef","concat","tf","removeNodes","at","current","firstNode","descendant","firstLast","children","length","moveNodes","to","unwrapNodes","unref","TColumnGroupElement","resizeColumn","columnGroup","columnId","newWidthPercent","widths","children","map","col","width","Number","parseFloat","totalBefore","reduce","sum","w","evenWidth","length","forEach","index","findIndex","id","totalAfter","diff","siblingIndex","Math","max","round","scale","i","toFixed","columnsToWidths","columns","Array","fill","map","At","SlateEditor","TColumnElement","TColumnGroupElement","NodeApi","KEYS","columnsToWidths","setColumns","editor","at","columns","widths","tf","withoutNormalizing","length","columnGroup","api","node","children","path","currentCount","targetCount","forEach","width","i","setNodes","concat","columnsToAdd","insertPath","newColumns","Array","fill","map","_","create","block","type","getType","column","insertNodes","keepColumnIndex","keepColumnPath","keepColumnNode","get","to","columnPath","columnEntry","moveNodes","removeNodes","ReplaceNodesOptions","SlateEditor","TElement","KEYS","columnsToWidths","setColumns","toggleColumnGroup","editor","at","columns","widths","Partial","entry","api","block","columnGroupEntry","above","match","type","getType","columnGroup","node","path","columnWidths","nodes","children","Array","fill","map","_","index","create","column","width","tf","replaceNodes","select","start","concat"],"sources":["../src/lib/transforms/insertColumn.ts","../src/lib/transforms/insertColumnGroup.ts","../src/lib/transforms/moveMiddleColumn.ts","../src/lib/transforms/resizeColumn.ts","../src/lib/utils/columnsToWidths.ts","../src/lib/transforms/setColumns.ts","../src/lib/transforms/toggleColumnGroup.ts"],"sourcesContent":["import type { InsertNodesOptions, SlateEditor, TColumnElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const insertColumn = (\n editor: SlateEditor,\n { width = '33%', ...options }: { width?: string } & InsertNodesOptions = {}\n) => {\n editor.tf.insertNodes<TColumnElement>(\n {\n children: [editor.api.create.block()],\n type: editor.getType(KEYS.column) as any,\n width,\n },\n options as any\n );\n};\n","import type {\n InsertNodesOptions,\n SlateEditor,\n TColumnGroupElement,\n} from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nexport const insertColumnGroup = (\n editor: SlateEditor,\n {\n columns = 2,\n select: selectProp,\n ...options\n }: InsertNodesOptions & {\n columns?: number;\n } = {}\n) => {\n const width = 100 / columns;\n\n editor.tf.withoutNormalizing(() => {\n editor.tf.insertNodes<TColumnGroupElement>(\n {\n children: new Array(columns).fill(null).map(() => ({\n children: [editor.api.create.block()],\n type: editor.getType(KEYS.column) as any,\n width: `${width}%`,\n })),\n type: editor.getType(KEYS.columnGroup) as any,\n },\n options\n );\n\n if (selectProp) {\n const entry = editor.api.node({\n at: options.at,\n match: { type: editor.getType(KEYS.column) },\n });\n\n if (!entry) return;\n\n editor.tf.select(entry[1].concat([0]));\n }\n });\n};\n","import {\n type NodeEntry,\n type SlateEditor,\n type TColumnElement,\n type TNode,\n NodeApi,\n} from 'platejs';\n\n/**\n * Move the middle column to the left if direction is 'left', or to the right if\n * 'right'. If the middle node is empty, return false and remove it.\n */\nexport const moveMiddleColumn = <N extends TNode>(\n editor: SlateEditor,\n [node, path]: NodeEntry<N>,\n options?: {\n direction: 'left' | 'right';\n }\n) => {\n const direction = options?.direction || 'left';\n\n if (direction === 'left') {\n const DESCENDANT_PATH = [1];\n\n const middleChildNode = NodeApi.get<TColumnElement>(node, DESCENDANT_PATH);\n\n if (!middleChildNode) return false;\n\n // Check emptiness using Api.string\n const isEmpty = NodeApi.string(middleChildNode) === '';\n\n const middleChildPathRef = editor.api.pathRef(path.concat(DESCENDANT_PATH));\n\n if (isEmpty) {\n editor.tf.removeNodes({ at: middleChildPathRef.current! });\n\n return false;\n }\n\n const firstNode = NodeApi.descendant<TColumnElement>(node, [0]);\n\n if (!firstNode) return false;\n\n const firstLast = path.concat([0, firstNode.children.length]);\n\n editor.tf.moveNodes({ at: middleChildPathRef.current!, to: firstLast });\n editor.tf.unwrapNodes({ at: middleChildPathRef.current! });\n middleChildPathRef.unref();\n }\n};\n","import type { TColumnGroupElement } from 'platejs';\n\nexport function resizeColumn(\n columnGroup: TColumnGroupElement,\n columnId: string,\n newWidthPercent: number\n): TColumnGroupElement {\n // Convert widths to numbers for easier math\n const widths = columnGroup.children.map((col) =>\n col.width ? Number.parseFloat(col.width) : 0\n );\n\n const totalBefore = widths.reduce((sum, w) => sum + w, 0);\n\n // fallback if columns do not sum to 100: normalize them\n if (totalBefore === 0) {\n // distribute evenly if no widths\n const evenWidth = 100 / columnGroup.children.length;\n columnGroup.children.forEach((col) => {\n col.width = `${evenWidth}%`;\n });\n\n return columnGroup;\n }\n\n const index = columnGroup.children.findIndex((col) => col.id === columnId);\n\n if (index === -1) return columnGroup; // Column not found\n\n // Set the new width for the target column\n widths[index] = newWidthPercent;\n\n // Calculate the difference from total (ideally 100)\n let totalAfter = widths.reduce((sum, w) => sum + w, 0);\n\n // If total is off from 100%, adjust siblings\n // For simplicity, assume totalAfter < 100%. Add leftover to the next column.\n // You can make this logic more balanced if needed.\n const diff = 100 - totalAfter;\n\n if (diff !== 0) {\n // Find a sibling to adjust. For a simple strategy, pick the next column.\n const siblingIndex = (index + 1) % widths.length;\n widths[siblingIndex] = Math.max(widths[siblingIndex] + diff, 0);\n }\n\n // Normalize again if rounding introduced a small error\n totalAfter = widths.reduce((sum, w) => sum + w, 0);\n\n if (Math.round(totalAfter) !== 100) {\n // If you want a perfectly balanced approach:\n // Scale all widths so they sum exactly to 100\n const scale = 100 / totalAfter;\n\n for (let i = 0; i < widths.length; i++) {\n widths[i] = Number.parseFloat((widths[i] * scale).toFixed(2));\n }\n }\n\n // Update the column widths\n columnGroup.children.forEach((col, i) => {\n col.width = `${widths[i]}%`;\n });\n\n return columnGroup;\n}\n","export const columnsToWidths = ({ columns = 2 }: { columns?: number } = {}) =>\n new Array(columns).fill(null).map(() => `${100 / columns}%`);\n","import {\n type At,\n type SlateEditor,\n type TColumnElement,\n type TColumnGroupElement,\n NodeApi,\n} from 'platejs';\nimport { KEYS } from 'platejs';\n\nimport { columnsToWidths } from '../utils/columnsToWidths';\n\nexport const setColumns = (\n editor: SlateEditor,\n {\n at,\n columns,\n widths,\n }: {\n /** Column group path */\n at?: At;\n columns?: number;\n widths?: string[];\n }\n) => {\n editor.tf.withoutNormalizing(() => {\n if (!at) return;\n\n widths = widths ?? columnsToWidths({ columns });\n\n // If widths is empty, do nothing.\n if (widths.length === 0) {\n return;\n }\n\n const columnGroup = editor.api.node<TColumnGroupElement>(at);\n\n if (!columnGroup) return;\n\n const [{ children }, path] = columnGroup;\n\n const currentCount = children.length;\n const targetCount = widths.length;\n\n if (currentCount === targetCount) {\n // Same number of columns: just set widths directly\n widths.forEach((width, i) => {\n editor.tf.setNodes<TColumnElement>({ width }, { at: path.concat([i]) });\n });\n\n return;\n }\n if (targetCount > currentCount) {\n // Need more columns than we have: insert extra columns at the end\n const columnsToAdd = targetCount - currentCount;\n const insertPath = path.concat([currentCount]);\n\n // Insert the extra columns\n const newColumns = new Array(columnsToAdd).fill(null).map((_, i) => ({\n children: [editor.api.create.block()],\n type: editor.getType(KEYS.column),\n width: widths![currentCount + i] || `${100 / targetCount}%`,\n }));\n\n editor.tf.insertNodes(newColumns, { at: insertPath });\n\n // Just ensure final widths match exactly\n widths.forEach((width, i) => {\n editor.tf.setNodes<TColumnElement>({ width }, { at: path.concat([i]) });\n });\n\n return;\n }\n if (targetCount < currentCount) {\n // Need fewer columns than we have: merge extra columns into the last kept column\n const keepColumnIndex = targetCount - 1;\n const keepColumnPath = path.concat([keepColumnIndex]);\n const keepColumnNode = NodeApi.get<TColumnElement>(\n editor,\n keepColumnPath\n );\n\n if (!keepColumnNode) return;\n\n const to = keepColumnPath.concat([keepColumnNode.children.length]);\n\n // Move content from columns beyond keepIndex into keepIndex column\n for (let i = currentCount - 1; i > keepColumnIndex; i--) {\n const columnPath = path.concat([i]);\n const columnEntry = editor.api.node<TColumnElement>(columnPath);\n\n if (!columnEntry) continue;\n\n editor.tf.moveNodes({\n at: columnEntry[1],\n children: true,\n to,\n });\n }\n\n // Remove the now-empty extra columns\n // Removing from the end to avoid path shifts\n for (let i = currentCount - 1; i > keepColumnIndex; i--) {\n editor.tf.removeNodes({ at: path.concat([i]) });\n }\n\n // Set the final widths\n widths.forEach((width, i) => {\n editor.tf.setNodes<TColumnElement>({ width }, { at: path.concat([i]) });\n });\n }\n });\n};\n","import type { ReplaceNodesOptions, SlateEditor, TElement } from 'platejs';\n\nimport { KEYS } from 'platejs';\n\nimport { columnsToWidths } from '../utils/columnsToWidths';\nimport { setColumns } from './setColumns';\n\nexport const toggleColumnGroup = (\n editor: SlateEditor,\n {\n at,\n columns = 2,\n widths,\n }: Partial<ReplaceNodesOptions> & {\n columns?: number;\n widths?: string[];\n } = {}\n) => {\n const entry = editor.api.block({ at });\n const columnGroupEntry = editor.api.block({\n above: true,\n at,\n match: { type: editor.getType(KEYS.columnGroup) },\n });\n\n if (!entry) return;\n\n const [node, path] = entry;\n\n // Check if the node is already a column_group\n if (columnGroupEntry) {\n // Node is already a column_group, just update the columns using setColumns\n setColumns(editor, { at: columnGroupEntry[1], columns, widths });\n } else {\n // Node is not a column_group, wrap it in a column_group\n const columnWidths = widths || columnsToWidths({ columns });\n\n const nodes = {\n children: new Array(columns).fill(null).map((_, index) => ({\n children: [index === 0 ? node : editor.api.create.block()],\n type: editor.getType(KEYS.column) as any,\n width: columnWidths[index],\n })),\n type: editor.getType(KEYS.columnGroup) as any,\n } as TElement;\n\n editor.tf.replaceNodes(nodes, {\n at: path,\n });\n\n editor.tf.select(editor.api.start(path.concat([0]))!);\n }\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/ColumnPlugin.tsx","../../src/react/hooks/useDebouncePopoverOpen.ts"],"sourcesContent":[],"mappings":";cAIa;AAAb;AAGa,cAAA,YAEX,EAAA,GAAA;;;cCPW"}
|
package/dist/react/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["toPlatePlugin","BaseColumnItemPlugin","BaseColumnPlugin","ColumnItemPlugin","ColumnPlugin","plugins","useEditorSelector","useReadOnly","useSelected","useDebouncePopoverOpen","$","_c","readOnly","selected","t0","Symbol","for","selectionCollapsed","_temp","editor","api","isCollapsed"],"sources":["../../src/react/ColumnPlugin.tsx","../../src/react/hooks/useDebouncePopoverOpen.ts"],"sourcesContent":["import { toPlatePlugin } from 'platejs/react';\n\nimport { BaseColumnItemPlugin, BaseColumnPlugin } from '../lib';\n\nexport const ColumnItemPlugin = toPlatePlugin(BaseColumnItemPlugin);\n\n/** Enables support for columns with React-specific features. */\nexport const ColumnPlugin = toPlatePlugin(BaseColumnPlugin, {\n plugins: [ColumnItemPlugin],\n});\n","import { useEditorSelector, useReadOnly, useSelected } from 'platejs/react';\n\nexport const useDebouncePopoverOpen = () => {\n const readOnly = useReadOnly();\n const selected = useSelected();\n\n const selectionCollapsed = useEditorSelector(\n (editor) => editor.api.isCollapsed(),\n []\n );\n\n // TODO:should add debounce\n return !readOnly && selected && selectionCollapsed;\n};\n"],"mappings":";;;;;AAIA,MAAaG,mBAAmBH,cAAcC,qBAAqB;;AAGnE,MAAaG,eAAeJ,cAAcE,kBAAkB,EAC1DG,SAAS,CAACF,iBAAgB,EAC3B,CAAC;;;;ACPF,MAAaM,+BAAyB;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACpC,MAAAC,WAAiBL,aAAa;CAC9B,MAAAM,WAAiBL,aAAa;CAAC,IAAAM;AAAA,KAAAJ,EAAA,OAAAK,OAAAC,IAAA,4BAAA,EAAA;AAI7BF,OAAA,EAAE;AAAAJ,IAAA,KAAAI;OAAAA,MAAAJ,EAAA;CAFJ,MAAAO,qBAA2BX,kBACzBY,OACAJ,GACD;AAAC,QAGK,CAACF,YAADC,YAAAI;;AAV6B,SAAAC,MAAAC,QAAA;AAAA,QAKtBA,OAAMC,IAAIC,aAAc"}
|