{"version":3,"sources":["../../src/kit/index.ts","../../src/bullet-list/bullet-list.ts","../../src/item/list-item.ts","../../src/helpers/createBranchingListDeleteKeymap.ts","../../src/helpers/hoistBranchingNestedList.ts","../../src/helpers/getBranchingNestedListAtCursor.ts","../../src/helpers/handleDeleteBranchingNestedList.ts","../../src/ordered-list/roman.ts","../../src/keymap/list-keymap.ts","../../src/keymap/listHelpers/index.ts","../../src/keymap/listHelpers/findListItemPos.ts","../../src/keymap/listHelpers/getNextListDepth.ts","../../src/keymap/listHelpers/handleBackspace.ts","../../src/keymap/listHelpers/hasListBefore.ts","../../src/keymap/listHelpers/handleDelete.ts","../../src/keymap/listHelpers/nextListIsDeeper.ts","../../src/keymap/listHelpers/nextListIsHigher.ts","../../src/keymap/listHelpers/handleTab.ts","../../src/keymap/listHelpers/hasListItemAfter.ts","../../src/keymap/listHelpers/hasListItemBefore.ts","../../src/keymap/listHelpers/listItemHasSubList.ts","../../src/ordered-list/ordered-list.ts","../../src/ordered-list/utils.ts","../../src/task-item/task-item.ts","../../src/task-list/task-list.ts"],"sourcesContent":["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<BulletListOptions> | false\n  /**\n   * If set to false, the listItem extension will not be registered\n   */\n  listItem: Partial<ListItemOptions> | false\n  /**\n   * If set to false, the listKeymap extension will not be registered\n   */\n  listKeymap: Partial<ListKeymapOptions> | false\n  /**\n   * If set to false, the orderedList extension will not be registered\n   */\n  orderedList: Partial<OrderedListOptions> | false\n  /**\n   * If set to false, the taskItem extension will not be registered\n   */\n  taskItem: Partial<TaskItemOptions> | false\n  /**\n   * If set to false, the taskList extension will not be registered\n   */\n  taskList: Partial<TaskListOptions> | 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<ListKitOptions>({\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","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<string, any>\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<ReturnType> {\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<BulletListOptions>({\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 { 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<string, any>\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<ListItemOptions>({\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    )\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 { 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","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 { 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 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","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<string, string | number> {\n  const { type, start } = parseListMarker(marker)\n  const attrs: Record<string, string | number> = {}\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 { 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<ListKeymapOptions>({\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","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 { 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 { 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\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 { 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 { 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 { 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","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 {\n  buildNestedStructure,\n  collectOrderedListItems,\n  parseListItems,\n  parsePlainTextOrderedListPaste,\n} 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<string, any>\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<ReturnType> {\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<OrderedListOptions>({\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 <ol>\n          const htmlType = element.getAttribute('type')\n          if (htmlType) {\n            return htmlType\n          }\n\n          // 2. Check CSS list-style-type on the <ol> 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 <li> 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<string, unknown> = {}\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 lines = src.split('\\n')\n      const [listItems, consumed] = collectOrderedListItems(lines)\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 {\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 { 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<string, any>\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<TaskItemOptions>({\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<string, any>\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\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<TaskListOptions>({\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"],"mappings":"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","names":["import_core","import_core","import_core","handleDelete","import_core","import_core","import_core","import_core","import_core","import_core","import_model","import_core","import_state","import_core","ListItemName","TextStyleName","import_core","import_core"]}