diff --git a/packages/extension-hardbreak/index.ts b/packages/extension-hardbreak/index.ts new file mode 100644 index 00000000..82cfe3d1 --- /dev/null +++ b/packages/extension-hardbreak/index.ts @@ -0,0 +1,38 @@ +import { Node } from '@tiptap/core' +import { chainCommands, exitCode } from 'prosemirror-commands' + +declare module '@tiptap/core/src/Editor' { + interface Editor { + hardbreak(): Editor, + } +} + +export default new Node() + .name('hardbreak') + .schema(() => ({ + inline: true, + group: 'inline', + selectable: false, + parseDOM: [ + { tag: 'br' }, + ], + toDOM: () => ['br'], + })) + .commands(({ editor, type }) => ({ + hardbreak: next => () => { + const { state, view } = editor + const { dispatch } = view + + chainCommands(exitCode, () => { + dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView()) + return true + })(state, dispatch, view) + + next() + }, + })) + .keys(({ editor }) => ({ + 'Mod-Enter': () => editor.hardbreak(), + 'Shift-Enter': () => editor.hardbreak(), + })) + .create() diff --git a/packages/extension-hardbreak/package.json b/packages/extension-hardbreak/package.json new file mode 100644 index 00000000..59de75b9 --- /dev/null +++ b/packages/extension-hardbreak/package.json @@ -0,0 +1,18 @@ +{ + "name": "@tiptap/extension-hardbreak", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-extension-hardbreak.js", + "umd:main": "dist/tiptap-extension-hardbreak.umd.js", + "module": "dist/tiptap-extension-hardbreak.mjs", + "unpkg": "dist/tiptap-extension-hardbreak.js", + "jsdelivr": "dist/tiptap-extension-hardbreak.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x", + "prosemirror-commands": "^1.1.3" + } +}