@udecode/plate-indent
Version:
Indent plugin for Plate
1 lines • 9.03 kB
Source Map (JSON)
{"version":3,"sources":["../../src/react/IndentPlugin.tsx","../../src/lib/BaseIndentPlugin.ts","../../src/lib/withIndent.ts","../../src/lib/transforms/setIndent.ts","../../src/lib/transforms/indent.ts","../../src/lib/transforms/outdent.ts","../../src/react/hooks/useIndentButton.ts","../../src/react/hooks/useOutdentButton.ts"],"sourcesContent":["import { toPlatePlugin } from '@udecode/plate/react';\n\nimport { BaseIndentPlugin } from '../lib/BaseIndentPlugin';\n\nexport const IndentPlugin = toPlatePlugin(BaseIndentPlugin);\n","import { type PluginConfig, createTSlatePlugin, KEYS } from '@udecode/plate';\n\nimport { withIndent } from './withIndent';\n\nexport type IndentConfig = PluginConfig<\n 'indent',\n {\n /** Maximum number of indentation. */\n indentMax?: number;\n /**\n * Indentation offset used in `(offset * element.indent) + unit`.\n *\n * @default 40\n */\n offset?: number;\n /**\n * Indentation unit used in `(offset * element.indent) + unit`.\n *\n * @default 'px'\n */\n unit?: string;\n }\n>;\n\nexport const BaseIndentPlugin = createTSlatePlugin<IndentConfig>({\n key: KEYS.indent,\n inject: {\n isBlock: true,\n nodeProps: {\n nodeKey: 'indent',\n styleKey: 'marginLeft',\n transformNodeValue: ({ getOptions, nodeValue }) => {\n const { offset, unit } = getOptions();\n\n return nodeValue * offset! + unit!;\n },\n },\n targetPlugins: [KEYS.p],\n },\n options: {\n offset: 24,\n unit: 'px',\n },\n}).overrideEditor(withIndent);\n","import type { OverrideEditor, TIndentElement } from '@udecode/plate';\n\nimport { getInjectMatch } from '@udecode/plate';\n\nimport type { IndentConfig } from './BaseIndentPlugin';\n\nimport { indent, outdent } from './transforms/index';\n\n/**\n * - `node.indent` can not exceed `indentMax`\n * - `node.indent` is unset if `node.type` is not in `types`\n */\nexport const withIndent: OverrideEditor<IndentConfig> = ({\n editor,\n getOptions,\n plugin,\n tf: { normalizeNode, tab },\n}) => {\n return {\n transforms: {\n normalizeNode([node, path]) {\n const { indentMax } = getOptions();\n\n const element = node as TIndentElement;\n const { type } = element;\n\n const match = getInjectMatch(editor, plugin);\n\n if (type) {\n if (match(element, path)) {\n if (indentMax && element.indent && element.indent > indentMax) {\n editor.tf.setNodes({ indent: indentMax }, { at: path });\n\n return;\n }\n } else if (element.indent) {\n editor.tf.unsetNodes('indent', { at: path });\n\n return;\n }\n }\n\n return normalizeNode([node, path]);\n },\n tab: (options) => {\n const apply = () => {\n const match = getInjectMatch(editor, plugin);\n const entry = editor.api.block();\n\n if (!entry) return;\n\n const [element, path] = entry;\n\n if (!match(element, path)) return;\n\n if (options.reverse) {\n outdent(editor);\n } else {\n indent(editor);\n }\n\n return true;\n };\n\n if (apply()) return true;\n\n return tab(options);\n },\n },\n };\n};\n","import type {\n AnyObject,\n EditorNodesOptions,\n SlateEditor,\n} from '@udecode/plate';\n\nimport { BaseIndentPlugin } from '../BaseIndentPlugin';\n\nexport interface SetIndentOptions {\n /** GetNodeEntries options */\n getNodesOptions?: EditorNodesOptions;\n\n /**\n * 1 to indent -1 to outdent\n *\n * @default 1\n */\n offset?: number;\n\n /** Set other props than the indent one. These will be unset if indent = 0. */\n setNodesProps?: ({ indent }: { indent: number }) => AnyObject;\n\n /** Nodes props to unset when indent = 0. */\n unsetNodesProps?: string[];\n}\n\n/** Add offset to the indentation of the selected blocks. */\nexport const setIndent = (\n editor: SlateEditor,\n {\n getNodesOptions,\n offset = 1,\n setNodesProps,\n unsetNodesProps = [],\n }: SetIndentOptions\n) => {\n const { nodeKey } = editor.getInjectProps(BaseIndentPlugin);\n\n const _nodes = editor.api.nodes({\n block: true,\n mode: 'lowest',\n ...getNodesOptions,\n });\n const nodes = Array.from(_nodes);\n\n editor.tf.withoutNormalizing(() => {\n nodes.forEach(([node, path]) => {\n const blockIndent = (node[nodeKey!] as number) ?? 0;\n const newIndent = blockIndent + offset;\n\n const props = setNodesProps?.({ indent: newIndent }) ?? {};\n\n if (newIndent <= 0) {\n editor.tf.unsetNodes([nodeKey!, ...unsetNodesProps], {\n at: path,\n });\n } else {\n editor.tf.setNodes({ [nodeKey!]: newIndent, ...props }, { at: path });\n }\n });\n });\n};\n","import type { SlateEditor } from '@udecode/plate';\n\nimport { type SetIndentOptions, setIndent } from './setIndent';\n\n/** Increase the indentation of the selected blocks. */\nexport const indent = (editor: SlateEditor, options?: SetIndentOptions) => {\n setIndent(editor, { offset: 1, ...options });\n};\n","import type { SlateEditor } from '@udecode/plate';\n\nimport { type SetIndentOptions, setIndent } from './setIndent';\n\n/** Decrease the indentation of the selected blocks. */\nexport const outdent = (editor: SlateEditor, options?: SetIndentOptions) => {\n setIndent(editor, { offset: -1, ...options });\n};\n","import { useEditorRef } from '@udecode/plate/react';\n\nimport { indent } from '../../index';\n\nexport const useIndentButton = () => {\n const editor = useEditorRef();\n\n return {\n props: {\n onClick: () => {\n indent(editor);\n },\n onMouseDown: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n },\n },\n };\n};\n","import { useEditorRef } from '@udecode/plate/react';\n\nimport { outdent } from '../../index';\n\nexport const useOutdentButton = () => {\n const editor = useEditorRef();\n\n return {\n props: {\n onClick: () => {\n outdent(editor);\n },\n onMouseDown: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n },\n },\n };\n};\n"],"mappings":"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","names":["useEditorRef","useEditorRef"]}