{"version":3,"file":"index.cjs","names":["ListItemName","TextStyleName","Node","mergeAttributes","wrappingInputRule","Fragment","Extension","Node","mergeAttributes","renderNestedMarkdownContent","getNodeType","getNodeAtPosition","isNodeActive","isAtStartOfNode","isNodeActive","isAtEndOfNode","isNodeActive","getPreviousBlockSibling","Fragment","TextSelection","getNodeType","Extension","Node","mergeAttributes","Plugin","wrappingInputRule","Node","mergeAttributes","renderNestedMarkdownContent","getRenderedAttributes","wrappingInputRule","Node","mergeAttributes","parseIndentedBlocks","Extension"],"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/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<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 { 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<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 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      { 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<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","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 { 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 { 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","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"],"mappings":"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"}