UNPKG

alinea

Version:

[![npm](https://img.shields.io/npm/v/alinea.svg)](https://npmjs.org/package/alinea) [![install size](https://packagephobia.com/badge?p=alinea)](https://packagephobia.com/result?p=alinea)

1,349 lines (1,327 loc) 36.8 kB
import { FloatingMenu } from "../../chunks/chunk-I5C4WAC4.js"; import { Decoration, DecorationSet, Extension, Fragment, Mark, Node, NodeSelection, Plugin, Selection, Slice, TextSelection, callOrReturn, dropPoint, getExtensionField, getMarkAttributes, isMacOS, keydownHandler, markInputRule, markPasteRule, mergeAttributes, nodeInputRule, textblockTypeInputRule, wrappingInputRule } from "../../chunks/chunk-MDIOFKJQ.js"; import "../../chunks/chunk-U5RRZUYZ.js"; // node_modules/@tiptap/extension-blockquote/dist/index.js var inputRegex = /^\s*>\s$/; var Blockquote = Node.create({ name: "blockquote", addOptions() { return { HTMLAttributes: {} }; }, content: "block+", group: "block", defining: true, parseHTML() { return [ { tag: "blockquote" } ]; }, renderHTML({ HTMLAttributes }) { return ["blockquote", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setBlockquote: () => ({ commands }) => { return commands.wrapIn(this.name); }, toggleBlockquote: () => ({ commands }) => { return commands.toggleWrap(this.name); }, unsetBlockquote: () => ({ commands }) => { return commands.lift(this.name); } }; }, addKeyboardShortcuts() { return { "Mod-Shift-b": () => this.editor.commands.toggleBlockquote() }; }, addInputRules() { return [ wrappingInputRule({ find: inputRegex, type: this.type }) ]; } }); // node_modules/@tiptap/extension-bold/dist/index.js var starInputRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))$/; var starPasteRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))/g; var underscoreInputRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))$/; var underscorePasteRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))/g; var Bold = Mark.create({ name: "bold", addOptions() { return { HTMLAttributes: {} }; }, parseHTML() { return [ { tag: "strong" }, { tag: "b", getAttrs: (node) => node.style.fontWeight !== "normal" && null }, { style: "font-weight", getAttrs: (value) => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null } ]; }, renderHTML({ HTMLAttributes }) { return ["strong", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setBold: () => ({ commands }) => { return commands.setMark(this.name); }, toggleBold: () => ({ commands }) => { return commands.toggleMark(this.name); }, unsetBold: () => ({ commands }) => { return commands.unsetMark(this.name); } }; }, addKeyboardShortcuts() { return { "Mod-b": () => this.editor.commands.toggleBold(), "Mod-B": () => this.editor.commands.toggleBold() }; }, addInputRules() { return [ markInputRule({ find: starInputRegex, type: this.type }), markInputRule({ find: underscoreInputRegex, type: this.type }) ]; }, addPasteRules() { return [ markPasteRule({ find: starPasteRegex, type: this.type }), markPasteRule({ find: underscorePasteRegex, type: this.type }) ]; } }); // node_modules/@tiptap/extension-bullet-list/dist/index.js var ListItem = Node.create({ name: "listItem", addOptions() { return { HTMLAttributes: {}, bulletListTypeName: "bulletList", orderedListTypeName: "orderedList" }; }, content: "paragraph block*", defining: true, parseHTML() { return [ { tag: "li" } ]; }, renderHTML({ HTMLAttributes }) { return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addKeyboardShortcuts() { return { Enter: () => this.editor.commands.splitListItem(this.name), Tab: () => this.editor.commands.sinkListItem(this.name), "Shift-Tab": () => this.editor.commands.liftListItem(this.name) }; } }); var TextStyle = Mark.create({ name: "textStyle", addOptions() { return { HTMLAttributes: {} }; }, parseHTML() { return [ { tag: "span", getAttrs: (element) => { const hasStyles = element.hasAttribute("style"); if (!hasStyles) { return false; } return {}; } } ]; }, renderHTML({ HTMLAttributes }) { return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { removeEmptyTextStyle: () => ({ state, commands }) => { const attributes = getMarkAttributes(state, this.type); const hasStyles = Object.entries(attributes).some(([, value]) => !!value); if (hasStyles) { return true; } return commands.unsetMark(this.name); } }; } }); var inputRegex2 = /^\s*([-+*])\s$/; var BulletList = Node.create({ name: "bulletList", addOptions() { return { itemTypeName: "listItem", HTMLAttributes: {}, keepMarks: false, keepAttributes: false }; }, group: "block list", content() { return `${this.options.itemTypeName}+`; }, parseHTML() { return [ { tag: "ul" } ]; }, renderHTML({ HTMLAttributes }) { return ["ul", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { toggleBulletList: () => ({ commands, chain }) => { if (this.options.keepAttributes) { return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run(); } return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); } }; }, addKeyboardShortcuts() { return { "Mod-Shift-8": () => this.editor.commands.toggleBulletList() }; }, addInputRules() { let inputRule = wrappingInputRule({ find: inputRegex2, type: this.type }); if (this.options.keepMarks || this.options.keepAttributes) { inputRule = wrappingInputRule({ find: inputRegex2, type: this.type, keepMarks: this.options.keepMarks, keepAttributes: this.options.keepAttributes, getAttributes: () => { return this.editor.getAttributes(TextStyle.name); }, editor: this.editor }); } return [ inputRule ]; } }); // node_modules/@tiptap/extension-document/dist/index.js var Document = Node.create({ name: "doc", topNode: true, content: "block+" }); // node_modules/prosemirror-dropcursor/dist/index.js function dropCursor(options = {}) { return new Plugin({ view(editorView) { return new DropCursorView(editorView, options); } }); } var DropCursorView = class { constructor(editorView, options) { var _a; this.editorView = editorView; this.cursorPos = null; this.element = null; this.timeout = -1; this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1; this.color = options.color === false ? void 0 : options.color || "black"; this.class = options.class; this.handlers = ["dragover", "dragend", "drop", "dragleave"].map((name) => { let handler = (e) => { this[name](e); }; editorView.dom.addEventListener(name, handler); return { name, handler }; }); } destroy() { this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler)); } update(editorView, prevState) { if (this.cursorPos != null && prevState.doc != editorView.state.doc) { if (this.cursorPos > editorView.state.doc.content.size) this.setCursor(null); else this.updateOverlay(); } } setCursor(pos) { if (pos == this.cursorPos) return; this.cursorPos = pos; if (pos == null) { this.element.parentNode.removeChild(this.element); this.element = null; } else { this.updateOverlay(); } } updateOverlay() { let $pos = this.editorView.state.doc.resolve(this.cursorPos); let isBlock = !$pos.parent.inlineContent, rect; if (isBlock) { let before = $pos.nodeBefore, after = $pos.nodeAfter; if (before || after) { let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0)); if (node) { let nodeRect = node.getBoundingClientRect(); let top = before ? nodeRect.bottom : nodeRect.top; if (before && after) top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; rect = { left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2 }; } } } if (!rect) { let coords = this.editorView.coordsAtPos(this.cursorPos); rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom }; } let parent = this.editorView.dom.offsetParent; if (!this.element) { this.element = parent.appendChild(document.createElement("div")); if (this.class) this.element.className = this.class; this.element.style.cssText = "position: absolute; z-index: 50; pointer-events: none;"; if (this.color) { this.element.style.backgroundColor = this.color; } } this.element.classList.toggle("prosemirror-dropcursor-block", isBlock); this.element.classList.toggle("prosemirror-dropcursor-inline", !isBlock); let parentLeft, parentTop; if (!parent || parent == document.body && getComputedStyle(parent).position == "static") { parentLeft = -pageXOffset; parentTop = -pageYOffset; } else { let rect2 = parent.getBoundingClientRect(); parentLeft = rect2.left - parent.scrollLeft; parentTop = rect2.top - parent.scrollTop; } this.element.style.left = rect.left - parentLeft + "px"; this.element.style.top = rect.top - parentTop + "px"; this.element.style.width = rect.right - rect.left + "px"; this.element.style.height = rect.bottom - rect.top + "px"; } scheduleRemoval(timeout) { clearTimeout(this.timeout); this.timeout = setTimeout(() => this.setCursor(null), timeout); } dragover(event) { if (!this.editorView.editable) return; let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY }); let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside); let disableDropCursor = node && node.type.spec.disableDropCursor; let disabled = typeof disableDropCursor == "function" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor; if (pos && !disabled) { let target = pos.pos; if (this.editorView.dragging && this.editorView.dragging.slice) { let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice); if (point != null) target = point; } this.setCursor(target); this.scheduleRemoval(5e3); } } dragend() { this.scheduleRemoval(20); } drop() { this.scheduleRemoval(20); } dragleave(event) { if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget)) this.setCursor(null); } }; // node_modules/@tiptap/extension-dropcursor/dist/index.js var Dropcursor = Extension.create({ name: "dropCursor", addOptions() { return { color: "currentColor", width: 1, class: void 0 }; }, addProseMirrorPlugins() { return [ dropCursor(this.options) ]; } }); // node_modules/prosemirror-gapcursor/dist/index.js var GapCursor = class _GapCursor extends Selection { /** Create a gap cursor. */ constructor($pos) { super($pos, $pos); } map(doc, mapping) { let $pos = doc.resolve(mapping.map(this.head)); return _GapCursor.valid($pos) ? new _GapCursor($pos) : Selection.near($pos); } content() { return Slice.empty; } eq(other) { return other instanceof _GapCursor && other.head == this.head; } toJSON() { return { type: "gapcursor", pos: this.head }; } /** @internal */ static fromJSON(doc, json) { if (typeof json.pos != "number") throw new RangeError("Invalid input for GapCursor.fromJSON"); return new _GapCursor(doc.resolve(json.pos)); } /** @internal */ getBookmark() { return new GapBookmark(this.anchor); } /** @internal */ static valid($pos) { let parent = $pos.parent; if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) return false; let override = parent.type.spec.allowGapCursor; if (override != null) return override; let deflt = parent.contentMatchAt($pos.index()).defaultType; return deflt && deflt.isTextblock; } /** @internal */ static findGapCursorFrom($pos, dir, mustMove = false) { search: for (; ; ) { if (!mustMove && _GapCursor.valid($pos)) return $pos; let pos = $pos.pos, next = null; for (let d = $pos.depth; ; d--) { let parent = $pos.node(d); if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) { next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1); break; } else if (d == 0) { return null; } pos += dir; let $cur = $pos.doc.resolve(pos); if (_GapCursor.valid($cur)) return $cur; } for (; ; ) { let inside = dir > 0 ? next.firstChild : next.lastChild; if (!inside) { if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) { $pos = $pos.doc.resolve(pos + next.nodeSize * dir); mustMove = false; continue search; } break; } next = inside; pos += dir; let $cur = $pos.doc.resolve(pos); if (_GapCursor.valid($cur)) return $cur; } return null; } } }; GapCursor.prototype.visible = false; GapCursor.findFrom = GapCursor.findGapCursorFrom; Selection.jsonID("gapcursor", GapCursor); var GapBookmark = class _GapBookmark { constructor(pos) { this.pos = pos; } map(mapping) { return new _GapBookmark(mapping.map(this.pos)); } resolve(doc) { let $pos = doc.resolve(this.pos); return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos); } }; function closedBefore($pos) { for (let d = $pos.depth; d >= 0; d--) { let index = $pos.index(d), parent = $pos.node(d); if (index == 0) { if (parent.type.spec.isolating) return true; continue; } for (let before = parent.child(index - 1); ; before = before.lastChild) { if (before.childCount == 0 && !before.inlineContent || before.isAtom || before.type.spec.isolating) return true; if (before.inlineContent) return false; } } return true; } function closedAfter($pos) { for (let d = $pos.depth; d >= 0; d--) { let index = $pos.indexAfter(d), parent = $pos.node(d); if (index == parent.childCount) { if (parent.type.spec.isolating) return true; continue; } for (let after = parent.child(index); ; after = after.firstChild) { if (after.childCount == 0 && !after.inlineContent || after.isAtom || after.type.spec.isolating) return true; if (after.inlineContent) return false; } } return true; } function gapCursor() { return new Plugin({ props: { decorations: drawGapCursor, createSelectionBetween(_view, $anchor, $head) { return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null; }, handleClick, handleKeyDown, handleDOMEvents: { beforeinput } } }); } var handleKeyDown = keydownHandler({ "ArrowLeft": arrow("horiz", -1), "ArrowRight": arrow("horiz", 1), "ArrowUp": arrow("vert", -1), "ArrowDown": arrow("vert", 1) }); function arrow(axis, dir) { const dirStr = axis == "vert" ? dir > 0 ? "down" : "up" : dir > 0 ? "right" : "left"; return function(state, dispatch, view) { let sel = state.selection; let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty; if (sel instanceof TextSelection) { if (!view.endOfTextblock(dirStr) || $start.depth == 0) return false; mustMove = false; $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before()); } let $found = GapCursor.findGapCursorFrom($start, dir, mustMove); if (!$found) return false; if (dispatch) dispatch(state.tr.setSelection(new GapCursor($found))); return true; }; } function handleClick(view, pos, event) { if (!view || !view.editable) return false; let $pos = view.state.doc.resolve(pos); if (!GapCursor.valid($pos)) return false; let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY }); if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside))) return false; view.dispatch(view.state.tr.setSelection(new GapCursor($pos))); return true; } function beforeinput(view, event) { if (event.inputType != "insertCompositionText" || !(view.state.selection instanceof GapCursor)) return false; let { $from } = view.state.selection; let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text); if (!insert) return false; let frag = Fragment.empty; for (let i = insert.length - 1; i >= 0; i--) frag = Fragment.from(insert[i].createAndFill(null, frag)); let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0)); tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1))); view.dispatch(tr); return false; } function drawGapCursor(state) { if (!(state.selection instanceof GapCursor)) return null; let node = document.createElement("div"); node.className = "ProseMirror-gapcursor"; return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: "gapcursor" })]); } // node_modules/@tiptap/extension-gapcursor/dist/index.js var Gapcursor = Extension.create({ name: "gapCursor", addProseMirrorPlugins() { return [ gapCursor() ]; }, extendNodeSchema(extension) { var _a; const context = { name: extension.name, options: extension.options, storage: extension.storage }; return { allowGapCursor: (_a = callOrReturn(getExtensionField(extension, "allowGapCursor", context))) !== null && _a !== void 0 ? _a : null }; } }); // node_modules/@tiptap/extension-hard-break/dist/index.js var HardBreak = Node.create({ name: "hardBreak", addOptions() { return { keepMarks: true, HTMLAttributes: {} }; }, inline: true, group: "inline", selectable: false, parseHTML() { return [ { tag: "br" } ]; }, renderHTML({ HTMLAttributes }) { return ["br", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; }, renderText() { return "\n"; }, addCommands() { return { setHardBreak: () => ({ commands, chain, state, editor }) => { return commands.first([ () => commands.exitCode(), () => commands.command(() => { const { selection, storedMarks } = state; if (selection.$from.parent.type.spec.isolating) { return false; } const { keepMarks } = this.options; const { splittableMarks } = editor.extensionManager; const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); return chain().insertContent({ type: this.name }).command(({ tr, dispatch }) => { if (dispatch && marks && keepMarks) { const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); tr.ensureMarks(filteredMarks); } return true; }).run(); }) ]); } }; }, addKeyboardShortcuts() { return { "Mod-Enter": () => this.editor.commands.setHardBreak(), "Shift-Enter": () => this.editor.commands.setHardBreak() }; } }); // node_modules/@tiptap/extension-heading/dist/index.js var Heading = Node.create({ name: "heading", addOptions() { return { levels: [1, 2, 3, 4, 5, 6], HTMLAttributes: {} }; }, content: "inline*", group: "block", defining: true, addAttributes() { return { level: { default: 1, rendered: false } }; }, parseHTML() { return this.options.levels.map((level) => ({ tag: `h${level}`, attrs: { level } })); }, renderHTML({ node, HTMLAttributes }) { const hasLevel = this.options.levels.includes(node.attrs.level); const level = hasLevel ? node.attrs.level : this.options.levels[0]; return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setHeading: (attributes) => ({ commands }) => { if (!this.options.levels.includes(attributes.level)) { return false; } return commands.setNode(this.name, attributes); }, toggleHeading: (attributes) => ({ commands }) => { if (!this.options.levels.includes(attributes.level)) { return false; } return commands.toggleNode(this.name, "paragraph", attributes); } }; }, addKeyboardShortcuts() { return this.options.levels.reduce((items, level) => ({ ...items, ...{ [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }) } }), {}); }, addInputRules() { return this.options.levels.map((level) => { return textblockTypeInputRule({ find: new RegExp(`^(#{1,${level}})\\s$`), type: this.type, getAttributes: { level } }); }); } }); // node_modules/@tiptap/extension-horizontal-rule/dist/index.js var HorizontalRule = Node.create({ name: "horizontalRule", addOptions() { return { HTMLAttributes: {} }; }, group: "block", parseHTML() { return [{ tag: "hr" }]; }, renderHTML({ HTMLAttributes }) { return ["hr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; }, addCommands() { return { setHorizontalRule: () => ({ chain, state }) => { const { $to: $originTo } = state.selection; const currentChain = chain(); if ($originTo.parentOffset === 0) { currentChain.insertContentAt(Math.max($originTo.pos - 2, 0), { type: this.name }); } else { currentChain.insertContent({ type: this.name }); } return currentChain.command(({ tr, dispatch }) => { var _a; if (dispatch) { const { $to } = tr.selection; const posAfter = $to.end(); if ($to.nodeAfter) { if ($to.nodeAfter.isTextblock) { tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1)); } else if ($to.nodeAfter.isBlock) { tr.setSelection(NodeSelection.create(tr.doc, $to.pos)); } else { tr.setSelection(TextSelection.create(tr.doc, $to.pos)); } } else { const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create(); if (node) { tr.insert(posAfter, node); tr.setSelection(TextSelection.create(tr.doc, posAfter + 1)); } } tr.scrollIntoView(); } return true; }).run(); } }; }, addInputRules() { return [ nodeInputRule({ find: /^(?:---|—-|___\s|\*\*\*\s)$/, type: this.type }) ]; } }); // node_modules/@tiptap/extension-italic/dist/index.js var starInputRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))$/; var starPasteRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))/g; var underscoreInputRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))$/; var underscorePasteRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))/g; var Italic = Mark.create({ name: "italic", addOptions() { return { HTMLAttributes: {} }; }, parseHTML() { return [ { tag: "em" }, { tag: "i", getAttrs: (node) => node.style.fontStyle !== "normal" && null }, { style: "font-style=italic" } ]; }, renderHTML({ HTMLAttributes }) { return ["em", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setItalic: () => ({ commands }) => { return commands.setMark(this.name); }, toggleItalic: () => ({ commands }) => { return commands.toggleMark(this.name); }, unsetItalic: () => ({ commands }) => { return commands.unsetMark(this.name); } }; }, addKeyboardShortcuts() { return { "Mod-i": () => this.editor.commands.toggleItalic(), "Mod-I": () => this.editor.commands.toggleItalic() }; }, addInputRules() { return [ markInputRule({ find: starInputRegex2, type: this.type }), markInputRule({ find: underscoreInputRegex2, type: this.type }) ]; }, addPasteRules() { return [ markPasteRule({ find: starPasteRegex2, type: this.type }), markPasteRule({ find: underscorePasteRegex2, type: this.type }) ]; } }); // node_modules/@tiptap/extension-list-item/dist/index.js var ListItem2 = Node.create({ name: "listItem", addOptions() { return { HTMLAttributes: {}, bulletListTypeName: "bulletList", orderedListTypeName: "orderedList" }; }, content: "paragraph block*", defining: true, parseHTML() { return [ { tag: "li" } ]; }, renderHTML({ HTMLAttributes }) { return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addKeyboardShortcuts() { return { Enter: () => this.editor.commands.splitListItem(this.name), Tab: () => this.editor.commands.sinkListItem(this.name), "Shift-Tab": () => this.editor.commands.liftListItem(this.name) }; } }); // node_modules/@tiptap/extension-ordered-list/dist/index.js var ListItem3 = Node.create({ name: "listItem", addOptions() { return { HTMLAttributes: {}, bulletListTypeName: "bulletList", orderedListTypeName: "orderedList" }; }, content: "paragraph block*", defining: true, parseHTML() { return [ { tag: "li" } ]; }, renderHTML({ HTMLAttributes }) { return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addKeyboardShortcuts() { return { Enter: () => this.editor.commands.splitListItem(this.name), Tab: () => this.editor.commands.sinkListItem(this.name), "Shift-Tab": () => this.editor.commands.liftListItem(this.name) }; } }); var TextStyle2 = Mark.create({ name: "textStyle", addOptions() { return { HTMLAttributes: {} }; }, parseHTML() { return [ { tag: "span", getAttrs: (element) => { const hasStyles = element.hasAttribute("style"); if (!hasStyles) { return false; } return {}; } } ]; }, renderHTML({ HTMLAttributes }) { return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { removeEmptyTextStyle: () => ({ state, commands }) => { const attributes = getMarkAttributes(state, this.type); const hasStyles = Object.entries(attributes).some(([, value]) => !!value); if (hasStyles) { return true; } return commands.unsetMark(this.name); } }; } }); var inputRegex3 = /^(\d+)\.\s$/; var OrderedList = Node.create({ name: "orderedList", addOptions() { return { itemTypeName: "listItem", HTMLAttributes: {}, keepMarks: false, keepAttributes: false }; }, group: "block list", content() { return `${this.options.itemTypeName}+`; }, addAttributes() { return { start: { default: 1, parseHTML: (element) => { return element.hasAttribute("start") ? parseInt(element.getAttribute("start") || "", 10) : 1; } } }; }, parseHTML() { return [ { tag: "ol" } ]; }, renderHTML({ HTMLAttributes }) { const { start, ...attributesWithoutStart } = HTMLAttributes; return start === 1 ? ["ol", mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0] : ["ol", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { toggleOrderedList: () => ({ commands, chain }) => { if (this.options.keepAttributes) { return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem3.name, this.editor.getAttributes(TextStyle2.name)).run(); } return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); } }; }, addKeyboardShortcuts() { return { "Mod-Shift-7": () => this.editor.commands.toggleOrderedList() }; }, addInputRules() { let inputRule = wrappingInputRule({ find: inputRegex3, type: this.type, getAttributes: (match) => ({ start: +match[1] }), joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1] }); if (this.options.keepMarks || this.options.keepAttributes) { inputRule = wrappingInputRule({ find: inputRegex3, type: this.type, keepMarks: this.options.keepMarks, keepAttributes: this.options.keepAttributes, getAttributes: (match) => ({ start: +match[1], ...this.editor.getAttributes(TextStyle2.name) }), joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1], editor: this.editor }); } return [ inputRule ]; } }); // node_modules/@tiptap/extension-paragraph/dist/index.js var Paragraph = Node.create({ name: "paragraph", priority: 1e3, addOptions() { return { HTMLAttributes: {} }; }, group: "block", content: "inline*", parseHTML() { return [ { tag: "p" } ]; }, renderHTML({ HTMLAttributes }) { return ["p", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setParagraph: () => ({ commands }) => { return commands.setNode(this.name); } }; }, addKeyboardShortcuts() { return { "Mod-Alt-0": () => this.editor.commands.setParagraph() }; } }); // node_modules/@tiptap/extension-strike/dist/index.js var inputRegex4 = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))$/; var pasteRegex = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))/g; var Strike = Mark.create({ name: "strike", addOptions() { return { HTMLAttributes: {} }; }, parseHTML() { return [ { tag: "s" }, { tag: "del" }, { tag: "strike" }, { style: "text-decoration", consuming: false, getAttrs: (style) => style.includes("line-through") ? {} : false } ]; }, renderHTML({ HTMLAttributes }) { return ["s", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; }, addCommands() { return { setStrike: () => ({ commands }) => { return commands.setMark(this.name); }, toggleStrike: () => ({ commands }) => { return commands.toggleMark(this.name); }, unsetStrike: () => ({ commands }) => { return commands.unsetMark(this.name); } }; }, addKeyboardShortcuts() { const shortcuts = {}; if (isMacOS()) { shortcuts["Mod-Shift-s"] = () => this.editor.commands.toggleStrike(); } else { shortcuts["Ctrl-Shift-s"] = () => this.editor.commands.toggleStrike(); } return shortcuts; }, addInputRules() { return [ markInputRule({ find: inputRegex4, type: this.type }) ]; }, addPasteRules() { return [ markPasteRule({ find: pasteRegex, type: this.type }) ]; } }); // node_modules/@tiptap/extension-text/dist/index.js var Text = Node.create({ name: "text", group: "inline" }); // node_modules/@tiptap/extension-text-align/dist/index.js var TextAlign = Extension.create({ name: "textAlign", addOptions() { return { types: [], alignments: ["left", "center", "right", "justify"], defaultAlignment: "left" }; }, addGlobalAttributes() { return [ { types: this.options.types, attributes: { textAlign: { default: this.options.defaultAlignment, parseHTML: (element) => element.style.textAlign || this.options.defaultAlignment, renderHTML: (attributes) => { if (attributes.textAlign === this.options.defaultAlignment) { return {}; } return { style: `text-align: ${attributes.textAlign}` }; } } } } ]; }, addCommands() { return { setTextAlign: (alignment) => ({ commands }) => { if (!this.options.alignments.includes(alignment)) { return false; } return this.options.types.every((type) => commands.updateAttributes(type, { textAlign: alignment })); }, unsetTextAlign: () => ({ commands }) => { return this.options.types.every((type) => commands.resetAttributes(type, "textAlign")); } }; }, addKeyboardShortcuts() { return { "Mod-Shift-l": () => this.editor.commands.setTextAlign("left"), "Mod-Shift-e": () => this.editor.commands.setTextAlign("center"), "Mod-Shift-r": () => this.editor.commands.setTextAlign("right"), "Mod-Shift-j": () => this.editor.commands.setTextAlign("justify") }; } }); // src/input/richtext/RichTextKit.ts import { fromModule } from "alinea/ui"; // src/input/richtext/RichTextKit.module.scss var RichTextKit_module_default = { "hyphenate": "alinea-RichTextKit-hyphenate", "link": "alinea-RichTextKit-link", "p": "alinea-RichTextKit-p", "h5": "alinea-RichTextKit-h5", "h4": "alinea-RichTextKit-h4", "h3": "alinea-RichTextKit-h3", "heading": "alinea-RichTextKit-heading", "h2": "alinea-RichTextKit-h2", "h1": "alinea-RichTextKit-h1", "is-flat": "alinea-RichTextKit-is-flat", "isFlat": "alinea-RichTextKit-is-flat", "monospace": "alinea-RichTextKit-monospace", "small": "alinea-RichTextKit-small", "paragraph": "alinea-RichTextKit-paragraph", "list": "alinea-RichTextKit-list", "listItem": "alinea-RichTextKit-listItem", "blockquote": "alinea-RichTextKit-blockquote" }; // src/input/richtext/RichTextKit.ts import { Link } from "./extensions/Link.js"; import Small from "./extensions/Small.js"; var styles = fromModule(RichTextKit_module_default); var RichTextKit = Extension.create({ name: "richTextKit", addExtensions() { return [ Document, Text, Paragraph.configure({ HTMLAttributes: { class: styles.paragraph() } }), Small, Bold, Italic, Strike, HorizontalRule, BulletList.configure({ HTMLAttributes: { class: styles.list() } }), OrderedList.configure({ HTMLAttributes: { class: styles.list() } }), ListItem2.configure({ HTMLAttributes: { class: styles.listItem() } }), Blockquote.configure({ HTMLAttributes: { class: styles.blockquote() } }), HardBreak, Heading.configure({ HTMLAttributes: { class: styles.heading() } }), TextAlign.configure({ types: ["heading", "paragraph"] }), Dropcursor, Gapcursor, Link.configure({ HTMLAttributes: { class: styles.link() } }), FloatingMenu ]; } }); export { RichTextKit };