{"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"]}