{"version":3,"file":"indentation.mjs","sources":["../../../src/slate-plugins/indentation.ts"],"sourcesContent":["import { isKeyHotkey } from 'is-hotkey';\nimport * as React from 'react';\nimport { RangeJSON, Range as SlateRange } from 'slate';\nimport Plain from 'slate-plain-serializer';\nimport { Editor, Plugin } from 'slate-react';\n\nconst isIndentLeftHotkey = isKeyHotkey('mod+[');\nconst isShiftTabHotkey = isKeyHotkey('shift+tab');\nconst isIndentRightHotkey = isKeyHotkey('mod+]');\n\nconst SLATE_TAB = '  ';\n\nconst handleTabKey = (event: React.KeyboardEvent<Element>, editor: Editor, next: Function): void => {\n  const {\n    startBlock,\n    endBlock,\n    selection: {\n      start: { offset: startOffset, key: startKey },\n      end: { offset: endOffset, key: endKey },\n    },\n  } = editor.value;\n  if (Plain.serialize(editor.value) === '') {\n    return;\n  }\n  event.preventDefault();\n  const first = startBlock.getFirstText();\n\n  const startBlockIsSelected =\n    first && startOffset === 0 && startKey === first.key && endOffset === first.text.length && endKey === first.key;\n\n  if (startBlockIsSelected || !startBlock.equals(endBlock)) {\n    handleIndent(editor, 'right');\n  } else {\n    editor.insertText(SLATE_TAB);\n  }\n};\n\nconst handleIndent = (editor: Editor, indentDirection: 'left' | 'right') => {\n  const curSelection = editor.value.selection;\n  const selectedBlocks = editor.value.document.getLeafBlocksAtRange(curSelection).toArray();\n\n  if (indentDirection === 'left') {\n    for (const block of selectedBlocks) {\n      const blockWhitespace = block.text.length - block.text.trimLeft().length;\n\n      const textKey = block.getFirstText()!.key;\n\n      const rangeProperties: RangeJSON = {\n        anchor: {\n          key: textKey,\n          offset: blockWhitespace,\n          path: [],\n        },\n        focus: {\n          key: textKey,\n          offset: blockWhitespace,\n          path: [],\n        },\n      };\n\n      editor.deleteBackwardAtRange(SlateRange.create(rangeProperties), Math.min(SLATE_TAB.length, blockWhitespace));\n    }\n  } else {\n    const { startText } = editor.value;\n    const textBeforeCaret = startText.text.slice(0, curSelection.start.offset);\n    const isWhiteSpace = /^\\s*$/.test(textBeforeCaret);\n\n    for (const block of selectedBlocks) {\n      editor.insertTextByKey(block.getFirstText()!.key, 0, SLATE_TAB);\n    }\n\n    if (isWhiteSpace) {\n      editor.moveStartBackward(SLATE_TAB.length);\n    }\n  }\n};\n\n// Clears the rest of the line after the caret\nexport function IndentationPlugin(): Plugin {\n  return {\n    onKeyDown(event, editor, next) {\n      if (isIndentLeftHotkey(event) || isShiftTabHotkey(event)) {\n        event.preventDefault();\n        handleIndent(editor, 'left');\n      } else if (isIndentRightHotkey(event)) {\n        event.preventDefault();\n        handleIndent(editor, 'right');\n      } else if (event.key === 'Tab') {\n        handleTabKey(event, editor, next);\n      } else {\n        return next();\n      }\n\n      return true;\n    },\n  };\n}\n"],"names":["SlateRange"],"mappings":"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"}