@pstdio/ui 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/{MermaidComponent-BVMyKttu.js → MermaidComponent-D92GMhht.js} +3 -3
  2. package/dist/{MermaidComponent-BVMyKttu.js.map → MermaidComponent-D92GMhht.js.map} +1 -1
  3. package/dist/chat-ui.d.ts +2 -0
  4. package/dist/chat-ui.js +2 -2
  5. package/dist/components/data-table/build-columns.d.ts +1 -0
  6. package/dist/components/data-table/data-table-column-menu.d.ts +2 -0
  7. package/dist/components/data-table/data-table-row-display.d.ts +11 -0
  8. package/dist/components/data-table/data-table-table-parts.d.ts +1 -0
  9. package/dist/components/data-table/edit-mode-data-table-body.d.ts +1 -0
  10. package/dist/components/data-table/edit-mode-data-table-cell.d.ts +1 -0
  11. package/dist/components/data-table/edit-mode-data-table-header.d.ts +1 -0
  12. package/dist/components/diff-viewer/code-editor.d.ts +8 -2
  13. package/dist/components/kanban-renderer/collection-badge.d.ts +7 -0
  14. package/dist/components/kanban-renderer/index.d.ts +1 -1
  15. package/dist/components/kanban-renderer/kanban-renderer-helpers.d.ts +2 -1
  16. package/dist/components/kanban-renderer/types.d.ts +20 -1
  17. package/dist/components/list-row/list-row-content.d.ts +1 -0
  18. package/dist/components/param-editor/param-editor-presentation.d.ts +1 -1
  19. package/dist/components/param-editor/param-editor.types.d.ts +5 -193
  20. package/dist/components/rich-text/shared/markdown-ast.d.ts +1 -0
  21. package/dist/components/rich-text/shared/markdown-source-document.d.ts +7 -0
  22. package/dist/components/rich-text/shared/markdown-source-links.d.ts +11 -0
  23. package/dist/components/rich-text/shared/markdown-source-map.d.ts +10 -0
  24. package/dist/components/rich-text/utils/inferResourceType.d.ts +1 -1
  25. package/dist/components/tag-editor/tag-editor-row.d.ts +1 -1
  26. package/dist/components/tag-editor/tag-editor.types.d.ts +12 -0
  27. package/dist/components/tag-editor/tag-settings-panel.d.ts +1 -1
  28. package/dist/components/tree-list/tree-list-drag-provider.d.ts +13 -0
  29. package/dist/components/tree-list/tree-list-order.store.d.ts +4 -1
  30. package/dist/components/tree-list/tree-list-reorder.d.ts +14 -3
  31. package/dist/components/tree-list/tree-list-sortable.d.ts +2 -0
  32. package/dist/components/tree-list/tree-list-visibility-filter.d.ts +2 -2
  33. package/dist/components/tree-list/tree-list.d.ts +3 -0
  34. package/dist/components/tree-list/tree-list.types.d.ts +4 -0
  35. package/dist/data-table.d.ts +2 -0
  36. package/dist/data-table.js +806 -793
  37. package/dist/data-table.js.map +1 -1
  38. package/dist/diff.d.ts +2 -0
  39. package/dist/diff.js +529 -533
  40. package/dist/diff.js.map +1 -1
  41. package/dist/edit-mode-data-table-DGgRuSW3.js +846 -0
  42. package/dist/edit-mode-data-table-DGgRuSW3.js.map +1 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +1516 -1413
  45. package/dist/index.js.map +1 -1
  46. package/dist/{kanban-renderer-toolbar-CpegGbwq.js → kanban-renderer-toolbar-Bl8xXdwU.js} +527 -469
  47. package/dist/kanban-renderer-toolbar-Bl8xXdwU.js.map +1 -0
  48. package/dist/kanban-renderer.d.ts +2 -0
  49. package/dist/kanban-renderer.js +21 -21
  50. package/dist/kanban-renderer.js.map +1 -1
  51. package/dist/lazy-markdown-editor-CCOchoJX.js +235 -0
  52. package/dist/lazy-markdown-editor-CCOchoJX.js.map +1 -0
  53. package/dist/list-row-DCgdza1i.js +812 -0
  54. package/dist/list-row-DCgdza1i.js.map +1 -0
  55. package/dist/markdown-CASvn1Z2.js +1643 -0
  56. package/dist/markdown-CASvn1Z2.js.map +1 -0
  57. package/dist/markdown-editor-C4GCyebp.js +1019 -0
  58. package/dist/markdown-editor-C4GCyebp.js.map +1 -0
  59. package/dist/{mermaid-renderer-H3IhLqnQ.js → mermaid-renderer-CVnuKs-A.js} +2 -2
  60. package/dist/{mermaid-renderer-H3IhLqnQ.js.map → mermaid-renderer-CVnuKs-A.js.map} +1 -1
  61. package/dist/mermaid.d.ts +2 -0
  62. package/dist/mermaid.js +1 -1
  63. package/dist/monaco-browser-CgvlArN7.js +21 -0
  64. package/dist/monaco-browser-CgvlArN7.js.map +1 -0
  65. package/dist/{param-editor-B8Ff9Nm8.js → param-editor-CkDq623X.js} +2 -2
  66. package/dist/{param-editor-B8Ff9Nm8.js.map → param-editor-CkDq623X.js.map} +1 -1
  67. package/dist/param-editor-field-DRgbnL7-.js +2809 -0
  68. package/dist/param-editor-field-DRgbnL7-.js.map +1 -0
  69. package/dist/rich-message-DARuDVOX.js +628 -0
  70. package/dist/{rich-message-DdFYRzTo.js.map → rich-message-DARuDVOX.js.map} +1 -1
  71. package/dist/rich-text.d.ts +2 -0
  72. package/dist/rich-text.js +48 -47
  73. package/dist/rich-text.js.map +1 -1
  74. package/dist/style.css +1 -1
  75. package/dist/terminal.d.ts +2 -0
  76. package/dist/theme/primitives/sizes.d.ts +9 -0
  77. package/dist/{theme-BH4fSst9.js → theme-B-l5_a6F.js} +69 -50
  78. package/dist/theme-B-l5_a6F.js.map +1 -0
  79. package/dist/theme-preference-Bpobguh4.js +114 -0
  80. package/dist/theme-preference-Bpobguh4.js.map +1 -0
  81. package/dist/theme.d.ts +2 -0
  82. package/dist/theme.js +1 -1
  83. package/dist/tree-list-AlO5ZmxQ.js +1262 -0
  84. package/dist/tree-list-AlO5ZmxQ.js.map +1 -0
  85. package/dist/utils/theme-preference.d.ts +4 -1
  86. package/dist/workspace-badge-BR_GgsAG.js +175 -0
  87. package/dist/workspace-badge-BR_GgsAG.js.map +1 -0
  88. package/package.json +5 -42
  89. package/dist/dialog-accept-shortcut-DAEBsoWW.js +0 -7
  90. package/dist/dialog-accept-shortcut-DAEBsoWW.js.map +0 -1
  91. package/dist/edit-mode-data-table-D6NeiDJx.js +0 -775
  92. package/dist/edit-mode-data-table-D6NeiDJx.js.map +0 -1
  93. package/dist/editor-config-D9OksZ93.js +0 -2416
  94. package/dist/editor-config-D9OksZ93.js.map +0 -1
  95. package/dist/kanban-renderer-toolbar-CpegGbwq.js.map +0 -1
  96. package/dist/lazy-markdown-editor-B7uP2ALS.js +0 -26
  97. package/dist/lazy-markdown-editor-B7uP2ALS.js.map +0 -1
  98. package/dist/list-row-9oxy-F0v.js +0 -796
  99. package/dist/list-row-9oxy-F0v.js.map +0 -1
  100. package/dist/monaco-browser-CO0NxK_Z.js +0 -19
  101. package/dist/monaco-browser-CO0NxK_Z.js.map +0 -1
  102. package/dist/number-input-WUfejtNx.js +0 -343
  103. package/dist/number-input-WUfejtNx.js.map +0 -1
  104. package/dist/param-editor-field-Cu4pto_a.js +0 -2845
  105. package/dist/param-editor-field-Cu4pto_a.js.map +0 -1
  106. package/dist/rich-message-DdFYRzTo.js +0 -658
  107. package/dist/theme-BH4fSst9.js.map +0 -1
  108. package/dist/theme-preference-DyymrYpR.js +0 -123
  109. package/dist/theme-preference-DyymrYpR.js.map +0 -1
  110. package/dist/tree-list-uV4UFj0x.js +0 -1116
  111. package/dist/tree-list-uV4UFj0x.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-CASvn1Z2.js","sources":["../src/components/rich-text/shared/components/content-editable.tsx","../src/components/rich-text/markdown-editor/plugins/ReferenceLinkPlugin/ReferenceLinkNode.tsx","../src/components/rich-text/markdown-editor/plugins/ReferenceLinkPlugin/ReferenceLinkTransformer.ts","../src/components/rich-text/theme/rich-text-theme.tsx","../src/components/rich-text/shared/markdown-ast.ts","../src/components/rich-text/shared/markdown-url.ts","../src/components/rich-text/shared/markdown-url-context.tsx","../src/components/rich-text/shared/nodes/MarkdownImageNode.tsx","../src/components/rich-text/shared/nodes/RawHtmlNode.tsx","../src/components/rich-text/shared/markdown-inline.tsx","../src/components/rich-text/shared/nodes/DataTableNode.tsx","../src/components/rich-text/shared/nodes/MarkdownLinkNode.ts","../src/components/rich-text/shared/plugins/EquationPlugin/EquationNode.tsx","../src/components/rich-text/shared/plugins/EquationPlugin/EquationPlugin.tsx","../src/components/rich-text/shared/plugins/HorizontalRulePlugin/HorizontalRuleNode.ts","../src/components/rich-text/shared/plugins/MermaidPlugin/MermaidNode.tsx","../src/components/rich-text/shared/plugins/HorizontalRulePlugin/horizontalRule.ts","../src/components/rich-text/shared/transformers/markdown-transformers.ts","../src/components/rich-text/shared/editor-config.ts","../src/components/rich-text/shared/plugins/CodePlugin/CodeBlockPlugin.tsx","../src/components/rich-text/shared/plugins/CodePlugin/CodeHighlightingPlugin.tsx","../src/components/rich-text/shared/markdown-export.ts","../src/components/rich-text/shared/markdown-import.ts","../src/components/rich-text/shared/markdown-source-links.ts","../src/components/rich-text/shared/markdown-source-map.ts","../src/components/rich-text/shared/markdown-source-document.ts","../src/components/rich-text/shared/plugins/ToggleEditablePlugin.tsx","../src/components/rich-text/shared/plugins/TreeViewPlugin/TreeViewPlugin.tsx","../src/components/rich-text/utils/markdown.ts"],"sourcesContent":["import { Box, chakra } from \"@chakra-ui/react\";\nimport { ContentEditable as LexicalContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\n\nconst StyledEditable = chakra(LexicalContentEditable);\n\ninterface ContentEditableProps {\n onRef?: (elem: HTMLDivElement) => void;\n fullWidth?: boolean;\n padding?: string;\n isRichMessage?: boolean;\n scrollable?: boolean;\n}\n\nexport function ContentEditable({\n onRef,\n fullWidth = false,\n padding,\n isRichMessage = false,\n scrollable = true,\n}: ContentEditableProps) {\n const editor = (\n <Box ref={onRef} width=\"100%\" minH=\"100%\" padding={padding}>\n <StyledEditable\n data-testid=\"content-editable\"\n height=\"fit-content\"\n minH=\"100%\"\n width=\"100%\"\n maxWidth={fullWidth ? \"100%\" : \"45rem\"}\n marginInline={fullWidth ? \"0\" : \"auto\"}\n textStyle=\"paragraph/M/regular\"\n fontSize=\"calc(var(--chakra-font-sizes-md) * var(--rich-text-font-scale))\"\n position=\"relative\"\n outline=\"none\"\n />\n </Box>\n );\n\n if (!scrollable) return editor;\n\n return (\n <ScrollArea\n className=\"rich-text\"\n data-rich-message={isRichMessage ? \"true\" : undefined}\n height=\"100%\"\n minH=\"0\"\n position=\"relative\"\n contentProps={{ width: \"100%\", minH: \"100%\" }}\n >\n {editor}\n </ScrollArea>\n );\n}\n","import { Box } from \"@chakra-ui/react\";\nimport {\n DecoratorNode,\n type EditorConfig,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from \"lexical\";\nimport type { ReactElement } from \"react\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\n\nexport type SerializedReferenceLinkNode = Spread<\n {\n href: string;\n label?: string;\n },\n SerializedLexicalNode\n>;\n\nexport class ReferenceLinkNode extends DecoratorNode<ReactElement> {\n __href: string;\n __label?: string;\n\n static getType(): string {\n return \"reference-link\";\n }\n\n static clone(node: ReferenceLinkNode): ReferenceLinkNode {\n return new ReferenceLinkNode(node.__href, node.__label, node.__key);\n }\n\n constructor(href: string, label?: string, key?: NodeKey) {\n super(key);\n this.__href = href;\n this.__label = label;\n }\n\n createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement {\n return document.createElement(\"span\");\n }\n\n updateDOM(_prevNode: ReferenceLinkNode, _dom: HTMLElement, _config: EditorConfig): boolean {\n return false;\n }\n\n getTextContent(): string {\n const label = this.__label ?? this.__href;\n return `{{link('${label}')}}`;\n }\n\n exportJSON(): SerializedReferenceLinkNode {\n return {\n type: ReferenceLinkNode.getType(),\n version: 1,\n href: this.__href,\n label: this.__label,\n };\n }\n\n static importJSON(serializedNode: SerializedReferenceLinkNode): ReferenceLinkNode {\n return $createReferenceLinkNode(serializedNode.href, serializedNode.label);\n }\n\n decorate(_editor: LexicalEditor, _config: EditorConfig): ReactElement {\n const href = this.__href;\n const fileName = href.split(\"/\").pop();\n const label = fileName || \"unknown\";\n const isExternal = /^https?:\\/\\//i.test(href);\n const isProjectFile = /^#?\\$PROJECT\\//i.test(href);\n\n return (\n <Box width=\"fit-content\" display=\"inline-block\">\n <ResourceBadge\n fileName={label}\n onSelect={() => {\n if (isExternal) {\n window.open(href, \"_blank\", \"noopener,noreferrer\");\n } else if (isProjectFile) {\n const projectPath = href.replace(/^#?\\$PROJECT\\//i, \"\");\n const event = new CustomEvent(\"ui:open-project-file\", { detail: projectPath });\n window.dispatchEvent(event);\n } else {\n window.location.assign(href);\n }\n }}\n />\n </Box>\n );\n }\n}\n\nexport function $createReferenceLinkNode(href: string, label?: string): ReferenceLinkNode {\n return new ReferenceLinkNode(href, label);\n}\n\nexport function $isReferenceLinkNode(node: LexicalNode | null | undefined): node is ReferenceLinkNode {\n return node instanceof ReferenceLinkNode;\n}\n","import type { TextMatchTransformer } from \"@lexical/markdown\";\nimport { $createReferenceLinkNode, $isReferenceLinkNode, ReferenceLinkNode } from \"./ReferenceLinkNode\";\n\n// Matches {{link('xxx')}} or {{ link(\"xxx\") }}\nconst LINK_REGEXP = /\\{\\{\\s*link\\((['\"])([^'\"\\s]+)\\1\\)\\s*\\}\\}/;\n\nexport const REFERENCE_LINK_TRANSFORMER: TextMatchTransformer = {\n dependencies: [ReferenceLinkNode],\n export: (node) => {\n if ($isReferenceLinkNode(node)) {\n const href = (node as ReferenceLinkNode).__href;\n const label = (node as ReferenceLinkNode).__label ?? href;\n // Export back to token form so markdown roundtrips\n if (label) {\n return `{{link('${label}')}}`;\n }\n return `{{link('${href}')}}`;\n }\n return null;\n },\n regExp: LINK_REGEXP,\n importRegExp: LINK_REGEXP,\n replace: (textNode, match) => {\n const value = match[2];\n // For now we assume value is both label and href; if it looks like a URL, use as href.\n const looksLikeUrl = /^(https?:\\/\\/|\\/)/i.test(value);\n const href = looksLikeUrl ? value : `#${value}`;\n const label = value;\n textNode.replace($createReferenceLinkNode(href, label));\n },\n type: \"text-match\",\n};\n","import type { EditorThemeClasses } from \"lexical\";\n\nimport \"./rich-text-theme.css\";\n\nconst theme: EditorThemeClasses = {\n code: \"rich-text__code\",\n codeHighlight: {\n atrule: \"rich-text__tokenAttr\",\n attr: \"rich-text__tokenAttr\",\n boolean: \"rich-text__tokenProperty\",\n builtin: \"rich-text__tokenSelector\",\n cdata: \"rich-text__tokenComment\",\n char: \"rich-text__tokenSelector\",\n class: \"rich-text__tokenFunction\",\n \"class-name\": \"rich-text__tokenFunction\",\n comment: \"rich-text__tokenComment\",\n constant: \"rich-text__tokenProperty\",\n deleted: \"rich-text__tokenProperty\",\n doctype: \"rich-text__tokenComment\",\n entity: \"rich-text__tokenOperator\",\n function: \"rich-text__tokenFunction\",\n important: \"rich-text__tokenVariable\",\n inserted: \"rich-text__tokenSelector\",\n keyword: \"rich-text__tokenAttr\",\n namespace: \"rich-text__tokenVariable\",\n number: \"rich-text__tokenProperty\",\n operator: \"rich-text__tokenOperator\",\n prolog: \"rich-text__tokenComment\",\n property: \"rich-text__tokenProperty\",\n punctuation: \"rich-text__tokenPunctuation\",\n regex: \"rich-text__tokenVariable\",\n selector: \"rich-text__tokenSelector\",\n string: \"rich-text__tokenSelector\",\n symbol: \"rich-text__tokenProperty\",\n tag: \"rich-text__tokenProperty\",\n url: \"rich-text__tokenOperator\",\n variable: \"rich-text__tokenVariable\",\n },\n embedBlock: {\n base: \"rich-text__embedBlock\",\n focus: \"rich-text__embedBlockFocus\",\n },\n list: {\n checklist: \"rich-text__checklist\",\n listitem: \"rich-text__listItem\",\n listitemChecked: \"rich-text__listItemChecked\",\n listitemUnchecked: \"rich-text__listItemUnchecked\",\n nested: {\n listitem: \"rich-text__nestedListItem\",\n },\n olDepth: [\"rich-text__ol1\", \"rich-text__ol2\", \"rich-text__ol3\", \"rich-text__ol4\", \"rich-text__ol5\"],\n ol: \"rich-text__ol\",\n ul: \"rich-text__ul\",\n },\n heading: {\n h1: \"rich-text__h1\",\n h2: \"rich-text__h2\",\n h3: \"rich-text__h3\",\n },\n paragraph: \"rich-text__p\",\n text: {\n underline: \"rich-text__textUnderline\",\n italic: \"rich-text__textItalic\",\n code: \"rich-text__textCode\",\n },\n link: \"rich-text__link\",\n quote: \"rich-text__quote\",\n reference: \"rich-text__reference\",\n table: \"rich-text__table\",\n tableCell: \"rich-text__tableCell\",\n tableRow: \"rich-text__tableRow\",\n tableCellHeader: \"rich-text__tableCellHeader\",\n layoutContainer: \"rich-text__layoutContainer\",\n layoutItem: \"rich-text__layoutItem\",\n draggableBlockDemo: {\n row: \"rich-text__row\",\n content: \"rich-text__content\",\n },\n};\n\nexport default theme;\n","import type { Paragraph, PhrasingContent, Root, RootContent } from \"mdast\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfmFromMarkdown, gfmToMarkdown } from \"mdast-util-gfm\";\nimport { mathFromMarkdown, mathToMarkdown } from \"mdast-util-math\";\nimport { toMarkdown } from \"mdast-util-to-markdown\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport { math } from \"micromark-extension-math\";\n\nconst parserOptions = {\n extensions: [gfm(), math()],\n mdastExtensions: [gfmFromMarkdown(), mathFromMarkdown()],\n};\n\nconst serializerOptions = {\n bullet: \"-\" as const,\n emphasis: \"*\" as const,\n extensions: [gfmToMarkdown(), mathToMarkdown()],\n fence: \"`\" as const,\n fences: true,\n listItemIndent: \"one\" as const,\n rule: \"-\" as const,\n strong: \"*\" as const,\n};\n\nconst fenceStart = (line: string) => line.match(/^ {0,3}(`{3,}|~{3,})/);\n\nconst normalizeLegacyInlineMath = (line: string) => {\n let codeFenceLength: number | null = null;\n let result = \"\";\n\n for (let index = 0; index < line.length; ) {\n if (line[index] === \"`\") {\n let end = index;\n while (line[end] === \"`\") end += 1;\n const length = end - index;\n\n if (codeFenceLength === null) codeFenceLength = length;\n else if (codeFenceLength === length) codeFenceLength = null;\n\n result += line.slice(index, end);\n index = end;\n continue;\n }\n\n const delimiter = line.slice(index, index + 2);\n if (codeFenceLength === null && (delimiter === \"\\\\(\" || delimiter === \"\\\\)\")) {\n result += \"$\";\n index += 2;\n continue;\n }\n if (codeFenceLength === null && (delimiter === \"\\\\[\" || delimiter === \"\\\\]\")) {\n result += \"$$\";\n index += 2;\n continue;\n }\n\n result += line[index];\n index += 1;\n }\n\n return result;\n};\n\nconst normalizeLegacyMath = (markdown: string) => {\n let fencedCode: { character: string; length: number } | null = null;\n const normalized: string[] = [];\n\n for (const line of markdown.split(\"\\n\")) {\n if (fencedCode) {\n normalized.push(line);\n const closingFence = line.match(/^ {0,3}(`+|~+)[ \\t]*$/)?.[1];\n if (closingFence?.[0] === fencedCode.character && closingFence.length >= fencedCode.length) {\n fencedCode = null;\n }\n continue;\n }\n\n const openingFence = fenceStart(line)?.[1];\n if (openingFence) {\n fencedCode = { character: openingFence[0] ?? \"`\", length: openingFence.length };\n normalized.push(line);\n continue;\n }\n\n const displayMath = line.match(/^( {0,3})\\\\\\[\\s*(.*?)\\s*\\\\\\][ \\t]*$/);\n if (displayMath) {\n const indent = displayMath[1] ?? \"\";\n normalized.push(`${indent}$$`, displayMath[2] ?? \"\", `${indent}$$`);\n continue;\n }\n\n if (/^ {0,3}\\\\\\[[ \\t]*$/.test(line)) {\n normalized.push(line.replace(\"\\\\[\", () => \"$$\"));\n continue;\n }\n if (/^ {0,3}\\\\\\][ \\t]*$/.test(line)) {\n normalized.push(line.replace(\"\\\\]\", () => \"$$\"));\n continue;\n }\n\n normalized.push(normalizeLegacyInlineMath(line));\n }\n\n return normalized.join(\"\\n\");\n};\n\nexport const parseMarkdown = (markdown: string) => fromMarkdown(normalizeLegacyMath(markdown), parserOptions);\n\nexport const parseMarkdownSource = (markdown: string) => fromMarkdown(markdown, parserOptions);\n\nexport const serializeMarkdownAst = (tree: Root) => toMarkdown(tree, serializerOptions).trimEnd();\n\nexport const serializeMarkdownBlock = (node: RootContent) => serializeMarkdownAst({ type: \"root\", children: [node] });\n\nexport const serializeMarkdownInline = (children: PhrasingContent[]) => {\n const paragraph: Paragraph = { type: \"paragraph\", children };\n return serializeMarkdownBlock(paragraph);\n};\n\nexport const parseMarkdownInline = (markdown: string) => {\n const tree = parseMarkdown(markdown);\n const first = tree.children[0];\n\n return first?.type === \"paragraph\" || first?.type === \"heading\" ? first.children : [];\n};\n","export type MarkdownUrlKind = \"link\" | \"image\";\n\nexport type MarkdownUrlResolver = (source: string, kind: MarkdownUrlKind) => string | null;\n\nconst SAFE_LINK_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\nconst SAFE_IMAGE_DATA_URL = /^data:image\\/(?:png|gif|jpeg|webp);base64,[a-z0-9+/=]+$/i;\nconst PROTOCOL = /^[a-z][a-z\\d+.-]*:/i;\n\nconst hasSafeLinkProtocol = (source: string) => {\n if (source.startsWith(\"#\") || source.startsWith(\"/\") || source.startsWith(\"./\") || source.startsWith(\"../\")) {\n return true;\n }\n\n if (!PROTOCOL.test(source)) return true;\n\n try {\n return SAFE_LINK_PROTOCOLS.has(new URL(source).protocol);\n } catch {\n return false;\n }\n};\n\nconst hasSafeImageProtocol = (source: string) => {\n if (source.startsWith(\"https://\")) return true;\n return SAFE_IMAGE_DATA_URL.test(source);\n};\n\nexport const resolveMarkdownUrl = (source: string, kind: MarkdownUrlKind, resolver?: MarkdownUrlResolver) => {\n const resolved = resolver ? resolver(source, kind) : source;\n if (resolved === null) return null;\n\n if (kind === \"image\") {\n const sourceIsRelative = !PROTOCOL.test(source);\n if (sourceIsRelative && !resolver) return null;\n return hasSafeImageProtocol(resolved) ? resolved : null;\n }\n\n return hasSafeLinkProtocol(resolved) ? resolved : null;\n};\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport type { MarkdownUrlResolver } from \"./markdown-url\";\n\nconst MarkdownUrlContext = createContext<MarkdownUrlResolver | undefined>(undefined);\n\ninterface MarkdownUrlProviderProps {\n children: ReactNode;\n resolver?: MarkdownUrlResolver;\n}\n\nexport const MarkdownUrlProvider = (props: MarkdownUrlProviderProps) => {\n const { children, resolver } = props;\n return <MarkdownUrlContext.Provider value={resolver}>{children}</MarkdownUrlContext.Provider>;\n};\n\nexport const useMarkdownUrlResolver = () => useContext(MarkdownUrlContext);\n","import { Box, Image, Text } from \"@chakra-ui/react\";\nimport {\n $applyNodeReplacement,\n $getNodeByKey,\n $getSelection,\n $isRangeSelection,\n DecoratorNode,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport { resolveMarkdownUrl } from \"../markdown-url\";\nimport { useMarkdownUrlResolver } from \"../markdown-url-context\";\n\nexport type SerializedMarkdownImageNode = Spread<\n { source: string; alt: string; title: string | null },\n SerializedLexicalNode\n>;\n\ninterface MarkdownImageProps {\n source: string;\n alt: string;\n title: string | null;\n onLoad?: () => void;\n}\n\nexport const MarkdownImage = (props: MarkdownImageProps) => {\n const { source, alt, title, onLoad } = props;\n const resolver = useMarkdownUrlResolver();\n const resolved = resolveMarkdownUrl(source, \"image\", resolver);\n\n if (!resolved) {\n return (\n <Box as=\"span\" display=\"inline-block\" paddingX=\"xs\" paddingY=\"2xs\" background=\"bg.muted\" borderRadius=\"sm\">\n <Text as=\"span\" textStyle=\"label/S/regular\" color=\"fg.muted\">\n {alt || \"Image\"}\n </Text>\n </Box>\n );\n }\n\n return (\n <Image\n src={resolved}\n alt={alt}\n title={title ?? undefined}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n onLoad={onLoad}\n />\n );\n};\n\nexport class MarkdownImageNode extends DecoratorNode<ReactNode> {\n __source: string;\n __alt: string;\n __title: string | null;\n\n static getType() {\n return \"markdown-image\";\n }\n\n static clone(node: MarkdownImageNode) {\n return new MarkdownImageNode(node.__source, node.__alt, node.__title, node.__key);\n }\n\n constructor(source: string, alt: string, title: string | null = null, key?: NodeKey) {\n super(key);\n this.__source = source;\n this.__alt = alt;\n this.__title = title;\n }\n\n createDOM() {\n return document.createElement(\"span\");\n }\n\n updateDOM() {\n return false;\n }\n\n isInline() {\n return true;\n }\n\n getSource() {\n return this.__source;\n }\n\n getAlt() {\n return this.__alt;\n }\n\n getTitle() {\n return this.__title;\n }\n\n getTextContent() {\n return this.__alt;\n }\n\n exportJSON(): SerializedMarkdownImageNode {\n return {\n type: \"markdown-image\",\n version: 1,\n source: this.__source,\n alt: this.__alt,\n title: this.__title,\n };\n }\n\n static importJSON(node: SerializedMarkdownImageNode) {\n return $createMarkdownImageNode(node.source, node.alt, node.title);\n }\n\n decorate(editor: LexicalEditor) {\n const keepFollowingSelectionVisible = () => {\n if (!editor.isEditable()) return;\n\n let selectedBlockKey: NodeKey | null = null;\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n const imageNode = $getNodeByKey(this.getKey());\n if (!$isRangeSelection(selection) || !selection.isCollapsed() || !imageNode) return;\n\n const imageBlock = imageNode.getTopLevelElement();\n const followingBlock = imageBlock?.getNextSibling();\n const followingBlockKey = followingBlock?.getKey();\n const selectionBlock = selection.anchor.getNode().getTopLevelElement();\n if (followingBlockKey && followingBlockKey === selectionBlock?.getKey()) {\n selectedBlockKey = followingBlockKey;\n }\n });\n\n const blockKey = selectedBlockKey;\n if (!blockKey) return;\n requestAnimationFrame(() => {\n editor.getElementByKey(blockKey)?.scrollIntoView({ block: \"end\" });\n });\n };\n\n return (\n <MarkdownImage\n source={this.__source}\n alt={this.__alt}\n title={this.__title}\n onLoad={keepFollowingSelectionVisible}\n />\n );\n }\n}\n\nexport const $createMarkdownImageNode = (source: string, alt: string, title: string | null = null) =>\n $applyNodeReplacement(new MarkdownImageNode(source, alt, title));\n\nexport const $isMarkdownImageNode = (node: LexicalNode | null | undefined): node is MarkdownImageNode =>\n node instanceof MarkdownImageNode;\n","import DOMPurify from \"dompurify\";\nimport {\n $applyNodeReplacement,\n DecoratorNode,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from \"lexical\";\nimport { type ReactNode, useEffect, useRef } from \"react\";\nimport { resolveMarkdownUrl } from \"../markdown-url\";\nimport { useMarkdownUrlResolver } from \"../markdown-url-context\";\n\nexport type RawHtmlDisplay = \"inline\" | \"block\";\n\nexport type SerializedRawHtmlNode = Spread<{ source: string; display: RawHtmlDisplay }, SerializedLexicalNode>;\n\nconst isHtmlComment = (source: string) => /^<!--[\\s\\S]*-->$/.test(source.trim());\n\nconst sanitizeMarkdownHtml = (source: string, resolver: ReturnType<typeof useMarkdownUrlResolver>) => {\n if (typeof document === \"undefined\") return null;\n\n const clean = DOMPurify.sanitize(source, {\n FORBID_TAGS: [\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"form\", \"input\", \"button\", \"textarea\", \"select\"],\n });\n const template = document.createElement(\"template\");\n template.innerHTML = clean;\n\n for (const element of template.content.querySelectorAll<HTMLElement>(\"[href], [src]\")) {\n const attribute = element.hasAttribute(\"href\") ? \"href\" : \"src\";\n const kind = attribute === \"href\" ? \"link\" : \"image\";\n const sourceUrl = element.getAttribute(attribute) ?? \"\";\n const resolved = resolveMarkdownUrl(sourceUrl, kind, resolver);\n\n if (resolved) element.setAttribute(attribute, resolved);\n else element.removeAttribute(attribute);\n }\n\n return template.content;\n};\n\ninterface RawHtmlProps {\n source: string;\n display: RawHtmlDisplay;\n}\n\nexport const RawHtml = (props: RawHtmlProps) => {\n const { source, display } = props;\n const resolver = useMarkdownUrlResolver();\n const elementRef = useRef<HTMLElement | null>(null);\n const attachElement = (element: HTMLElement | null) => {\n elementRef.current = element;\n };\n\n useEffect(() => {\n const fragment = sanitizeMarkdownHtml(source, resolver);\n const element = elementRef.current;\n if (!element) return;\n\n element.replaceChildren(fragment ? fragment.cloneNode(true) : document.createTextNode(\"\"));\n }, [resolver, source]);\n\n if (isHtmlComment(source)) return null;\n if (display === \"inline\") return <span ref={attachElement} />;\n return <div ref={attachElement} />;\n};\n\nexport class RawHtmlNode extends DecoratorNode<ReactNode> {\n __source: string;\n __display: RawHtmlDisplay;\n\n static getType() {\n return \"raw-html\";\n }\n\n static clone(node: RawHtmlNode) {\n return new RawHtmlNode(node.__source, node.__display, node.__key);\n }\n\n constructor(source: string, display: RawHtmlDisplay, key?: NodeKey) {\n super(key);\n this.__source = source;\n this.__display = display;\n }\n\n createDOM() {\n return document.createElement(this.__display === \"inline\" ? \"span\" : \"div\");\n }\n\n updateDOM(previous: RawHtmlNode) {\n return previous.__display !== this.__display;\n }\n\n isInline() {\n return this.__display === \"inline\";\n }\n\n getSource() {\n return this.__source;\n }\n\n getDisplay() {\n return this.__display;\n }\n\n getTextContent() {\n return isHtmlComment(this.__source) ? \"\" : this.__source;\n }\n\n exportJSON(): SerializedRawHtmlNode {\n return {\n type: \"raw-html\",\n version: 1,\n source: this.__source,\n display: this.__display,\n };\n }\n\n static importJSON(node: SerializedRawHtmlNode) {\n return $createRawHtmlNode(node.source, node.display);\n }\n\n decorate() {\n return <RawHtml source={this.__source} display={this.__display} />;\n }\n}\n\nexport const $createRawHtmlNode = (source: string, display: RawHtmlDisplay) =>\n $applyNodeReplacement(new RawHtmlNode(source, display));\n\nexport const $isRawHtmlNode = (node: LexicalNode | null | undefined): node is RawHtmlNode =>\n node instanceof RawHtmlNode;\n","import { Box, Code, Link, Text } from \"@chakra-ui/react\";\nimport type { PhrasingContent } from \"mdast\";\nimport { Fragment, type ReactNode } from \"react\";\nimport { parseMarkdownInline } from \"./markdown-ast\";\nimport { resolveMarkdownUrl } from \"./markdown-url\";\nimport { useMarkdownUrlResolver } from \"./markdown-url-context\";\nimport { MarkdownImage } from \"./nodes/MarkdownImageNode\";\nimport { RawHtml } from \"./nodes/RawHtmlNode\";\n\ninterface MarkdownInlineProps {\n value: string;\n}\n\ninterface InlineChildrenProps {\n nodes: PhrasingContent[];\n}\n\nconst InlineChildren = (props: InlineChildrenProps) => {\n const { nodes } = props;\n const resolver = useMarkdownUrlResolver();\n\n return nodes.map((node, index): ReactNode => {\n const key = `${node.type}-${index}`;\n\n switch (node.type) {\n case \"text\":\n return <Fragment key={key}>{node.value}</Fragment>;\n case \"strong\":\n return (\n <Text as=\"strong\" key={key} fontWeight=\"semibold\">\n <InlineChildren nodes={node.children} />\n </Text>\n );\n case \"emphasis\":\n return (\n <Box as=\"em\" key={key}>\n <InlineChildren nodes={node.children} />\n </Box>\n );\n case \"delete\":\n return (\n <Box as=\"del\" key={key}>\n <InlineChildren nodes={node.children} />\n </Box>\n );\n case \"inlineCode\":\n return <Code key={key}>{node.value}</Code>;\n case \"break\":\n return <br key={key} />;\n case \"link\": {\n const href = resolveMarkdownUrl(node.url, \"link\", resolver);\n if (!href) return <InlineChildren key={key} nodes={node.children} />;\n return (\n <Link key={key} href={href} title={node.title ?? undefined} target=\"_blank\" rel=\"noopener noreferrer\">\n <InlineChildren nodes={node.children} />\n </Link>\n );\n }\n case \"image\":\n return <MarkdownImage key={key} source={node.url} alt={node.alt ?? \"\"} title={node.title ?? null} />;\n case \"html\":\n return <RawHtml key={key} source={node.value} display=\"inline\" />;\n case \"inlineMath\":\n return <Code key={key}>{node.value}</Code>;\n default:\n return null;\n }\n });\n};\n\nexport const MarkdownInline = (props: MarkdownInlineProps) => {\n const { value } = props;\n return <InlineChildren nodes={parseMarkdownInline(value)} />;\n};\n","import { Box } from \"@chakra-ui/react\";\nimport {\n $applyNodeReplacement,\n $createParagraphNode,\n $getNodeByKey,\n DecoratorNode,\n HISTORY_PUSH_TAG,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n REDO_COMMAND,\n type SerializedLexicalNode,\n type Spread,\n UNDO_COMMAND,\n} from \"lexical\";\nimport type React from \"react\";\nimport { type FocusEvent, type KeyboardEvent, type MouseEvent, useRef, useState } from \"react\";\nimport { EditModeDataTable } from \"@/components/data-table/edit-mode-data-table\";\nimport type { DataTableEditModeColumn, RowData } from \"@/components/data-table/types\";\nimport { LazyMarkdownEditor } from \"../../lazy-markdown-editor\";\nimport { MarkdownInline } from \"../markdown-inline\";\nimport type { MarkdownTableValue } from \"../markdown-table\";\n\ninterface MarkdownDataTableProps {\n editor: LexicalEditor;\n nodeKey: NodeKey;\n table: MarkdownTableValue;\n}\n\nconst projectRows = (table: MarkdownTableValue): RowData[] => table.rows.map((row) => ({ id: row.id, ...row.cells }));\n\nconst projectColumns = (table: MarkdownTableValue): DataTableEditModeColumn[] => table.columns;\n\nconst MarkdownDataTable = (props: MarkdownDataTableProps) => {\n const { editor, nodeKey, table } = props;\n const [isSelected, setSelected] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const focusTable = () => {\n setTimeout(() => containerRef.current?.focus(), 0);\n };\n\n const updateTable = (change: (current: MarkdownTableValue) => MarkdownTableValue) => {\n editor.update(\n () => {\n const node = $getNodeByKey(nodeKey);\n if ($isDataTableNode(node)) node.setTable(change(node.getTable()));\n },\n { tag: HISTORY_PUSH_TAG },\n );\n focusTable();\n };\n\n const handleColumnsChange = (columns: DataTableEditModeColumn[]) => {\n updateTable((current) => ({\n columns,\n rows: current.rows.map((row) => ({\n ...row,\n cells: Object.fromEntries(columns.map((column) => [column.id, row.cells[column.id] ?? \"\"])),\n })),\n }));\n };\n\n const handleDataChange = (data: RowData[]) => {\n updateTable((current) => ({\n ...current,\n rows: data.map((row, index) => ({\n id: String(row.id ?? current.rows[index]?.id ?? `row-${index + 1}`),\n cells: Object.fromEntries(current.columns.map((column) => [column.id, String(row[column.id] ?? \"\")])),\n })),\n }));\n };\n\n const deleteTable = () => {\n editor.update(\n () => {\n const node = $getNodeByKey(nodeKey);\n if ($isDataTableNode(node)) {\n const paragraph = $createParagraphNode();\n node.replace(paragraph);\n paragraph.select();\n }\n },\n { tag: HISTORY_PUSH_TAG },\n );\n setTimeout(() => editor.focus(), 0);\n };\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"button, input, textarea, [contenteditable='true'], [role='menuitem']\")) return;\n\n event.preventDefault();\n containerRef.current?.focus();\n };\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setSelected(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n const isTextInput = target.matches(\"input, textarea\") || target.isContentEditable;\n const isUndo = (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\";\n\n if (isUndo && !isTextInput) {\n event.preventDefault();\n event.stopPropagation();\n editor.dispatchCommand(event.shiftKey ? REDO_COMMAND : UNDO_COMMAND, undefined);\n return;\n }\n\n if (isTextInput) return;\n\n if (isSelected && (event.key === \"Delete\" || event.key === \"Backspace\")) {\n event.preventDefault();\n event.stopPropagation();\n deleteTable();\n }\n };\n\n return (\n <Box\n ref={containerRef}\n data-testid=\"markdown-table-node\"\n data-selected={String(isSelected)}\n aria-label=\"Markdown table\"\n aria-selected={isSelected}\n tabIndex={0}\n outline={isSelected ? \"2px solid\" : \"none\"}\n outlineColor=\"border.accent-light\"\n outlineOffset=\"2px\"\n borderRadius=\"sm\"\n onFocus={() => setSelected(true)}\n onBlur={handleBlur}\n onClick={handleClick}\n onKeyDownCapture={handleKeyDown}\n >\n <EditModeDataTable\n data={projectRows(table)}\n editMode={{\n columns: projectColumns(table),\n onColumnsChange: handleColumnsChange,\n onDataChange: handleDataChange,\n renderHeader: (column) => <MarkdownInline value={column.label} />,\n renderCell: (context) => <MarkdownInline value={String(context.value ?? \"\")} />,\n renderCellEditor: ({ value, onChange }) => (\n <LazyMarkdownEditor\n autoFocus\n defaultState={value}\n fullWidth\n isEditable\n padding=\"xs\"\n scrollable={false}\n onChange={onChange}\n />\n ),\n }}\n fullWidth\n getRowId={(row) => String(row.id)}\n initialPageSize={30}\n isReadOnly={!editor.isEditable()}\n />\n </Box>\n );\n};\n\nexport class DataTableNode extends DecoratorNode<React.JSX.Element> {\n __table: MarkdownTableValue;\n\n static getType() {\n return \"data_table\";\n }\n\n static clone(node: DataTableNode) {\n return new DataTableNode(node.__table, node.__key);\n }\n\n constructor(table: MarkdownTableValue, key?: NodeKey) {\n super(key);\n this.__table = table;\n }\n\n getTable() {\n return this.getLatest().__table;\n }\n\n setTable(table: MarkdownTableValue) {\n const writable = this.getWritable();\n writable.__table = table;\n }\n\n createDOM() {\n return document.createElement(\"div\");\n }\n\n updateDOM() {\n return false;\n }\n\n decorate(editor: LexicalEditor) {\n return <MarkdownDataTable editor={editor} nodeKey={this.__key} table={this.__table} />;\n }\n\n exportJSON(): SerializedDataTableNode {\n return {\n type: \"data_table\",\n version: 2,\n table: this.__table,\n };\n }\n\n static importJSON(json: SerializedDataTableNode) {\n return $createDataTableNode(json.table);\n }\n\n getTextContent() {\n const headers = this.__table.columns.map((column) => column.label).join(\" | \");\n const separator = this.__table.columns.map(() => \"---\").join(\" | \");\n const rows = this.__table.rows.map((row) =>\n this.__table.columns.map((column) => row.cells[column.id] ?? \"\").join(\" | \"),\n );\n return [headers, separator, ...rows].join(\"\\n\");\n }\n}\n\nexport type SerializedDataTableNode = Spread<\n { table: MarkdownTableValue; type: \"data_table\"; version: 2 },\n SerializedLexicalNode\n>;\n\nexport const $createDataTableNode = (table: MarkdownTableValue) => $applyNodeReplacement(new DataTableNode(table));\n\nexport const $isDataTableNode = (node: LexicalNode | null | undefined): node is DataTableNode =>\n node instanceof DataTableNode;\n","import { type LinkAttributes, LinkNode, type SerializedLinkNode } from \"@lexical/link\";\nimport {\n $applyNodeReplacement,\n type LexicalNode,\n type NodeKey,\n type SerializedLexicalNode,\n type Spread,\n} from \"lexical\";\nimport { type MarkdownUrlResolver, resolveMarkdownUrl } from \"../markdown-url\";\n\nexport type SerializedMarkdownLinkNode = Spread<{ source: string }, Spread<SerializedLinkNode, SerializedLexicalNode>>;\n\nconst safeLinkUrl = (source: string, resolver?: MarkdownUrlResolver) =>\n resolveMarkdownUrl(source, \"link\", resolver) ?? \"about:blank\";\n\nexport class MarkdownLinkNode extends LinkNode {\n __source: string;\n\n static getType() {\n return \"markdown-link\";\n }\n\n static clone(node: MarkdownLinkNode) {\n return new MarkdownLinkNode(\n node.__source,\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title },\n node.__key,\n );\n }\n\n constructor(source = \"\", resolvedUrl?: string | null, attributes?: LinkAttributes, key?: NodeKey) {\n super(resolvedUrl ?? safeLinkUrl(source), attributes, key);\n this.__source = source;\n }\n\n getSource() {\n return this.__source;\n }\n\n setURL(url: string) {\n const writable = this.getWritable();\n writable.__source = url;\n writable.__url = safeLinkUrl(url);\n return writable;\n }\n\n exportJSON(): SerializedMarkdownLinkNode {\n return {\n ...super.exportJSON(),\n source: this.__source,\n type: \"markdown-link\",\n version: 1,\n };\n }\n\n static importJSON(node: SerializedMarkdownLinkNode) {\n return $createMarkdownLinkNode(node.source, undefined, {\n rel: node.rel,\n target: node.target,\n title: node.title,\n });\n }\n}\n\nexport const $createMarkdownLinkNode = (source: string, resolver?: MarkdownUrlResolver, attributes?: LinkAttributes) =>\n $applyNodeReplacement(new MarkdownLinkNode(source, safeLinkUrl(source, resolver), attributes));\n\nexport const $isMarkdownLinkNode = (node: LexicalNode | null | undefined): node is MarkdownLinkNode =>\n node instanceof MarkdownLinkNode;\n","import katex from \"katex\";\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode, type DOMExportOutput } from \"lexical\";\nimport * as React from \"react\";\nimport { Suspense } from \"react\";\n\nconst EquationComponent = React.lazy(() => import(\"./EquationComponent\"));\n\nexport type SerializedEquationNode = Spread<\n {\n equation: string;\n inline: boolean;\n },\n SerializedLexicalNode\n>;\n\nfunction $convertEquationElement(domNode: HTMLElement): null | DOMConversionOutput {\n let equation = domNode.getAttribute(\"data-lexical-equation\");\n const inline = domNode.getAttribute(\"data-lexical-inline\") === \"true\";\n\n // Decode the equation from base64\n equation = atob(equation || \"\");\n\n if (equation) {\n const node = $createEquationNode(equation, inline);\n return { node };\n }\n\n return null;\n}\n\nexport class EquationNode extends DecoratorNode<React.ReactNode> {\n __equation: string;\n __inline: boolean;\n\n static getType(): string {\n return \"equation\";\n }\n\n static clone(node: EquationNode): EquationNode {\n return new EquationNode(node.__equation, node.__inline, node.__key);\n }\n\n constructor(equation: string, inline?: boolean, key?: NodeKey) {\n super(key);\n this.__equation = equation;\n this.__inline = inline ?? false;\n }\n\n static importJSON(serializedNode: SerializedEquationNode): EquationNode {\n return $createEquationNode(serializedNode.equation, serializedNode.inline);\n }\n\n exportJSON(): SerializedEquationNode {\n return {\n equation: this.getEquation(),\n inline: this.__inline,\n type: \"equation\",\n version: 1,\n };\n }\n\n createDOM(_config: EditorConfig): HTMLElement {\n const element = document.createElement(this.__inline ? \"span\" : \"div\");\n\n // EquationNodes should implement `user-action:none` in their CSS to avoid issues with deletion on Android.\n element.className = \"editor-equation\";\n return element;\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement(this.__inline ? \"span\" : \"div\");\n\n // Encode the equation as base64 to avoid issues with special characters\n const equation = btoa(this.__equation);\n element.setAttribute(\"data-lexical-equation\", equation);\n element.setAttribute(\"data-lexical-inline\", `${this.__inline}`);\n katex.render(this.__equation, element, {\n displayMode: !this.__inline, // true === block display //\n errorColor: \"#cc0000\",\n output: \"html\",\n strict: \"warn\",\n throwOnError: false,\n trust: false,\n });\n\n return { element };\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(\"data-lexical-equation\")) {\n return null;\n }\n\n return {\n conversion: $convertEquationElement,\n priority: 2,\n };\n },\n span: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(\"data-lexical-equation\")) {\n return null;\n }\n\n return {\n conversion: $convertEquationElement,\n priority: 1,\n };\n },\n };\n }\n\n updateDOM(prevNode: EquationNode): boolean {\n // If the inline property changes, replace the element\n return this.__inline !== prevNode.__inline;\n }\n\n getTextContent(): string {\n return this.__equation;\n }\n\n getEquation(): string {\n return this.__equation;\n }\n\n setEquation(equation: string): void {\n const writable = this.getWritable();\n writable.__equation = equation;\n }\n\n isInline(): boolean {\n return this.__inline;\n }\n\n decorate() {\n return (\n <Suspense fallback={null}>\n <EquationComponent equation={this.__equation} inline={this.__inline} />\n </Suspense>\n );\n }\n}\n\nexport function $createEquationNode(equation = \"\", inline = false): EquationNode {\n const equationNode = new EquationNode(equation, inline);\n return $applyNodeReplacement(equationNode);\n}\n\nexport function $isEquationNode(node: LexicalNode | null | undefined): node is EquationNode {\n return node instanceof EquationNode;\n}\n","import \"./EquationPlugin.css\";\n\nimport type { MultilineElementTransformer, TextMatchTransformer } from \"@lexical/markdown\";\nimport { $createEquationNode, $isEquationNode, EquationNode } from \"./EquationNode.tsx\";\n\nexport const EQUATION_INLINE: TextMatchTransformer = {\n dependencies: [EquationNode],\n export: (node) => {\n if ($isEquationNode(node) && node.isInline()) {\n return `\\\\( ${node.getEquation().trim()} \\\\)`;\n }\n return null;\n },\n importRegExp: /\\\\\\((.*?)\\\\\\)/,\n regExp: /\\\\\\((.*?)\\\\\\)/,\n replace: (textNode, match) => {\n const equationNode = $createEquationNode(match[1].trim(), true);\n textNode.replace(equationNode);\n },\n type: \"text-match\",\n};\n\nexport const EQUATION_MULTILINE: MultilineElementTransformer = {\n dependencies: [EquationNode],\n regExpStart: /\\\\\\[/,\n regExpEnd: /\\\\]/,\n export: (node) => {\n if ($isEquationNode(node) && !node.isInline()) {\n return `\\\\[ ${node.getEquation().trim()} \\\\]`;\n }\n return null;\n },\n replace: (rootNode, _children, _startMatch, _endMatch, linesInBetween) => {\n if (linesInBetween) {\n rootNode.append($createEquationNode(linesInBetween.join(\" \"), false));\n return true;\n }\n return false;\n },\n type: \"multiline-element\",\n};\n\nexport function EquationPlugin(): null {\n return null;\n}\n","import {\n type EditorConfig,\n ElementNode,\n type LexicalEditor,\n type LexicalNode,\n type SerializedElementNode,\n type Spread,\n} from \"lexical\";\n\nexport type SerializedHRNode = Spread<SerializedElementNode, SerializedElementNode>;\n\nexport class HRNode extends ElementNode {\n static getType() {\n return \"hr\";\n }\n\n static clone(node: HRNode) {\n return new HRNode(node?.__key);\n }\n\n static importJSON(_serializedNode: SerializedHRNode) {\n return $createHRNode();\n }\n\n exportJSON(): SerializedHRNode {\n return {\n ...super.exportJSON(),\n };\n }\n\n createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement {\n const element = document.createElement(\"hr\");\n element.style = \"margin: 2rem 0;\";\n return element;\n }\n\n updateDOM(_prevNode: unknown, _dom: HTMLElement, _config: EditorConfig): boolean {\n return false;\n }\n\n decorate(_editor: LexicalEditor) {\n return null;\n }\n}\n\nexport function $createHRNode(): HRNode {\n return new HRNode();\n}\n\nexport function $isHRNode(node: LexicalNode | null | undefined): node is HRNode {\n return node instanceof HRNode;\n}\n","import type { LexicalNode, NodeKey, SerializedLexicalNode } from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport { lazy, Suspense } from \"react\";\n\nconst MermaidComponent = lazy(() => import(\"./MermaidComponent\"));\n\nexport interface SerializedMermaidNode extends SerializedLexicalNode {\n type: \"mermaid\";\n code: string;\n version: 1;\n}\n\nexport class MermaidNode extends DecoratorNode<ReactNode> {\n __code: string;\n\n static getType() {\n return \"mermaid\";\n }\n\n static clone(node: MermaidNode) {\n return new MermaidNode(node.__code, node.__key);\n }\n\n constructor(code: string, key?: NodeKey) {\n super(key);\n this.__code = code;\n }\n\n createDOM() {\n return document.createElement(\"div\");\n }\n\n updateDOM() {\n return false;\n }\n\n static importJSON(serializedNode: SerializedMermaidNode): MermaidNode {\n return new MermaidNode(serializedNode.code);\n }\n\n exportJSON(): SerializedMermaidNode {\n return {\n type: \"mermaid\",\n code: this.__code,\n version: 1,\n };\n }\n\n getTextContent() {\n return `\\`\\`\\`mermaid\\n${this.__code}\\n\\`\\`\\``;\n }\n\n getCode() {\n return this.__code;\n }\n\n setCode(code: string) {\n const writable = this.getWritable();\n writable.__code = code;\n }\n\n decorate() {\n return (\n <Suspense fallback={null}>\n <MermaidComponent code={this.__code} nodeKey={this.__key} />\n </Suspense>\n );\n }\n}\n\nexport function $isMermaidNode(node: LexicalNode | null | undefined): node is MermaidNode {\n return node instanceof MermaidNode;\n}\n\nexport function $createMermaidNode(code: string) {\n return $applyNodeReplacement(new MermaidNode(code));\n}\n","import type { ElementTransformer } from \"@lexical/markdown\";\nimport type { LexicalNode } from \"lexical\";\nimport { $createHRNode, $isHRNode, HRNode } from \"./HorizontalRuleNode\";\n\nexport const HR: ElementTransformer = {\n dependencies: [HRNode],\n export: (node: LexicalNode) => {\n return $isHRNode(node) ? \"***\" : null;\n },\n regExp: /^(---|\\*\\*\\*|___)\\s?$/,\n replace: (parentNode) => {\n const line = $createHRNode();\n parentNode.replace(line);\n },\n type: \"element\",\n};\n","import {\n $createAutoLinkNode,\n $createLinkNode,\n $isAutoLinkNode,\n $isLinkNode,\n AutoLinkNode,\n LinkNode,\n} from \"@lexical/link\";\nimport type { TextMatchTransformer } from \"@lexical/markdown\";\nimport { $createTextNode, TextNode } from \"lexical\";\nimport { HR } from \"../plugins/HorizontalRulePlugin/horizontalRule\";\n\nexport const UNDERLINE_INS_TAG: TextMatchTransformer = {\n dependencies: [TextNode],\n export: (node, _children) => {\n if (node instanceof TextNode) {\n let markdownText = node.getTextContent();\n\n if (node.hasFormat(\"bold\")) {\n markdownText = `**${markdownText}**`;\n } else if (node.hasFormat(\"italic\")) {\n markdownText = `*${markdownText}*`;\n } else if (node.hasFormat(\"underline\")) {\n markdownText = `<ins>${markdownText}</ins>`;\n } else {\n return null;\n }\n\n return markdownText;\n }\n return null;\n },\n regExp: /<ins>(.*)<\\/ins>/,\n importRegExp: /<ins>(.*)<\\/ins>/,\n replace: (node, match) => {\n const textNode = $createTextNode(match[1]);\n textNode.toggleFormat(\"underline\");\n node.replace(textNode);\n },\n type: \"text-match\",\n};\n\nexport const UNDERLINE_U_TAG: TextMatchTransformer = {\n dependencies: [TextNode],\n export: (_node, _children) => {\n return null;\n },\n regExp: /<u>(.*)<\\/u>/,\n importRegExp: /<u>(.*)<\\/u>/,\n replace: (node, match) => {\n const textNode = $createTextNode(match[1]);\n textNode.toggleFormat(\"underline\");\n node.replace(textNode);\n },\n type: \"text-match\",\n};\n\nconst BARE_URL_REGEXP = /https?:\\/\\/[^\\s<>\"']*[^\\s<>\"'.,:;\"')\\]}]/;\n\n// Strip markdown character escapes that may have leaked into a URL, e.g.\n// `https://example.com/foo\\_bar` -> `https://example.com/foo_bar`.\n// Without this, repeated save/reopen cycles would accumulate backslashes\n// because the URL is stored as both text content and href.\nconst unescapeUrl = (url: string) => url.replace(/\\\\([*_`~\\\\])/g, \"$1\");\n\nconst escapeLinkTitle = (title: string) => title.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\nconst unescapeLinkTitle = (title: string | undefined) => title?.replace(/\\\\([\"\\\\])/g, \"$1\");\n\nconst normalizeEscapedUrlText = (textContent: string, href: string, exportedText: string) => {\n if (textContent !== href) {\n return exportedText;\n }\n\n const escapedHref = href.replace(/([*_`~\\\\])/g, \"\\\\$1\");\n\n return exportedText.replace(escapedHref, href);\n};\n\nexport const LINK: TextMatchTransformer = {\n dependencies: [LinkNode],\n export: (node, exportChildren) => {\n if (!$isLinkNode(node) || $isAutoLinkNode(node)) {\n return null;\n }\n\n const title = node.getTitle();\n const href = unescapeUrl(node.getURL());\n const textContent = normalizeEscapedUrlText(node.getTextContent(), href, exportChildren(node));\n\n return title != null ? `[${textContent}](${href} \"${escapeLinkTitle(title)}\")` : `[${textContent}](${href})`;\n },\n importRegExp: /(?:\\[(.+?)\\])(?:\\((?:([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?)\\))/,\n regExp: /(?:\\[(.+?)\\])(?:\\((?:([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?)\\))$/,\n replace: (textNode, match) => {\n const [, linkText, linkUrl, linkTitle] = match;\n const href = unescapeUrl(linkUrl);\n const linkNode = $createLinkNode(href, { title: unescapeLinkTitle(linkTitle) });\n const openBracketAmount = linkText.split(\"[\").length - 1;\n const closeBracketAmount = linkText.split(\"]\").length - 1;\n let parsedLinkText = linkText;\n let outsideLinkText = \"\";\n\n if (openBracketAmount < closeBracketAmount) {\n return;\n }\n\n if (openBracketAmount > closeBracketAmount) {\n const linkTextParts = linkText.split(\"[\");\n outsideLinkText = `[${linkTextParts[0]}`;\n parsedLinkText = linkTextParts.slice(1).join(\"[\");\n }\n\n const normalizedLinkText = unescapeUrl(parsedLinkText);\n const linkTextNode = $createTextNode(normalizedLinkText === href ? href : normalizedLinkText);\n\n linkTextNode.setFormat(textNode.getFormat());\n linkNode.append(linkTextNode);\n textNode.replace(linkNode);\n\n if (outsideLinkText) {\n linkNode.insertBefore($createTextNode(outsideLinkText));\n }\n\n return linkTextNode;\n },\n trigger: \")\",\n type: \"text-match\",\n};\n\nexport const BARE_URL: TextMatchTransformer = {\n dependencies: [AutoLinkNode],\n export: (node, exportChildren) => {\n if (!$isAutoLinkNode(node)) {\n return null;\n }\n\n const href = unescapeUrl(node.getURL());\n\n return normalizeEscapedUrlText(node.getTextContent(), href, exportChildren(node));\n },\n regExp: BARE_URL_REGEXP,\n importRegExp: BARE_URL_REGEXP,\n replace: (textNode, match) => {\n const href = unescapeUrl(match[0]);\n const autoLinkNode = $createAutoLinkNode(href);\n const linkTextNode = $createTextNode(href);\n\n linkTextNode.setFormat(textNode.getFormat());\n autoLinkNode.append(linkTextNode);\n textNode.replace(autoLinkNode);\n },\n type: \"text-match\",\n};\n\nexport const TRANSFORMERS_EXTENDED = [HR, UNDERLINE_INS_TAG, UNDERLINE_U_TAG, LINK, BARE_URL];\n","import { AutoLinkNode, LinkNode } from \"@lexical/link\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { CHECK_LIST, LINK as LEXICAL_LINK, TRANSFORMERS } from \"@lexical/markdown\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport type { Klass, LexicalNode } from \"lexical\";\nimport { REFERENCE_LINK_TRANSFORMER, ReferenceLinkNode } from \"../markdown-editor/plugins/ReferenceLinkPlugin\";\nimport theme from \"../theme/rich-text-theme\";\nimport { CodeHighlightNode, CodeNode } from \"./lexical-code\";\nimport { DataTableNode } from \"./nodes/DataTableNode\";\nimport { MarkdownImageNode } from \"./nodes/MarkdownImageNode\";\nimport { MarkdownLinkNode } from \"./nodes/MarkdownLinkNode\";\nimport { RawHtmlNode } from \"./nodes/RawHtmlNode\";\nimport { EquationNode } from \"./plugins/EquationPlugin/EquationNode\";\nimport { EQUATION_INLINE, EQUATION_MULTILINE } from \"./plugins/EquationPlugin/EquationPlugin\";\nimport { HRNode } from \"./plugins/HorizontalRulePlugin/HorizontalRuleNode\";\nimport { MermaidNode } from \"./plugins/MermaidPlugin/MermaidNode\";\nimport { TRANSFORMERS_EXTENDED } from \"./transformers/markdown-transformers\";\n\nexport const editorNodes: Array<Klass<LexicalNode>> = [\n QuoteNode,\n LinkNode,\n AutoLinkNode,\n MarkdownLinkNode,\n MarkdownImageNode,\n RawHtmlNode,\n DataTableNode,\n HeadingNode,\n ListNode,\n ListItemNode,\n CodeNode,\n CodeHighlightNode,\n MermaidNode,\n EquationNode,\n HRNode,\n ReferenceLinkNode,\n];\n\nexport const baseEditorTransformers = [\n CHECK_LIST,\n ...TRANSFORMERS.filter((transformer) => transformer !== LEXICAL_LINK),\n ...TRANSFORMERS_EXTENDED,\n EQUATION_INLINE,\n EQUATION_MULTILINE,\n];\n\nexport const editorTransformers = [...baseEditorTransformers, REFERENCE_LINK_TRANSFORMER];\n\nexport const editorTheme = theme;\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $nodesOfType } from \"lexical\";\nimport { useEffect } from \"react\";\nimport { CodeNode } from \"../../lexical-code\";\nimport { MermaidNode } from \"../MermaidPlugin/MermaidNode\";\n\nfunction isMermaidLanguage(language: string) {\n return language.trim().toLowerCase() === \"mermaid\";\n}\n\nexport function replaceCodeNodeWithMermaidNode(node: CodeNode) {\n const language = node.getLanguage() ?? \"plaintext\";\n if (!isMermaidLanguage(language)) {\n return false;\n }\n\n node.replace(new MermaidNode(node.getTextContent()));\n return true;\n}\n\nexport function ImportCodeBlocksPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n editor.update(() => {\n const codeNodes = $nodesOfType(CodeNode);\n for (const n of codeNodes) {\n replaceCodeNodeWithMermaidNode(n);\n }\n });\n }, [editor]);\n\n return null;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\nimport { registerCodeHighlighting } from \"../../lexical-code\";\n\nexport function CodeHighlightingPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return registerCodeHighlighting(editor);\n }, [editor]);\n\n return null;\n}\n","import { $isLinkNode } from \"@lexical/link\";\nimport { $isListItemNode, $isListNode, type ListItemNode, type ListNode } from \"@lexical/list\";\nimport { $isHeadingNode, $isQuoteNode } from \"@lexical/rich-text\";\nimport {\n $isElementNode,\n $isLineBreakNode,\n $isParagraphNode,\n $isTextNode,\n type ElementNode,\n type LexicalNode,\n type TextNode,\n} from \"lexical\";\nimport type { BlockContent, ListItem, Paragraph, PhrasingContent, Root, Table, TableCell } from \"mdast\";\nimport { $isReferenceLinkNode } from \"../markdown-editor/plugins/ReferenceLinkPlugin/ReferenceLinkNode\";\nimport { $isCodeNode } from \"./lexical-code\";\nimport { parseMarkdownInline, serializeMarkdownAst } from \"./markdown-ast\";\nimport { $isDataTableNode, type DataTableNode } from \"./nodes/DataTableNode\";\nimport { $isMarkdownImageNode } from \"./nodes/MarkdownImageNode\";\nimport { $isMarkdownLinkNode } from \"./nodes/MarkdownLinkNode\";\nimport { $isRawHtmlNode } from \"./nodes/RawHtmlNode\";\nimport { $isEquationNode } from \"./plugins/EquationPlugin/EquationNode\";\nimport { $isHRNode } from \"./plugins/HorizontalRulePlugin/HorizontalRuleNode\";\nimport { $isMermaidNode } from \"./plugins/MermaidPlugin/MermaidNode\";\n\nconst exportText = (node: TextNode) => {\n let content: PhrasingContent = node.hasFormat(\"code\")\n ? { type: \"inlineCode\", value: node.getTextContent() }\n : { type: \"text\", value: node.getTextContent() };\n\n if (!node.hasFormat(\"code\")) {\n if (node.hasFormat(\"bold\")) content = { type: \"strong\", children: [content] };\n if (node.hasFormat(\"italic\")) content = { type: \"emphasis\", children: [content] };\n if (node.hasFormat(\"strikethrough\")) content = { type: \"delete\", children: [content] };\n }\n\n if (node.hasFormat(\"underline\")) {\n return [\n { type: \"html\", value: \"<ins>\" } as PhrasingContent,\n content,\n { type: \"html\", value: \"</ins>\" } as PhrasingContent,\n ];\n }\n\n return [content];\n};\n\nconst exportInlineNode = (node: LexicalNode): PhrasingContent[] => {\n if ($isTextNode(node)) return exportText(node);\n if ($isLineBreakNode(node)) return [{ type: \"break\" }];\n if ($isMarkdownImageNode(node)) {\n return [{ type: \"image\", url: node.getSource(), alt: node.getAlt(), title: node.getTitle() }];\n }\n if ($isEquationNode(node) && node.isInline()) return [{ type: \"inlineMath\", value: node.getEquation() }];\n if ($isRawHtmlNode(node)) return [{ type: \"html\", value: node.getSource() }];\n if ($isReferenceLinkNode(node)) return [{ type: \"text\", value: node.getTextContent() }];\n\n if ($isLinkNode(node)) {\n return [\n {\n type: \"link\",\n url: $isMarkdownLinkNode(node) ? node.getSource() : node.getURL(),\n title: node.getTitle(),\n children: exportInlineChildren(node),\n },\n ];\n }\n\n if ($isElementNode(node)) return exportInlineChildren(node);\n const value = node.getTextContent();\n return value ? [{ type: \"text\", value }] : [];\n};\n\nconst exportInlineChildren = (node: ElementNode) => node.getChildren().flatMap(exportInlineNode);\n\nconst paragraphFrom = (node: ElementNode): Paragraph => ({\n type: \"paragraph\",\n children: exportInlineChildren(node),\n});\n\nconst exportListItem = (node: ListItemNode): ListItem => {\n const children: BlockContent[] = [];\n const inline: PhrasingContent[] = [];\n\n for (const child of node.getChildren()) {\n if ($isListNode(child)) {\n if (inline.length) children.push({ type: \"paragraph\", children: inline.splice(0) });\n children.push(exportList(child));\n } else if ($isParagraphNode(child)) {\n if (inline.length) children.push({ type: \"paragraph\", children: inline.splice(0) });\n children.push(paragraphFrom(child));\n } else {\n inline.push(...exportInlineNode(child));\n }\n }\n\n if (inline.length || children.length === 0) children.unshift({ type: \"paragraph\", children: inline });\n\n return {\n type: \"listItem\",\n checked: node.getChecked(),\n spread: false,\n children,\n };\n};\n\nconst exportList = (node: ListNode) => ({\n type: \"list\" as const,\n ordered: node.getListType() === \"number\",\n start: node.getListType() === \"number\" ? node.getStart() : null,\n spread: false,\n children: node.getChildren().filter($isListItemNode).map(exportListItem),\n});\n\nconst tableCell = (value: string): TableCell => ({\n type: \"tableCell\",\n children: parseMarkdownInline(value),\n});\n\nconst exportTable = (node: DataTableNode): Table => {\n const table = node.getTable();\n return {\n type: \"table\",\n align: table.columns.map((column) => column.alignment),\n children: [\n {\n type: \"tableRow\",\n children: table.columns.map((column) => tableCell(column.label)),\n },\n ...table.rows.map((row) => ({\n type: \"tableRow\" as const,\n children: table.columns.map((column) => tableCell(row.cells[column.id] ?? \"\")),\n })),\n ],\n };\n};\n\nconst exportBlock = (node: LexicalNode): BlockContent | null => {\n if ($isParagraphNode(node)) return paragraphFrom(node);\n if ($isHeadingNode(node)) {\n return {\n type: \"heading\",\n depth: Number(node.getTag().slice(1)) as 1 | 2 | 3 | 4 | 5 | 6,\n children: exportInlineChildren(node),\n };\n }\n if ($isQuoteNode(node)) {\n return {\n type: \"blockquote\",\n children: node\n .getChildren()\n .map(exportBlock)\n .filter((child) => child !== null),\n };\n }\n if ($isListNode(node)) return exportList(node);\n if ($isCodeNode(node)) {\n return { type: \"code\", lang: node.getLanguage() || null, meta: null, value: node.getTextContent() };\n }\n if ($isMermaidNode(node)) return { type: \"code\", lang: \"mermaid\", meta: null, value: node.getCode() };\n if ($isEquationNode(node)) return { type: \"math\", meta: null, value: node.getEquation() };\n if ($isHRNode(node)) return { type: \"thematicBreak\" };\n if ($isDataTableNode(node)) return exportTable(node);\n if ($isRawHtmlNode(node)) return { type: \"html\", value: node.getSource() };\n if ($isElementNode(node)) return paragraphFrom(node);\n\n const value = node.getTextContent();\n return value ? { type: \"paragraph\", children: [{ type: \"text\", value }] } : null;\n};\n\nexport const exportLexicalToMarkdown = (root: ElementNode) => {\n const tree: Root = {\n type: \"root\",\n children: root\n .getChildren()\n .map(exportBlock)\n .filter((node) => node !== null),\n };\n return serializeMarkdownAst(tree);\n};\n","import { $createListItemNode, $createListNode } from \"@lexical/list\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport {\n $createLineBreakNode,\n $createParagraphNode,\n $createTextNode,\n $getRoot,\n type ElementNode,\n type LexicalNode,\n type TextFormatType,\n} from \"lexical\";\nimport type { Definition, ImageReference, LinkReference, PhrasingContent, RootContent, Table } from \"mdast\";\nimport { $createReferenceLinkNode } from \"../markdown-editor/plugins/ReferenceLinkPlugin/ReferenceLinkNode\";\nimport { $createCodeNode } from \"./lexical-code\";\nimport { parseMarkdown, serializeMarkdownBlock, serializeMarkdownInline } from \"./markdown-ast\";\nimport type { MarkdownTableAlignment, MarkdownTableValue } from \"./markdown-table\";\nimport type { MarkdownUrlResolver } from \"./markdown-url\";\nimport { $createDataTableNode } from \"./nodes/DataTableNode\";\nimport { $createMarkdownImageNode } from \"./nodes/MarkdownImageNode\";\nimport { $createMarkdownLinkNode } from \"./nodes/MarkdownLinkNode\";\nimport { $createRawHtmlNode } from \"./nodes/RawHtmlNode\";\nimport { $createEquationNode } from \"./plugins/EquationPlugin/EquationNode\";\nimport { $createHRNode } from \"./plugins/HorizontalRulePlugin/HorizontalRuleNode\";\nimport { $createMermaidNode } from \"./plugins/MermaidPlugin/MermaidNode\";\n\ninterface ImportContext {\n definitions: Map<string, Definition>;\n resolver?: MarkdownUrlResolver;\n tableIndex: number;\n}\n\nconst REFERENCE_TOKEN = /\\{\\{\\s*link\\((['\"])([^'\"\\s]+)\\1\\)\\s*\\}\\}/g;\n\nconst formattedText = (value: string, formats: Set<TextFormatType>) => {\n const node = $createTextNode(value);\n for (const format of formats) node.toggleFormat(format);\n return node;\n};\n\nconst textWithReferences = (value: string, formats: Set<TextFormatType>) => {\n const nodes: LexicalNode[] = [];\n let start = 0;\n\n for (const match of value.matchAll(REFERENCE_TOKEN)) {\n const index = match.index ?? 0;\n if (index > start) nodes.push(formattedText(value.slice(start, index), formats));\n const label = match[2] ?? \"\";\n const href = /^(?:https?:\\/\\/|\\/)/i.test(label) ? label : `#${label}`;\n nodes.push($createReferenceLinkNode(href, label));\n start = index + match[0].length;\n }\n\n if (start < value.length) nodes.push(formattedText(value.slice(start), formats));\n return nodes;\n};\n\nconst referenceDefinition = (node: LinkReference | ImageReference, context: ImportContext) =>\n context.definitions.get(node.identifier.toLowerCase());\n\nfunction importInlineNode(node: PhrasingContent, context: ImportContext, formats: Set<TextFormatType>) {\n switch (node.type) {\n case \"text\":\n return textWithReferences(node.value, formats);\n case \"strong\":\n return importInlineChildren(node.children, context, new Set([...formats, \"bold\"]));\n case \"emphasis\":\n return importInlineChildren(node.children, context, new Set([...formats, \"italic\"]));\n case \"delete\":\n return importInlineChildren(node.children, context, new Set([...formats, \"strikethrough\"]));\n case \"inlineCode\":\n return [formattedText(node.value, new Set([...formats, \"code\"]))];\n case \"break\":\n return [$createLineBreakNode()];\n case \"link\": {\n const link = $createMarkdownLinkNode(node.url, context.resolver, { title: node.title });\n link.append(...importInlineChildren(node.children, context, formats));\n return [link];\n }\n case \"linkReference\": {\n const definition = referenceDefinition(node, context);\n if (!definition) return [formattedText(serializeMarkdownInline([node]), formats)];\n const link = $createMarkdownLinkNode(definition.url, context.resolver, { title: definition.title });\n link.append(...importInlineChildren(node.children, context, formats));\n return [link];\n }\n case \"image\":\n return [$createMarkdownImageNode(node.url, node.alt ?? \"\", node.title ?? null)];\n case \"imageReference\": {\n const definition = referenceDefinition(node, context);\n if (!definition) return [formattedText(serializeMarkdownInline([node]), formats)];\n return [$createMarkdownImageNode(definition.url, node.alt ?? \"\", definition.title ?? null)];\n }\n case \"inlineMath\":\n return [$createEquationNode(node.value, true)];\n case \"html\":\n return [$createRawHtmlNode(node.value, \"inline\")];\n default:\n return [formattedText(serializeMarkdownInline([node]), formats)];\n }\n}\n\nfunction importInlineChildren(\n children: PhrasingContent[],\n context: ImportContext,\n formats = new Set<TextFormatType>(),\n) {\n const nodes: LexicalNode[] = [];\n let underlineDepth = 0;\n\n for (const node of children) {\n if (node.type === \"html\" && /^<(?:ins|u)>$/i.test(node.value.trim())) {\n underlineDepth += 1;\n continue;\n }\n if (node.type === \"html\" && /^<\\/(?:ins|u)>$/i.test(node.value.trim())) {\n underlineDepth = Math.max(underlineDepth - 1, 0);\n continue;\n }\n\n const activeFormats = new Set(formats);\n if (underlineDepth > 0) activeFormats.add(\"underline\");\n nodes.push(...importInlineNode(node, context, activeFormats));\n }\n\n return nodes;\n}\n\nconst tableValue = (table: Table, context: ImportContext): MarkdownTableValue => {\n context.tableIndex += 1;\n const prefix = `table-${context.tableIndex}`;\n const header = table.children[0];\n const columnCount = Math.max(header?.children.length ?? 0, 1);\n const columns = Array.from({ length: columnCount }, (_, index) => ({\n id: `${prefix}-column-${index + 1}`,\n label: header?.children[index] ? serializeMarkdownInline(header.children[index].children) : \"\",\n alignment: (table.align?.[index] ?? null) as MarkdownTableAlignment,\n }));\n const rows = table.children.slice(1).map((row, rowIndex) => ({\n id: `${prefix}-row-${rowIndex + 1}`,\n cells: Object.fromEntries(\n columns.map((column, columnIndex) => [\n column.id,\n row.children[columnIndex] ? serializeMarkdownInline(row.children[columnIndex].children) : \"\",\n ]),\n ),\n }));\n\n return { columns, rows };\n};\n\nconst appendListItem = (parent: ElementNode, node: RootContent, context: ImportContext) => {\n if (node.type !== \"listItem\") return;\n const item = $createListItemNode(node.checked ?? undefined);\n parent.append(item);\n\n for (const child of node.children) {\n if (child.type === \"paragraph\") item.append(...importInlineChildren(child.children, context));\n else if (child.type === \"list\") appendBlock(item, child, context);\n else item.append(formattedText(serializeMarkdownBlock(child), new Set()));\n }\n};\n\nconst appendBlock = (parent: ElementNode, node: RootContent, context: ImportContext) => {\n switch (node.type) {\n case \"paragraph\": {\n const paragraph = $createParagraphNode();\n paragraph.append(...importInlineChildren(node.children, context));\n parent.append(paragraph);\n break;\n }\n case \"heading\": {\n const heading = $createHeadingNode(`h${node.depth}`);\n heading.append(...importInlineChildren(node.children, context));\n parent.append(heading);\n break;\n }\n case \"blockquote\": {\n const quote = $createQuoteNode();\n parent.append(quote);\n for (const child of node.children) appendBlock(quote, child, context);\n break;\n }\n case \"list\": {\n const hasTasks = node.children.some((item) => item.checked !== null && item.checked !== undefined);\n let listType: \"bullet\" | \"check\" | \"number\" = \"bullet\";\n if (node.ordered) listType = \"number\";\n else if (hasTasks) listType = \"check\";\n const list = $createListNode(listType, node.start ?? 1);\n parent.append(list);\n for (const item of node.children) appendListItem(list, item, context);\n break;\n }\n case \"code\":\n parent.append(\n node.lang === \"mermaid\"\n ? $createMermaidNode(node.value)\n : $createCodeNode(node.lang ?? undefined).append($createTextNode(node.value)),\n );\n break;\n case \"math\":\n parent.append($createEquationNode(node.value, false));\n break;\n case \"thematicBreak\":\n parent.append($createHRNode());\n break;\n case \"table\":\n parent.append($createDataTableNode(tableValue(node, context)));\n break;\n case \"html\":\n parent.append($createRawHtmlNode(node.value, \"block\"));\n break;\n case \"definition\":\n break;\n default: {\n const paragraph = $createParagraphNode();\n paragraph.append($createTextNode(serializeMarkdownBlock(node)));\n parent.append(paragraph);\n }\n }\n};\n\nexport const importMarkdownToLexical = (markdown: string, resolver?: MarkdownUrlResolver) => {\n const tree = parseMarkdown(markdown);\n const definitions = new Map(\n tree.children\n .filter((node): node is Definition => node.type === \"definition\")\n .map((node) => [node.identifier.toLowerCase(), node]),\n );\n const context: ImportContext = { definitions, resolver, tableIndex: 0 };\n const root = $getRoot();\n root.clear();\n\n for (const node of tree.children) appendBlock(root, node, context);\n // Lexical treats a root-only state as uninitialized and skips its first change notification.\n if (root.isEmpty()) root.append($createParagraphNode());\n};\n","import type { Link, LinkReference, Parent, RootContent } from \"mdast\";\nimport { parseMarkdownSource } from \"./markdown-ast\";\n\ninterface TextEdit {\n end: number;\n replacement: string;\n start: number;\n}\n\ninterface LinkChanges {\n edits: TextEdit[];\n normalizedCurrent: string;\n}\n\ninterface LinkOccurrence {\n block: RootContent;\n node: Link | LinkReference;\n}\n\nconst nodeOffsets = (node: { position?: { start: { offset?: number }; end: { offset?: number } } }) => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n return start === undefined || end === undefined ? null : { end, start };\n};\n\nconst isParent = (node: unknown): node is Parent =>\n typeof node === \"object\" && node !== null && \"children\" in node && Array.isArray(node.children);\n\nconst isLink = (node: unknown): node is Link | LinkReference =>\n typeof node === \"object\" &&\n node !== null &&\n \"type\" in node &&\n (node.type === \"link\" || node.type === \"linkReference\");\n\nconst linksIn = (node: unknown) => {\n const links: Array<Link | LinkReference> = [];\n\n if (!isParent(node)) return links;\n\n for (const child of node.children) {\n if (isLink(child)) links.push(child);\n if (isParent(child)) links.push(...linksIn(child));\n }\n\n return links;\n};\n\nconst linkOccurrencesIn = (markdown: string) =>\n parseMarkdownSource(markdown).children.flatMap((block) =>\n block.type === \"table\" ? [] : linksIn(block).map((node) => ({ block, node })),\n );\n\nconst removedLinkReplacements = (\n baseline: string,\n current: string,\n sourceLinks: LinkOccurrence[],\n baselineBlock: RootContent,\n baselineLinks: Array<Link | LinkReference>,\n currentBlock: RootContent,\n) => {\n const baselineBlockOffsets = nodeOffsets(baselineBlock);\n const currentBlockOffsets = nodeOffsets(currentBlock);\n if (!baselineBlockOffsets || !currentBlockOffsets) return [];\n\n const linkOffsets = baselineLinks.map(nodeOffsets);\n if (linkOffsets.some((offsets) => !offsets)) return [];\n\n const segments: string[] = [];\n let baselineOffset = baselineBlockOffsets.start;\n for (const offsets of linkOffsets) {\n if (!offsets) return [];\n segments.push(baseline.slice(baselineOffset, offsets.start));\n baselineOffset = offsets.end;\n }\n segments.push(baseline.slice(baselineOffset, baselineBlockOffsets.end));\n\n const currentBlockSource = current.slice(currentBlockOffsets.start, currentBlockOffsets.end);\n const firstSegment = segments[0] ?? \"\";\n if (!currentBlockSource.startsWith(firstSegment)) return [];\n\n const replacements: Array<{ end: number; start: number; value: string }> = [];\n let currentOffset = firstSegment.length;\n\n for (let index = 0; index < baselineLinks.length; index += 1) {\n const nextSegment = segments[index + 1] ?? \"\";\n const replacementEnd =\n index === baselineLinks.length - 1\n ? currentBlockSource.length - nextSegment.length\n : currentBlockSource.indexOf(nextSegment, currentOffset);\n if (replacementEnd < currentOffset) return [];\n\n replacements.push({\n start: currentOffset,\n end: replacementEnd,\n value: currentBlockSource.slice(currentOffset, replacementEnd),\n });\n currentOffset = replacementEnd + nextSegment.length;\n }\n\n if (currentOffset !== currentBlockSource.length) return [];\n\n return replacements.flatMap((replacement, index) => {\n if (linkOccurrencesIn(replacement.value).length > 0) return [];\n\n const sourceLinkOffsets = nodeOffsets(sourceLinks[index]?.node ?? {});\n const baselineLinkOffsets = linkOffsets[index];\n if (!sourceLinkOffsets || !baselineLinkOffsets) return [];\n\n return [\n {\n edit: { ...sourceLinkOffsets, replacement: replacement.value },\n normalization: {\n start: currentBlockOffsets.start + replacement.start,\n end: currentBlockOffsets.start + replacement.end,\n replacement: baseline.slice(baselineLinkOffsets.start, baselineLinkOffsets.end),\n },\n },\n ];\n });\n};\n\nconst findRemovedLinkReplacements = (\n sourceLinks: LinkOccurrence[],\n baseline: string,\n current: string,\n baselineBlock: RootContent,\n baselineLinks: Array<Link | LinkReference>,\n currentBlocks: RootContent[],\n preferredBlockIndex: number,\n usedCurrentBlocks: Set<number>,\n) => {\n const candidateIndexes = currentBlocks.map((_, index) => index);\n candidateIndexes.sort((left, right) => Number(right === preferredBlockIndex) - Number(left === preferredBlockIndex));\n\n for (const currentBlockIndex of candidateIndexes) {\n if (usedCurrentBlocks.has(currentBlockIndex)) continue;\n const currentBlock = currentBlocks[currentBlockIndex];\n if (!currentBlock) continue;\n\n const currentLinks = linksIn(currentBlock);\n if (baselineLinks.length <= currentLinks.length) continue;\n\n const replacements = removedLinkReplacements(\n baseline,\n current,\n sourceLinks,\n baselineBlock,\n baselineLinks,\n currentBlock,\n );\n if (replacements.length === baselineLinks.length - currentLinks.length) {\n return { currentBlockIndex, replacements };\n }\n }\n\n return null;\n};\n\nexport const collectMarkdownLinkChanges = (source: string, baseline: string, current: string): LinkChanges => {\n const sourceLinks = linkOccurrencesIn(source);\n if (linkOccurrencesIn(current).length >= linkOccurrencesIn(baseline).length) {\n return { edits: [], normalizedCurrent: current };\n }\n\n const baselineTree = parseMarkdownSource(baseline);\n const currentTree = parseMarkdownSource(current);\n const edits: TextEdit[] = [];\n const normalizations: TextEdit[] = [];\n const usedCurrentBlocks = new Set<number>();\n let linkOrdinal = 0;\n\n for (let blockIndex = 0; blockIndex < baselineTree.children.length; blockIndex += 1) {\n const baselineBlock = baselineTree.children[blockIndex];\n if (!baselineBlock || baselineBlock.type === \"table\") continue;\n\n const baselineLinks = linksIn(baselineBlock);\n const linkChanges = findRemovedLinkReplacements(\n sourceLinks.slice(linkOrdinal, linkOrdinal + baselineLinks.length),\n baseline,\n current,\n baselineBlock,\n baselineLinks,\n currentTree.children,\n blockIndex,\n usedCurrentBlocks,\n );\n if (linkChanges) {\n for (const replacement of linkChanges.replacements) {\n edits.push(replacement.edit);\n normalizations.push(replacement.normalization);\n }\n usedCurrentBlocks.add(linkChanges.currentBlockIndex);\n }\n\n linkOrdinal += baselineLinks.length;\n }\n\n let normalizedCurrent = current;\n for (const normalization of normalizations.sort((left, right) => right.start - left.start)) {\n normalizedCurrent =\n normalizedCurrent.slice(0, normalization.start) +\n normalization.replacement +\n normalizedCurrent.slice(normalization.end);\n }\n\n return { edits, normalizedCurrent };\n};\n","import { diffChars } from \"diff\";\nimport { parseMarkdownSource } from \"./markdown-ast\";\n\nexport interface SourceMap {\n end: number[];\n start: number[];\n}\n\nfunction* diffSourceBlocks(canonical: string, source: string) {\n const canonicalBlocks = parseMarkdownSource(canonical).children;\n const sourceBlocks = parseMarkdownSource(source).children;\n const sameBlocks =\n canonicalBlocks.length === sourceBlocks.length &&\n canonicalBlocks.every(\n (block, index) =>\n block.type === sourceBlocks[index]?.type &&\n block.position?.end.offset !== undefined &&\n sourceBlocks[index]?.position?.end.offset !== undefined,\n );\n\n if (!sameBlocks) {\n yield* diffChars(canonical, source);\n return;\n }\n\n // Import preserves block order. Match spelling within those blocks so many\n // normalized tokens do not create one quadratic diff across the document.\n let canonicalOffset = 0;\n let sourceOffset = 0;\n for (let index = 0; index < canonicalBlocks.length; index += 1) {\n const canonicalEnd = canonicalBlocks[index]!.position!.end.offset!;\n const sourceEnd = sourceBlocks[index]!.position!.end.offset!;\n yield* diffChars(canonical.slice(canonicalOffset, canonicalEnd), source.slice(sourceOffset, sourceEnd));\n canonicalOffset = canonicalEnd;\n sourceOffset = sourceEnd;\n }\n yield* diffChars(canonical.slice(canonicalOffset), source.slice(sourceOffset));\n}\n\nexport const buildSourceMap = (canonical: string, source: string) => {\n const start = Array.from<number>({ length: canonical.length + 1 }).fill(-1);\n const end = Array.from<number>({ length: canonical.length + 1 }).fill(-1);\n let canonicalOffset = 0;\n let sourceOffset = 0;\n let removedAtBoundary = false;\n\n start[0] = 0;\n end[0] = 0;\n\n for (const change of diffSourceBlocks(canonical, source)) {\n const length = change.value.length;\n\n if (change.added) {\n end[canonicalOffset] = sourceOffset;\n sourceOffset += length;\n start[canonicalOffset] = sourceOffset;\n if (removedAtBoundary) end[canonicalOffset] = sourceOffset;\n removedAtBoundary = false;\n continue;\n }\n\n if (change.removed) {\n for (let index = 0; index <= length; index += 1) {\n start[canonicalOffset + index] = sourceOffset;\n end[canonicalOffset + index] = sourceOffset;\n }\n canonicalOffset += length;\n removedAtBoundary = true;\n continue;\n }\n\n for (let index = 0; index <= length; index += 1) {\n const offset = canonicalOffset + index;\n start[offset] = sourceOffset + index;\n // A source-only insertion at this boundary belongs between the\n // canonical characters. Keep its left edge as the end of the preceding\n // range so an edit before it does not consume untouched source.\n if (end[offset] === undefined || end[offset] < 0) end[offset] = sourceOffset + index;\n }\n canonicalOffset += length;\n sourceOffset += length;\n removedAtBoundary = false;\n }\n\n return { end, start } satisfies SourceMap;\n};\n\nconst nearestMappedOffset = (values: number[], index: number, direction: -1 | 1) => {\n for (let offset = index; offset >= 0 && offset < values.length; offset += direction) {\n const value = values[offset];\n if (value !== undefined && value >= 0) return value;\n }\n return direction === -1 ? 0 : (values.at(-1) ?? 0);\n};\n\nexport const mappedStart = (map: SourceMap, index: number) => {\n const exact = map.start[index];\n if (exact !== undefined && exact >= 0) return exact;\n return nearestMappedOffset(map.start, index, -1);\n};\n\nexport const mappedEnd = (map: SourceMap, index: number) => {\n const exact = map.end[index];\n if (exact !== undefined && exact >= 0) return exact;\n return nearestMappedOffset(map.end, index, 1);\n};\n","import { diffChars } from \"diff\";\nimport { $getRoot, type ElementNode } from \"lexical\";\nimport type { Table, TableCell } from \"mdast\";\nimport { parseMarkdownSource } from \"./markdown-ast\";\nimport { exportLexicalToMarkdown } from \"./markdown-export\";\nimport { importMarkdownToLexical } from \"./markdown-import\";\nimport { collectMarkdownLinkChanges } from \"./markdown-source-links\";\nimport { buildSourceMap, mappedEnd, mappedStart, type SourceMap } from \"./markdown-source-map\";\nimport type { MarkdownUrlResolver } from \"./markdown-url\";\n\ninterface TextEdit {\n end: number;\n replacement: string;\n start: number;\n}\n\ninterface TableChanges {\n edits: TextEdit[];\n normalizedCurrent: string;\n}\n\nconst collectEdits = (baseline: string, current: string) => {\n const edits: TextEdit[] = [];\n let baselineOffset = 0;\n let pending: TextEdit | null = null;\n\n const finishPending = () => {\n if (!pending) return;\n edits.push(pending);\n pending = null;\n };\n\n for (const change of diffChars(baseline, current)) {\n if (!change.added && !change.removed) {\n finishPending();\n baselineOffset += change.value.length;\n continue;\n }\n\n pending ??= { start: baselineOffset, end: baselineOffset, replacement: \"\" };\n if (change.added) {\n pending.replacement += change.value;\n continue;\n }\n\n baselineOffset += change.value.length;\n pending.end = baselineOffset;\n }\n\n finishPending();\n return edits;\n};\n\nconst sourceLineEnding = (source: string) => (source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\");\n\nconst withSourceLineEndings = (value: string, source: string) => {\n const lineEnding = sourceLineEnding(source);\n return lineEnding === \"\\n\" ? value : value.replaceAll(\"\\n\", lineEnding);\n};\n\nconst withoutPosition = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(withoutPosition);\n if (!value || typeof value !== \"object\") return value;\n\n return Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"position\")\n .map(([key, entry]) => [key, withoutPosition(entry)]),\n );\n};\n\nconst sameMarkdownNode = (left: unknown, right: unknown) =>\n JSON.stringify(withoutPosition(left)) === JSON.stringify(withoutPosition(right));\n\nconst tablesIn = (markdown: string) =>\n parseMarkdownSource(markdown).children.filter(\n (node): node is Table => node.type === \"table\" && Boolean(node.position),\n );\n\nconst tableCells = (table: Table) => table.children.flatMap((row) => row.children);\n\nconst sameTableShape = (left: Table, right: Table) =>\n left.children.length === right.children.length &&\n left.children.every((row, index) => row.children.length === right.children[index]?.children.length);\n\nconst nodeOffsets = (node: { position?: { start: { offset?: number }; end: { offset?: number } } }) => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n return start === undefined || end === undefined ? null : { end, start };\n};\n\nconst cellContentOffsets = (markdown: string, cell: TableCell) => {\n const first = cell.children[0];\n const last = cell.children.at(-1);\n const contentStart = first?.position?.start.offset;\n const contentEnd = last?.position?.end.offset;\n\n if (contentStart !== undefined && contentEnd !== undefined) {\n return { start: contentStart, end: contentEnd };\n }\n\n const cellOffsets = nodeOffsets(cell);\n if (!cellOffsets) return null;\n const cellSource = markdown.slice(cellOffsets.start, cellOffsets.end);\n const leftDelimiter = cellSource.indexOf(\"|\");\n const rightDelimiter = cellSource.endsWith(\"|\") ? cellSource.length - 1 : cellSource.length;\n const insideStart = leftDelimiter < 0 ? 0 : leftDelimiter + 1;\n const leadingSpace = cellSource.slice(insideStart, rightDelimiter).match(/^\\s*/)?.[0].length ?? 0;\n const offset = cellOffsets.start + insideStart + leadingSpace;\n return { start: offset, end: offset };\n};\n\nconst cellMarkdown = (markdown: string, cell: TableCell) => {\n const offsets = cellContentOffsets(markdown, cell);\n return offsets ? markdown.slice(offsets.start, offsets.end) : \"\";\n};\n\nconst collectTableCellEdits = (\n source: string,\n current: string,\n sourceTable: Table,\n baselineTable: Table,\n currentTable: Table,\n) => {\n const sourceCells = tableCells(sourceTable);\n const baselineCells = tableCells(baselineTable);\n const currentCells = tableCells(currentTable);\n\n return currentCells.flatMap((currentCell, index) => {\n const sourceCell = sourceCells[index];\n const baselineCell = baselineCells[index];\n if (!sourceCell || !baselineCell || sameMarkdownNode(baselineCell, currentCell)) return [];\n\n const sourceContent = cellContentOffsets(source, sourceCell);\n if (!sourceContent) return [];\n return [{ ...sourceContent, replacement: cellMarkdown(current, currentCell) }];\n });\n};\n\nconst editsForTable = (\n source: string,\n current: string,\n sourceTable: Table,\n baselineTable: Table,\n currentTable: Table,\n) => {\n if (sameMarkdownNode(baselineTable, currentTable)) return [];\n\n const cellOnlyChange =\n sameTableShape(baselineTable, currentTable) &&\n sameTableShape(sourceTable, baselineTable) &&\n JSON.stringify(baselineTable.align) === JSON.stringify(currentTable.align);\n\n if (cellOnlyChange) {\n return collectTableCellEdits(source, current, sourceTable, baselineTable, currentTable);\n }\n\n const sourceOffsets = nodeOffsets(sourceTable);\n const currentOffsets = nodeOffsets(currentTable);\n if (!sourceOffsets || !currentOffsets) return [];\n return [\n {\n start: sourceOffsets.start,\n end: sourceOffsets.end,\n replacement: current.slice(currentOffsets.start, currentOffsets.end),\n },\n ];\n};\n\nconst collectTableChanges = (source: string, baseline: string, current: string): TableChanges => {\n const sourceTables = tablesIn(source);\n const baselineTables = tablesIn(baseline);\n const currentTables = tablesIn(current);\n\n if (sourceTables.length !== baselineTables.length || baselineTables.length !== currentTables.length) {\n return { edits: [], normalizedCurrent: current };\n }\n\n const edits: TextEdit[] = [];\n let normalizedCurrent = current;\n\n for (let index = currentTables.length - 1; index >= 0; index -= 1) {\n const sourceTable = sourceTables[index];\n const baselineTable = baselineTables[index];\n const currentTable = currentTables[index];\n if (!sourceTable || !baselineTable || !currentTable) continue;\n\n const baselineOffsets = nodeOffsets(baselineTable);\n const currentOffsets = nodeOffsets(currentTable);\n if (!baselineOffsets || !currentOffsets) continue;\n\n normalizedCurrent =\n normalizedCurrent.slice(0, currentOffsets.start) +\n baseline.slice(baselineOffsets.start, baselineOffsets.end) +\n normalizedCurrent.slice(currentOffsets.end);\n\n edits.push(...editsForTable(source, current, sourceTable, baselineTable, currentTable));\n }\n\n return { edits, normalizedCurrent };\n};\n\nconst applyChanges = (source: string, sourceMap: SourceMap, baseline: string, current: string) => {\n if (baseline === current) return source;\n\n const linkChanges = collectMarkdownLinkChanges(source, baseline, current);\n const tableChanges = collectTableChanges(source, baseline, linkChanges.normalizedCurrent);\n\n // Lexical reports semantic Markdown but normalizes its spelling. Map those\n // semantic edits back onto the loaded source so unrelated syntax never moves.\n const edits = collectEdits(baseline, tableChanges.normalizedCurrent)\n .map((edit) => ({\n start: edit.start === edit.end ? mappedEnd(sourceMap, edit.start) : mappedStart(sourceMap, edit.start),\n end: mappedEnd(sourceMap, edit.end),\n replacement: withSourceLineEndings(edit.replacement, source),\n }))\n .concat(\n linkChanges.edits.map((edit) => ({\n ...edit,\n replacement: withSourceLineEndings(edit.replacement, source),\n })),\n )\n .concat(\n tableChanges.edits.map((edit) => ({\n ...edit,\n replacement: withSourceLineEndings(edit.replacement, source),\n })),\n )\n .sort((left, right) => right.start - left.start);\n\n let result = source;\n for (const edit of edits) {\n result = result.slice(0, edit.start) + edit.replacement + result.slice(edit.end);\n }\n return result;\n};\n\nexport interface MarkdownSourceDocument {\n exportFromLexical: (root: ElementNode) => string;\n importToLexical: () => void;\n}\n\nexport const createMarkdownSourceDocument = (\n source: string,\n resolver?: MarkdownUrlResolver,\n): MarkdownSourceDocument => {\n let baseline: string | null = null;\n let sourceMap: SourceMap | null = null;\n\n return {\n importToLexical() {\n importMarkdownToLexical(source, resolver);\n baseline = exportLexicalToMarkdown($getRoot());\n sourceMap = buildSourceMap(baseline, source);\n },\n exportFromLexical(root) {\n const current = exportLexicalToMarkdown(root);\n const loadedBaseline = baseline ?? current;\n return applyChanges(source, sourceMap ?? buildSourceMap(loadedBaseline, source), loadedBaseline, current);\n },\n };\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\nexport default function ToggleEditablePlugin({ isEditable }: { isEditable: boolean }) {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n editor.setEditable(isEditable);\n }, [isEditable, editor]);\n\n return null;\n}\n","import { Box } from \"@chakra-ui/react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { TreeView } from \"@lexical/react/LexicalTreeView\";\n\nexport function TreeViewPlugin() {\n const [editor] = useLexicalComposerContext();\n return (\n <Box fontSize=\"xs\" color=\"fg.muted\" padding=\"4\">\n <TreeView\n treeTypeButtonClassName=\"debug-treetype-button\"\n timeTravelButtonClassName=\"debug-timetravel-button\"\n timeTravelPanelButtonClassName=\"debug-timetravel-button\"\n timeTravelPanelClassName=\"debug-timetravel-panel\"\n timeTravelPanelSliderClassName=\"debug-timetravel-slider\"\n viewClassName=\"tree-view-output\"\n editor={editor}\n />\n </Box>\n );\n}\n","const FRONTMATTER_PATTERN = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*(?:\\n|$)/;\n\nconst FENCE_PATTERN = /^```/;\nconst LIST_ITEM_PATTERN = /^([ \\t]*)((?:[-*+])|(?:\\d+\\.))\\s+/;\nconst INDENTED_LINE_PATTERN = /^([ \\t]+)/;\n\ninterface ActiveListIndent {\n normalizedIndentWidth: number;\n sourceIndentWidth: number;\n}\n\ninterface MarkdownListState {\n isInCodeFence: boolean;\n activeListIndents: ActiveListIndent[];\n}\n\nfunction getExpandedIndentWidth(indent: string) {\n let width = 0;\n\n for (const char of indent) {\n width += char === \"\\t\" ? 4 : 1;\n }\n\n return width;\n}\n\nfunction findParentIndent(activeListIndents: ActiveListIndent[], sourceIndentWidth: number) {\n return [...activeListIndents].reverse().find((indent) => indent.sourceIndentWidth < sourceIndentWidth);\n}\n\nfunction toNormalizedIndent(indent: string, normalizedWidth: number, sourceWidth: number) {\n if (normalizedWidth === sourceWidth && !indent.includes(\"\\t\")) return indent;\n return \" \".repeat(normalizedWidth);\n}\n\nfunction normalizeIndentedContinuation(line: string, activeListIndents: ActiveListIndent[]) {\n const indentedLineMatch = line.match(INDENTED_LINE_PATTERN);\n if (!indentedLineMatch) {\n if (line.trim() !== \"\") {\n activeListIndents.length = 0;\n }\n\n return line;\n }\n\n const sourceIndentWidth = getExpandedIndentWidth(indentedLineMatch[1]);\n const parentLevel = findParentIndent(activeListIndents, sourceIndentWidth);\n if (!parentLevel) return line;\n\n const normalizedIndentWidth = sourceIndentWidth + (parentLevel.normalizedIndentWidth - parentLevel.sourceIndentWidth);\n const normalizedIndent = toNormalizedIndent(indentedLineMatch[1], normalizedIndentWidth, sourceIndentWidth);\n\n if (normalizedIndent === indentedLineMatch[1]) return line;\n\n return `${normalizedIndent}${line.slice(indentedLineMatch[1].length)}`;\n}\n\nfunction normalizeListItem(line: string, match: RegExpMatchArray, activeListIndents: ActiveListIndent[]) {\n const sourceIndentWidth = getExpandedIndentWidth(match[1]);\n\n while (activeListIndents.length && activeListIndents.at(-1)!.sourceIndentWidth > sourceIndentWidth) {\n activeListIndents.pop();\n }\n\n const currentLevel = activeListIndents.at(-1);\n if (currentLevel?.sourceIndentWidth === sourceIndentWidth) {\n return `${toNormalizedIndent(match[1], currentLevel.normalizedIndentWidth, sourceIndentWidth)}${line.slice(match[1].length)}`;\n }\n\n const parentLevel = activeListIndents.at(-1);\n const indentStep = sourceIndentWidth - (parentLevel?.sourceIndentWidth ?? 0);\n let normalizedIndentWidth = sourceIndentWidth;\n\n if (parentLevel && indentStep === 2 && !match[1].includes(\"\\t\")) {\n normalizedIndentWidth = parentLevel.normalizedIndentWidth + 4;\n }\n\n activeListIndents.push({ normalizedIndentWidth, sourceIndentWidth });\n\n return `${toNormalizedIndent(match[1], normalizedIndentWidth, sourceIndentWidth)}${line.slice(match[1].length)}`;\n}\n\nfunction normalizeMarkdownLine(line: string, state: MarkdownListState) {\n if (FENCE_PATTERN.test(line.trimStart())) {\n state.isInCodeFence = !state.isInCodeFence;\n return line;\n }\n\n if (state.isInCodeFence) return line;\n\n const match = line.match(LIST_ITEM_PATTERN);\n if (!match) return normalizeIndentedContinuation(line, state.activeListIndents);\n\n return normalizeListItem(line, match, state.activeListIndents);\n}\n\nexport function normalizeMarkdownListIndentation(content: string) {\n const lines = content.split(\"\\n\");\n const state: MarkdownListState = { isInCodeFence: false, activeListIndents: [] };\n\n return lines.map((line) => normalizeMarkdownLine(line, state)).join(\"\\n\");\n}\n\nexport function splitFrontmatter(content: string) {\n const match = content.match(FRONTMATTER_PATTERN);\n if (!match) {\n return { frontmatter: \"\", body: content };\n }\n return {\n frontmatter: match[0],\n body: content.slice(match[0].length),\n };\n}\n"],"names":["StyledEditable","chakra","LexicalContentEditable","ContentEditable","t0","$","_c","onRef","fullWidth","t1","padding","isRichMessage","t2","scrollable","t3","undefined","t4","t5","t6","jsx","t7","Box","editor","t8","t9","Symbol","for","width","minH","t10","ScrollArea","ReferenceLinkNode","DecoratorNode","__href","__label","getType","clone","node","__key","constructor","href","label","key","createDOM","_config","_editor","document","createElement","updateDOM","_prevNode","_dom","getTextContent","exportJSON","type","version","importJSON","serializedNode","$createReferenceLinkNode","decorate","split","pop","isExternal","test","isProjectFile","ResourceBadge","window","open","projectPath","replace","event","CustomEvent","detail","dispatchEvent","location","assign","$isReferenceLinkNode","LINK_REGEXP","REFERENCE_LINK_TRANSFORMER","dependencies","export","regExp","importRegExp","textNode","match","value","theme","code","codeHighlight","atrule","attr","boolean","builtin","cdata","char","class","comment","constant","deleted","doctype","entity","function","important","inserted","keyword","namespace","number","operator","prolog","property","punctuation","regex","selector","string","symbol","tag","url","variable","embedBlock","base","focus","list","checklist","listitem","listitemChecked","listitemUnchecked","nested","olDepth","ol","ul","heading","h1","h2","h3","paragraph","text","underline","italic","link","quote","reference","table","tableCell","tableRow","tableCellHeader","layoutContainer","layoutItem","draggableBlockDemo","row","content","parserOptions","extensions","gfm","math","mdastExtensions","gfmFromMarkdown","mathFromMarkdown","serializerOptions","bullet","emphasis","gfmToMarkdown","mathToMarkdown","fence","fences","listItemIndent","rule","strong","fenceStart","line","normalizeLegacyInlineMath","codeFenceLength","result","index","length","end","slice","delimiter","normalizeLegacyMath","markdown","fencedCode","normalized","push","closingFence","character","openingFence","displayMath","indent","join","parseMarkdown","fromMarkdown","parseMarkdownSource","serializeMarkdownAst","tree","toMarkdown","trimEnd","serializeMarkdownBlock","children","serializeMarkdownInline","parseMarkdownInline","first","SAFE_LINK_PROTOCOLS","Set","SAFE_IMAGE_DATA_URL","PROTOCOL","hasSafeLinkProtocol","source","startsWith","has","URL","protocol","hasSafeImageProtocol","resolveMarkdownUrl","kind","resolver","resolved","MarkdownUrlContext","createContext","MarkdownUrlProvider","props","useMarkdownUrlResolver","useContext","MarkdownImage","alt","title","onLoad","Text","Image","MarkdownImageNode","__source","__alt","__title","isInline","getSource","getAlt","getTitle","$createMarkdownImageNode","keepFollowingSelectionVisible","isEditable","selectedBlockKey","getEditorState","read","selection","$getSelection","imageNode","$getNodeByKey","getKey","$isRangeSelection","isCollapsed","followingBlockKey","getTopLevelElement","getNextSibling","selectionBlock","anchor","getNode","blockKey","requestAnimationFrame","getElementByKey","scrollIntoView","block","$applyNodeReplacement","$isMarkdownImageNode","isHtmlComment","trim","sanitizeMarkdownHtml","clean","DOMPurify","sanitize","FORBID_TAGS","template","innerHTML","element","querySelectorAll","attribute","hasAttribute","sourceUrl","getAttribute","setAttribute","removeAttribute","RawHtml","display","elementRef","useRef","current","attachElement","fragment","element_0","replaceChildren","cloneNode","createTextNode","useEffect","RawHtmlNode","__display","previous","getDisplay","$createRawHtmlNode","$isRawHtmlNode","InlineChildren","nodes","Fragment","Code","Link","map","MarkdownInline","projectRows","rows","id","cells","projectColumns","columns","MarkdownDataTable","nodeKey","isSelected","setSelected","useState","containerRef","setTimeout","focusTable","change","update","$isDataTableNode","setTable","getTable","HISTORY_PUSH_TAG","updateTable","Object","fromEntries","column","handleColumnsChange","data","current_0","row_0","String","column_0","handleDataChange","node_0","$createParagraphNode","select","deleteTable","target","closest","preventDefault","handleClick","event_0","currentTarget","contains","relatedTarget","handleBlur","event_1","target_0","isTextInput","matches","isContentEditable","ctrlKey","metaKey","toLowerCase","stopPropagation","dispatchCommand","shiftKey","REDO_COMMAND","UNDO_COMMAND","handleKeyDown","t11","t12","t13","onColumnsChange","onDataChange","renderHeader","_temp","renderCell","_temp2","renderCellEditor","_temp3","t14","t15","t16","EditModeDataTable","_temp4","t17","DataTableNode","__table","getLatest","writable","getWritable","json","$createDataTableNode","headers","separator","column_1","context","onChange","LazyMarkdownEditor","row_1","safeLinkUrl","MarkdownLinkNode","LinkNode","__url","rel","__rel","__target","resolvedUrl","attributes","setURL","$createMarkdownLinkNode","$isMarkdownLinkNode","EquationComponent","React","lazy","$convertEquationElement","domNode","equation","inline","atob","$createEquationNode","EquationNode","__equation","__inline","getEquation","className","exportDOM","btoa","katex","render","displayMode","errorColor","output","strict","throwOnError","trust","importDOM","div","conversion","priority","span","prevNode","setEquation","Suspense","equationNode","$isEquationNode","EQUATION_INLINE","EQUATION_MULTILINE","regExpStart","regExpEnd","rootNode","_children","_startMatch","_endMatch","linesInBetween","append","EquationPlugin","HRNode","ElementNode","_serializedNode","$createHRNode","style","$isHRNode","MermaidComponent","MermaidNode","__code","getCode","setCode","$isMermaidNode","$createMermaidNode","HR","parentNode","UNDERLINE_INS_TAG","TextNode","markdownText","hasFormat","$createTextNode","toggleFormat","UNDERLINE_U_TAG","_node","BARE_URL_REGEXP","unescapeUrl","escapeLinkTitle","unescapeLinkTitle","normalizeEscapedUrlText","textContent","exportedText","escapedHref","LINK","exportChildren","$isLinkNode","$isAutoLinkNode","getURL","linkText","linkUrl","linkTitle","linkNode","$createLinkNode","openBracketAmount","closeBracketAmount","parsedLinkText","outsideLinkText","linkTextParts","normalizedLinkText","linkTextNode","setFormat","getFormat","insertBefore","trigger","BARE_URL","AutoLinkNode","autoLinkNode","$createAutoLinkNode","TRANSFORMERS_EXTENDED","editorNodes","QuoteNode","HeadingNode","ListNode","ListItemNode","CodeNode","CodeHighlightNode","baseEditorTransformers","CHECK_LIST","TRANSFORMERS","filter","transformer","LEXICAL_LINK","editorTransformers","editorTheme","isMermaidLanguage","language","replaceCodeNodeWithMermaidNode","getLanguage","ImportCodeBlocksPlugin","useLexicalComposerContext","codeNodes","$nodesOfType","n","CodeHighlightingPlugin","registerCodeHighlighting","exportText","exportInlineNode","$isTextNode","$isLineBreakNode","exportInlineChildren","$isElementNode","getChildren","flatMap","paragraphFrom","exportListItem","child","$isListNode","splice","exportList","$isParagraphNode","unshift","checked","getChecked","spread","ordered","getListType","start","getStart","$isListItemNode","exportTable","align","alignment","exportBlock","$isHeadingNode","depth","Number","getTag","$isQuoteNode","$isCodeNode","lang","meta","exportLexicalToMarkdown","root","REFERENCE_TOKEN","formattedText","formats","format","textWithReferences","matchAll","referenceDefinition","definitions","get","identifier","importInlineNode","importInlineChildren","$createLineBreakNode","definition","underlineDepth","Math","max","activeFormats","add","tableValue","tableIndex","prefix","header","columnCount","Array","from","_","rowIndex","columnIndex","appendListItem","parent","item","$createListItemNode","appendBlock","$createHeadingNode","$createQuoteNode","hasTasks","some","listType","$createListNode","$createCodeNode","importMarkdownToLexical","Map","$getRoot","clear","isEmpty","nodeOffsets","position","offset","isParent","isArray","isLink","linksIn","links","linkOccurrencesIn","removedLinkReplacements","baseline","sourceLinks","baselineBlock","baselineLinks","currentBlock","baselineBlockOffsets","currentBlockOffsets","linkOffsets","offsets","segments","baselineOffset","currentBlockSource","firstSegment","replacements","currentOffset","nextSegment","replacementEnd","indexOf","replacement","sourceLinkOffsets","baselineLinkOffsets","edit","normalization","findRemovedLinkReplacements","currentBlocks","preferredBlockIndex","usedCurrentBlocks","candidateIndexes","sort","left","right","currentBlockIndex","currentLinks","collectMarkdownLinkChanges","edits","normalizedCurrent","baselineTree","currentTree","normalizations","linkOrdinal","blockIndex","linkChanges","diffSourceBlocks","canonical","canonicalBlocks","sourceBlocks","every","diffChars","canonicalOffset","sourceOffset","canonicalEnd","sourceEnd","buildSourceMap","fill","removedAtBoundary","added","removed","nearestMappedOffset","values","direction","at","mappedStart","exact","mappedEnd","collectEdits","pending","finishPending","sourceLineEnding","includes","withSourceLineEndings","lineEnding","replaceAll","withoutPosition","entries","entry","sameMarkdownNode","JSON","stringify","tablesIn","Boolean","tableCells","sameTableShape","cellContentOffsets","cell","last","contentStart","contentEnd","cellOffsets","cellSource","leftDelimiter","rightDelimiter","endsWith","insideStart","leadingSpace","cellMarkdown","collectTableCellEdits","sourceTable","baselineTable","currentTable","sourceCells","baselineCells","currentCell","sourceCell","baselineCell","sourceContent","editsForTable","sourceOffsets","currentOffsets","collectTableChanges","sourceTables","baselineTables","currentTables","baselineOffsets","applyChanges","sourceMap","tableChanges","concat","createMarkdownSourceDocument","importToLexical","exportFromLexical","loadedBaseline","ToggleEditablePlugin","setEditable","TreeViewPlugin","TreeView","FRONTMATTER_PATTERN","splitFrontmatter","frontmatter","body"],"mappings":"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"}