{"version":3,"file":"index.cjs","names":["Fragment","Extension","Node","mergeAttributes","renderNestedMarkdownContent"],"sources":["../../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"],"sourcesContent":["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"],"mappings":"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"}