{"version":3,"file":"index.js","names":["ListItemName","TextStyleName"],"sources":["../src/bullet-list/bullet-list.ts","../src/helpers/getBranchingNestedListAtCursor.ts","../src/helpers/hoistBranchingNestedList.ts","../src/helpers/handleDeleteBranchingNestedList.ts","../src/helpers/createBranchingListDeleteKeymap.ts","../src/ordered-list/roman.ts","../src/item/list-item.ts","../src/keymap/listHelpers/findListItemPos.ts","../src/keymap/listHelpers/getNextListDepth.ts","../src/keymap/listHelpers/hasListBefore.ts","../src/keymap/listHelpers/handleBackspace.ts","../src/keymap/listHelpers/nextListIsDeeper.ts","../src/keymap/listHelpers/nextListIsHigher.ts","../src/keymap/listHelpers/handleDelete.ts","../src/keymap/listHelpers/handleTab.ts","../src/keymap/listHelpers/hasListItemAfter.ts","../src/keymap/listHelpers/hasListItemBefore.ts","../src/keymap/listHelpers/listItemHasSubList.ts","../src/keymap/listHelpers/index.ts","../src/keymap/list-keymap.ts","../src/ordered-list/utils.ts","../src/ordered-list/collectOrderedListItemsFromSource.ts","../src/ordered-list/ordered-list.ts","../src/task-item/task-item.ts","../src/task-list/task-list.ts","../src/kit/index.ts"],"sourcesContent":["import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nconst ListItemName = 'listItem'\nconst TextStyleName = 'textStyle'\n\nexport interface BulletListOptions {\n /**\n * The node name for the list items\n * @default 'listItem'\n * @example 'paragraph'\n */\n itemTypeName: string\n\n /**\n * HTML attributes to add to the bullet list element\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record\n\n /**\n * Keep the marks when splitting the list\n * @default false\n * @example true\n */\n keepMarks: boolean\n\n /**\n * Keep the attributes when splitting the list\n * @default false\n * @example true\n */\n keepAttributes: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n bulletList: {\n /**\n * Toggle a bullet list\n */\n toggleBulletList: () => ReturnType\n }\n }\n}\n\n/**\n * Matches a bullet list to a dash or asterisk.\n */\nexport const bulletListInputRegex = /^\\s*([-+*])\\s$/\n\n/**\n * This extension allows you to create bullet lists.\n * This requires the ListItem extension\n * @see https://tiptap.dev/api/nodes/bullet-list\n * @see https://tiptap.dev/api/nodes/list-item.\n */\nexport const BulletList = Node.create({\n name: 'bulletList',\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n HTMLAttributes: {},\n keepMarks: false,\n keepAttributes: false,\n }\n },\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`\n },\n\n parseHTML() {\n return [{ tag: 'ul' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ul', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n markdownTokenName: 'list',\n\n parseMarkdown: (token, helpers) => {\n if (token.type !== 'list' || (token as any).ordered) {\n return []\n }\n\n return {\n type: 'bulletList',\n content: token.items ? helpers.parseChildren(token.items) : [],\n }\n },\n\n renderMarkdown: (node, h) => {\n if (!node.content) {\n return ''\n }\n\n return h.renderChildren(node.content, '\\n')\n },\n\n markdownOptions: {\n indentsContent: true,\n },\n\n addCommands() {\n return {\n toggleBulletList:\n () =>\n ({ commands, chain }) => {\n if (this.options.keepAttributes) {\n return chain()\n .toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n .updateAttributes(ListItemName, this.editor.getAttributes(TextStyleName))\n .run()\n }\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-8': () => this.editor.commands.toggleBulletList(),\n }\n },\n\n addInputRules() {\n let inputRule = wrappingInputRule({\n find: bulletListInputRegex,\n type: this.type,\n })\n\n if (this.options.keepMarks || this.options.keepAttributes) {\n inputRule = wrappingInputRule({\n find: bulletListInputRegex,\n type: this.type,\n keepMarks: this.options.keepMarks,\n keepAttributes: this.options.keepAttributes,\n getAttributes: () => {\n return this.editor.getAttributes(TextStyleName)\n },\n editor: this.editor,\n })\n }\n return [inputRule]\n },\n})\n","import type { Node } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nexport type BranchingNestedListAtCursor = {\n listItemDepth: number\n nestedList: Node\n nestedListPos: number\n insertPos: number\n items: Node[]\n}\n\n/**\n * Resolves a branching nested list immediately after the cursor when the selection is\n * collapsed at the end of a textblock inside a list item.\n *\n * @param state - The editor state to inspect.\n * @param itemName - The list item node name (for example `listItem` or `taskItem`).\n * @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n * @returns Resolved positions and nodes for hoisting, or `null` when not applicable.\n *\n * @example\n * ```ts\n * const context = getBranchingNestedListAtCursor(editor.state, 'listItem', [\n * 'bulletList',\n * 'orderedList',\n * ])\n *\n * if (context) {\n * // cursor is at the end of Item 1 before a branching nested sublist\n * }\n * ```\n */\nexport const getBranchingNestedListAtCursor = (\n state: EditorState,\n itemName: string,\n wrapperNames: string[],\n): BranchingNestedListAtCursor | null => {\n const { selection } = state\n\n if (!selection.empty) {\n return null\n }\n\n const { $from } = selection\n\n if (!$from.parent.isTextblock) {\n return null\n }\n\n if ($from.parentOffset !== $from.parent.content.size) {\n return null\n }\n\n let listItemDepth = -1\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n if ($from.node(depth).type.name === itemName) {\n listItemDepth = depth\n break\n }\n }\n\n if (listItemDepth < 0) {\n return null\n }\n\n const listItem = $from.node(listItemDepth)\n const indexInListItem = $from.index(listItemDepth)\n\n if (indexInListItem + 1 >= listItem.childCount) {\n return null\n }\n\n const nextChild = listItem.child(indexInListItem + 1)\n\n if (!wrapperNames.includes(nextChild.type.name)) {\n return null\n }\n\n const itemType = state.schema.nodes[itemName]\n let hasBranching = false\n\n nextChild.forEach(child => {\n if (child.type === itemType && child.childCount > 1) {\n hasBranching = true\n }\n })\n\n if (!hasBranching) {\n return null\n }\n\n const nodeAfter = state.doc.resolve($from.after()).nodeAfter\n\n if (!nodeAfter || !wrapperNames.includes(nodeAfter.type.name)) {\n return null\n }\n\n const items: Node[] = []\n\n nodeAfter.forEach(child => {\n items.push(child)\n })\n\n if (items.length === 0) {\n return null\n }\n\n return {\n listItemDepth,\n nestedList: nodeAfter,\n nestedListPos: $from.after(),\n insertPos: $from.after(listItemDepth),\n items,\n }\n}\n","import { Fragment } from '@tiptap/pm/model'\nimport type { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport { getBranchingNestedListAtCursor } from './getBranchingNestedListAtCursor.js'\n\n/**\n * Hoists all list items from a branching nested list after the cursor into the parent list.\n *\n * Use this when `joinForward` cannot restructure a nested list that contains list items\n * with sublists (see issue #6906).\n *\n * @param state - The editor state to transform.\n * @param dispatch - Optional dispatch function for the transaction.\n * @param itemName - The list item node name (for example `listItem` or `taskItem`).\n * @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n * @returns `true` when the nested list was hoisted, otherwise `false`.\n *\n * @example\n * ```ts\n * // Cursor at the end of \"Item 1\" before a nested list with branching items.\n * hoistBranchingNestedList(editor.state, editor.view.dispatch, 'listItem', [\n * 'bulletList',\n * 'orderedList',\n * ])\n * ```\n */\nexport const hoistBranchingNestedList = (\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n itemName: string,\n wrapperNames: string[],\n) => {\n const context = getBranchingNestedListAtCursor(state, itemName, wrapperNames)\n\n if (!context) {\n return false\n }\n\n const { selection } = state\n const { nestedList, nestedListPos, insertPos, items } = context\n const tr = state.tr\n\n tr.delete(nestedListPos, nestedListPos + nestedList.nodeSize)\n\n const mappedInsertPos = tr.mapping.map(insertPos)\n\n tr.insert(mappedInsertPos, Fragment.from(items))\n\n tr.setSelection(selection.map(tr.doc, tr.mapping))\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n}\n","import type { Editor } from '@tiptap/core'\n\nimport { hoistBranchingNestedList } from './hoistBranchingNestedList.js'\n\n/**\n * Handles Delete for a list item when a branching nested sublist follows the cursor.\n *\n * @param editor - The editor instance whose state should be updated.\n * @param itemName - The list item node name (for example `listItem` or `taskItem`).\n * @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n * @returns `true` when the nested list was hoisted, otherwise `false`.\n *\n * @example\n * ```ts\n * Delete: () =>\n * handleDeleteBranchingNestedList(editor, 'listItem', ['bulletList', 'orderedList']),\n * ```\n */\nexport const handleDeleteBranchingNestedList = (\n editor: Editor,\n itemName: string,\n wrapperNames: string[],\n) => {\n return hoistBranchingNestedList(editor.state, editor.view.dispatch, itemName, wrapperNames)\n}\n","import { Extension } from '@tiptap/core'\n\nimport { handleDeleteBranchingNestedList } from './handleDeleteBranchingNestedList.js'\n\n/**\n * Creates a high-priority keymap extension that handles Delete for branching nested lists.\n * Kept separate from the list item node so Enter/Tab shortcuts keep their default priority.\n */\nexport const createBranchingListDeleteKeymap = (itemName: string, wrapperNames: string[]) => {\n return Extension.create({\n name: `${itemName}BranchingDeleteKeymap`,\n priority: 101,\n\n addKeyboardShortcuts() {\n const handleDelete = () =>\n handleDeleteBranchingNestedList(this.editor, itemName, wrapperNames)\n\n return {\n Delete: handleDelete,\n 'Mod-Delete': handleDelete,\n }\n },\n })\n}\n","const ROMAN_NUMERALS: [number, string][] = [\n [1000, 'm'],\n [900, 'cm'],\n [500, 'd'],\n [400, 'cd'],\n [100, 'c'],\n [90, 'xc'],\n [50, 'l'],\n [40, 'xl'],\n [10, 'x'],\n [9, 'ix'],\n [5, 'v'],\n [4, 'iv'],\n [1, 'i'],\n]\n\nconst ALPHA_NUMERALS = 'abcdefghijklmnopqrstuvwxyz'\n\n/** Alpha list markers support at most 2 letters (a–z, aa–zz), matching {@link fromAlpha}. */\nexport const ORDERED_LIST_ALPHA_MARKER_PATTERN = '[a-zA-Z]{1,2}'\n\n/**\n * Marker segment for ordered list lines: numeric, roman, or 1–2 letter alpha.\n * Roman is matched before alpha so \"iii\" is roman; invalid romans like \"aa\" fall through to alpha.\n */\nexport const ORDERED_LIST_MARKER_PATTERN = String.raw`\\d+|[ivxlcdmIVXLCDM]+|${ORDERED_LIST_ALPHA_MARKER_PATTERN}`\n\n/**\n * Convert a number to lowercase roman numerals.\n * @example toRoman(1) // 'i'\n * @example toRoman(4) // 'iv'\n */\nexport function toRoman(num: number): string {\n let remaining = num\n let result = ''\n\n for (const [value, numeral] of ROMAN_NUMERALS) {\n while (remaining >= value) {\n result += numeral\n remaining -= value\n }\n }\n\n return result\n}\n\n/**\n * Convert a number to uppercase roman numerals.\n * @example toRomanUpper(1) // 'I'\n * @example toRomanUpper(4) // 'IV'\n */\nexport function toRomanUpper(num: number): string {\n return toRoman(num).toUpperCase()\n}\n\nfunction fromRoman(roman: string): number {\n const lower = roman.toLowerCase()\n let index = 0\n let result = 0\n\n while (index < lower.length) {\n let matched = false\n\n for (const [value, numeral] of ROMAN_NUMERALS) {\n if (lower.startsWith(numeral, index)) {\n result += value\n index += numeral.length\n matched = true\n break\n }\n }\n\n if (!matched) {\n return 0\n }\n }\n\n return result\n}\n\nfunction isValidRoman(marker: string): boolean {\n if (!/^[ivxlcdmIVXLCDM]+$/.test(marker)) {\n return false\n }\n\n const value = fromRoman(marker)\n\n if (value <= 0) {\n return false\n }\n\n const expected = marker === marker.toLowerCase() ? toRoman(value) : toRomanUpper(value)\n\n return expected === marker\n}\n\nfunction fromAlpha(marker: string): number {\n const lower = marker.toLowerCase()\n\n if (lower.length === 1) {\n return lower.charCodeAt(0) - 'a'.charCodeAt(0) + 1\n }\n\n if (lower.length === 2) {\n const first = lower.charCodeAt(0) - 'a'.charCodeAt(0)\n const second = lower.charCodeAt(1) - 'a'.charCodeAt(0)\n\n return (first + 1) * 26 + second + 1\n }\n\n return 0\n}\n\nfunction toRomanAlpha(num: number): string {\n if (num <= 26) {\n return ALPHA_NUMERALS[num - 1]\n }\n\n const first = Math.floor((num - 1) / 26) - 1\n const second = (num - 1) % 26\n\n if (first < 0) {\n return ALPHA_NUMERALS[second]\n }\n\n return ALPHA_NUMERALS[first] + ALPHA_NUMERALS[second]\n}\n\n/**\n * Extract the list marker type from a marker string.\n * Supports \"1\", \"a\", \"A\", \"i\", \"I\" marker styles.\n *\n * @param marker The text content of the list marker (e.g. \"a\", \"1\", \"iii\", \"b\")\n * @returns The normalized type string, or undefined for default numeric type\n */\nexport function detectMarkerType(marker: string): string | undefined {\n if (!marker || /^\\d+$/.test(marker)) {\n return undefined\n }\n\n if (isValidRoman(marker)) {\n return marker === marker.toLowerCase() ? 'i' : 'I'\n }\n\n if (/^[a-z]{1,2}$/.test(marker)) {\n return 'a'\n }\n\n if (/^[A-Z]{1,2}$/.test(marker)) {\n return 'A'\n }\n\n return undefined\n}\n\n/**\n * Convert a list marker string to its numeric start position.\n *\n * @param marker The text content of the list marker (e.g. \"3\", \"b\", \"II\")\n * @returns The 1-based start value for the ordered list\n */\nexport function markerToStart(marker: string): number {\n if (/^\\d+$/.test(marker)) {\n return parseInt(marker, 10)\n }\n\n const type = detectMarkerType(marker)\n\n if (type === 'i' || type === 'I') {\n return fromRoman(marker)\n }\n\n if (type === 'a' || type === 'A') {\n const start = fromAlpha(marker)\n\n return start > 0 ? start : 1\n }\n\n const parsed = parseInt(marker, 10)\n\n return Number.isNaN(parsed) ? 1 : parsed\n}\n\nfunction startToMarker(type: string, start: number): string {\n if (type === 'numeric') {\n return String(start)\n }\n\n switch (type) {\n case 'a':\n return toRomanAlpha(start)\n case 'A':\n return toRomanAlpha(start).toUpperCase()\n case 'i':\n return toRoman(start)\n case 'I':\n return toRomanUpper(start)\n default:\n return String(start)\n }\n}\n\n/**\n * Returns true when all markers share the same style and increment by 1.\n * Style is inferred from the first marker so ambiguous letters (e.g. \"c\", \"i\")\n * are not re-classified differently on later lines.\n */\nexport function areOrderedListMarkersSequential(markers: string[]): boolean {\n if (markers.length === 0) {\n return false\n }\n\n const firstType = detectMarkerType(markers[0]) ?? 'numeric'\n const firstStart = markerToStart(markers[0])\n\n if (firstStart < 1) {\n return false\n }\n\n for (let i = 0; i < markers.length; i++) {\n const expected = startToMarker(firstType, firstStart + i)\n\n if (markers[i] !== expected) {\n return false\n }\n }\n\n return true\n}\n\nexport interface ParsedListMarker {\n type?: string\n start: number\n}\n\n/**\n * Parse a list marker into HTML ordered-list attrs (type + start).\n */\nexport function parseListMarker(marker: string): ParsedListMarker {\n return {\n type: detectMarkerType(marker),\n start: markerToStart(marker),\n }\n}\n\n/**\n * Build orderedList node attrs from the first list item marker.\n */\nexport function buildOrderedListAttrsFromMarker(marker: string): Record {\n const { type, start } = parseListMarker(marker)\n const attrs: Record = {}\n\n if (type) {\n attrs.type = type\n }\n\n if (start !== 1) {\n attrs.start = start\n }\n\n return attrs\n}\n\n/**\n * Returns the list marker prefix for a given item at a given index.\n *\n * @param type The list type attribute (e.g. \"a\", \"A\", \"i\", \"I\", null/undefined for default)\n * @param index The zero-based index of the list item\n * @param separator The separator to use (default: \". \")\n * @returns The marker string (e.g. \"a. \", \"I. \", \"1. \")\n */\nexport function getListMarker(\n type: string | null | undefined,\n index: number,\n separator = '. ',\n): string {\n const position = index + 1\n\n if (!type || type === '1') {\n return `${position}${separator}`\n }\n\n switch (type) {\n case 'a':\n return `${toRomanAlpha(position)}${separator}`\n case 'A':\n return `${toRomanAlpha(position).toUpperCase()}${separator}`\n case 'i':\n return `${toRoman(position)}${separator}`\n case 'I':\n return `${toRomanUpper(position)}${separator}`\n default:\n return `${position}${separator}`\n }\n}\n","import type { JSONContent, MarkdownParseHelpers, MarkdownToken } from '@tiptap/core'\nimport { mergeAttributes, Node, renderNestedMarkdownContent } from '@tiptap/core'\n\nimport { createBranchingListDeleteKeymap } from '../helpers/createBranchingListDeleteKeymap.js'\n\nimport { getListMarker } from '../ordered-list/roman.js'\n\nexport interface ListItemOptions {\n /**\n * The HTML attributes for a list item node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record\n\n /**\n * The node type for bulletList nodes\n * @default 'bulletList'\n * @example 'myCustomBulletList'\n */\n bulletListTypeName: string\n\n /**\n * The node type for orderedList nodes\n * @default 'orderedList'\n * @example 'myCustomOrderedList'\n */\n orderedListTypeName: string\n}\n\nfunction isSameLineOrderedListToken(token: MarkdownToken): boolean {\n const nestedToken = token.tokens?.[0]\n\n return Boolean(\n token.text &&\n token.tokens?.length === 1 &&\n nestedToken?.type === 'list' &&\n nestedToken.ordered &&\n nestedToken.raw === token.text,\n )\n}\n\nfunction parseSameLineOrderedListText(text: string, helpers: MarkdownParseHelpers): JSONContent[] {\n if (helpers.tokenizeInline) {\n return helpers.parseInline(helpers.tokenizeInline(text))\n }\n\n return helpers.parseInline([\n {\n type: 'text',\n raw: text,\n text,\n },\n ])\n}\n\n/**\n * This extension allows you to create list items.\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nexport const ListItem = Node.create({\n name: 'listItem',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n bulletListTypeName: 'bulletList',\n orderedListTypeName: 'orderedList',\n }\n },\n\n content: 'paragraph block*',\n\n defining: true,\n\n parseHTML() {\n return [\n {\n tag: 'li',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n markdownTokenName: 'list_item',\n\n parseMarkdown: (token, helpers) => {\n if (token.type !== 'list_item') {\n return []\n }\n\n const parseBlockChildren = helpers.parseBlockChildren ?? helpers.parseChildren\n let content: any[] = []\n\n if (token.tokens && token.tokens.length > 0) {\n if (isSameLineOrderedListToken(token)) {\n return {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: parseSameLineOrderedListText(token.text || '', helpers),\n },\n ],\n }\n }\n\n // Check if we have paragraph tokens (complex list items)\n const hasParagraphTokens = token.tokens.some(t => t.type === 'paragraph')\n\n if (hasParagraphTokens) {\n // If we have paragraph tokens, parse them as block elements\n content = parseBlockChildren(token.tokens)\n } else {\n // Check if the first token is a text token with nested inline tokens\n const firstToken = token.tokens[0]\n\n if (\n firstToken &&\n firstToken.type === 'text' &&\n firstToken.tokens &&\n firstToken.tokens.length > 0\n ) {\n // Parse the inline content from the text token\n const inlineContent = helpers.parseInline(firstToken.tokens)\n\n // Start with the paragraph containing the inline content\n content = [\n {\n type: 'paragraph',\n content: inlineContent,\n },\n ]\n\n // If there are additional tokens after the first text token (like nested lists),\n // parse them as block elements and add them\n if (token.tokens.length > 1) {\n const remainingTokens = token.tokens.slice(1)\n const additionalContent = parseBlockChildren(remainingTokens)\n content.push(...additionalContent)\n }\n } else {\n // Fallback: parse all tokens as block elements\n content = parseBlockChildren(token.tokens)\n }\n }\n }\n\n // Ensure we always have at least an empty paragraph\n if (content.length === 0) {\n content = [\n {\n type: 'paragraph',\n content: [],\n },\n ]\n }\n\n return {\n type: 'listItem',\n content,\n }\n },\n\n renderMarkdown: (node, h, ctx) => {\n return renderNestedMarkdownContent(\n node,\n h,\n (context: any) => {\n if (context.parentType === 'bulletList') {\n return '- '\n }\n if (context.parentType === 'orderedList') {\n const start = context.meta?.parentAttrs?.start || 1\n const type = context.meta?.parentAttrs?.type as string | undefined\n const index = start - 1 + (context.index || 0)\n return getListMarker(type, index, '. ')\n }\n // Fallback to bullet list for unknown parent types\n return '- '\n },\n ctx,\n { alignNestedToPrefix: ctx?.parentType === 'orderedList' },\n )\n },\n\n addExtensions() {\n return [\n createBranchingListDeleteKeymap(this.name, [\n this.options.bulletListTypeName,\n this.options.orderedListTypeName,\n ]),\n ]\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => this.editor.commands.splitListItem(this.name),\n Tab: () => this.editor.commands.sinkListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n },\n})\n","import { getNodeType } from '@tiptap/core'\nimport type { NodeType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nexport const findListItemPos = (typeOrName: string | NodeType, state: EditorState) => {\n const { $from } = state.selection\n const nodeType = getNodeType(typeOrName, state.schema)\n\n let currentNode = null\n let currentDepth = $from.depth\n let currentPos = $from.pos\n let targetDepth: number | null = null\n\n while (currentDepth > 0 && targetDepth === null) {\n currentNode = $from.node(currentDepth)\n\n if (currentNode.type === nodeType) {\n targetDepth = currentDepth\n } else {\n currentDepth -= 1\n currentPos -= 1\n }\n }\n\n if (targetDepth === null) {\n return null\n }\n\n return { $pos: state.doc.resolve(currentPos), depth: targetDepth }\n}\n","import { getNodeAtPosition } from '@tiptap/core'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport { findListItemPos } from './findListItemPos.js'\n\nexport const getNextListDepth = (typeOrName: string, state: EditorState) => {\n const listItemPos = findListItemPos(typeOrName, state)\n\n if (!listItemPos) {\n return false\n }\n\n const [, depth] = getNodeAtPosition(state, typeOrName, listItemPos.$pos.pos + 4)\n\n return depth\n}\n","import type { EditorState } from '@tiptap/pm/state'\n\nexport const hasListBefore = (\n editorState: EditorState,\n name: string,\n parentListTypes: string[],\n) => {\n const { $anchor } = editorState.selection\n\n const previousNodePos = Math.max(0, $anchor.pos - 2)\n\n const previousNode = editorState.doc.resolve(previousNodePos).node()\n\n if (!previousNode || !parentListTypes.includes(previousNode.type.name)) {\n return false\n }\n\n return true\n}\n","import type { Editor } from '@tiptap/core'\nimport { isAtStartOfNode, isNodeActive } from '@tiptap/core'\nimport type { Node } from '@tiptap/pm/model'\n\nimport { hasListBefore } from './hasListBefore.js'\n\nexport const handleBackspace = (editor: Editor, name: string, parentListTypes: string[]) => {\n // this is required to still handle the undo handling\n if (editor.commands.undoInputRule()) {\n return true\n }\n\n // if the selection is not collapsed\n // we can rely on the default backspace behavior\n if (editor.state.selection.from !== editor.state.selection.to) {\n return false\n }\n\n // if the current item is NOT inside a list item &\n // the previous item is a list (orderedList or bulletList)\n // move the cursor into the list and delete the current item\n if (!isNodeActive(editor.state, name) && hasListBefore(editor.state, name, parentListTypes)) {\n const { $anchor } = editor.state.selection\n\n const $listPos = editor.state.doc.resolve($anchor.before() - 1)\n\n const listDescendants: Array<{ node: Node; pos: number }> = []\n\n $listPos.node().descendants((node, pos) => {\n if (node.type.name === name) {\n listDescendants.push({ node, pos })\n }\n })\n\n const lastItem = listDescendants.at(-1)\n\n if (!lastItem) {\n return false\n }\n\n const $lastItemPos = editor.state.doc.resolve($listPos.start() + lastItem.pos + 1)\n\n return editor\n .chain()\n .cut({ from: $anchor.start() - 1, to: $anchor.end() + 1 }, $lastItemPos.end())\n .joinForward()\n .run()\n }\n\n // if the cursor is not inside the current node type\n // do nothing and proceed\n if (!isNodeActive(editor.state, name)) {\n return false\n }\n\n // if the cursor is not at the start of a node\n // do nothing and proceed\n if (!isAtStartOfNode(editor.state)) {\n return false\n }\n\n // only intercept at the start of the list item's first child\n const { $from } = editor.state.selection\n const itemDepth = $from.depth - 1\n if ($from.node(itemDepth).type !== editor.schema.nodes[name] || $from.index(itemDepth) !== 0) {\n return false\n }\n\n return editor.chain().liftListItem(name).run()\n}\n","import type { EditorState } from '@tiptap/pm/state'\n\nimport { findListItemPos } from './findListItemPos.js'\nimport { getNextListDepth } from './getNextListDepth.js'\n\nexport const nextListIsDeeper = (typeOrName: string, state: EditorState) => {\n const listDepth = getNextListDepth(typeOrName, state)\n const listItemPos = findListItemPos(typeOrName, state)\n\n if (!listItemPos || !listDepth) {\n return false\n }\n\n if (listDepth > listItemPos.depth) {\n return true\n }\n\n return false\n}\n","import type { EditorState } from '@tiptap/pm/state'\n\nimport { findListItemPos } from './findListItemPos.js'\nimport { getNextListDepth } from './getNextListDepth.js'\n\nexport const nextListIsHigher = (typeOrName: string, state: EditorState) => {\n const listDepth = getNextListDepth(typeOrName, state)\n const listItemPos = findListItemPos(typeOrName, state)\n\n if (!listItemPos || !listDepth) {\n return false\n }\n\n if (listDepth < listItemPos.depth) {\n return true\n }\n\n return false\n}\n","import type { Editor } from '@tiptap/core'\nimport { isAtEndOfNode, isNodeActive } from '@tiptap/core'\n\nimport { nextListIsDeeper } from './nextListIsDeeper.js'\nimport { nextListIsHigher } from './nextListIsHigher.js'\n\nexport const handleDelete = (editor: Editor, name: string) => {\n // if the cursor is not inside the current node type\n // do nothing and proceed\n if (!isNodeActive(editor.state, name)) {\n return false\n }\n\n // if the cursor is not at the end of a node\n // do nothing and proceed\n if (!isAtEndOfNode(editor.state, name)) {\n return false\n }\n\n // if the selection is not collapsed, or not within a single node\n // do nothing and proceed\n const { selection } = editor.state\n const { $from, $to } = selection\n\n if (!selection.empty && $from.sameParent($to)) {\n return false\n }\n\n // check if the next node is a list with a deeper depth\n if (nextListIsDeeper(name, editor.state)) {\n return editor\n .chain()\n .focus(editor.state.selection.from + 4)\n .lift(name)\n .joinBackward()\n .run()\n }\n\n if (nextListIsHigher(name, editor.state)) {\n return editor.chain().joinForward().joinBackward().run()\n }\n\n return editor.commands.joinItemForward()\n}\n","import type { Editor } from '@tiptap/core'\nimport { getPreviousBlockSibling, isNodeActive } from '@tiptap/core'\nimport { Fragment } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\n\nexport const handleTab = (editor: Editor, name: string, parentListTypes: string[]) => {\n const { state } = editor\n const { selection } = state\n if (!selection.empty) return false\n\n const { $from } = selection\n if ($from.parentOffset !== 0) return false\n\n // gap cursors satisfy both checks above but resolve outside a textblock\n if (!$from.parent.isTextblock) return false\n\n // Tab inside a list item belongs to sinkListItem\n if (isNodeActive(state, name)) return false\n\n const previous = getPreviousBlockSibling($from)\n if (!previous || !parentListTypes.includes(previous.type.name)) return false\n\n const lastItem = previous.lastChild\n if (!lastItem || lastItem.type.name !== name) return false\n\n const block = $from.parent\n\n if (!lastItem.canReplace(lastItem.childCount, lastItem.childCount, Fragment.from(block))) {\n return false\n }\n\n const blockStart = $from.before()\n const blockEnd = $from.after()\n\n // step back over the closing tokens of the list and its last item\n const insideLastItemEnd = blockStart - 2\n\n return editor.commands.command(({ tr, dispatch }) => {\n if (dispatch) {\n tr.delete(blockStart, blockEnd).insert(insideLastItemEnd, Fragment.from(block))\n // place the cursor at the start of the inserted block\n tr.setSelection(TextSelection.create(tr.doc, insideLastItemEnd + 1))\n tr.scrollIntoView()\n }\n\n return true\n })\n}\n","import type { EditorState } from '@tiptap/pm/state'\n\nexport const hasListItemAfter = (typeOrName: string, state: EditorState): boolean => {\n const { $anchor } = state.selection\n\n const $targetPos = state.doc.resolve($anchor.pos - $anchor.parentOffset - 2)\n\n if ($targetPos.index() === $targetPos.parent.childCount - 1) {\n return false\n }\n\n if ($targetPos.nodeAfter?.type.name !== typeOrName) {\n return false\n }\n\n return true\n}\n","import type { EditorState } from '@tiptap/pm/state'\n\nexport const hasListItemBefore = (typeOrName: string, state: EditorState): boolean => {\n const { $anchor } = state.selection\n\n const $targetPos = state.doc.resolve($anchor.pos - 2)\n\n if ($targetPos.index() === 0) {\n return false\n }\n\n if ($targetPos.nodeBefore?.type.name !== typeOrName) {\n return false\n }\n\n return true\n}\n","import { getNodeType } from '@tiptap/core'\nimport type { Node } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nexport const listItemHasSubList = (typeOrName: string, state: EditorState, node?: Node) => {\n if (!node) {\n return false\n }\n\n const nodeType = getNodeType(typeOrName, state.schema)\n\n let hasSubList = false\n\n node.descendants(child => {\n if (child.type === nodeType) {\n hasSubList = true\n }\n })\n\n return hasSubList\n}\n","export * from './findListItemPos.js'\nexport * from './getNextListDepth.js'\nexport * from './handleBackspace.js'\nexport * from './handleDelete.js'\nexport * from './handleTab.js'\nexport * from './hasListBefore.js'\nexport * from './hasListItemAfter.js'\nexport * from './hasListItemBefore.js'\nexport * from './listItemHasSubList.js'\nexport * from './nextListIsDeeper.js'\nexport * from './nextListIsHigher.js'\n","import { Extension } from '@tiptap/core'\n\nimport { handleBackspace, handleDelete, handleTab } from './listHelpers/index.js'\n\nexport type ListKeymapOptions = {\n /**\n * An array of list types. This is used for item and wrapper list matching.\n * @default []\n * @example [{ itemName: 'listItem', wrapperNames: ['bulletList', 'orderedList'] }]\n */\n listTypes: Array<{\n itemName: string\n wrapperNames: string[]\n }>\n}\n\n/**\n * This extension registers custom keymaps to change the behaviour of the backspace and delete keys.\n * By default Prosemirror keyhandling will always lift or sink items so paragraphs are joined into\n * the adjacent or previous list item. This extension will prevent this behaviour and instead will\n * try to join paragraphs from two list items into a single list item.\n * @see https://www.tiptap.dev/api/extensions/list-keymap\n */\nexport const ListKeymap = Extension.create({\n name: 'listKeymap',\n\n addOptions() {\n return {\n listTypes: [\n {\n itemName: 'listItem',\n wrapperNames: ['bulletList', 'orderedList'],\n },\n {\n itemName: 'taskItem',\n wrapperNames: ['taskList'],\n },\n ],\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Delete: ({ editor }) => {\n let handled = false\n\n this.options.listTypes.forEach(({ itemName }) => {\n if (editor.state.schema.nodes[itemName] === undefined) {\n return\n }\n\n if (handleDelete(editor, itemName)) {\n handled = true\n }\n })\n\n return handled\n },\n 'Mod-Delete': ({ editor }) => {\n let handled = false\n\n this.options.listTypes.forEach(({ itemName }) => {\n if (editor.state.schema.nodes[itemName] === undefined) {\n return\n }\n\n if (handleDelete(editor, itemName)) {\n handled = true\n }\n })\n\n return handled\n },\n Backspace: ({ editor }) => {\n let handled = false\n\n this.options.listTypes.forEach(({ itemName, wrapperNames }) => {\n if (editor.state.schema.nodes[itemName] === undefined) {\n return\n }\n\n if (handleBackspace(editor, itemName, wrapperNames)) {\n handled = true\n }\n })\n\n return handled\n },\n 'Mod-Backspace': ({ editor }) => {\n let handled = false\n\n this.options.listTypes.forEach(({ itemName, wrapperNames }) => {\n if (editor.state.schema.nodes[itemName] === undefined) {\n return\n }\n\n if (handleBackspace(editor, itemName, wrapperNames)) {\n handled = true\n }\n })\n\n return handled\n },\n Tab: ({ editor }) => {\n // stop at the first handled list type so a single Tab cannot sink the block twice\n for (const { itemName, wrapperNames } of this.options.listTypes) {\n if (editor.state.schema.nodes[itemName] === undefined) {\n continue\n }\n\n if (handleTab(editor, itemName, wrapperNames)) {\n return true\n }\n }\n\n return false\n },\n }\n },\n})\n","import type {\n JSONContent,\n MarkdownLexerConfiguration,\n MarkdownParseHelpers,\n MarkdownToken,\n} from '@tiptap/core'\n\nimport {\n areOrderedListMarkersSequential,\n buildOrderedListAttrsFromMarker,\n detectMarkerType,\n markerToStart,\n ORDERED_LIST_MARKER_PATTERN,\n} from './roman.js'\n\nexport { ORDERED_LIST_MARKER_PATTERN }\n\n/**\n * Matches an ordered list item line with optional leading whitespace.\n * Captures: (1) indentation spaces, (2) item marker (number, letter, or roman numeral),\n * (3) separator (. or )), (4) content after marker\n *\n * Examples: \"1. Item\", \" a) Nested item\", \" I. Roman item\", \"iii. Another\", \"aa. Item 27\"\n */\nexport const ORDERED_LIST_ITEM_REGEX = new RegExp(\n `^(\\\\s*)(${ORDERED_LIST_MARKER_PATTERN})([.)])\\\\s+(.*)$`,\n)\n\n/**\n * Matches any line that starts with whitespace (indented content).\n * Used to identify continuation content that belongs to a list item.\n */\nconst INDENTED_LINE_REGEX = /^\\s/\n\n/**\n * This are blocks that can interrupt a paragraph, so a line starting with one of\n * them can never be lazy continuation text of a list item\n */\nconst PARAGRAPH_INTERRUPTERS = {\n heading: /^#{1,6}(?:\\s|$)/,\n bulletItem: /^[-+*]\\s+/,\n codeFence: /^(?:```|~~~)/,\n blockMath: /^\\$\\$/,\n thematicBreak: /^(?:(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})$/,\n}\n\n/**\n * Represents a parsed ordered list item with indentation information\n */\nexport interface OrderedListItem {\n indent: number\n number: number\n type?: string\n content: string\n contentLines: string[]\n raw: string\n}\n\nfunction isOrderedListMarkerLine(line: string): boolean {\n return ORDERED_LIST_ITEM_REGEX.test(line.trimStart())\n}\n\nfunction isBlockContentLine(line: string): boolean {\n const trimmedLine = line.trimStart()\n\n return (\n PARAGRAPH_INTERRUPTERS.bulletItem.test(trimmedLine) ||\n isOrderedListMarkerLine(trimmedLine) ||\n PARAGRAPH_INTERRUPTERS.heading.test(trimmedLine) ||\n // dash breaks are excluded: \"---\" directly below paragraph text is a\n // setext heading underline, not a thematic break\n (PARAGRAPH_INTERRUPTERS.thematicBreak.test(trimmedLine) && !trimmedLine.startsWith('-')) ||\n // oxlint-disable-next-line prefer-string-starts-ends-with\n /^>\\s?/.test(trimmedLine) ||\n PARAGRAPH_INTERRUPTERS.codeFence.test(trimmedLine) ||\n PARAGRAPH_INTERRUPTERS.blockMath.test(trimmedLine)\n )\n}\n\nfunction interruptsLazyContinuation(line: string): boolean {\n return Object.values(PARAGRAPH_INTERRUPTERS).some(pattern => pattern.test(line))\n}\n\nfunction splitItemContent(contentLines: string[]): {\n paragraphLines: string[]\n blockLines: string[]\n} {\n const paragraphLines: string[] = []\n const blockLines: string[] = []\n let reachedBlockBoundary = false\n\n contentLines.forEach(line => {\n if (reachedBlockBoundary) {\n blockLines.push(line)\n return\n }\n\n if (line.trim() === '') {\n reachedBlockBoundary = true\n blockLines.push(line)\n return\n }\n\n if (paragraphLines.length > 0 && isBlockContentLine(line)) {\n reachedBlockBoundary = true\n blockLines.push(line)\n return\n }\n\n paragraphLines.push(line)\n })\n\n return {\n paragraphLines,\n blockLines,\n }\n}\n\n/**\n * Collects all ordered list items from lines, parsing them into a flat array\n * with indentation information. Stops collecting continuation content when\n * encountering nested list items, allowing them to be processed separately.\n *\n * @param lines - Array of source lines to parse\n * @returns Tuple of [listItems array, number of lines consumed]\n */\nexport function collectOrderedListItems(lines: string[]): [OrderedListItem[], number] {\n const listItems: OrderedListItem[] = []\n let currentLineIndex = 0\n let consumed = 0\n\n while (currentLineIndex < lines.length) {\n const line = lines[currentLineIndex]\n const match = line.match(ORDERED_LIST_ITEM_REGEX)\n\n if (!match) {\n break\n }\n\n const [, indent, marker, _separator, content] = match\n const indentLevel = indent.length\n const number = parseInt(marker, 10)\n\n const markerType = isNaN(number) ? detectMarkerType(marker) : undefined\n const itemNumber = isNaN(number) ? markerToStart(marker) : number\n\n const itemContentLines = [content]\n let nextLineIndex = currentLineIndex + 1\n const itemLines = [line]\n let sawBlankLine = false\n\n // Collect continuation lines for this item (but NOT nested list items)\n while (nextLineIndex < lines.length) {\n const nextLine = lines[nextLineIndex]\n const nextMatch = nextLine.match(ORDERED_LIST_ITEM_REGEX)\n\n // If it's another list item (nested or not), stop collecting\n if (nextMatch) {\n break\n }\n\n // Check for continuation content (non-list content)\n if (nextLine.trim() === '') {\n // Empty line\n itemLines.push(nextLine)\n itemContentLines.push('')\n sawBlankLine = true\n nextLineIndex += 1\n } else if (nextLine.match(INDENTED_LINE_REGEX)) {\n // Indented content - part of this item (but not a list item).\n // Strip the indentation only up to the whitespace that is actually present,\n // so an under-indented line (e.g. a single leading space) keeps its first character.\n const leadingWhitespace = nextLine.length - nextLine.trimStart().length\n const contentIndent = indentLevel + marker.length + 1\n itemLines.push(nextLine)\n itemContentLines.push(nextLine.slice(Math.min(leadingWhitespace, contentIndent)))\n nextLineIndex += 1\n } else {\n if (sawBlankLine || interruptsLazyContinuation(nextLine)) {\n break\n }\n\n itemLines.push(nextLine)\n itemContentLines.push(nextLine)\n nextLineIndex += 1\n }\n }\n\n listItems.push({\n indent: indentLevel,\n number: itemNumber,\n type: markerType,\n content: itemContentLines.join('\\n').trim(),\n contentLines: itemContentLines,\n raw: itemLines.join('\\n'),\n })\n\n consumed = nextLineIndex\n currentLineIndex = nextLineIndex\n }\n\n return [listItems, consumed]\n}\n\nconst PLAIN_TEXT_ORDERED_LIST_LINE_REGEX = new RegExp(\n `^(${ORDERED_LIST_MARKER_PATTERN})([.)])\\\\s+(.+)$`,\n)\n\n/**\n * Parse plain-text pasted ordered list lines into JSONContent, or null if not a typed list.\n */\nexport function parsePlainTextOrderedListPaste(text: string): JSONContent | null {\n const lines = text.split('\\n').filter(l => l.trim().length > 0)\n\n if (lines.length === 0) {\n return null\n }\n\n const parsedItems: Array<{ marker: string; content: string }> = []\n\n for (const line of lines) {\n const match = line.trim().match(PLAIN_TEXT_ORDERED_LIST_LINE_REGEX)\n\n if (!match) {\n return null\n }\n\n parsedItems.push({\n marker: match[1],\n content: match[3],\n })\n }\n\n const markers = parsedItems.map(item => item.marker)\n\n if (!areOrderedListMarkersSequential(markers)) {\n return null\n }\n\n const attrs = buildOrderedListAttrsFromMarker(parsedItems[0].marker)\n\n return {\n type: 'orderedList',\n attrs,\n content: parsedItems.map(item => ({\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [{ type: 'text', text: item.content }],\n },\n ],\n })),\n }\n}\n\n/**\n * Recursively builds a nested structure from a flat array of list items\n * based on their indentation levels. Creates proper markdown tokens with\n * nested lists where appropriate.\n *\n * @param items - Flat array of list items with indentation info\n * @param baseIndent - The indentation level to process at this recursion level\n * @param lexer - Markdown lexer for parsing inline and block content\n * @returns Array of list_item tokens with proper nesting\n */\nexport function buildNestedStructure(\n items: OrderedListItem[],\n baseIndent: number,\n lexer: MarkdownLexerConfiguration,\n): unknown[] {\n const result: unknown[] = []\n let currentIndex = 0\n\n while (currentIndex < items.length) {\n const item = items[currentIndex]\n\n if (item.indent === baseIndent) {\n // This item belongs at the current level\n const { paragraphLines, blockLines } = splitItemContent(item.contentLines)\n const mainText = paragraphLines.join('\\n').trim()\n\n const tokens = []\n\n // Always wrap the main text in a paragraph token\n if (mainText) {\n tokens.push({\n type: 'paragraph',\n raw: mainText,\n tokens: lexer.inlineTokens(mainText),\n })\n }\n\n const additionalContent = blockLines.join('\\n').trim()\n if (additionalContent) {\n const blockTokens = lexer.blockTokens(additionalContent)\n tokens.push(...blockTokens)\n }\n\n // Look ahead to find nested items at deeper indent levels\n let lookAheadIndex = currentIndex + 1\n const nestedItems = []\n\n while (lookAheadIndex < items.length && items[lookAheadIndex].indent > baseIndent) {\n nestedItems.push(items[lookAheadIndex])\n lookAheadIndex += 1\n }\n\n // If we have nested items, recursively build their structure\n if (nestedItems.length > 0) {\n // Find the next indent level (immediate children)\n const nextIndent = Math.min(...nestedItems.map(nestedItem => nestedItem.indent))\n\n // Build the nested list recursively with all nested items\n // The recursive call will handle further nesting\n const nestedListItems = buildNestedStructure(nestedItems, nextIndent, lexer)\n\n // Create a nested list token\n tokens.push({\n type: 'list',\n ordered: true,\n start: nestedItems[0].number,\n typeMarker: nestedItems[0].type,\n items: nestedListItems,\n raw: nestedItems.map(nestedItem => nestedItem.raw).join('\\n'),\n })\n }\n\n result.push({\n type: 'list_item',\n raw: item.raw,\n tokens,\n })\n\n // Skip the nested items we just processed\n currentIndex = lookAheadIndex\n } else {\n // This item has deeper indent than we're currently processing\n // It should be handled by a recursive call\n currentIndex += 1\n }\n }\n\n return result\n}\n\n/**\n * Parses markdown list item tokens into Tiptap JSONContent structure,\n * ensuring text content is properly wrapped in paragraph nodes.\n *\n * @param items - Array of markdown tokens representing list items\n * @param helpers - Markdown parse helpers for recursive parsing\n * @returns Array of listItem JSONContent nodes\n */\nexport function parseListItems(\n items: MarkdownToken[],\n helpers: MarkdownParseHelpers,\n): JSONContent[] {\n return items.map(item => {\n if (item.type !== 'list_item') {\n return helpers.parseChildren([item])[0]\n }\n\n // Parse the tokens within the list item\n const content: JSONContent[] = []\n\n if (item.tokens && item.tokens.length > 0) {\n item.tokens.forEach(itemToken => {\n // If it's already a proper block node (paragraph, list, etc.), parse it directly\n if (\n itemToken.type === 'paragraph' ||\n itemToken.type === 'list' ||\n itemToken.type === 'blockquote' ||\n itemToken.type === 'code'\n ) {\n content.push(...helpers.parseChildren([itemToken]))\n } else if (itemToken.type === 'text' && itemToken.tokens) {\n // If it's inline text tokens, wrap them in a paragraph\n const inlineContent = helpers.parseChildren([itemToken])\n content.push({\n type: 'paragraph',\n content: inlineContent,\n })\n } else {\n // For any other content, try to parse it\n const parsed = helpers.parseChildren([itemToken])\n if (parsed.length > 0) {\n content.push(...parsed)\n }\n }\n })\n }\n\n return {\n type: 'listItem',\n content,\n }\n })\n}\n","import type { OrderedListItem } from './utils.js'\nimport { collectOrderedListItems, ORDERED_LIST_ITEM_REGEX } from './utils.js'\n\nconst ORDERED_LIST_SCAN_WINDOW = 64\n\n// Fewer than `max` lines means `source` ended.\nfunction takeLines(source: string, max: number): string[] {\n const lines: string[] = []\n let start = 0\n\n while (lines.length < max) {\n const lineEnd = source.indexOf('\\n', start)\n\n if (lineEnd === -1) {\n lines.push(source.slice(start))\n return lines\n }\n\n lines.push(source.slice(start, lineEnd))\n start = lineEnd + 1\n }\n\n return lines\n}\n\n/**\n * Collect ordered list items from the start of `source`, reading only the lines the list needs.\n *\n * @param source Markdown beginning at a block boundary.\n * @returns The items, how many lines they consumed, and the lines that were read.\n * @example\n * collectOrderedListItemsFromSource('1. one\\n2. two\\n\\nAfter')\n * // → [[item, item], 3, ['1. one', '2. two', '', 'After']]\n */\nexport function collectOrderedListItemsFromSource(\n source: string,\n): [OrderedListItem[], number, string[]] {\n const firstLineEnd = source.indexOf('\\n')\n const firstLine = firstLineEnd === -1 ? source : source.slice(0, firstLineEnd)\n\n // Every block start is offered here, so reject non-lists before reading further.\n if (!ORDERED_LIST_ITEM_REGEX.test(firstLine)) {\n return [[], 0, []]\n }\n\n let windowSize = ORDERED_LIST_SCAN_WINDOW\n let lines = takeLines(source, windowSize)\n let collected = collectOrderedListItems(lines)\n\n // Consuming the whole window means the list may continue past it.\n while (collected[1] === lines.length && lines.length === windowSize) {\n windowSize *= 2\n lines = takeLines(source, windowSize)\n collected = collectOrderedListItems(lines)\n }\n\n return [collected[0], collected[1], lines]\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Plugin } from '@tiptap/pm/state'\n\nimport { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nimport { collectOrderedListItemsFromSource } from './collectOrderedListItemsFromSource.js'\nimport { buildNestedStructure, parseListItems, parsePlainTextOrderedListPaste } from './utils.js'\n\nconst ListItemName = 'listItem'\nconst TextStyleName = 'textStyle'\n\nexport interface OrderedListOptions {\n /**\n * The node type name for list items.\n * @default 'listItem'\n * @example 'myListItem'\n */\n itemTypeName: string\n\n /**\n * The HTML attributes for an ordered list node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record\n\n /**\n * Keep the marks when splitting a list item.\n * @default false\n * @example true\n */\n keepMarks: boolean\n\n /**\n * Keep the attributes when splitting a list item.\n * @default false\n * @example true\n */\n keepAttributes: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n orderedList: {\n /**\n * Toggle an ordered list\n * @example editor.commands.toggleOrderedList()\n */\n toggleOrderedList: () => ReturnType\n }\n }\n}\n\n/**\n * Matches an ordered list to a 1. on input (or any number followed by a dot).\n */\nexport const orderedListInputRegex = /^(\\d+)\\.\\s$/\n\n/**\n * Maps CSS list-style-type values to HTML type attribute values.\n * Google Docs and Word often use CSS instead of the HTML type attribute.\n */\nfunction cssListStyleTypeToHtmlType(style: string): string | null {\n const match = style.match(/list-style-type\\s*:\\s*([^;]+)/i)\n if (!match) {\n return null\n }\n\n const cssValue = match[1].trim().toLowerCase()\n\n switch (cssValue) {\n case 'upper-roman':\n return 'I'\n case 'lower-roman':\n return 'i'\n case 'upper-alpha':\n case 'upper-latin':\n return 'A'\n case 'lower-alpha':\n case 'lower-latin':\n return 'a'\n default:\n return null\n }\n}\n\n/**\n * This extension allows you to create ordered lists.\n * This requires the ListItem extension\n * @see https://www.tiptap.dev/api/nodes/ordered-list\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nexport const OrderedList = Node.create({\n name: 'orderedList',\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n HTMLAttributes: {},\n keepMarks: false,\n keepAttributes: false,\n }\n },\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`\n },\n\n addAttributes() {\n return {\n start: {\n default: 1,\n parseHTML: element => {\n return element.hasAttribute('start')\n ? parseInt(element.getAttribute('start') || '', 10)\n : 1\n },\n },\n type: {\n default: null,\n parseHTML: element => {\n // 1. Check the HTML type attribute on
    \n const htmlType = element.getAttribute('type')\n if (htmlType) {\n return htmlType\n }\n\n // 2. Check CSS list-style-type on the
      element's style attribute\n const style = element.getAttribute('style')\n if (style) {\n const mappedFromOl = cssListStyleTypeToHtmlType(style)\n if (mappedFromOl) {\n return mappedFromOl\n }\n }\n\n // 3. Check the first
    1. child for list-style-type (Google Docs pattern)\n const firstLi = element.querySelector('li')\n if (firstLi) {\n const liStyle = firstLi.getAttribute('style')\n if (liStyle) {\n const mappedFromLi = cssListStyleTypeToHtmlType(liStyle)\n if (mappedFromLi) {\n return mappedFromLi\n }\n }\n }\n\n return null\n },\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'ol',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n const { start, type, ...attributesWithoutType } = HTMLAttributes\n\n const attrs = mergeAttributes(this.options.HTMLAttributes, attributesWithoutType)\n\n if (start !== 1) {\n attrs.start = start\n }\n\n if (type && type !== '1') {\n attrs.type = type\n }\n\n return ['ol', attrs, 0]\n },\n\n markdownTokenName: 'list',\n\n parseMarkdown: (token, helpers) => {\n if (token.type !== 'list' || !token.ordered) {\n return []\n }\n\n const startValue = token.start || 1\n const typeValue = token.typeMarker as string | undefined\n const content = token.items ? parseListItems(token.items, helpers) : []\n\n // Build attrs only when they differ from defaults\n const attrs: Record = {}\n\n if (startValue !== 1) {\n attrs.start = startValue\n }\n\n if (typeValue) {\n attrs.type = typeValue\n }\n\n if (Object.keys(attrs).length > 0) {\n return {\n type: 'orderedList',\n attrs,\n content,\n }\n }\n\n return {\n type: 'orderedList',\n content,\n }\n },\n\n renderMarkdown: (node, h) => {\n if (!node.content) {\n return ''\n }\n\n return h.renderChildren(node.content, '\\n')\n },\n\n markdownTokenizer: {\n name: 'orderedList',\n level: 'block',\n // marked already breaks paragraphs before a start-of-line list marker. It\n // probes this with `src.slice(1)`, so any marker it surfaces here is\n // mid-line (like the \"216)\" in \"(216) 555-1234\") and must not start a list.\n // We still define the callback so marked does not fall back to probing\n // `tokenize`, which would re-introduce the mid-line split.\n start: () => -1,\n tokenize: (src: string, _tokens, lexer) => {\n const [listItems, consumed, lines] = collectOrderedListItemsFromSource(src)\n\n if (listItems.length === 0) {\n return undefined\n }\n\n // buildNestedStructure() only includes an item when item.indent matches\n // the base indent it's given, so the base must be this list's own\n // indentation level (that of its first collected item, e.g. 1 for a\n // line with a single leading space) rather than always 0 — a nested\n // list is not necessarily flush with the start of the line.\n const items = buildNestedStructure(listItems, listItems[0].indent, lexer)\n\n if (items.length === 0) {\n return undefined\n }\n\n const startValue = listItems[0]?.number || 1\n const typeMarker = listItems[0]?.type\n\n return {\n type: 'list',\n ordered: true,\n start: startValue,\n typeMarker,\n items,\n raw: lines.slice(0, consumed).join('\\n'),\n } as unknown as object\n },\n },\n\n markdownOptions: {\n indentsContent: true,\n },\n\n addCommands() {\n return {\n toggleOrderedList:\n () =>\n ({ commands, chain }) => {\n if (this.options.keepAttributes) {\n return chain()\n .toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n .updateAttributes(ListItemName, this.editor.getAttributes(TextStyleName))\n .run()\n }\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-7': () => this.editor.commands.toggleOrderedList(),\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n props: {\n handlePaste: (view, event) => {\n const html = event.clipboardData?.getData('text/html')\n\n if (html?.trim()) {\n return false\n }\n\n const text = event.clipboardData?.getData('text/plain')\n\n if (!text) {\n return false\n }\n\n const orderedListContent = parsePlainTextOrderedListPaste(text)\n\n if (!orderedListContent) {\n return false\n }\n\n try {\n const orderedListNode = view.state.schema.nodeFromJSON(orderedListContent)\n const tr = view.state.tr.replaceSelectionWith(orderedListNode)\n\n view.dispatch(tr)\n\n return true\n } catch {\n return false\n }\n },\n },\n }),\n ]\n },\n\n addInputRules() {\n const joinPredicate = (match: RegExpMatchArray, node: ProseMirrorNode) => {\n // Only join if the existing list has a default type\n // (not a typed list like \"a\" or \"i\" which should stay separate)\n const hasDefaultType = !node.attrs.type || node.attrs.type === '1'\n\n return hasDefaultType && node.childCount + node.attrs.start === +match[1]\n }\n\n let inputRule = wrappingInputRule({\n find: orderedListInputRegex,\n type: this.type,\n getAttributes: match => ({ start: +match[1] }),\n joinPredicate,\n })\n\n if (this.options.keepMarks || this.options.keepAttributes) {\n inputRule = wrappingInputRule({\n find: orderedListInputRegex,\n type: this.type,\n keepMarks: this.options.keepMarks,\n keepAttributes: this.options.keepAttributes,\n getAttributes: match => ({ start: +match[1], ...this.editor.getAttributes(TextStyleName) }),\n joinPredicate,\n editor: this.editor,\n })\n }\n return [inputRule]\n },\n})\n","import type { KeyboardShortcutCommand } from '@tiptap/core'\nimport {\n getRenderedAttributes,\n mergeAttributes,\n Node,\n renderNestedMarkdownContent,\n wrappingInputRule,\n} from '@tiptap/core'\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { createBranchingListDeleteKeymap } from '../helpers/createBranchingListDeleteKeymap.js'\n\nexport interface TaskItemOptions {\n /**\n * A callback function that is called when the checkbox is clicked while the editor is in readonly mode.\n * @param node The prosemirror node of the task item\n * @param checked The new checked state\n * @returns boolean\n */\n onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean\n\n /**\n * Controls whether the task items can be nested or not.\n * @default false\n * @example true\n */\n nested: boolean\n\n /**\n * HTML attributes to add to the task item element.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record\n\n /**\n * The node type for taskList nodes\n * @default 'taskList'\n * @example 'myCustomTaskList'\n */\n taskListTypeName: string\n\n /**\n * Accessibility options for the task item.\n * @default {}\n * @example\n * ```js\n * {\n * checkboxLabel: (node) => `Task item: ${node.textContent || 'empty task item'}`\n * }\n */\n a11y?: {\n /**\n * The accessible label for the checkbox. Used as the aria-label on the input and as the\n * (visually hidden) text of the wrapping label element.\n * @param node The prosemirror node of the task item\n * @param checked The new checked state\n * @returns The accessible label for the checkbox\n * @example\n * ```js\n * TaskItem.configure({\n * a11y: {\n * checkboxLabel: node => `Task item: ${node.textContent || 'empty task item'}`,\n * },\n * })\n * ```\n */\n checkboxLabel?: (node: ProseMirrorNode, checked: boolean) => string\n }\n}\n\n/**\n * Matches a task item to a - [ ] on input.\n */\nexport const inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/\n\n/**\n * Hides the checkbox label visually while keeping it in the accessibility tree.\n */\nconst visuallyHiddenStyle =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0'\n\nconst getCheckboxLabel = (node: ProseMirrorNode, checked: boolean, a11y: TaskItemOptions['a11y']) =>\n a11y?.checkboxLabel?.(node, checked) ||\n `Task item checkbox for ${node.textContent || 'empty task item'}`\n\n/**\n * This extension allows you to create task items.\n * @see https://www.tiptap.dev/api/nodes/task-item\n */\nexport const TaskItem = Node.create({\n name: 'taskItem',\n\n addOptions() {\n return {\n nested: false,\n HTMLAttributes: {},\n taskListTypeName: 'taskList',\n a11y: undefined,\n }\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => {\n const dataChecked = element.getAttribute('data-checked')\n\n return dataChecked === '' || dataChecked === 'true'\n },\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n contentElement: element => element.querySelector('div') ?? element,\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n 'data-type': this.name,\n }),\n [\n 'label',\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs.checked ? 'checked' : null,\n },\n ],\n ['span'],\n ],\n ['div', 0],\n ]\n },\n\n parseMarkdown: (token, h) => {\n // Parse the task item's text content into paragraph content\n const content = []\n\n // First, add the main paragraph content\n if (token.tokens && token.tokens.length > 0) {\n // If we have tokens, create a paragraph with the inline content\n content.push(h.createNode('paragraph', {}, h.parseInline(token.tokens)))\n } else if (token.text) {\n // If we have raw text, create a paragraph with text node\n content.push(h.createNode('paragraph', {}, [h.createNode('text', { text: token.text })]))\n } else {\n // Fallback: empty paragraph\n content.push(h.createNode('paragraph', {}, []))\n }\n\n // Then, add any nested content (like nested task lists)\n if (token.nestedTokens && token.nestedTokens.length > 0) {\n const nestedContent = h.parseChildren(token.nestedTokens)\n content.push(...nestedContent)\n }\n\n return h.createNode('taskItem', { checked: token.checked || false }, content)\n },\n\n renderMarkdown: (node, h) => {\n const checkedChar = node.attrs?.checked ? 'x' : ' '\n const prefix = `- [${checkedChar}] `\n\n return renderNestedMarkdownContent(node, h, prefix)\n },\n\n addExtensions() {\n if (!this.options.nested) {\n return []\n }\n\n return [createBranchingListDeleteKeymap(this.name, [this.options.taskListTypeName])]\n },\n\n addKeyboardShortcuts() {\n const shortcuts: {\n [key: string]: KeyboardShortcutCommand\n } = {\n Enter: () => this.editor.commands.splitListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem(this.name),\n }\n },\n\n addNodeView() {\n return ({ node, HTMLAttributes, getPos, editor }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxStyler.style.cssText = visuallyHiddenStyle\n\n const updateA11Y = (currentNode: ProseMirrorNode) => {\n const label = getCheckboxLabel(currentNode, currentNode.attrs.checked, this.options.a11y)\n\n checkbox.setAttribute('aria-label', label)\n checkboxStyler.textContent = label\n }\n\n updateA11Y(node)\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('mousedown', event => event.preventDefault())\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable and we don't have a handler for\n // readonly checks we have to undo the latest change\n if (!editor.isEditable && !this.options.onReadOnlyChecked) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .command(({ tr }) => {\n const position = getPos()\n\n if (typeof position !== 'number') {\n return false\n }\n const currentNode = tr.doc.nodeAt(position)\n\n tr.setNodeMarkup(position, undefined, {\n ...currentNode?.attrs,\n checked,\n })\n\n return true\n })\n .run()\n }\n if (!editor.isEditable && this.options.onReadOnlyChecked) {\n // Reset state if onReadOnlyChecked returns false\n if (!this.options.onReadOnlyChecked(node, checked)) {\n checkbox.checked = !checkbox.checked\n }\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n checkbox.checked = node.attrs.checked\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object.entries(HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n // Track the keys of previously rendered HTML attributes for proper removal\n let prevRenderedAttributeKeys = new Set(Object.keys(HTMLAttributes))\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n checkbox.checked = updatedNode.attrs.checked\n updateA11Y(updatedNode)\n\n // Sync all HTML attributes from the updated node\n const extensionAttributes = editor.extensionManager.attributes\n const newHTMLAttributes = getRenderedAttributes(updatedNode, extensionAttributes)\n const newKeys = new Set(Object.keys(newHTMLAttributes))\n\n // Remove attributes that were previously rendered but are no longer present\n // If the attribute exists in static options, restore it instead of removing\n const staticAttrs = this.options.HTMLAttributes\n\n prevRenderedAttributeKeys.forEach(key => {\n if (!newKeys.has(key)) {\n if (key in staticAttrs) {\n listItem.setAttribute(key, staticAttrs[key])\n } else {\n listItem.removeAttribute(key)\n }\n }\n })\n\n // Update or add new attributes\n Object.entries(newHTMLAttributes).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n // If the attribute exists in static options, restore it instead of removing\n if (key in staticAttrs) {\n listItem.setAttribute(key, staticAttrs[key])\n } else {\n listItem.removeAttribute(key)\n }\n } else {\n listItem.setAttribute(key, value)\n }\n })\n\n // Update the tracked keys for next update\n prevRenderedAttributeKeys = newKeys\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n","import { mergeAttributes, Node, parseIndentedBlocks } from '@tiptap/core'\n\nexport interface TaskListOptions {\n /**\n * The node type name for a task item.\n * @default 'taskItem'\n * @example 'myCustomTaskItem'\n */\n itemTypeName: string\n\n /**\n * The HTML attributes for a task list node.\n * @default {}\n * @example { class: 'foo' }\n */\n HTMLAttributes: Record\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n taskList: {\n /**\n * Toggle a task list\n * @example editor.commands.toggleTaskList()\n */\n toggleTaskList: () => ReturnType\n }\n }\n}\n\n/**\n * This extension allows you to create task lists.\n * @see https://www.tiptap.dev/api/nodes/task-list\n */\nexport const TaskList = Node.create({\n name: 'taskList',\n\n addOptions() {\n return {\n itemTypeName: 'taskItem',\n HTMLAttributes: {},\n }\n },\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`\n },\n\n parseHTML() {\n return [\n {\n tag: `ul[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'ul',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': this.name }),\n 0,\n ]\n },\n\n parseMarkdown: (token, h) => {\n return h.createNode('taskList', {}, h.parseChildren(token.items || []))\n },\n\n renderMarkdown: (node, h) => {\n if (!node.content) {\n return ''\n }\n\n return h.renderChildren(node.content, '\\n')\n },\n\n markdownTokenizer: {\n name: 'taskList',\n level: 'block',\n start(src) {\n // Look for the start of a task list item\n const index = src.match(/^\\s*[-+*]\\s+\\[([ xX])\\]\\s+/)?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, tokens, lexer) {\n // Helper function to recursively parse task lists\n const parseTaskListContent = (content: string): any[] | undefined => {\n const nestedResult = parseIndentedBlocks(\n content,\n {\n itemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n extractItemData: match => ({\n indentLevel: match[1].length,\n mainContent: match[4],\n checked: match[3].toLowerCase() === 'x',\n }),\n createToken: (data, nestedTokens) => ({\n type: 'taskItem',\n raw: '',\n mainContent: data.mainContent,\n indentLevel: data.indentLevel,\n checked: data.checked,\n text: data.mainContent,\n tokens: lexer.inlineTokens(data.mainContent),\n nestedTokens,\n }),\n // Allow recursive nesting\n customNestedParser: parseTaskListContent,\n },\n lexer,\n )\n\n if (nestedResult) {\n const taskListToken = {\n type: 'taskList',\n raw: nestedResult.raw,\n items: nestedResult.items,\n }\n\n // parseIndentedBlocks only consumes checkbox items.\n // Parse any remaining indented content, such as plain bullets,\n // and keep it as sibling tokens.\n const remainder = content.slice(nestedResult.raw.length)\n if (remainder.trim()) {\n return [taskListToken, ...lexer.blockTokens(remainder)]\n }\n\n return [taskListToken]\n }\n\n // Fall back to regular markdown parsing if not a task list\n return lexer.blockTokens(content)\n }\n\n const result = parseIndentedBlocks(\n src,\n {\n itemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n extractItemData: match => ({\n indentLevel: match[1].length,\n mainContent: match[4],\n checked: match[3].toLowerCase() === 'x',\n }),\n createToken: (data, nestedTokens) => ({\n type: 'taskItem',\n raw: '',\n mainContent: data.mainContent,\n indentLevel: data.indentLevel,\n checked: data.checked,\n text: data.mainContent,\n tokens: lexer.inlineTokens(data.mainContent),\n nestedTokens,\n }),\n // Use the recursive parser for nested content\n customNestedParser: parseTaskListContent,\n },\n lexer,\n )\n\n if (!result) {\n return undefined\n }\n\n return {\n type: 'taskList',\n raw: result.raw,\n items: result.items,\n }\n },\n },\n\n markdownOptions: {\n indentsContent: true,\n },\n\n addCommands() {\n return {\n toggleTaskList:\n () =>\n ({ commands }) => {\n return commands.toggleList(this.name, this.options.itemTypeName)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-9': () => this.editor.commands.toggleTaskList(),\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nimport type { BulletListOptions } from '../bullet-list/index.js'\nimport { BulletList } from '../bullet-list/index.js'\nimport type { ListItemOptions } from '../item/index.js'\nimport { ListItem } from '../item/index.js'\nimport type { ListKeymapOptions } from '../keymap/index.js'\nimport { ListKeymap } from '../keymap/index.js'\nimport type { OrderedListOptions } from '../ordered-list/index.js'\nimport { OrderedList } from '../ordered-list/index.js'\nimport type { TaskItemOptions } from '../task-item/index.js'\nimport { TaskItem } from '../task-item/index.js'\nimport type { TaskListOptions } from '../task-list/index.js'\nimport { TaskList } from '../task-list/index.js'\n\nexport interface ListKitOptions {\n /**\n * If set to false, the bulletList extension will not be registered\n * @example table: false\n */\n bulletList: Partial | false\n /**\n * If set to false, the listItem extension will not be registered\n */\n listItem: Partial | false\n /**\n * If set to false, the listKeymap extension will not be registered\n */\n listKeymap: Partial | false\n /**\n * If set to false, the orderedList extension will not be registered\n */\n orderedList: Partial | false\n /**\n * If set to false, the taskItem extension will not be registered\n */\n taskItem: Partial | false\n /**\n * If set to false, the taskList extension will not be registered\n */\n taskList: Partial | false\n}\n\n/**\n * The table kit is a collection of table editor extensions.\n *\n * It’s a good starting point for building your own table in Tiptap.\n */\nexport const ListKit = Extension.create({\n name: 'listKit',\n\n addExtensions() {\n const extensions = []\n\n if (this.options.bulletList !== false) {\n extensions.push(BulletList.configure(this.options.bulletList))\n }\n\n if (this.options.listItem !== false) {\n extensions.push(ListItem.configure(this.options.listItem))\n }\n\n if (this.options.listKeymap !== false) {\n extensions.push(ListKeymap.configure(this.options.listKeymap))\n }\n\n if (this.options.orderedList !== false) {\n extensions.push(OrderedList.configure(this.options.orderedList))\n }\n\n if (this.options.taskItem !== false) {\n extensions.push(TaskItem.configure(this.options.taskItem))\n }\n\n if (this.options.taskList !== false) {\n extensions.push(TaskList.configure(this.options.taskList))\n }\n\n return extensions\n },\n})\n"],"mappings":"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"}