@pstdio/ui 0.44.0 → 0.45.0-nightly.20261021030241

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 (65) hide show
  1. package/dist/{MermaidComponent-DhNTaUMt.js → MermaidComponent-CTWuGAqI.js} +2 -2
  2. package/dist/{MermaidComponent-DhNTaUMt.js.map → MermaidComponent-CTWuGAqI.js.map} +1 -1
  3. package/dist/alert-CO-uOKLm.js +409 -0
  4. package/dist/alert-CO-uOKLm.js.map +1 -0
  5. package/dist/chat-ui.d.ts +7 -5
  6. package/dist/chat-ui.js +1110 -1119
  7. package/dist/chat-ui.js.map +1 -1
  8. package/dist/{collection-view-grouping-BKIr4QAb.js → collection-view-grouping-BQMfKdQG.js} +2 -2
  9. package/dist/{collection-view-grouping-BKIr4QAb.js.map → collection-view-grouping-BQMfKdQG.js.map} +1 -1
  10. package/dist/{collection-view-search-D7HFymZW.js → collection-view-search-DS9U9WAl.js} +2 -2
  11. package/dist/{collection-view-search-D7HFymZW.js.map → collection-view-search-DS9U9WAl.js.map} +1 -1
  12. package/dist/collection-view.d.ts +90 -3
  13. package/dist/collection-view.js +1 -1
  14. package/dist/data-table.d.ts +1 -2
  15. package/dist/data-table.js +4 -4
  16. package/dist/{diff-viewer-Cpiw-1ut.js → diff-viewer-ChEyTNpa.js} +2 -2
  17. package/dist/{diff-viewer-Cpiw-1ut.js.map → diff-viewer-ChEyTNpa.js.map} +1 -1
  18. package/dist/diff.js +2 -2
  19. package/dist/{display-sort-control-BuqijDAl.js → display-sort-control-BUMkmlIu.js} +3 -3
  20. package/dist/{display-sort-control-BuqijDAl.js.map → display-sort-control-BUMkmlIu.js.map} +1 -1
  21. package/dist/{edit-mode-data-table-BwNTRik5.js → edit-mode-data-table-MKEjfFUw.js} +4 -4
  22. package/dist/{edit-mode-data-table-BwNTRik5.js.map → edit-mode-data-table-MKEjfFUw.js.map} +1 -1
  23. package/dist/icon-options-DpzDAnlu.js +313 -0
  24. package/dist/icon-options-DpzDAnlu.js.map +1 -0
  25. package/dist/{index-DTjRTEez.d.ts → index-C0PaeiBy.d.ts} +8 -1
  26. package/dist/{index-Bq1BDCBk.d.ts → index-eV_0Gjzo.d.ts} +4 -2
  27. package/dist/index.d.ts +16 -2
  28. package/dist/index.js +862 -780
  29. package/dist/index.js.map +1 -1
  30. package/dist/kanban-renderer.d.ts +2 -2
  31. package/dist/kanban-renderer.js +596 -397
  32. package/dist/kanban-renderer.js.map +1 -1
  33. package/dist/{markdown-editor-DUBUE7M-.js → markdown-editor-BPGIS9ku.js} +996 -876
  34. package/dist/markdown-editor-BPGIS9ku.js.map +1 -0
  35. package/dist/param-editor-Bva0M7Ns.js +374 -0
  36. package/dist/param-editor-Bva0M7Ns.js.map +1 -0
  37. package/dist/{param-editor-field-B5z6200g.js → param-editor-field-BPBlweVg.js} +1183 -1161
  38. package/dist/param-editor-field-BPBlweVg.js.map +1 -0
  39. package/dist/param-editor.d.ts +57 -2
  40. package/dist/param-editor.js +3 -3
  41. package/dist/{resolve-icon-component-Ck6ZyRnc.js → resolve-icon-component-Dy0pOuj5.js} +2 -2
  42. package/dist/{resolve-icon-component-Ck6ZyRnc.js.map → resolve-icon-component-Dy0pOuj5.js.map} +1 -1
  43. package/dist/{rich-text-2c_ra5gK.js → rich-text-CH2psble.js} +569 -524
  44. package/dist/rich-text-CH2psble.js.map +1 -0
  45. package/dist/rich-text.d.ts +1 -1
  46. package/dist/rich-text.js +3 -3
  47. package/dist/terminal.js +1 -1
  48. package/dist/{theme-Chgjys_o.js → theme-BsStBWWL.js} +255 -155
  49. package/dist/theme-BsStBWWL.js.map +1 -0
  50. package/dist/theme.js +1 -1
  51. package/dist/{tree-list-B8Gtot1M.js → tree-list-aNC_UTGS.js} +396 -341
  52. package/dist/tree-list-aNC_UTGS.js.map +1 -0
  53. package/package.json +2 -2
  54. package/dist/alert-MQ47wy7f.js +0 -388
  55. package/dist/alert-MQ47wy7f.js.map +0 -1
  56. package/dist/icon-options-Tt6Wzhtv.js +0 -308
  57. package/dist/icon-options-Tt6Wzhtv.js.map +0 -1
  58. package/dist/index-kYQwGcym.d.ts +0 -91
  59. package/dist/markdown-editor-DUBUE7M-.js.map +0 -1
  60. package/dist/param-editor-DK1uCOh3.js +0 -225
  61. package/dist/param-editor-DK1uCOh3.js.map +0 -1
  62. package/dist/param-editor-field-B5z6200g.js.map +0 -1
  63. package/dist/rich-text-2c_ra5gK.js.map +0 -1
  64. package/dist/theme-Chgjys_o.js.map +0 -1
  65. package/dist/tree-list-B8Gtot1M.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-editor-BPGIS9ku.js","names":["Box","chakra","ContentEditable","LexicalContentEditable","ScrollArea","StyledEditable","ContentEditableProps","onRef","elem","HTMLDivElement","fullWidth","padding","layerStyle","isRichMessage","scrollable","t0","$","_c","t1","t2","t3","undefined","t4","t5","t6","t7","editor","t8","t9","Symbol","for","width","minH","t10","LexicalContentEditable","ContentEditable","_c","ScrollArea","ChatLinkCandidate","source","origin","ChatLinkHandler","resolveHref","candidate","resolveResource","Promise","label","icon","href","resolveImageSource","resolveIcon","describe","open","ChatLinkProps","linkHandler","ChatSourcePosition","line","column","endLine","ParsedChatLink","kind","path","position","reason","isGuessedChatLink","isChatWebLink","handler","parsed","parseChatLink","window","undefined","location","test","invalid","const","positive","value","Number","isSafeInteger","localSource","url","URL","hostname","pathname","replace","hash","search","filePosition","indexOf","match","exec","slice","index","isInlinePath","original","explicit","startsWith","shaped","includes","dashboardOrigin","trim","local","file","decodeURIComponent","replaceAll","createContext","ReactNode","useContext","ChatLinkHandler","ChatLinkContext","undefined","ChatLinkProvider","props","$","_c","handler","children","t0","useChatLinkHandler","ChatLinkStreamingContext","_c","useEffect","useState","ChatLinkCandidate","ChatLinkHandler","useChatLinkHandler","Presentation","Awaited","ReturnType","NonNullable","useChatResource","candidate","t0","$","_c","enabled","undefined","source","origin","handler","resolved","setResolved","t1","t2","active","resolveResource","then","value","catch","_c","Link","ReactNode","ChatLinkCandidate","isGuessedChatLink","parseChatLink","useChatLinkHandler","useChatResource","ChatLinkAnchor","props","$","_c","candidate","children","resolvedHref","handler","resource","undefined","parsed","window","location","origin","href","resolveHref","kind","t0","t1","t2","t3","event","stopPropagation","metaKey","ctrlKey","shiftKey","altKey","button","preventDefault","open","event_0","key","t4","_c","EditorThemeClasses","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","TEXT_TYPE_TO_FORMAT","TextFormatType","ReactNode","theme","CHAT_TEXT_FORMAT_TAGS","const","hasChatTextFormat","format","type","ChatGuessText","props","text","reduceRight","content","Tag","Box","Icon","ResourceBadge","getFileTypeIcon","resolveIconComponent","ChatGuessText","ChatLinkCandidate","isGuessedChatLink","parseChatLink","ChatLinkAnchor","useChatLinkHandler","useChatResource","ChatResourceLinkProps","candidate","label","format","ChatResourceLink","props","$","_c","t0","undefined","handler","presentation","t1","parsed","t2","icon","ownerIcon","t3","kind","path","ResourceIcon","t4","href","resolveHref","t5","t6","t7","t8","_c","MarkdownUrlKind","MarkdownUrlResolver","source","kind","SAFE_LINK_PROTOCOLS","Set","SAFE_IMAGE_DATA_URL","PROTOCOL","hasSafeLinkProtocol","startsWith","test","has","URL","protocol","hasSafeImageProtocol","resolveMarkdownUrl","resolver","resolved","sourceIsRelative","Box","Icon","Image","Link","Globe","useContext","useEffect","useState","ResourceBadge","resolveMarkdownUrl","ChatLinkStreamingContext","useChatLinkHandler","ChatWebLinkProps","source","label","SiteIcon","props","$","_c","href","handler","streaming","icon","setIcon","failedSrc","setFailedSrc","t0","t1","active","show","src","resolveIcon","then","src_0","t2","Symbol","for","t3","ChatWebLink","_c","Box","Link","isChatWebLink","parseChatLink","ChatLinkAnchor","useChatLinkHandler","ChatResourceLink","ChatWebLink","ResourceBadge","ReferenceLinkBadge","props","$","_c","href","target","handler","candidate","label","t0","Symbol","for","bb0","source","origin","const","t1","split","pop","t2","parsed","window","undefined","location","kind","test","open","dispatchEvent","CustomEvent","detail","replace","assign","t3","_c","DecoratorNode","EditorConfig","LexicalEditor","LexicalNode","NodeKey","SerializedLexicalNode","Spread","ReactElement","ReferenceLinkBadge","SerializedReferenceLinkNode","href","label","ReferenceLinkNode","__href","__label","getType","clone","node","__key","constructor","key","createDOM","_config","_editor","HTMLElement","document","createElement","updateDOM","_prevNode","_dom","getTextContent","importDOM","exportDOM","element","createTextNode","exportJSON","type","version","importJSON","serializedNode","$createReferenceLinkNode","decorate","$isReferenceLinkNode","TextMatchTransformer","$createReferenceLinkNode","$isReferenceLinkNode","ReferenceLinkNode","LINK_REGEXP","REFERENCE_LINK_TRANSFORMER","dependencies","export","node","href","__href","label","__label","regExp","importRegExp","replace","textNode","match","value","looksLikeUrl","test","type","Paragraph","PhrasingContent","Root","RootContent","fromMarkdown","gfmFromMarkdown","gfmToMarkdown","mathFromMarkdown","mathToMarkdown","toMarkdown","gfm","math","parserOptions","extensions","mdastExtensions","serializerOptions","bullet","const","emphasis","fence","fences","listItemIndent","rule","strong","fenceStart","line","match","normalizeLegacyInlineMath","codeFenceLength","result","index","length","end","slice","delimiter","normalizeLegacyMath","markdown","fencedCode","character","normalized","split","push","closingFence","openingFence","displayMath","indent","test","replace","join","parseMarkdown","parseMarkdownSource","serializeMarkdownAst","tree","trimEnd","serializeMarkdownBlock","node","type","children","serializeMarkdownInline","paragraph","parseMarkdownInline","first","createContext","ReactNode","useContext","MarkdownUrlResolver","MarkdownUrlContext","undefined","MarkdownUrlProviderProps","children","resolver","MarkdownUrlProvider","props","$","_c","t0","useMarkdownUrlResolver","_c","createContext","useContext","resolveMarkdownUrl","ChatMessagePart","SessionMessage","ChatLinkHandler","parseChatLink","emptyChatImageSources","ReadonlyMap","Map","emptyImageHistory","WeakMap","ChatImageHistory","Pick","imageSourceKey","source","handler","parsed","origin","kind","undefined","resolveHref","path","addCapturedImages","sources","part","type","Array","isArray","state","output","next","image","src","key","set","indexChatImageSources","messages","index","message","parts","size","history","capturedChatImageSource","get","ChatImageHistoryContext","useChatImageHistory","ChatImageSourcesContext","useChatImageSources","Box","Image","Text","$applyNodeReplacement","$getNodeByKey","$getSelection","$isRangeSelection","DecoratorNode","LexicalEditor","LexicalNode","NodeKey","SerializedLexicalNode","Spread","ReactNode","useEffect","useState","capturedChatImageSource","useChatImageSources","ChatLinkHandler","useChatLinkHandler","resolveMarkdownUrl","useMarkdownUrlResolver","SerializedMarkdownImageNode","source","alt","title","MarkdownImageProps","onLoad","MarkdownImage","props","$","_c","resolver","handler","t0","t1","captured","loaded","setLoaded","t2","direct","t3","value","resolved","t4","t5","resolveImageSource","current","catch","_temp","then","t6","t7","undefined","MarkdownImageNode","__source","__alt","__title","getType","clone","node","__key","constructor","key","createDOM","document","createElement","updateDOM","isInline","getSource","getAlt","getTitle","getTextContent","exportJSON","type","version","importJSON","$createMarkdownImageNode","decorate","editor","keepFollowingSelectionVisible","isEditable","selectedBlockKey","getEditorState","read","selection","imageNode","getKey","isCollapsed","imageBlock","getTopLevelElement","followingBlock","getNextSibling","followingBlockKey","selectionBlock","anchor","getNode","blockKey","requestAnimationFrame","getElementByKey","scrollIntoView","block","$isMarkdownImageNode","_c","_temp","DOMPurify","$applyNodeReplacement","DecoratorNode","LexicalNode","NodeKey","SerializedLexicalNode","Spread","ReactNode","useEffect","useRef","resolveMarkdownUrl","useMarkdownUrlResolver","RawHtmlDisplay","SerializedRawHtmlNode","source","display","isHtmlComment","test","trim","sanitizeMarkdownHtml","resolver","ReturnType","document","clean","sanitize","FORBID_TAGS","template","createElement","innerHTML","element","content","querySelectorAll","HTMLElement","attribute","hasAttribute","kind","sourceUrl","getAttribute","resolved","setAttribute","removeAttribute","RawHtmlProps","RawHtml","props","$","_c","elementRef","t0","Symbol","for","current","attachElement","t1","t2","fragment","element_0","replaceChildren","cloneNode","createTextNode","t3","RawHtmlNode","__source","__display","getType","clone","node","__key","constructor","key","createDOM","updateDOM","previous","isInline","getSource","getDisplay","getTextContent","exportJSON","type","version","importJSON","$createRawHtmlNode","decorate","$isRawHtmlNode","_c","Box","Code","Link","Text","PhrasingContent","Fragment","ReactNode","isChatWebLink","parseChatLink","ChatLinkAnchor","useChatLinkHandler","ChatWebLink","parseMarkdownInline","resolveMarkdownUrl","useMarkdownUrlResolver","MarkdownImage","RawHtml","MarkdownInlineProps","value","InlineChildrenProps","nodes","plainText","map","node","children","join","InlineChildren","props","$","_c","resolver","handler","t0","t1","index","key","type","source","origin","candidate","url","const","every","_temp","parsed","window","undefined","location","kind","resolveHref","href","title","alt","MarkdownInline","child","_c","Fragment","_temp","createContext","DataTableSettings","MarkdownTableSettingsContext","Partial","undefined","Box","$applyNodeReplacement","$createParagraphNode","$getNodeByKey","DecoratorNode","HISTORY_PUSH_TAG","LexicalEditor","LexicalNode","NodeKey","REDO_COMMAND","SerializedLexicalNode","Spread","UNDO_COMMAND","React","FocusEvent","KeyboardEvent","MouseEvent","useContext","useRef","useState","EditModeDataTable","DataTableEditModeColumn","RowData","HostStorageProvider","LazyMarkdownEditor","MarkdownInline","MarkdownTableValue","MarkdownTableSettingsContext","MarkdownDataTableProps","editor","nodeKey","table","projectRows","rows","map","row","id","cells","projectColumns","columns","MarkdownDataTable","props","$","_c","defaultSettings","storage","_temp3","isSelected","setSelected","containerRef","t0","Symbol","for","setTimeout","current","focus","focusTable","t1","change","update","node","$isDataTableNode","setTable","getTable","tag","updateTable","t2","Object","fromEntries","column","handleColumnsChange","t3","data","current_0","row_0","index","String","column_0","handleDataChange","t4","node_0","paragraph","replace","select","deleteTable","t5","event","target","HTMLElement","currentTarget","contains","closest","preventDefault","handleClick","t6","event_0","relatedTarget","Node","handleBlur","t7","event_1","target_0","isTextInput","matches","isContentEditable","isUndo","ctrlKey","metaKey","key","toLowerCase","stopPropagation","dispatchCommand","shiftKey","undefined","handleKeyDown","t8","t9","t10","t11","t12","t13","onColumnsChange","onDataChange","renderHeader","_temp4","renderCell","_temp5","renderCellEditor","_temp6","t14","isEditable","t15","t16","_temp7","t17","t18","DataTableNode","JSX","Element","__table","getType","clone","__key","constructor","getLatest","writable","getWritable","createDOM","document","createElement","updateDOM","decorate","exportJSON","SerializedDataTableNode","type","version","importJSON","json","$createDataTableNode","getTextContent","headers","label","join","separator","_temp","_temp2","getItem","setItem","column_1","context","value","onChange","row_1","_c","_temp3","_temp4","_temp","_temp2","LinkAttributes","LinkNode","SerializedLinkNode","$applyNodeReplacement","EditorConfig","LexicalNode","NodeKey","SerializedLexicalNode","Spread","MarkdownUrlResolver","resolveMarkdownUrl","SerializedMarkdownLinkNode","source","safeLinkUrl","resolver","MarkdownLinkNode","__source","getType","clone","node","__url","rel","__rel","target","__target","title","__title","__key","constructor","resolvedUrl","attributes","key","createDOM","config","anchor","dataset","chatSource","chatOrigin","updateDOM","previous","HTMLAnchorElement","changed","getSource","setResolvedURL","url","getURL","getWritable","setURL","writable","exportJSON","type","version","importJSON","$createMarkdownLinkNode","undefined","$isMarkdownLinkNode","$applyNodeReplacement","EditorConfig","TextNode","StreamingTextNode","getType","clone","node","__text","__key","importJSON","serialized","ReturnType","$createStreamingTextNode","text","updateFromJSON","createDOM","config","element","classList","add","exportJSON","type","katex","DOMConversionMap","DOMConversionOutput","EditorConfig","LexicalNode","NodeKey","SerializedLexicalNode","Spread","$applyNodeReplacement","DecoratorNode","DOMExportOutput","React","Suspense","EquationComponent","lazy","SerializedEquationNode","equation","inline","$convertEquationElement","domNode","HTMLElement","getAttribute","atob","node","$createEquationNode","EquationNode","ReactNode","__equation","__inline","getType","clone","__key","constructor","key","importJSON","serializedNode","exportJSON","getEquation","type","version","createDOM","_config","element","document","createElement","className","exportDOM","btoa","setAttribute","render","displayMode","errorColor","output","strict","throwOnError","trust","importDOM","div","hasAttribute","conversion","priority","span","updateDOM","prevNode","getTextContent","setEquation","writable","getWritable","isInline","decorate","equationNode","$isEquationNode","MultilineElementTransformer","TextMatchTransformer","$createEquationNode","$isEquationNode","EquationNode","EQUATION_INLINE","dependencies","export","node","isInline","getEquation","trim","importRegExp","regExp","replace","textNode","match","equationNode","type","EQUATION_MULTILINE","regExpStart","regExpEnd","rootNode","_children","_startMatch","_endMatch","linesInBetween","append","join","EquationPlugin","EditorConfig","ElementNode","LexicalEditor","LexicalNode","SerializedElementNode","Spread","SerializedHRNode","HRNode","getType","clone","node","__key","importJSON","_serializedNode","$createHRNode","exportJSON","createDOM","_config","_editor","HTMLElement","element","document","createElement","style","updateDOM","_prevNode","_dom","decorate","$isHRNode","LexicalNode","NodeKey","SerializedLexicalNode","$applyNodeReplacement","DecoratorNode","ReactNode","lazy","Suspense","MermaidComponent","SerializedMermaidNode","type","code","version","MermaidNode","__code","getType","clone","node","__key","constructor","key","createDOM","document","createElement","updateDOM","importJSON","serializedNode","exportJSON","getTextContent","getCode","setCode","writable","getWritable","decorate","$isMermaidNode","$createMermaidNode","ElementTransformer","LexicalNode","$createHRNode","$isHRNode","HRNode","HR","dependencies","export","node","regExp","replace","parentNode","line","type","$createAutoLinkNode","$createLinkNode","$isAutoLinkNode","$isLinkNode","AutoLinkNode","LinkNode","TextMatchTransformer","$createTextNode","TextNode","HR","UNDERLINE_INS_TAG","dependencies","export","node","_children","markdownText","getTextContent","hasFormat","regExp","importRegExp","replace","match","textNode","toggleFormat","type","UNDERLINE_U_TAG","_node","BARE_URL_REGEXP","unescapeUrl","url","escapeLinkTitle","title","unescapeLinkTitle","normalizeEscapedUrlText","textContent","href","exportedText","escapedHref","LINK","exportChildren","getTitle","getURL","linkText","linkUrl","linkTitle","linkNode","openBracketAmount","split","length","closeBracketAmount","parsedLinkText","outsideLinkText","linkTextParts","slice","join","normalizedLinkText","linkTextNode","setFormat","getFormat","append","insertBefore","trigger","BARE_URL","autoLinkNode","TRANSFORMERS_EXTENDED","LINK","AutoLinkNode","LinkNode","ListItemNode","ListNode","CHECK_LIST","LINK","LEXICAL_LINK","TRANSFORMERS","HeadingNode","QuoteNode","Klass","LexicalNode","REFERENCE_LINK_TRANSFORMER","ReferenceLinkNode","theme","CodeHighlightNode","CodeNode","DataTableNode","MarkdownImageNode","MarkdownLinkNode","RawHtmlNode","StreamingTextNode","EquationNode","EQUATION_INLINE","EQUATION_MULTILINE","HRNode","MermaidNode","TRANSFORMERS_EXTENDED","editorNodes","Array","baseEditorTransformers","filter","transformer","editorTransformers","editorTheme","LEXICAL_LINK","IconButton","useLexicalComposerContext","$findMatchingParent","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_CRITICAL","SELECTION_CHANGE_COMMAND","Check","Copy","React","CSSProperties","useEffect","useRef","useState","createPortal","Tooltip","$isCodeNode","getCodeElementFromSelection","editor","ReturnType","selection","anchorNode","anchor","getNode","codeNode","node","codeElement","getElementByKey","getKey","HTMLElement","getCodeElementFromTarget","target","EventTarget","closest","getActionPosition","anchorElem","anchorRect","getBoundingClientRect","codeRect","top","left","right","CodeBlockActionsPlugin","t0","$","_c","activeCodeElement","setActiveCodeElement","isCopied","setIsCopied","copyResetTimeoutRef","t1","t2","Symbol","for","current","window","clearTimeout","t3","t4","rootElement","getRootElement","handlePointerMove","event","nextCodeElement","handlePointerLeave","getEditorState","read","selectionCodeElement","addEventListener","removeEventListener","t5","t6","registerUpdateListener","t7","editorState","selectionCodeElement_0","registerCommand","selectionCodeElement_1","_temp","position","t8","style","t9","t10","t11","textContent","code","navigator","clipboard","writeText","setTimeout","t12","t13","t14","t15","t16","matches","_c","_temp","Tooltip","useLexicalComposerContext","$nodesOfType","useEffect","CodeNode","MermaidNode","isMermaidLanguage","language","trim","toLowerCase","replaceCodeNodeWithMermaidNode","node","getLanguage","replace","getTextContent","ImportCodeBlocksPlugin","$","_c","editor","t0","t1","update","_temp","codeNodes","n","_c","_temp","useLexicalComposerContext","useEffect","registerCodeHighlighting","CodeHighlightingPlugin","$","_c","editor","t0","t1","_c","createCommand","LexicalCommand","TOGGLE_LINK_EDIT_MODE_COMMAND","$isAtNodeEnd","ElementNode","RangeSelection","TextNode","getSelectedNode","selection","anchor","focus","anchorNode","getNode","focusNode","isBackward","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPos","targetRect","DOMRect","floatingElem","HTMLElement","anchorElem","verticalGap","horizontalOffset","placement","coordinateSpace","scrollerElem","parentElement","style","opacity","transform","floatingElemRect","getBoundingClientRect","anchorElementRect","editorScrollerRect","document","documentElement","clientWidth","clientHeight","top","height","left","bottom","width","right","Math","abs","IconButton","Stack","Text","HeadingTagType","FORMAT_TEXT_COMMAND","LexicalEditor","Code","Link","LinkIcon","List","ListOrdered","ListTodo","TextQuote","Tooltip","BlockType","FloatingToolbarButtonsProps","editor","blockType","isBold","isItalic","isUnderline","isCode","isLink","formatHeading","headingSize","formatList","type","formatQuote","insertLink","ToolbarSeparator","$","_c","t0","Symbol","for","display","height","margin","borderLeft","FloatingToolbarButtons","props","undefined","t1","dispatchCommand","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","t45","t46","t47","t48","t49","t50","t51","t52","_c","Tooltip","Code","LinkIcon","$isListNode","$isHeadingNode","$findMatchingParent","$isRootOrShadowRoot","LexicalNode","blockTypeToBlockName","bullet","check","code","h1","h2","h3","h4","h5","h6","number","paragraph","quote","BlockType","toKnownBlockType","type","findSelectionElement","anchorNode","rootMatch","getKey","node","parent","getParent","getTopLevelElementOrThrow","resolveBlockTypeFromAnchor","element","getListType","parentList","getTag","getType","ShouldShowFloatingToolbarParams","hasSelection","isRangeSelection","isCollapsed","hasNativeSelection","hasNativeRange","isAnchorInsideEditor","isEditorEditable","isPointerSelecting","shouldShowFloatingToolbar","params","Box","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","REMOVE_LIST_COMMAND","useLexicalComposerContext","$createHeadingNode","$createQuoteNode","HeadingTagType","$setBlocksType","$findMatchingParent","mergeRegister","$createParagraphNode","$getSelection","$isRangeSelection","CLICK_COMMAND","COMMAND_PRIORITY_CRITICAL","COMMAND_PRIORITY_HIGH","LexicalEditor","SELECTION_CHANGE_COMMAND","React","Dispatch","useEffect","useRef","useState","createPortal","TOGGLE_LINK_EDIT_MODE_COMMAND","getSelectedNode","setFloatingElemPos","FloatingToolbarButtons","BlockType","resolveBlockTypeFromAnchor","shouldShowFloatingToolbar","GAP","FloatingTextToolbar","editor","anchorElem","isToolbarActive","setIsToolbarActive","HTMLElement","JSX","Element","editorRef","HTMLDivElement","blockType","setBlockType","isBold","setIsBold","isItalic","setIsItalic","isUnderline","setIsUnderline","isCode","setIsCode","isLink","setIsLink","isPointerSelectingRef","updateFloatingToolbarRef","undefined","formatHeading","headingSize","update","selection","formatList","type","dispatchCommand","command","bullet","number","check","formatQuote","insertLink","updateToolbar","hasFormat","node","linkParent","autoLinkParent","nextBlockType","anchor","getNode","current","editorElem","nativeSelection","window","getSelection","rootElement","getRootElement","hasNativeSelection","hasNativeRange","rangeCount","isAnchorInsideEditor","Boolean","contains","anchorNode","hasSelection","isRangeSelection","isCollapsed","isEditorEditable","isEditable","isPointerSelecting","domRect","DOMRect","getRangeAt","getBoundingClientRect","bottomRect","left","bottom","ownerDocument","startPointerSelection","finishPointerSelection","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","registerCommand","_payload","FloatingTextFormatToolbarPlugin","t0","$","_c","t1","document","body","t2","GAP","_c","ListNode","useLexicalComposerContext","useEffect","ListMarkerWidthPlugin","$","_c","editor","t0","t1","registerMutationListener","mutations","key","mutation","list","getElementByKey","HTMLOListElement","values","children","flatMap","_temp","style","setProperty","String","Math","max","start","length","toString","item","HTMLLIElement","value","_c","_temp","$isLinkNode","$isListItemNode","$isListNode","ListItemNode","ListNode","$isHeadingNode","$isQuoteNode","$isElementNode","$isInlineElementOrDecoratorNode","$isLineBreakNode","$isParagraphNode","$isTextNode","ElementNode","LexicalNode","TextNode","BlockContent","ListItem","Paragraph","PhrasingContent","Root","Table","TableCell","$isReferenceLinkNode","$isCodeNode","parseMarkdownInline","serializeMarkdownAst","$isDataTableNode","DataTableNode","$isMarkdownImageNode","$isMarkdownLinkNode","$isRawHtmlNode","$isEquationNode","$isHRNode","$isMermaidNode","exportText","node","content","hasFormat","type","value","getTextContent","children","exportInlineNode","url","getSource","alt","getAlt","title","getTitle","isInline","getEquation","getURL","exportInlineChildren","getChildren","flatMap","exportQuoteChildren","inline","flushInline","length","push","splice","child","block","exportBlock","paragraphFrom","exportListItem","exportList","unshift","checked","getChecked","spread","const","ordered","getListType","start","getStart","filter","map","tableCell","exportTable","table","getTable","align","columns","column","alignment","label","rows","row","cells","id","depth","Number","getTag","slice","lang","getLanguage","meta","getCode","exportLexicalToMarkdown","root","tree","PhrasingContent","REFERENCE_TOKEN","REFERENCE_PREFIX","REFERENCE_AT_START","RegExp","source","literalLinkText","node","type","children","every","child","undefined","text","map","value","join","start","position","offset","end","length","url","readReferenceText","first","prefix","match","index","test","slice","$createListItemNode","$createListNode","$createHeadingNode","$createQuoteNode","$createLineBreakNode","$createParagraphNode","$createTextNode","$getRoot","ElementNode","LexicalNode","TextFormatType","Definition","ImageReference","LinkReference","PhrasingContent","RootContent","Table","$createReferenceLinkNode","$createCodeNode","parseMarkdown","serializeMarkdownBlock","serializeMarkdownInline","REFERENCE_TOKEN","readReferenceText","MarkdownTableAlignment","MarkdownTableValue","MarkdownUrlResolver","$createDataTableNode","$createMarkdownImageNode","$createMarkdownLinkNode","$createRawHtmlNode","$createEquationNode","$createHRNode","$createMermaidNode","ImportContext","definitions","Map","resolver","tableIndex","formattedText","value","formats","Set","node","format","toggleFormat","textWithReferences","nodes","start","match","matchAll","index","push","slice","label","href","test","length","referenceDefinition","context","get","identifier","toLowerCase","importInlineNode","type","importInlineChildren","children","link","url","title","append","definition","alt","underlineDepth","trim","Math","max","activeFormats","add","reference","end","tableValue","table","prefix","header","columnCount","columns","Array","from","_","id","alignment","align","rows","map","row","rowIndex","cells","Object","fromEntries","column","columnIndex","appendListItem","parent","item","checked","undefined","child","appendBlock","paragraph","heading","depth","quote","entries","hasTasks","some","listType","ordered","list","lang","createMarkdownLexicalNodes","markdown","tree","filter","root","isEmpty","getChildren","importMarkdownToLexical","clear","$createCodeNode","Link","LinkReference","Parent","RootContent","parseMarkdownSource","TextEdit","end","replacement","start","LinkChanges","edits","normalizedCurrent","LinkOccurrence","block","node","nodeOffsets","position","offset","undefined","isParent","Array","isArray","children","isLink","type","linksIn","links","child","push","linkOccurrencesIn","markdown","flatMap","map","removedLinkReplacements","baseline","current","sourceLinks","baselineBlock","baselineLinks","currentBlock","baselineBlockOffsets","currentBlockOffsets","linkOffsets","some","offsets","segments","baselineOffset","slice","currentBlockSource","firstSegment","startsWith","replacements","value","currentOffset","length","index","nextSegment","replacementEnd","indexOf","sourceLinkOffsets","baselineLinkOffsets","edit","normalization","findRemovedLinkReplacements","currentBlocks","preferredBlockIndex","usedCurrentBlocks","Set","candidateIndexes","_","sort","left","right","Number","currentBlockIndex","has","currentLinks","collectMarkdownLinkChanges","source","baselineTree","currentTree","normalizations","linkOrdinal","blockIndex","linkChanges","add","nodeOffsets","diffChars","parseMarkdownSource","SourceMap","blockStarts","Map","end","start","matchingSourceBlocks","canonical","source","canonicalBlocks","children","sourceBlocks","filter","block","type","sameBlocks","length","every","index","position","offset","undefined","map","diffSourceBlocks","blocks","ReturnType","canonicalOffset","sourceOffset","canonicalEnd","sourceEnd","slice","buildSourceMap","Array","from","fill","removedAtBoundary","change","value","added","removed","canonicalStart","sourceStart","set","nearestMappedOffset","values","direction","at","mappedStart","exact","mappedEnd","mappedInsertion","get","diffChars","$getRoot","ElementNode","Table","TableCell","parseMarkdownSource","exportLexicalToMarkdown","importMarkdownToLexical","collectMarkdownLinkChanges","buildSourceMap","mappedEnd","mappedInsertion","mappedStart","SourceMap","MarkdownUrlResolver","TextEdit","end","replacement","start","TableChanges","edits","normalizedCurrent","collectEdits","baseline","current","baselineOffset","pending","finishPending","push","change","added","removed","value","length","sourceLineEnding","source","includes","withSourceLineEndings","lineEnding","replaceAll","withoutPosition","Array","isArray","map","Object","fromEntries","entries","filter","key","entry","sameMarkdownNode","left","right","JSON","stringify","tablesIn","markdown","children","node","type","Boolean","position","tableCells","table","flatMap","row","sameTableShape","every","index","nodeOffsets","offset","undefined","cellContentOffsets","cell","first","last","at","contentStart","contentEnd","cellOffsets","cellSource","slice","leftDelimiter","indexOf","rightDelimiter","endsWith","insideStart","leadingSpace","match","cellMarkdown","offsets","collectTableCellEdits","sourceTable","baselineTable","currentTable","sourceCells","baselineCells","currentCells","currentCell","sourceCell","baselineCell","sourceContent","editsForTable","cellOnlyChange","align","sourceOffsets","currentOffsets","collectTableChanges","sourceTables","baselineTables","currentTables","baselineOffsets","applyChanges","sourceMap","linkChanges","tableChanges","edit","concat","sort","result","MarkdownSourceDocument","exportFromLexical","root","importToLexical","createMarkdownSourceDocument","resolver","loadedBaseline","Link","ChakraLink","IconButton","Input","Stack","Check","Pencil","Trash2","X","React","Tooltip","LinkEditorContentProps","isActive","isLinkEditMode","editedLinkUrl","editedLinkUrlIsValid","linkUrl","href","inputRef","RefObject","HTMLInputElement","onEditedLinkUrlChange","url","onInputKeyDown","event","KeyboardEvent","onClose","onSubmit","onEdit","onRemove","LinkEditorContent","props","$","_c","t0","t1","target","value","t2","t3","Symbol","for","t4","preventFocusLoss","t5","t6","t7","t8","MouseEvent","preventDefault","_c","Tooltip","ChakraLink","shouldCancelLinkEdit","isLinkEditMode","isLink","linkUrl","$isLinkNode","$findMatchingParent","RangeSelection","getSelectedNode","getSelectionLinkUrl","selection","node","linkParent","getURL","SUPPORTED_URL_PROTOCOLS","Set","sanitizeUrl","url","parsedUrl","URL","has","protocol","validateUrl","hostname","pathname","trim","Box","$createLinkNode","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","$findMatchingParent","mergeRegister","$getSelection","$isLineBreakNode","$isRangeSelection","$setSelection","BaseSelection","CLICK_COMMAND","COMMAND_PRIORITY_CRITICAL","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","LexicalEditor","SELECTION_CHANGE_COMMAND","React","Dispatch","useEffect","useLayoutEffect","useRef","useState","createPortal","TOGGLE_LINK_EDIT_MODE_COMMAND","LinkEditorContent","getSelectedNode","shouldCancelLinkEdit","getSelectionLinkUrl","setFloatingElemPos","sanitizeUrl","validateUrl","GAP","LinkEditor","editor","isLink","setIsLink","anchorElem","isLinkEditMode","setIsLinkEditMode","HTMLElement","JSX","Element","editorRef","HTMLDivElement","inputRef","HTMLInputElement","updateLinkEditorRef","undefined","linkUrl","setLinkUrl","editedLinkUrl","setEditedLinkUrl","lastSelection","setLastSelection","isActive","editedLinkUrlIsValid","current","selection","nextLinkUrl","closeLinkEditor","editorElem","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","hasNativeRange","rangeCount","contains","anchorNode","isEditable","rangeRect","getRangeAt","getBoundingClientRect","topRect","DOMRect","left","top","height","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","registerCommand","focus","monitorInputInteraction","event","KeyboardEvent","key","preventDefault","handleLinkSubmission","dispatchCommand","parent","getParent","linkNode","getURL","rel","__rel","target","__target","title","__title","replace","useLinkEditorToolbar","$","_c","activeEditor","setActiveEditor","t0","t1","$updateToolbar","focusNode","focusLinkNode","focusAutoLinkNode","badNode","getNodes","filter","_temp","find","node_0","node","autoLinkNode","autoLinkIsUnlinked","getIsUnlinked","is","t2","_payload","newEditor","_temp2","payload_0","payload","body","selection_0","node_1","linkNode_0","metaKey","ctrlKey","open","LinkEditorPlugin","_c","_temp","_temp2","LinkPlugin","LexicalLinkPlugin","validateUrl","$","_c","t0","Symbol","for","LinkPlugin","_c","LexicalLinkPlugin","useLexicalComposerContext","useLayoutEffect","ToggleEditablePlugin","t0","$","_c","isEditable","editor","t1","t2","setEditable","_c","Box","useLexicalComposerContext","TreeView","TreeViewPlugin","$","_c","editor","t0","_c","FRONTMATTER_PATTERN","FENCE_PATTERN","LIST_ITEM_PATTERN","INDENTED_LINE_PATTERN","ActiveListIndent","normalizedIndentWidth","sourceIndentWidth","MarkdownListState","isInCodeFence","activeListIndents","getExpandedIndentWidth","indent","width","char","findParentIndent","reverse","find","toNormalizedIndent","normalizedWidth","sourceWidth","includes","repeat","normalizeIndentedContinuation","line","indentedLineMatch","match","trim","length","parentLevel","normalizedIndent","slice","normalizeListItem","RegExpMatchArray","at","pop","currentLevel","indentStep","push","normalizeMarkdownLine","state","test","trimStart","normalizeMarkdownListIndentation","content","lines","split","map","join","splitFrontmatter","frontmatter","body","MarkdownSectionAnchor","id","heading","occurrence","MarkdownSectionNavigation","anchors","targetId","MatchedMarkdownSection","headingIndex","MarkdownSectionPosition","top","normalizeHeading","value","trim","replace","matchMarkdownSectionAnchors","headings","normalizedHeadings","map","implicitOccurrences","Map","matches","anchor","get","set","seen","candidate","entries","push","sort","left","right","resolveActiveMarkdownSection","sections","threshold","first","active","section","useLexicalComposerContext","useEffect","useRef","MarkdownSectionAnchor","matchMarkdownSectionAnchors","resolveActiveMarkdownSection","MarkdownSectionNavigationPluginProps","anchors","targetId","onActiveSectionChange","sectionId","findScrollContainer","root","HTMLElement","current","parentElement","overflowY","getComputedStyle","includes","MarkdownSectionNavigationPlugin","props","editor","callbackRef","cleanup","frame","requestAnimationFrame","getRootElement","headingElements","Array","from","querySelectorAll","matches","map","heading","textContent","matchedElements","match","id","element","headingIndex","dataset","markdownSectionId","target","find","console","warn","tabIndex","scrollIntoView","block","focus","preventScroll","scrollContainer","previousId","publishActiveSection","containerTop","getBoundingClientRect","top","activeId","scrollTarget","Window","window","addEventListener","passive","removeEventListener","cancelAnimationFrame","MarkdownTableAlignment","MarkdownTableColumn","id","label","alignment","MarkdownTableRow","cells","Record","MarkdownTableValue","columns","rows","updateMarkdownTableColumn","table","columnId","update","Partial","Pick","map","column","updateMarkdownTableCell","rowId","value","row","addMarkdownTableColumn","removeMarkdownTableColumn","length","some","filter","Object","fromEntries","entries","key","addMarkdownTableRow","removeMarkdownTableRow","createEmptyMarkdownTable","Box","Button","Dialog","Field","Flex","Icon","Input","Text","$createCodeNode","useLexicalComposerContext","$createHorizontalRuleNode","LexicalTypeaheadMenuPlugin","MenuTextMatch","$addUpdateTag","$createParagraphNode","$getNodeByKey","$getSelection","$isParagraphNode","$isRangeSelection","HISTORY_MERGE_TAG","LexicalNode","TextNode","Code2","Image","ImageIcon","Minus","Table2","ElementType","FormEvent","useEffect","useState","ReactDOM","createEmptyMarkdownTable","$createDataTableNode","$createMarkdownImageNode","SlashCommandOption","id","key","label","icon","setRefElement","element","HTMLElement","commandDefinitions","Array","Omit","slashTrigger","text","selection","anchorNode","anchor","getNode","getParent","getPreviousSibling","match","exec","leadOffset","matchingString","replaceableString","createTableId","unique","globalThis","crypto","randomUUID","Date","now","Math","random","replaceSlashWithBlock","queryNode","block","parent","replace","nextParagraph","insertAfter","select","SlashCommandMenuProps","options","selectedIndex","onSelect","option","index","onHighlight","SlashCommandMenu","props","$","_c","t0","t1","document","getElementById","scrollIntoView","t2","Symbol","for","t3","length","t4","t5","selected","background","_temp","map","MarkdownSlashCommandPlugin","editor","query","setQuery","imageParagraphKey","setImageParagraphKey","imageUrl","setImageUrl","imageAlt","setImageAlt","filter","toLowerCase","includes","_temp3","update","paragraph","selectStart","tag","setTimeout","focus","closeImageDialog","event","preventDefault","trim","paragraph_0","splice","insertImage","option_1","closeMenu","paragraph_1","set","getKey","removeText","_temp4","Boolean","t6","getRootElement","t7","details","open","t8","t9","t10","t11","event_0","target","value","t12","t13","t14","event_1","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","_temp2","option_0","anchorElementRef","menu","current","createPortal","setHighlightedIndex","option_2","selectOptionAndCleanUp","ImageIcon","_c","_Fragment","useLexicalComposerContext","HistoryPlugin","COMMAND_PRIORITY_HIGH","KEY_DOWN_COMMAND","REDO_COMMAND","UNDO_COMMAND","useEffect","useState","MarkdownHistoryPlugin","editor","historyState","current","editorState","getEditorState","redoStack","undoStack","registerCommand","event","target","HTMLInputElement","HTMLTextAreaElement","ctrlKey","metaKey","key","toLowerCase","preventDefault","dispatchCommand","shiftKey","undefined","Box","Flex","AutoFocusPlugin","CheckListPlugin","LexicalComposer","LexicalErrorBoundary","HorizontalRulePlugin","ListPlugin","MarkdownShortcutPlugin","OnChangePlugin","RichTextPlugin","TabIndentationPlugin","$addUpdateTag","$getRoot","useEffect","useRef","useState","ContentEditable","editorNodes","editorTheme","editorTransformers","createMarkdownSourceDocument","MarkdownUrlResolver","MarkdownUrlProvider","CodeBlockActionsPlugin","ImportCodeBlocksPlugin","CodeHighlightingPlugin","EquationPlugin","FloatingTextFormatToolbarPlugin","LinkEditorPlugin","LinkPlugin","ListMarkerWidthPlugin","ToggleEditablePlugin","TreeViewPlugin","splitFrontmatter","MarkdownSectionNavigationPlugin","MarkdownSlashCommandPlugin","MarkdownHistoryPlugin","MarkdownSectionNavigation","INITIAL_IMPORT_TAG","MarkdownEditorProps","autoFocus","debug","defaultState","fullWidth","isEditable","padding","placeholder","scrollable","sectionNavigation","resolveMarkdownUrl","onActiveSectionChange","sectionId","onChange","value","MarkdownEditor","props","frontmatter","body","shouldTrackChanges","Boolean","editorContainerRef","HTMLDivElement","sourceDocumentRef","ReturnType","current","sourceDocument","floatingToolbarAnchorElem","setFloatingToolbarAnchorElem","HTMLElement","initialConfig","namespace","nodes","editorState","importToLexical","onError","error","Error","console","editable","theme","anchors","targetId","_editor","tags","has","read","root","markdownBody","exportFromLexical","LinkPlugin","ContentEditable","_Fragment","__exportAll","Tooltip$1","ScrollArea$1","getFileTypeIcon","HostStorageProvider","resolveIconComponent","EditModeDataTable","LazyMarkdownEditor","React","Fragment$1","Code$1","Image$1","Link$1","ReactDOM","$createCodeNode$1","DOMPurify","katex","StyledEditable","chakra","ContentEditable","ContentEditable$1","$","c","t1","t2","t3","t0","fullWidth","isRichMessage","scrollable","t4","t5","t6","t7","layerStyle","onRef","padding","Box","editor","t8","t9","t10","isGuessedChatLink","candidate","isChatWebLink","handler","parsed","parseChatLink","invalid","positive","value","localSource","source","url","filePosition","position","hash","match","isInlinePath","explicit","original","shaped","dashboardOrigin","local","file","path","ChatLinkContext","createContext","ChatLinkProvider","props","children","useChatLinkHandler","useContext","ChatLinkStreamingContext","useChatResource","enabled","resolved","setResolved","useState","origin","active","useEffect","ChatLinkAnchor","resource","resolvedHref","href","event","event_0","Link","theme","CHAT_TEXT_FORMAT_TAGS","hasChatTextFormat","format","TEXT_TYPE_TO_FORMAT","type","ChatGuessText","Tag","content","text","ChatResourceLink","presentation","label","ownerIcon","ResourceIcon","Icon","ResourceBadge","SAFE_LINK_PROTOCOLS","SAFE_IMAGE_DATA_URL","PROTOCOL","hasSafeLinkProtocol","hasSafeImageProtocol","resolveMarkdownUrl","resolver","kind","SiteIcon","streaming","icon","setIcon","failedSrc","setFailedSrc","show","src_0","Globe","Image","ChatWebLink","ReferenceLinkBadge","target","ReferenceLinkNode","DecoratorNode","node","key","$createReferenceLinkNode","serializedNode","$isReferenceLinkNode","LINK_REGEXP","REFERENCE_LINK_TRANSFORMER","parserOptions","gfm","math","gfmFromMarkdown","mathFromMarkdown","serializerOptions","gfmToMarkdown","mathToMarkdown","fenceStart","line","normalizeLegacyInlineMath","codeFenceLength","result","index","end","length","delimiter","normalizeLegacyMath","fencedCode","normalized","markdown","closingFence","openingFence","displayMath","indent","parseMarkdown","fromMarkdown","parseMarkdownSource","serializeMarkdownAst","toMarkdown","tree","serializeMarkdownBlock","serializeMarkdownInline","parseMarkdownInline","first","MarkdownUrlContext","MarkdownUrlProvider","useMarkdownUrlResolver","emptyChatImageSources","emptyImageHistory","imageSourceKey","addCapturedImages","part","sources","next","image","src","indexChatImageSources","message","messages","capturedChatImageSource","ChatImageHistoryContext","useChatImageHistory","ChatImageSourcesContext","useChatImageSources","MarkdownImage","captured","loaded","setLoaded","direct","current","_temp$7","alt","Text","title","onLoad","MarkdownImageNode","$createMarkdownImageNode","selectedBlockKey","selection","$getSelection","imageNode","$getNodeByKey","$isRangeSelection","followingBlockKey","selectionBlock","blockKey","$applyNodeReplacement","$isMarkdownImageNode","isHtmlComment","sanitizeMarkdownHtml","clean","template","element","attribute","RawHtml","elementRef","useRef","attachElement","fragment","element_0","display","RawHtmlNode","previous","$createRawHtmlNode","$isRawHtmlNode","plainText","nodes","InlineChildren","Code","_temp$6","MarkdownInline","child","MarkdownTableSettingsContext","projectRows","table","row","projectColumns","MarkdownDataTable","defaultSettings","storage","_temp3$1","isSelected","setSelected","containerRef","focusTable","nodeKey","$isDataTableNode","change","HISTORY_PUSH_TAG","updateTable","columns","column","handleColumnsChange","current_0","data","row_0","column_0","handleDataChange","node_0","paragraph","$createParagraphNode","deleteTable","handleClick","handleBlur","target_0","event_1","isTextInput","REDO_COMMAND","UNDO_COMMAND","handleKeyDown","t11","t12","t13","_temp4$1","_temp5","_temp6","t14","t15","t16","_temp7","t17","t18","DataTableNode","writable","$createDataTableNode","json","_temp$5","_temp2$2","column_1","context","row_1","safeLinkUrl","MarkdownLinkNode","LinkNode","resolvedUrl","attributes","anchor","config","changed","$createMarkdownLinkNode","$isMarkdownLinkNode","StreamingTextNode","TextNode","$createStreamingTextNode","serialized","EquationComponent","$convertEquationElement","equation","domNode","inline","$createEquationNode","EquationNode","prevNode","Suspense","equationNode","$isEquationNode","EQUATION_INLINE","EQUATION_MULTILINE","linesInBetween","rootNode","EquationPlugin","HRNode","ElementNode","$createHRNode","$isHRNode","MermaidComponent","lazy","MermaidNode","code","$isMermaidNode","$createMermaidNode","HR","UNDERLINE_INS_TAG","markdownText","textNode","$createTextNode","UNDERLINE_U_TAG","BARE_URL_REGEXP","unescapeUrl","escapeLinkTitle","unescapeLinkTitle","normalizeEscapedUrlText","textContent","exportedText","escapedHref","TRANSFORMERS_EXTENDED","$isLinkNode","$isAutoLinkNode","exportChildren","linkText","linkUrl","linkTitle","linkNode","$createLinkNode","openBracketAmount","closeBracketAmount","parsedLinkText","outsideLinkText","linkTextParts","normalizedLinkText","linkTextNode","AutoLinkNode","autoLinkNode","$createAutoLinkNode","editorNodes","QuoteNode","HeadingNode","ListNode","ListItemNode","CodeNode","CodeHighlightNode","editorTransformers","CHECK_LIST","TRANSFORMERS","transformer","LINK","editorTheme","getCodeElementFromSelection","anchorNode","codeNode","$isCodeNode","$findMatchingParent","codeElement","getCodeElementFromTarget","getActionPosition","anchorRect","anchorElem","codeRect","CodeBlockActionsPlugin","useLexicalComposerContext","activeCodeElement","setActiveCodeElement","isCopied","setIsCopied","copyResetTimeoutRef","rootElement","handlePointerMove","nextCodeElement","handlePointerLeave","selectionCodeElement","mergeRegister","selectionCodeElement_0","SELECTION_CHANGE_COMMAND","selectionCodeElement_1","_temp$4","COMMAND_PRIORITY_CRITICAL","style","jsx","Check","Copy","IconButton","createPortal","isMermaidLanguage","language","replaceCodeNodeWithMermaidNode","ImportCodeBlocksPlugin","_temp$3","codeNodes","$nodesOfType","n","CodeHighlightingPlugin","registerCodeHighlighting","TOGGLE_LINK_EDIT_MODE_COMMAND","createCommand","getSelectedNode","focus","focusNode","$isAtNodeEnd","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPos","scrollerElem","targetRect","floatingElemRect","floatingElem","anchorElementRect","editorScrollerRect","coordinateSpace","top","placement","verticalGap","left","horizontalOffset","ToolbarSeparator","FloatingToolbarButtons","isBold","FORMAT_TEXT_COMMAND","isItalic","isUnderline","blockType","formatHeading","t19","t20","t21","t22","t23","t24","t25","t26","isCode","t27","t28","t29","t30","isLink","t31","t32","t33","t34","insertLink","t35","t36","t37","TextQuote","t38","formatQuote","t39","t40","t41","formatList","t42","List","t43","t44","t45","t46","ListOrdered","t47","t48","t49","t50","ListTodo","t51","t52","Stack","blockTypeToBlockName","toKnownBlockType","findSelectionElement","parent","$isRootOrShadowRoot","resolveBlockTypeFromAnchor","$isListNode","parentList","$isHeadingNode","shouldShowFloatingToolbar","params","hasSelection","isRangeSelection","isCollapsed","hasNativeSelection","hasNativeRange","isAnchorInsideEditor","isEditorEditable","isPointerSelecting","GAP$1","FloatingTextToolbar","editorRef","setBlockType","setIsBold","setIsItalic","setIsUnderline","setIsCode","setIsLink","isPointerSelectingRef","updateFloatingToolbarRef","headingSize","$createHeadingNode","REMOVE_LIST_COMMAND","command","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","selection_0","$createQuoteNode","TOGGLE_LINK_COMMAND","updateToolbar","selection_1","linkParent","autoLinkParent","nextBlockType","selection_2","editorElem","nativeSelection","domRect","setIsToolbarActive","rootElement_0","ownerDocument","startPointerSelection","finishPointerSelection","ownerDocument_0","update","CLICK_COMMAND","selection_3","COMMAND_PRIORITY_HIGH","isToolbarActive","FloatingTextFormatToolbarPlugin","ListMarkerWidthPlugin","mutation","mutations","list","values","_temp$2","item","exportText","exportInlineNode","$isTextNode","$isLineBreakNode","exportInlineChildren","$isElementNode","exportQuoteChildren","flushInline","$isInlineElementOrDecoratorNode","block","exportBlock","paragraphFrom","exportListItem","exportList","$isParagraphNode","$isListItemNode","tableCell","exportTable","$isQuoteNode","exportLexicalToMarkdown","root","REFERENCE_TOKEN","REFERENCE_PREFIX","REFERENCE_AT_START","literalLinkText","start","readReferenceText","prefix","formattedText","formats","textWithReferences","referenceDefinition","importInlineNode","importInlineChildren","$createLineBreakNode","link","definition","underlineDepth","activeFormats","reference","tableValue","header","columnCount","rowIndex","columnIndex","appendListItem","$createListItemNode","appendBlock","heading","quote","hasTasks","listType","$createListNode","createMarkdownLexicalNodes","importMarkdownToLexical","nodeOffsets$1","isParent","linksIn","links","linkOccurrencesIn","removedLinkReplacements","baselineBlockOffsets","baselineBlock","currentBlockOffsets","currentBlock","linkOffsets","baselineLinks","offsets","segments","baselineOffset","baseline","currentBlockSource","firstSegment","replacements","currentOffset","nextSegment","replacementEnd","replacement","sourceLinkOffsets","sourceLinks","baselineLinkOffsets","findRemovedLinkReplacements","candidateIndexes","currentBlocks","right","preferredBlockIndex","currentBlockIndex","usedCurrentBlocks","currentLinks","collectMarkdownLinkChanges","baselineTree","currentTree","edits","normalizations","linkOrdinal","blockIndex","linkChanges","normalizedCurrent","normalization","matchingSourceBlocks","canonicalBlocks","canonical","sourceBlocks","diffSourceBlocks","blocks","diffChars","canonicalOffset","sourceOffset","canonicalEnd","sourceEnd","buildSourceMap","removedAtBoundary","offset","blockStarts","canonicalStart","sourceStart","nearestMappedOffset","direction","mappedStart","exact","map","mappedEnd","mappedInsertion","collectEdits","pending","finishPending","sourceLineEnding","withSourceLineEndings","lineEnding","withoutPosition","entry","sameMarkdownNode","tablesIn","tableCells","sameTableShape","nodeOffsets","cellContentOffsets","cell","last","contentStart","contentEnd","cellOffsets","cellSource","leftDelimiter","rightDelimiter","insideStart","leadingSpace","cellMarkdown","collectTableCellEdits","sourceCells","sourceTable","baselineCells","baselineTable","currentTable","sourceCell","baselineCell","currentCell","sourceContent","editsForTable","sourceOffsets","currentOffsets","collectTableChanges","sourceTables","baselineTables","currentTables","baselineOffsets","applyChanges","tableChanges","edit","sourceMap","createMarkdownSourceDocument","$getRoot","loadedBaseline","LinkEditorContent","isActive","isLinkEditMode","editedLinkUrlIsValid","onEditedLinkUrlChange","editedLinkUrl","inputRef","onInputKeyDown","Input","X","onClose","preventFocusLoss","onSubmit","Pencil","onEdit","Trash2","onRemove","shouldCancelLinkEdit","getSelectionLinkUrl","SUPPORTED_URL_PROTOCOLS","sanitizeUrl","parsedUrl","validateUrl","GAP","LinkEditor","updateLinkEditorRef","setLinkUrl","setEditedLinkUrl","lastSelection","setLastSelection","nextLinkUrl","closeLinkEditor","activeElement","rangeRect","setIsLinkEditMode","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","useLayoutEffect","monitorInputInteraction","handleLinkSubmission","useLinkEditorToolbar","activeEditor","setActiveEditor","$updateToolbar","focusLinkNode","focusAutoLinkNode","_temp$1","autoLinkIsUnlinked","newEditor","_temp2$1","payload_0","node_1","linkNode_0","payload","LinkEditorPlugin","LinkPlugin$1","LinkPlugin","ToggleEditablePlugin","isEditable","TreeViewPlugin","TreeView","FRONTMATTER_PATTERN","splitFrontmatter","normalizeHeading","matchMarkdownSectionAnchors","normalizedHeadings","headings","implicitOccurrences","matches","anchors","occurrence","seen","headingIndex","resolveActiveMarkdownSection","sections","section","threshold","findScrollContainer","overflowY","MarkdownSectionNavigationPlugin","callbackRef","onActiveSectionChange","cleanup","frame","headingElements","matchedElements","match_0","match_1","targetId","scrollContainer","previousId","publishActiveSection","containerTop","activeId","match_2","scrollTarget","createEmptyMarkdownTable","id","commandDefinitions","Table2","Code2","Minus","slashTrigger","createTableId","replaceSlashWithBlock","queryNode","nextParagraph","SlashCommandMenu","selectedIndex","options","onHighlight","onSelect","selected","Flex","option","_temp","MarkdownSlashCommandPlugin","query","setQuery","imageParagraphKey","setImageParagraphKey","imageUrl","setImageUrl","imageAlt","setImageAlt","_temp3","HISTORY_MERGE_TAG","closeImageDialog","paragraph_0","insertImage","option_1","paragraph_1","$addUpdateTag","closeMenu","$createCodeNode","$createHorizontalRuleNode","LexicalTypeaheadMenuPlugin","_temp4","details","Dialog","Field","Button","Fragment","_temp2","option_0","anchorElementRef","menu","option_2","MarkdownHistoryPlugin","historyState","KEY_DOWN_COMMAND","HistoryPlugin","markdown_editor_exports","MarkdownEditor","INITIAL_IMPORT_TAG","defaultState","shouldTrackChanges","onChange","editorContainerRef","sourceDocumentRef","body","sourceDocument","floatingToolbarAnchorElem","setFloatingToolbarAnchorElem","LexicalComposer","error","sectionNavigation","autoFocus","AutoFocusPlugin","ListPlugin","TabIndentationPlugin","CheckListPlugin","MarkdownShortcutPlugin","HorizontalRulePlugin","RichTextPlugin","placeholder","LexicalErrorBoundary","OnChangePlugin","tags","editorState","markdownBody","frontmatter","debug"],"sources":["../src/components/rich-text/shared/components/content-editable.tsx","../src/components/chat-ui/links/chat-link.ts","../src/components/chat-ui/links/chat-link-context.tsx","../src/components/chat-ui/links/use-chat-resource.ts","../src/components/chat-ui/links/chat-link-anchor.tsx","../src/components/rich-text/theme/rich-text-theme.tsx","../src/components/chat-ui/links/chat-guess-text.tsx","../src/components/chat-ui/links/chat-resource-link.tsx","../src/components/rich-text/shared/markdown-url.ts","../src/components/chat-ui/links/chat-web-link.tsx","../src/components/rich-text/shared/components/reference-link-badge.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/shared/markdown-ast.ts","../src/components/rich-text/shared/markdown-url-context.tsx","../src/components/chat-ui/links/chat-image-sources.ts","../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/markdown-table-settings-context.ts","../src/components/rich-text/shared/nodes/DataTableNode.tsx","../src/components/rich-text/shared/nodes/MarkdownLinkNode.ts","../src/components/rich-text/shared/nodes/streaming-text-node.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/CodeBlockActionsPlugin.tsx","../src/components/rich-text/shared/plugins/CodePlugin/CodeBlockPlugin.tsx","../src/components/rich-text/shared/plugins/CodePlugin/CodeHighlightingPlugin.tsx","../src/components/rich-text/shared/plugins/LinkEditorPlugin/commands.ts","../src/components/rich-text/shared/plugins/LinkEditorPlugin/utils/getSelectedNode.ts","../src/components/rich-text/shared/plugins/LinkEditorPlugin/utils/setFloatingElemPos.ts","../src/components/rich-text/shared/plugins/FloatingTextFormatToolbarPlugin/floating-toolbar-buttons.tsx","../src/components/rich-text/shared/plugins/FloatingTextFormatToolbarPlugin/resolve-block-type.ts","../src/components/rich-text/shared/plugins/FloatingTextFormatToolbarPlugin/should-show-floating-toolbar.ts","../src/components/rich-text/shared/plugins/FloatingTextFormatToolbarPlugin/FloatingTextFormatToolbarPlugin.tsx","../src/components/rich-text/shared/plugins/list-marker-width-plugin.tsx","../src/components/rich-text/shared/markdown-export.ts","../src/components/rich-text/shared/markdown-reference-tokens.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/LinkEditorPlugin/link-editor-content.tsx","../src/components/rich-text/shared/plugins/LinkEditorPlugin/utils/link-edit-state.ts","../src/components/rich-text/shared/plugins/LinkEditorPlugin/utils/selection-link-url.ts","../src/components/rich-text/shared/plugins/LinkEditorPlugin/utils/url.ts","../src/components/rich-text/shared/plugins/LinkEditorPlugin/LinkEditorPlugin.tsx","../src/components/rich-text/shared/plugins/LinkEditorPlugin/LinkPlugin.tsx","../src/components/rich-text/shared/plugins/ToggleEditablePlugin.tsx","../src/components/rich-text/shared/plugins/TreeViewPlugin/TreeViewPlugin.tsx","../src/components/rich-text/utils/markdown.ts","../src/components/rich-text/markdown-editor/plugins/markdown-section-navigation.ts","../src/components/rich-text/markdown-editor/plugins/MarkdownSectionNavigationPlugin.tsx","../src/components/rich-text/shared/markdown-table.ts","../src/components/rich-text/markdown-editor/plugins/MarkdownSlashCommandPlugin.tsx","../src/components/rich-text/markdown-editor/plugins/markdown-history-plugin.tsx","../src/components/rich-text/markdown-editor/markdown-editor.tsx"],"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 layerStyle?: \"markdownEditorInset\";\n isRichMessage?: boolean;\n scrollable?: boolean;\n}\n\nexport function ContentEditable({\n onRef,\n fullWidth = false,\n padding,\n layerStyle,\n isRichMessage = false,\n scrollable = true,\n}: ContentEditableProps) {\n const editor = (\n <Box ref={onRef} width=\"100%\" minH=\"100%\" layerStyle={layerStyle} 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","export interface ChatLinkCandidate {\n source: string;\n origin: \"markdown\" | \"inline-code\" | \"reference\" | \"tool\" | \"text\";\n}\n\nexport interface ChatLinkHandler {\n resolveHref(candidate: ChatLinkCandidate): string | null;\n // Paths guessed from prose or inline code become links only when this confirms a target.\n // Omit `label` to keep the message text.\n resolveResource?(\n candidate: ChatLinkCandidate,\n ): Promise<{ label?: string; icon?: string; href: string | null } | null>;\n resolveImageSource?(source: string): Promise<string | null>;\n // Returns the site icon of an http(s) link as an image URL. Hosts without it keep plain web links.\n resolveIcon?(href: string): Promise<string | null>;\n describe?(candidate: ChatLinkCandidate): string;\n open(candidate: ChatLinkCandidate): void | Promise<void>;\n}\n\nexport interface ChatLinkProps {\n linkHandler?: ChatLinkHandler;\n}\n\nexport interface ChatSourcePosition {\n line: number;\n column?: number;\n endLine?: number;\n}\n\nexport type ParsedChatLink =\n | { kind: \"file\"; path: string; position?: ChatSourcePosition }\n | { kind: \"page\"; href: string }\n | { kind: \"external\"; href: string }\n | { kind: \"invalid\"; reason: string };\n\n// Prose and inline code only look like paths. Show them as links only after the host confirms a target.\nexport const isGuessedChatLink = (candidate: ChatLinkCandidate) =>\n candidate.origin === \"text\" || candidate.origin === \"inline-code\";\n\n// A web link becomes a bubble with its site icon when the host resolves icons and leaves opening to the browser.\nexport const isChatWebLink = (handler: ChatLinkHandler | undefined, candidate: ChatLinkCandidate) => {\n if (!handler?.resolveIcon || handler.resolveHref(candidate)) return false;\n const parsed = parseChatLink(candidate, typeof window === \"undefined\" ? undefined : window.location.origin);\n return parsed?.kind === \"external\" && /^https?:/i.test(parsed.href);\n};\n\nconst invalid = (reason: string) => ({ kind: \"invalid\" as const, reason });\nconst positive = (value: number) => Number.isSafeInteger(value) && value > 0;\n\nconst localSource = (source: string) => {\n if (/^file:/i.test(source)) {\n try {\n const url = new URL(source);\n if (url.hostname) return invalid(\"Network file links are unavailable.\");\n source = url.pathname.replace(/^\\/([a-z]:\\/)/i, \"$1\") + url.hash;\n if (url.search) return invalid(\"File links cannot contain a query.\");\n } catch {\n return invalid(\"This file link is malformed.\");\n }\n } else if (\n /^[a-z][a-z\\d+.-]*:/i.test(source) &&\n !/^[a-z]:[/\\\\]/i.test(source) &&\n !/^[^:]+:\\d+(?::\\d+)?$/.test(source)\n ) {\n return invalid(\"This link scheme is unsupported.\");\n }\n\n return source.replace(/^#?\\$PROJECT\\//i, \"\");\n};\n\nconst filePosition = (source: string) => {\n let position: ChatSourcePosition | undefined;\n const hash = source.indexOf(\"#\");\n if (hash >= 0) {\n const match = /^#L(\\d+)(?:-L(\\d+))?$/.exec(source.slice(hash));\n if (!match) return invalid(\"This file location is unsupported.\");\n position = { line: Number(match[1]), ...(match[2] ? { endLine: Number(match[2]) } : {}) };\n source = source.slice(0, hash);\n } else {\n const match = /:(\\d+)(?::(\\d+))?$/.exec(source);\n if (match) {\n position = { line: Number(match[1]), ...(match[2] ? { column: Number(match[2]) } : {}) };\n source = source.slice(0, match.index);\n }\n }\n if (\n position &&\n (!positive(position.line) ||\n (position.column !== undefined && !positive(position.column)) ||\n (position.endLine !== undefined && (!positive(position.endLine) || position.endLine < position.line)))\n )\n return invalid(\"Source locations must use positive line and column numbers.\");\n\n return { kind: \"file\" as const, path: source, position };\n};\n\nconst isInlinePath = (source: string, original: string) => {\n const explicit = /^(\\.\\.?\\/|\\/|[a-z]:\\/)/i.test(source) || original.startsWith(\"$PROJECT/\");\n const shaped =\n !/^(@|v\\d)/.test(source) &&\n !/[\\s()]/.test(source) &&\n (source.includes(\"/\") || /^[\\w-]+\\.[a-z][\\w-]*$/i.test(source));\n\n return explicit || shaped;\n};\n\nexport const parseChatLink = (candidate: ChatLinkCandidate, dashboardOrigin?: string): ParsedChatLink | undefined => {\n const source = candidate.source.trim();\n if (!source) return undefined;\n if (/^https?:/i.test(source)) {\n try {\n const url = new URL(source);\n if (url.origin === dashboardOrigin && url.pathname.startsWith(\"/projects/\"))\n return { kind: \"page\", href: source };\n return { kind: \"external\", href: source };\n } catch {\n return invalid(\"This URL is malformed.\");\n }\n }\n if (/^(mailto:|sms:|tel:)/i.test(source)) return { kind: \"external\", href: source };\n if (/^\\/projects\\//.test(source)) return { kind: \"page\", href: source };\n if (/^(~\\/|\\\\\\\\|\\/\\/)/.test(source)) return invalid(\"This path has no supported workspace root.\");\n if (/^(javascript|data|vscode|pstdio):/i.test(source)) return invalid(\"This link scheme is unsupported.\");\n const local = localSource(source);\n if (typeof local !== \"string\") return local;\n const file = filePosition(local);\n if (file.kind === \"invalid\") return file;\n if (file.path.includes(\"?\")) return invalid(\"Encode question marks in file names.\");\n let path: string;\n try {\n path = decodeURIComponent(file.path).replaceAll(\"\\\\\", \"/\");\n } catch {\n return invalid(\"This path has invalid URL encoding.\");\n }\n if (path.includes(\"\\0\")) return invalid(\"This path is malformed.\");\n if (candidate.origin === \"inline-code\" && !isInlinePath(path, candidate.source)) return undefined;\n return { ...file, path };\n};\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport type { ChatLinkHandler } from \"./chat-link\";\n\nconst ChatLinkContext = createContext<ChatLinkHandler | undefined>(undefined);\nexport const ChatLinkProvider = (props: { handler?: ChatLinkHandler; children: ReactNode }) => {\n const { handler, children } = props;\n return <ChatLinkContext.Provider value={handler}>{children}</ChatLinkContext.Provider>;\n};\nexport const useChatLinkHandler = () => useContext(ChatLinkContext);\n\n// Bare web links grow while a message streams, so their host names are final only when it ends.\nexport const ChatLinkStreamingContext = createContext(false);\n","import { useEffect, useState } from \"react\";\nimport type { ChatLinkCandidate, ChatLinkHandler } from \"./chat-link\";\nimport { useChatLinkHandler } from \"./chat-link-context\";\n\ntype Presentation = Awaited<ReturnType<NonNullable<ChatLinkHandler[\"resolveResource\"]>>>;\n\nexport const useChatResource = (candidate: ChatLinkCandidate, enabled = true) => {\n const { source, origin } = candidate;\n const handler = useChatLinkHandler();\n const [resolved, setResolved] = useState<{ source: string; value: Presentation } | null>(null);\n useEffect(() => {\n if (!enabled) return;\n let active = true;\n void handler\n ?.resolveResource?.({ source, origin })\n .then((value) => {\n if (active) setResolved({ source, value });\n })\n .catch(() => {\n if (active) setResolved(null);\n });\n return () => {\n active = false;\n };\n }, [handler, source, origin, enabled]);\n return resolved?.source === source ? resolved.value : null;\n};\n","import { Link } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { type ChatLinkCandidate, isGuessedChatLink, parseChatLink } from \"./chat-link\";\nimport { useChatLinkHandler } from \"./chat-link-context\";\nimport { useChatResource } from \"./use-chat-resource\";\n\nexport const ChatLinkAnchor = (props: {\n candidate: ChatLinkCandidate;\n children: ReactNode;\n resolvedHref?: string | null;\n}) => {\n const { candidate, children, resolvedHref } = props;\n const handler = useChatLinkHandler();\n const resource = useChatResource(candidate, resolvedHref === undefined);\n const parsed = parseChatLink(candidate, typeof window === \"undefined\" ? undefined : window.location.origin);\n if (resolvedHref === undefined && !resource && isGuessedChatLink(candidate)) return children;\n let href = resolvedHref;\n if (href === undefined) href = resource ? resource.href : handler?.resolveHref(candidate);\n if (!handler || !parsed || (parsed.kind === \"external\" && !href)) return children;\n return (\n <Link\n variant=\"resource\"\n href={href ?? undefined}\n role={href ? undefined : \"button\"}\n tabIndex={0}\n onClickCapture={(event) => {\n event.stopPropagation();\n if (href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0)) return;\n event.preventDefault();\n void handler.open(candidate);\n }}\n onKeyDownCapture={(event) => {\n if (!href && event.key === \"Enter\") {\n event.preventDefault();\n void handler.open(candidate);\n }\n }}\n >\n {children}\n </Link>\n );\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 { TEXT_TYPE_TO_FORMAT, type TextFormatType } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport theme from \"@/components/rich-text/theme/rich-text-theme\";\n\nexport const CHAT_TEXT_FORMAT_TAGS = [\n [\"code\", \"code\"],\n [\"bold\", \"strong\"],\n [\"italic\", \"em\"],\n [\"strikethrough\", \"s\"],\n [\"underline\", \"u\"],\n] as const satisfies readonly (readonly [TextFormatType, string])[];\n\nexport const hasChatTextFormat = (format: number, type: TextFormatType) => (format & TEXT_TYPE_TO_FORMAT[type]) !== 0;\n\n// A guess that stays unlinked keeps the bold, italic and code formatting it had in the message.\nexport const ChatGuessText = (props: { text: string; format: number }) => {\n const { text, format } = props;\n return CHAT_TEXT_FORMAT_TAGS.reduceRight<ReactNode>((content, [type, Tag]) => {\n if (!hasChatTextFormat(format, type)) return content;\n return (\n <Tag key={type} className={theme.text?.[type]}>\n {content}\n </Tag>\n );\n }, text);\n};\n","import { Box, Icon } from \"@chakra-ui/react\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { getFileTypeIcon } from \"@/utils/get-file-type-icon\";\nimport { resolveIconComponent } from \"@/utils/resolve-icon-component\";\nimport { ChatGuessText } from \"./chat-guess-text\";\nimport { type ChatLinkCandidate, isGuessedChatLink, parseChatLink } from \"./chat-link\";\nimport { ChatLinkAnchor } from \"./chat-link-anchor\";\nimport { useChatLinkHandler } from \"./chat-link-context\";\nimport { useChatResource } from \"./use-chat-resource\";\n\ninterface ChatResourceLinkProps {\n candidate: ChatLinkCandidate;\n label: string;\n format?: number;\n}\n\nexport const ChatResourceLink = (props: ChatResourceLinkProps) => {\n const { candidate, label, format = 0 } = props;\n const handler = useChatLinkHandler();\n const presentation = useChatResource(candidate);\n if (!presentation && isGuessedChatLink(candidate)) return <ChatGuessText text={label} format={format} />;\n const parsed = parseChatLink(candidate);\n const ownerIcon = presentation?.icon ? resolveIconComponent(presentation.icon) : undefined;\n const ResourceIcon = ownerIcon ?? getFileTypeIcon(parsed?.kind === \"file\" ? parsed.path : label);\n return (\n <Box as=\"span\" display=\"inline-block\" verticalAlign=\"middle\" maxW=\"full\">\n <ChatLinkAnchor\n candidate={candidate}\n resolvedHref={presentation ? presentation.href : (handler?.resolveHref(candidate) ?? null)}\n >\n <ResourceBadge\n fileName={presentation?.label ?? label}\n icon={<Icon as={ResourceIcon} boxSize=\"3\" aria-hidden />}\n tooltip={false}\n size=\"sm\"\n cursor=\"pointer\"\n />\n </ChatLinkAnchor>\n </Box>\n );\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 { Box, Icon, Image, Link } from \"@chakra-ui/react\";\nimport { Globe } from \"lucide-react\";\nimport { useContext, useEffect, useState } from \"react\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\nimport { resolveMarkdownUrl } from \"@/components/rich-text/shared/markdown-url\";\nimport { ChatLinkStreamingContext, useChatLinkHandler } from \"./chat-link-context\";\n\ninterface ChatWebLinkProps {\n source: string;\n label: string;\n}\n\nconst SiteIcon = (props: { href: string }) => {\n const { href } = props;\n const handler = useChatLinkHandler();\n const streaming = useContext(ChatLinkStreamingContext);\n const [icon, setIcon] = useState<{ href: string; src: string | null }>();\n const [failedSrc, setFailedSrc] = useState<string>();\n useEffect(() => {\n if (streaming) return;\n let active = true;\n const show = (src: string | null) => {\n if (active) setIcon({ href, src });\n };\n void handler?.resolveIcon?.(href).then(show, () => show(null));\n return () => {\n active = false;\n };\n }, [handler, href, streaming]);\n const src = icon?.href === href ? icon.src : null;\n if (!src || src === failedSrc) return <Icon as={Globe} boxSize=\"3\" aria-hidden />;\n return <Image src={src} alt=\"\" boxSize=\"3\" onError={() => setFailedSrc(src)} />;\n};\n\n// Web links keep a native anchor, so new tabs, modified clicks and the desktop window-open handler still work.\n// The badge stops the click before Lexical's ClickableLinkPlugin, which would call window.open without noopener.\nexport const ChatWebLink = (props: ChatWebLinkProps) => {\n const { source, label } = props;\n const href = resolveMarkdownUrl(source, \"link\");\n if (!href) return label;\n return (\n <Box as=\"span\" display=\"inline-block\" verticalAlign=\"middle\" maxW=\"full\">\n <Link variant=\"resource\" href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n <ResourceBadge fileName={label} icon={<SiteIcon href={href} />} tooltip={false} size=\"sm\" cursor=\"pointer\" />\n </Link>\n </Box>\n );\n};\n","import { Box, Link } from \"@chakra-ui/react\";\nimport { isChatWebLink, parseChatLink } from \"@/components/chat-ui/links/chat-link\";\nimport { ChatLinkAnchor } from \"@/components/chat-ui/links/chat-link-anchor\";\nimport { useChatLinkHandler } from \"@/components/chat-ui/links/chat-link-context\";\nimport { ChatResourceLink } from \"@/components/chat-ui/links/chat-resource-link\";\nimport { ChatWebLink } from \"@/components/chat-ui/links/chat-web-link\";\nimport { ResourceBadge } from \"@/components/primitives/resource-badge\";\n\n// `target` is the reference as written. `href` encodes relative targets for the editor (`#path`).\nexport const ReferenceLinkBadge = (props: { href: string; target: string }) => {\n const { href, target } = props;\n const handler = useChatLinkHandler();\n const candidate = { source: target, origin: \"reference\" as const };\n const label = target.split(\"/\").pop() || \"unknown\";\n if (isChatWebLink(handler, candidate)) return <ChatWebLink source={target} label={label} />;\n const parsed = parseChatLink(candidate, typeof window === \"undefined\" ? undefined : window.location.origin);\n if (parsed?.kind === \"external\")\n return (\n <Link\n href={parsed.href}\n variant=\"resource\"\n target={/^https?:/i.test(parsed.href) ? \"_blank\" : undefined}\n rel=\"noopener noreferrer\"\n >\n <ResourceBadge fileName={label} size=\"sm\" tooltip={false} cursor=\"pointer\" />\n </Link>\n );\n if (handler) return <ChatResourceLink candidate={candidate} label={label} />;\n return (\n <Box width=\"fit-content\" display=\"inline-block\">\n <ChatLinkAnchor candidate={candidate}>\n <ResourceBadge\n fileName={label}\n tooltip={false}\n onSelect={() => {\n if (/^https?:\\/\\//i.test(href)) {\n window.open(href, \"_blank\", \"noopener,noreferrer\");\n } else if (/^#?\\$PROJECT\\//i.test(href)) {\n window.dispatchEvent(\n new CustomEvent(\"ui:open-project-file\", { detail: href.replace(/^#?\\$PROJECT\\//i, \"\") }),\n );\n } else {\n window.location.assign(href);\n }\n }}\n />\n </ChatLinkAnchor>\n </Box>\n );\n};\n","import {\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 { ReferenceLinkBadge } from \"@/components/rich-text/shared/components/reference-link-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 // Pasted reference text is parsed again as Markdown, so HTML import adds nothing.\n static importDOM() {\n return null;\n }\n\n // Copy writes HTML from this export. Keep the reference text so pasting keeps the link.\n exportDOM() {\n return { element: document.createTextNode(this.getTextContent()) };\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 return <ReferenceLinkBadge href={this.__href} target={this.__label ?? this.__href} />;\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 { 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","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 { createContext, useContext } from \"react\";\nimport { resolveMarkdownUrl } from \"@/components/rich-text/shared/markdown-url\";\nimport type { ChatMessagePart, SessionMessage } from \"../components/message-types\";\nimport { type ChatLinkHandler, parseChatLink } from \"./chat-link\";\n\nexport const emptyChatImageSources: ReadonlyMap<string, string> = new Map();\nconst emptyImageHistory = new WeakMap<ChatMessagePart, ReadonlyMap<string, string>>();\ntype ChatImageHistory = Pick<typeof emptyImageHistory, \"get\">;\n\nconst imageSourceKey = (source: string, handler?: ChatLinkHandler) => {\n const parsed = parseChatLink({ source, origin: \"markdown\" });\n if (parsed?.kind !== \"file\") return undefined;\n return handler?.resolveHref({ source, origin: \"markdown\" }) ?? parsed.path;\n};\n\nconst addCapturedImages = (sources: ReadonlyMap<string, string>, part: ChatMessagePart, handler?: ChatLinkHandler) => {\n if (part.type !== \"tool\" || !Array.isArray(part.state?.output)) return sources;\n let next: Map<string, string> | undefined;\n for (const image of part.state.output) {\n if (image?.type !== \"image\" || typeof image.source !== \"string\" || typeof image.src !== \"string\") continue;\n const key = imageSourceKey(image.source, handler);\n const src = resolveMarkdownUrl(image.src, \"image\");\n if (!key || !src) continue;\n next ??= new Map(sources);\n next.set(key, src);\n }\n return next ?? sources;\n};\n\n// Display normalization keeps the original parts, even when it combines activity messages.\nexport const indexChatImageSources = (messages: SessionMessage[], handler?: ChatLinkHandler) => {\n let index: WeakMap<ChatMessagePart, ReadonlyMap<string, string>> | undefined;\n let sources = emptyChatImageSources;\n for (const message of messages)\n for (const part of message.parts) {\n sources = addCapturedImages(sources, part, handler);\n if (sources.size === 0) continue;\n index ??= new WeakMap();\n index.set(part, sources);\n }\n const history: ChatImageHistory = index ?? emptyImageHistory;\n return history;\n};\n\nexport const capturedChatImageSource = (\n sources: ReadonlyMap<string, string>,\n source: string,\n handler?: ChatLinkHandler,\n) => {\n const key = imageSourceKey(source, handler);\n return key ? sources.get(key) : undefined;\n};\nexport const ChatImageHistoryContext = createContext<ChatImageHistory>(emptyImageHistory);\nexport const useChatImageHistory = () => useContext(ChatImageHistoryContext);\nexport const ChatImageSourcesContext = createContext(emptyChatImageSources);\nexport const useChatImageSources = () => useContext(ChatImageSourcesContext);\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, useEffect, useState } from \"react\";\nimport { capturedChatImageSource, useChatImageSources } from \"@/components/chat-ui/links/chat-image-sources\";\nimport type { ChatLinkHandler } from \"@/components/chat-ui/links/chat-link\";\nimport { useChatLinkHandler } from \"@/components/chat-ui/links/chat-link-context\";\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 handler = useChatLinkHandler();\n const captured = capturedChatImageSource(useChatImageSources(), source, handler);\n const [loaded, setLoaded] = useState<{ source: string; handler: ChatLinkHandler; value: string | null }>();\n const direct = captured ?? resolveMarkdownUrl(source, \"image\", resolver);\n const resolved =\n direct ??\n (loaded?.source === source && loaded.handler === handler && loaded.value\n ? resolveMarkdownUrl(loaded.value, \"image\")\n : null);\n useEffect(() => {\n if (direct || !handler?.resolveImageSource) return;\n let current = true;\n void handler\n .resolveImageSource(source)\n .catch(() => null)\n .then((value) => {\n if (current) setLoaded({ source, handler, value });\n });\n return () => {\n current = false;\n };\n }, [direct, source, handler]);\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 { isChatWebLink, parseChatLink } from \"@/components/chat-ui/links/chat-link\";\nimport { ChatLinkAnchor } from \"@/components/chat-ui/links/chat-link-anchor\";\nimport { useChatLinkHandler } from \"@/components/chat-ui/links/chat-link-context\";\nimport { ChatWebLink } from \"@/components/chat-ui/links/chat-web-link\";\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\n// Bubble labels are plain text, like the message text of a link.\nconst plainText = (nodes: PhrasingContent[]): string =>\n nodes\n .map((node) => {\n if (\"children\" in node) return plainText(node.children);\n return \"value\" in node ? node.value : \"\";\n })\n .join(\"\");\n\nconst InlineChildren = (props: InlineChildrenProps) => {\n const { nodes } = props;\n const resolver = useMarkdownUrlResolver();\n const handler = useChatLinkHandler();\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 (\n <ChatLinkAnchor key={key} candidate={{ source: node.value, origin: \"inline-code\" }}>\n <Code>{node.value}</Code>\n </ChatLinkAnchor>\n );\n case \"break\":\n return <br key={key} />;\n case \"link\": {\n const candidate = { source: node.url, origin: \"markdown\" as const };\n if (node.children.every((child) => child.type !== \"image\") && isChatWebLink(handler, candidate))\n return <ChatWebLink key={key} source={node.url} label={plainText(node.children)} />;\n const parsed = parseChatLink(candidate, typeof window === \"undefined\" ? undefined : window.location.origin);\n if (handler && parsed && (parsed.kind !== \"external\" || handler.resolveHref(candidate)))\n return (\n <ChatLinkAnchor key={key} candidate={candidate}>\n <InlineChildren nodes={node.children} />\n </ChatLinkAnchor>\n );\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 { createContext } from \"react\";\nimport type { DataTableSettings } from \"@/components/data-table/types\";\n\nexport const MarkdownTableSettingsContext = createContext<Partial<DataTableSettings> | undefined>(undefined);\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, useContext, useRef, useState } from \"react\";\nimport { EditModeDataTable } from \"@/components/data-table/edit-mode-data-table\";\nimport type { DataTableEditModeColumn, RowData } from \"@/components/data-table/types\";\nimport { HostStorageProvider } from \"@/utils/host-storage\";\nimport { LazyMarkdownEditor } from \"../../lazy-markdown-editor\";\nimport { MarkdownInline } from \"../markdown-inline\";\nimport type { MarkdownTableValue } from \"../markdown-table\";\nimport { MarkdownTableSettingsContext } from \"../markdown-table-settings-context\";\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 defaultSettings = useContext(MarkdownTableSettingsContext);\n // Document tables own their view state; generated column ids repeat across documents.\n const [storage] = useState(() => ({ getItem: () => null, setItem: () => undefined }));\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 (!event.currentTarget.contains(target)) return;\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 <HostStorageProvider storage={storage}>\n <EditModeDataTable\n data={projectRows(table)}\n defaultSettings={defaultSettings}\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 </HostStorageProvider>\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 EditorConfig,\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 createDOM(config: EditorConfig) {\n const anchor = super.createDOM(config);\n anchor.dataset.chatSource = this.__source;\n anchor.dataset.chatOrigin = \"markdown\";\n return anchor;\n }\n\n updateDOM(previous: this, anchor: HTMLAnchorElement, config: EditorConfig) {\n const changed = super.updateDOM(previous, anchor, config);\n anchor.dataset.chatSource = this.__source;\n return changed;\n }\n\n getSource() {\n return this.__source;\n }\n\n setResolvedURL(url: string) {\n if (this.getURL() !== url) this.getWritable().__url = url;\n return this;\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 { $applyNodeReplacement, type EditorConfig, TextNode } from \"lexical\";\n\n// A chunk owns its span for its lifetime. Lexical must not merge it with earlier text.\nexport class StreamingTextNode extends TextNode {\n static getType() {\n return \"streaming-text\";\n }\n static clone(node: StreamingTextNode) {\n return new StreamingTextNode(node.__text, node.__key);\n }\n static importJSON(serialized: ReturnType<TextNode[\"exportJSON\"]>) {\n return $createStreamingTextNode(serialized.text).updateFromJSON(serialized);\n }\n createDOM(config: EditorConfig) {\n const element = super.createDOM(config);\n element.classList.add(\"streaming-text-chunk\");\n return element;\n }\n exportJSON() {\n return { ...super.exportJSON(), type: \"streaming-text\" };\n }\n}\n\nexport const $createStreamingTextNode = (text: string) => $applyNodeReplacement(new StreamingTextNode(text));\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 { StreamingTextNode } from \"./nodes/streaming-text-node\";\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 StreamingTextNode,\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 \"./CodeBlockActionsPlugin.css\";\n\nimport { IconButton } from \"@chakra-ui/react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_CRITICAL, SELECTION_CHANGE_COMMAND } from \"lexical\";\nimport { Check, Copy } from \"lucide-react\";\nimport type React from \"react\";\nimport { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { $isCodeNode } from \"../../lexical-code\";\n\nfunction getCodeElementFromSelection(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return null;\n }\n\n const anchorNode = selection.anchor.getNode();\n const codeNode = $isCodeNode(anchorNode)\n ? anchorNode\n : $findMatchingParent(anchorNode, (node) => {\n return $isCodeNode(node);\n });\n\n if (!$isCodeNode(codeNode)) {\n return null;\n }\n\n const codeElement = editor.getElementByKey(codeNode.getKey());\n return codeElement instanceof HTMLElement ? codeElement : null;\n}\n\nfunction getCodeElementFromTarget(target: EventTarget | null) {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n\n return target.closest(\".rich-text__code\");\n}\n\nfunction getActionPosition(anchorElem: HTMLElement, codeElement: HTMLElement) {\n const anchorRect = anchorElem.getBoundingClientRect();\n const codeRect = codeElement.getBoundingClientRect();\n\n return {\n top: codeRect.top - anchorRect.top + 6,\n left: codeRect.right - anchorRect.left - 30,\n };\n}\n\nexport function CodeBlockActionsPlugin({ anchorElem }: { anchorElem?: HTMLElement | null }): React.JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n const [activeCodeElement, setActiveCodeElement] = useState<HTMLElement | null>(null);\n const [isCopied, setIsCopied] = useState(false);\n const copyResetTimeoutRef = useRef<number | null>(null);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n const rootElement = editor.getRootElement();\n if (!rootElement) {\n return;\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n const nextCodeElement = getCodeElementFromTarget(event.target);\n setActiveCodeElement(nextCodeElement instanceof HTMLElement ? nextCodeElement : null);\n };\n\n const handlePointerLeave = () => {\n editor.getEditorState().read(() => {\n const selectionCodeElement = getCodeElementFromSelection(editor);\n setActiveCodeElement(selectionCodeElement);\n });\n };\n\n rootElement.addEventListener(\"pointermove\", handlePointerMove);\n rootElement.addEventListener(\"pointerleave\", handlePointerLeave);\n\n return () => {\n rootElement.removeEventListener(\"pointermove\", handlePointerMove);\n rootElement.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }, [editor]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selectionCodeElement = getCodeElementFromSelection(editor);\n if (selectionCodeElement) {\n setActiveCodeElement(selectionCodeElement);\n }\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n editor.getEditorState().read(() => {\n const selectionCodeElement = getCodeElementFromSelection(editor);\n if (!selectionCodeElement) {\n setActiveCodeElement((current) => {\n return current?.matches(\":hover\") ? current : null;\n });\n return;\n }\n\n setActiveCodeElement(selectionCodeElement);\n });\n\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n );\n }, [editor]);\n\n if (!anchorElem || !activeCodeElement) {\n return null;\n }\n\n const position = getActionPosition(anchorElem, activeCodeElement);\n const style: CSSProperties = {\n position: \"absolute\",\n top: position.top,\n left: position.left,\n };\n\n return createPortal(\n <div className=\"code-block-actions\" style={style}>\n <Tooltip content={isCopied ? \"Copied\" : \"Copy code\"}>\n <IconButton\n aria-label={isCopied ? \"Copied\" : \"Copy code\"}\n variant=\"subtle\"\n size=\"xs\"\n onClick={async () => {\n const code = activeCodeElement.textContent ?? \"\";\n try {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n copyResetTimeoutRef.current = window.setTimeout(() => {\n setIsCopied(false);\n }, 1200);\n } catch {\n setIsCopied(false);\n }\n }}\n >\n {isCopied ? <Check size={14} /> : <Copy size={14} />}\n </IconButton>\n </Tooltip>\n </div>,\n anchorElem,\n );\n}\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 { createCommand, type LexicalCommand } from \"lexical\";\n\nexport const TOGGLE_LINK_EDIT_MODE_COMMAND: LexicalCommand<boolean> = createCommand(\"TOGGLE_LINK_EDIT_MODE_COMMAND\");\n","import { $isAtNodeEnd } from \"@lexical/selection\";\nimport type { ElementNode, RangeSelection, TextNode } from \"lexical\";\n\nexport function getSelectedNode(selection: RangeSelection): TextNode | ElementNode {\n const anchor = selection.anchor;\n const focus = selection.focus;\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (anchorNode === focusNode) {\n return anchorNode;\n }\n const isBackward = selection.isBackward();\n if (isBackward) {\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\n }\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\n}\n","const VERTICAL_GAP = 10;\nconst HORIZONTAL_OFFSET = 5;\n\nexport function setFloatingElemPos(\n targetRect: DOMRect | null,\n floatingElem: HTMLElement,\n anchorElem: HTMLElement,\n verticalGap: number = VERTICAL_GAP,\n horizontalOffset: number = HORIZONTAL_OFFSET,\n placement: \"above\" | \"legacy\" = \"legacy\",\n coordinateSpace: \"anchor\" | \"viewport\" = \"anchor\",\n): void {\n const scrollerElem = anchorElem.parentElement;\n\n if (targetRect === null || !scrollerElem) {\n floatingElem.style.opacity = \"0\";\n floatingElem.style.transform = \"translate(-10000px, -10000px)\";\n return;\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect();\n const anchorElementRect = anchorElem.getBoundingClientRect();\n const editorScrollerRect =\n coordinateSpace === \"viewport\"\n ? new DOMRect(0, 0, document.documentElement.clientWidth, document.documentElement.clientHeight)\n : scrollerElem.getBoundingClientRect();\n\n let top =\n placement === \"above\" ? targetRect.top - floatingElemRect.height - verticalGap : targetRect.top - verticalGap;\n let left = targetRect.left - horizontalOffset;\n\n if (top < editorScrollerRect.top) {\n top =\n placement === \"above\"\n ? targetRect.bottom + verticalGap\n : top + floatingElemRect.height + targetRect.height + verticalGap * 2;\n }\n\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\n }\n\n if (top + floatingElemRect.height > editorScrollerRect.bottom) {\n top = targetRect.top - floatingElemRect.height - Math.abs(verticalGap);\n }\n\n if (coordinateSpace === \"anchor\") {\n top -= anchorElementRect.top;\n left -= anchorElementRect.left;\n }\n\n floatingElem.style.opacity = \"1\";\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\n}\n","import { IconButton, Stack, Text } from \"@chakra-ui/react\";\nimport type { HeadingTagType } from \"@lexical/rich-text\";\nimport { FORMAT_TEXT_COMMAND, type LexicalEditor } from \"lexical\";\nimport { Code, Link as LinkIcon, List, ListOrdered, ListTodo, TextQuote } from \"lucide-react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { BlockType } from \"./resolve-block-type\";\n\ninterface FloatingToolbarButtonsProps {\n editor: LexicalEditor;\n blockType: BlockType;\n isBold: boolean;\n isItalic: boolean;\n isUnderline: boolean;\n isCode: boolean;\n isLink: boolean;\n formatHeading: (headingSize: HeadingTagType) => void;\n formatList: (type: \"bullet\" | \"number\" | \"check\") => void;\n formatQuote: () => void;\n insertLink: () => void;\n}\n\nfunction ToolbarSeparator() {\n return (\n <span\n style={{\n display: \"inline-flex\",\n height: \"1rem\",\n margin: \"0 0.25rem\",\n borderLeft: \"1px solid var(--chakra-colors-border-subtle)\",\n }}\n />\n );\n}\n\nexport function FloatingToolbarButtons(props: FloatingToolbarButtonsProps) {\n const {\n editor,\n blockType,\n isBold,\n isItalic,\n isUnderline,\n isCode,\n isLink,\n formatHeading,\n formatList,\n formatQuote,\n insertLink,\n } = props;\n\n return (\n <Stack direction=\"row\" gap=\"0.5\" alignItems=\"center\">\n <Tooltip content=\"Bold\">\n <IconButton\n data-active={isBold || undefined}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n variant=\"ghost\"\n aria-label=\"Bold\"\n size=\"xs\"\n >\n <Text fontWeight=\"bold\" fontSize=\".75rem\">\n B\n </Text>\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Italic\">\n <IconButton\n data-active={isItalic || undefined}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")}\n variant=\"ghost\"\n aria-label=\"Italic\"\n size=\"xs\"\n >\n <Text fontStyle=\"italic\" fontSize=\".75rem\">\n I\n </Text>\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Underline\">\n <IconButton\n data-active={isUnderline || undefined}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")}\n variant=\"ghost\"\n aria-label=\"Underline\"\n size=\"xs\"\n >\n <Text textDecoration=\"underline\" fontSize=\".75rem\">\n U\n </Text>\n </IconButton>\n </Tooltip>\n <ToolbarSeparator />\n\n <Tooltip content=\"Heading 1\">\n <IconButton\n data-active={blockType === \"h1\" || undefined}\n variant=\"ghost\"\n aria-label=\"Heading 1\"\n size=\"xs\"\n onClick={() => formatHeading(\"h1\")}\n >\n <Text fontWeight=\"thin\" fontSize=\".8rem\">\n H1\n </Text>\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Heading 2\">\n <IconButton\n data-active={blockType === \"h2\" || undefined}\n variant=\"ghost\"\n aria-label=\"Heading 2\"\n size=\"xs\"\n onClick={() => formatHeading(\"h2\")}\n >\n <Text fontWeight=\"thin\" fontSize=\".8rem\">\n H2\n </Text>\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Heading 3\">\n <IconButton\n data-active={blockType === \"h3\" || undefined}\n variant=\"ghost\"\n aria-label=\"Heading 3\"\n size=\"xs\"\n onClick={() => formatHeading(\"h3\")}\n >\n <Text fontWeight=\"thin\" fontSize=\".8rem\">\n H3\n </Text>\n </IconButton>\n </Tooltip>\n <ToolbarSeparator />\n\n <Tooltip content=\"Inline Code\">\n <IconButton\n data-active={isCode || undefined}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\n variant=\"ghost\"\n aria-label=\"Inline Code\"\n size=\"xs\"\n >\n <Code size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content={isLink ? \"Remove Link\" : \"Insert Link\"}>\n <IconButton\n data-active={isLink || undefined}\n variant=\"ghost\"\n aria-label={isLink ? \"Remove Link\" : \"Insert Link\"}\n size=\"xs\"\n onClick={insertLink}\n >\n <LinkIcon size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Quote\">\n <IconButton\n data-active={blockType === \"quote\" || undefined}\n variant=\"ghost\"\n aria-label=\"Quote\"\n size=\"xs\"\n onClick={formatQuote}\n >\n <TextQuote size={14} />\n </IconButton>\n </Tooltip>\n\n <ToolbarSeparator />\n\n <Tooltip content=\"Bulleted List\">\n <IconButton\n data-active={blockType === \"bullet\" || undefined}\n variant=\"ghost\"\n aria-label=\"Bulleted List\"\n size=\"xs\"\n onClick={() => formatList(\"bullet\")}\n >\n <List size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Numbered List\">\n <IconButton\n data-active={blockType === \"number\" || undefined}\n variant=\"ghost\"\n aria-label=\"Numbered List\"\n size=\"xs\"\n onClick={() => formatList(\"number\")}\n >\n <ListOrdered size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Check List\">\n <IconButton\n data-active={blockType === \"check\" || undefined}\n variant=\"ghost\"\n aria-label=\"Check List\"\n size=\"xs\"\n onClick={() => formatList(\"check\")}\n >\n <ListTodo size={14} />\n </IconButton>\n </Tooltip>\n </Stack>\n );\n}\n","import { $isListNode } from \"@lexical/list\";\nimport { $isHeadingNode } from \"@lexical/rich-text\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport { $isRootOrShadowRoot, type LexicalNode } from \"lexical\";\n\nexport const blockTypeToBlockName = {\n bullet: \"Bulleted List\",\n check: \"Check List\",\n code: \"Code Block\",\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n number: \"Numbered List\",\n paragraph: \"Normal\",\n quote: \"Quote\",\n};\n\nexport type BlockType = keyof typeof blockTypeToBlockName;\n\nconst toKnownBlockType = (type: string) => {\n return type in blockTypeToBlockName ? (type as BlockType) : null;\n};\n\nconst findSelectionElement = (anchorNode: LexicalNode) => {\n const rootMatch =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, (node) => {\n const parent = node.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n return rootMatch ?? anchorNode.getTopLevelElementOrThrow();\n};\n\nexport const resolveBlockTypeFromAnchor = (anchorNode: LexicalNode) => {\n const element = findSelectionElement(anchorNode);\n\n if ($isListNode(element)) {\n return element.getListType() as BlockType;\n }\n\n const parentList = $findMatchingParent(anchorNode, (node) => $isListNode(node));\n if (parentList !== null && $isListNode(parentList)) {\n return parentList.getListType() as BlockType;\n }\n\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\n return toKnownBlockType(type);\n};\n","interface ShouldShowFloatingToolbarParams {\n hasSelection: boolean;\n isRangeSelection: boolean;\n isCollapsed: boolean;\n hasNativeSelection: boolean;\n hasNativeRange: boolean;\n isAnchorInsideEditor: boolean;\n isEditorEditable: boolean;\n isPointerSelecting: boolean;\n}\n\nexport function shouldShowFloatingToolbar(params: ShouldShowFloatingToolbarParams) {\n const {\n hasSelection,\n isRangeSelection,\n isCollapsed,\n hasNativeSelection,\n hasNativeRange,\n isAnchorInsideEditor,\n isEditorEditable,\n isPointerSelecting,\n } = params;\n\n return (\n hasSelection &&\n isRangeSelection &&\n !isCollapsed &&\n hasNativeSelection &&\n hasNativeRange &&\n isAnchorInsideEditor &&\n isEditorEditable &&\n !isPointerSelecting\n );\n}\n","import \"./FloatingTextFormatToolbarPlugin.css\";\n\nimport { Box } from \"@chakra-ui/react\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport {\n INSERT_CHECK_LIST_COMMAND,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n REMOVE_LIST_COMMAND,\n} from \"@lexical/list\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $createHeadingNode, $createQuoteNode, type HeadingTagType } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport {\n $createParagraphNode,\n $getSelection,\n $isRangeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n type LexicalEditor,\n SELECTION_CHANGE_COMMAND,\n} from \"lexical\";\nimport type React from \"react\";\nimport { type Dispatch, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { TOGGLE_LINK_EDIT_MODE_COMMAND } from \"../LinkEditorPlugin/commands\";\nimport { getSelectedNode } from \"../LinkEditorPlugin/utils/getSelectedNode\";\nimport { setFloatingElemPos } from \"../LinkEditorPlugin/utils/setFloatingElemPos\";\nimport { FloatingToolbarButtons } from \"./floating-toolbar-buttons\";\nimport { type BlockType, resolveBlockTypeFromAnchor } from \"./resolve-block-type\";\nimport { shouldShowFloatingToolbar } from \"./should-show-floating-toolbar\";\n\n// Increase the vertical gap (negative places it below the selection) to avoid overlap\nconst GAP = -4;\n\nfunction FloatingTextToolbar({\n editor,\n anchorElem,\n isToolbarActive,\n setIsToolbarActive,\n}: {\n editor: LexicalEditor;\n anchorElem: HTMLElement;\n isToolbarActive: boolean;\n setIsToolbarActive: Dispatch<boolean>;\n}): React.JSX.Element {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const [blockType, setBlockType] = useState<BlockType>(\"paragraph\");\n const [isBold, setIsBold] = useState(false);\n const [isItalic, setIsItalic] = useState(false);\n const [isUnderline, setIsUnderline] = useState(false);\n const [isCode, setIsCode] = useState(false);\n const [isLink, setIsLink] = useState(false);\n const isPointerSelectingRef = useRef(false);\n const updateFloatingToolbarRef = useRef<() => boolean | undefined>(() => undefined);\n\n const formatHeading = (headingSize: HeadingTagType) => {\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n if (blockType === headingSize) {\n $setBlocksType(selection, $createParagraphNode);\n return;\n }\n\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\n });\n };\n\n const formatList = (type: \"bullet\" | \"number\" | \"check\") => {\n if (blockType === type) {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n return;\n }\n const command = {\n bullet: INSERT_UNORDERED_LIST_COMMAND,\n number: INSERT_ORDERED_LIST_COMMAND,\n check: INSERT_CHECK_LIST_COMMAND,\n }[type];\n editor.dispatchCommand(command, undefined);\n };\n\n const formatQuote = () => {\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n if (blockType === \"quote\") {\n $setBlocksType(selection, $createParagraphNode);\n return;\n }\n\n $setBlocksType(selection, $createQuoteNode);\n });\n };\n\n const insertLink = () => {\n if (isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n return;\n }\n editor.dispatchCommand(TOGGLE_LINK_EDIT_MODE_COMMAND, true);\n };\n\n const updateToolbar = () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n setIsBold(selection.hasFormat(\"bold\"));\n setIsItalic(selection.hasFormat(\"italic\"));\n setIsUnderline(selection.hasFormat(\"underline\"));\n setIsCode(selection.hasFormat(\"code\"));\n\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n setIsLink(linkParent !== null || autoLinkParent !== null);\n\n const nextBlockType = resolveBlockTypeFromAnchor(selection.anchor.getNode());\n if (nextBlockType) {\n setBlockType(nextBlockType);\n }\n };\n\n updateFloatingToolbarRef.current = () => {\n const selection = $getSelection();\n const editorElem = editorRef.current;\n const nativeSelection = window.getSelection();\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n const hasNativeSelection = nativeSelection !== null;\n const hasNativeRange = hasNativeSelection && nativeSelection.rangeCount > 0;\n const isAnchorInsideEditor = Boolean(rootElement?.contains(hasNativeSelection ? nativeSelection.anchorNode : null));\n\n if (\n shouldShowFloatingToolbar({\n hasSelection: selection !== null,\n isRangeSelection: $isRangeSelection(selection),\n isCollapsed: $isRangeSelection(selection) ? selection.isCollapsed() : false,\n hasNativeSelection,\n hasNativeRange,\n isAnchorInsideEditor,\n isEditorEditable: editor.isEditable(),\n isPointerSelecting: isPointerSelectingRef.current,\n }) &&\n nativeSelection\n ) {\n const domRect: DOMRect | undefined = nativeSelection.getRangeAt(0).getBoundingClientRect();\n\n if (domRect) {\n // Anchor to the bottom of the selection to avoid overlap with tall selections\n const bottomRect = new DOMRect(domRect.left, domRect.bottom, 0, 0);\n setFloatingElemPos(bottomRect, editorElem, anchorElem, GAP, undefined, \"legacy\", \"viewport\");\n }\n\n setIsToolbarActive(true);\n } else {\n if (rootElement !== null) {\n setFloatingElemPos(null, editorElem, anchorElem, undefined, undefined, \"legacy\", \"viewport\");\n }\n setIsToolbarActive(false);\n }\n\n updateToolbar();\n\n return true;\n };\n\n useEffect(() => {\n const rootElement = editor.getRootElement();\n if (!rootElement) return;\n\n const ownerDocument = rootElement.ownerDocument;\n const startPointerSelection = () => {\n isPointerSelectingRef.current = true;\n setIsToolbarActive(false);\n };\n const finishPointerSelection = () => {\n if (!isPointerSelectingRef.current) return;\n\n isPointerSelectingRef.current = false;\n editor.getEditorState().read(() => {\n updateFloatingToolbarRef.current();\n });\n };\n\n rootElement.addEventListener(\"pointerdown\", startPointerSelection);\n ownerDocument.addEventListener(\"pointerup\", finishPointerSelection);\n ownerDocument.addEventListener(\"pointercancel\", finishPointerSelection);\n\n return () => {\n rootElement.removeEventListener(\"pointerdown\", startPointerSelection);\n ownerDocument.removeEventListener(\"pointerup\", finishPointerSelection);\n ownerDocument.removeEventListener(\"pointercancel\", finishPointerSelection);\n };\n }, [editor, setIsToolbarActive]);\n\n useEffect(() => {\n const ownerDocument = anchorElem.ownerDocument;\n\n const update = () => {\n editor.getEditorState().read(() => {\n updateFloatingToolbarRef.current();\n });\n };\n\n window.addEventListener(\"resize\", update);\n // Scroll does not bubble; capture it from the editor and its scrollable ancestors.\n ownerDocument.addEventListener(\"scroll\", update, true);\n\n return () => {\n window.removeEventListener(\"resize\", update);\n ownerDocument.removeEventListener(\"scroll\", update, true);\n };\n }, [anchorElem, editor]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateFloatingToolbarRef.current();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload) => {\n updateFloatingToolbarRef.current();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (_payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n updateFloatingToolbarRef.current();\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH,\n ),\n );\n }, [editor]);\n\n return (\n <Box ref={editorRef} zIndex=\"tooltip\" className={`floating-text-format-toolbar ${isToolbarActive ? \"active\" : \"\"}`}>\n <FloatingToolbarButtons\n editor={editor}\n blockType={blockType}\n isBold={isBold}\n isItalic={isItalic}\n isUnderline={isUnderline}\n isCode={isCode}\n isLink={isLink}\n formatHeading={formatHeading}\n formatList={formatList}\n formatQuote={formatQuote}\n insertLink={insertLink}\n />\n </Box>\n );\n}\n\nexport function FloatingTextFormatToolbarPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement;\n}): React.JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n const [isToolbarActive, setIsToolbarActive] = useState(false);\n\n return createPortal(\n <FloatingTextToolbar\n editor={editor}\n anchorElem={anchorElem}\n isToolbarActive={isToolbarActive}\n setIsToolbarActive={setIsToolbarActive}\n />,\n document.body,\n );\n}\n","import { ListNode } from \"@lexical/list\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect } from \"react\";\n\n// List numbers sit in the indent before each item. Each numbered list records the\n// digit count of its widest number so the theme can make the indent wide enough.\nexport function ListMarkerWidthPlugin() {\n const [editor] = useLexicalComposerContext();\n\n useEffect(\n () =>\n editor.registerMutationListener(ListNode, (mutations) => {\n for (const [key, mutation] of mutations) {\n if (mutation === \"destroyed\") continue;\n const list = editor.getElementByKey(key);\n if (!(list instanceof HTMLOListElement)) continue;\n const values = [...list.children].flatMap((item) => (item instanceof HTMLLIElement ? [item.value] : []));\n list.style.setProperty(\"--rich-text-list-digits\", String(Math.max(list.start, ...values)).length.toString());\n }\n }),\n [editor],\n );\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 $isInlineElementOrDecoratorNode,\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 exportQuoteChildren = (node: ElementNode) => {\n const children: BlockContent[] = [];\n const inline: PhrasingContent[] = [];\n const flushInline = () => {\n if (inline.length) children.push({ type: \"paragraph\", children: inline.splice(0) });\n };\n\n for (const child of node.getChildren()) {\n if ($isTextNode(child) || $isLineBreakNode(child) || $isInlineElementOrDecoratorNode(child)) {\n inline.push(...exportInlineNode(child));\n } else {\n flushInline();\n const block = exportBlock(child);\n if (block) children.push(block);\n }\n }\n flushInline();\n return children;\n};\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: exportQuoteChildren(node),\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 type { PhrasingContent } from \"mdast\";\n\nexport const REFERENCE_TOKEN = /\\{\\{\\s*link\\((['\"])([^'\"\\s]+)\\1\\)\\s*\\}\\}/g;\nconst REFERENCE_PREFIX = /\\{\\{\\s*link\\((['\"])[^'\"\\s]*$/;\nconst REFERENCE_AT_START = new RegExp(`^${REFERENCE_TOKEN.source}`);\n\nconst literalLinkText = (node: PhrasingContent) => {\n if (node.type !== \"link\" || !node.children.every((child) => child.type === \"text\")) return undefined;\n const text = node.children.map((child) => (child.type === \"text\" ? child.value : \"\")).join(\"\");\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n return start !== undefined && end !== undefined && end - start === text.length && node.url === text\n ? text\n : undefined;\n};\n\n// GFM can split a URL out of a reference token before the reference importer sees it.\n// Rejoin only literal text and bare autolinks; formatted Markdown keeps its structure.\nexport const readReferenceText = (children: PhrasingContent[], start: number) => {\n const first = children[start];\n if (first?.type !== \"text\") return undefined;\n const prefix = first.value.match(REFERENCE_PREFIX);\n if (!prefix || prefix.index === undefined) return undefined;\n let value = first.value;\n for (let end = start + 1; end < children.length; end++) {\n const child = children[end]!;\n const text = child.type === \"text\" ? child.value : literalLinkText(child);\n if (text === undefined) return undefined;\n value += text;\n if (REFERENCE_AT_START.test(value.slice(prefix.index))) return { value, end };\n }\n return undefined;\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 { REFERENCE_TOKEN, readReferenceText } from \"./markdown-reference-tokens\";\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 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 (let index = 0; index < children.length; index++) {\n const node = children[index]!;\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 const reference = readReferenceText(children, index);\n if (reference) {\n nodes.push(...textWithReferences(reference.value, activeFormats));\n index = reference.end;\n continue;\n }\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 [index, child] of node.children.entries()) {\n if (child.type === \"paragraph\") {\n // Native Lexical quotes hold inline content; paragraph children intercept Enter.\n if (node.children[index - 1]?.type === \"paragraph\") quote.append($createTextNode(\"\\n\\n\"));\n quote.append(...importInlineChildren(child.children, context));\n } else {\n appendBlock(quote, child, context);\n }\n }\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 createMarkdownLexicalNodes = (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 = $createParagraphNode();\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 return root.isEmpty() ? [$createParagraphNode()] : root.getChildren();\n};\n\nexport const importMarkdownToLexical = (markdown: string, resolver?: MarkdownUrlResolver) => {\n $getRoot()\n .clear()\n .append(...createMarkdownLexicalNodes(markdown, resolver));\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 blockStarts: Map<number, number>;\n end: number[];\n start: number[];\n}\n\nconst matchingSourceBlocks = (canonical: string, source: string) => {\n const canonicalBlocks = parseMarkdownSource(canonical).children;\n // Link definitions remain in the source but have no editable Lexical block.\n const sourceBlocks = parseMarkdownSource(source).children.filter((block) => block.type !== \"definition\");\n const sameBlocks =\n canonicalBlocks.length === sourceBlocks.length &&\n canonicalBlocks.every(\n (block, index) =>\n block.type === sourceBlocks[index]?.type &&\n block.position?.start.offset !== undefined &&\n sourceBlocks[index]?.position?.start.offset !== undefined &&\n block.position?.end.offset !== undefined &&\n sourceBlocks[index]?.position?.end.offset !== undefined,\n );\n\n return sameBlocks ? canonicalBlocks.map((block, index) => ({ canonical: block, source: sourceBlocks[index]! })) : [];\n};\n\nfunction* diffSourceBlocks(canonical: string, source: string, blocks: ReturnType<typeof matchingSourceBlocks>) {\n if (!blocks.length) {\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 (const block of blocks) {\n const canonicalEnd = block.canonical.position!.end.offset!;\n const sourceEnd = block.source.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 const blocks = matchingSourceBlocks(canonical, source);\n\n start[0] = 0;\n end[0] = 0;\n\n for (const change of diffSourceBlocks(canonical, source, blocks)) {\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 // Block prefixes belong after preserved separators. A character diff can\n // otherwise place a new heading marker inside extra source-only blank lines.\n const blockStarts = new Map<number, number>();\n for (const block of blocks) {\n const canonicalStart = block.canonical.position!.start.offset!;\n const sourceStart = block.source.position!.start.offset!;\n blockStarts.set(canonicalStart, sourceStart);\n }\n\n return { blockStarts, 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\nexport const mappedInsertion = (map: SourceMap, index: number) => map.blockStarts.get(index) ?? mappedEnd(map, index);\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, mappedInsertion, 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 const start =\n edit.start === edit.end ? mappedInsertion(sourceMap, edit.start) : mappedStart(sourceMap, edit.start);\n return {\n start,\n end: edit.start === edit.end ? start : mappedEnd(sourceMap, edit.end),\n replacement: withSourceLineEndings(edit.replacement, source),\n };\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 { Link as ChakraLink, IconButton, Input, Stack } from \"@chakra-ui/react\";\nimport { Check, Pencil, Trash2, X } from \"lucide-react\";\nimport type React from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\n\ninterface LinkEditorContentProps {\n isActive: boolean;\n isLinkEditMode: boolean;\n editedLinkUrl: string;\n editedLinkUrlIsValid: boolean;\n linkUrl: string;\n href: string;\n inputRef: React.RefObject<HTMLInputElement | null>;\n onEditedLinkUrlChange: (url: string) => void;\n onInputKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n onClose: () => void;\n onSubmit: () => void;\n onEdit: () => void;\n onRemove: () => void;\n}\n\nexport function LinkEditorContent(props: LinkEditorContentProps) {\n const {\n isActive,\n isLinkEditMode,\n editedLinkUrl,\n editedLinkUrlIsValid,\n linkUrl,\n href,\n inputRef,\n onEditedLinkUrlChange,\n onInputKeyDown,\n onClose,\n onSubmit,\n onEdit,\n onRemove,\n } = props;\n\n if (!isActive) {\n return null;\n }\n\n if (isLinkEditMode) {\n return (\n <Stack className=\"link-editor-content\" direction=\"row\" gap=\"1\" alignItems=\"center\" p=\"1\">\n <Input\n ref={inputRef}\n className=\"link-editor-url-field\"\n size=\"sm\"\n fontSize=\"sm\"\n value={editedLinkUrl}\n placeholder=\"https://\"\n aria-label=\"Link URL\"\n aria-invalid={!editedLinkUrlIsValid}\n onChange={(event) => {\n onEditedLinkUrlChange(event.target.value);\n }}\n onKeyDown={onInputKeyDown}\n />\n <Tooltip content=\"Cancel\">\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n aria-label=\"Cancel link edit\"\n onMouseDown={preventFocusLoss}\n onClick={onClose}\n >\n <X size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Confirm\">\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n aria-label=\"Confirm link edit\"\n disabled={!editedLinkUrlIsValid}\n onMouseDown={preventFocusLoss}\n onClick={onSubmit}\n >\n <Check size={14} />\n </IconButton>\n </Tooltip>\n </Stack>\n );\n }\n\n return (\n <Stack className=\"link-editor-content\" direction=\"row\" gap=\"1\" alignItems=\"center\" p=\"1\">\n <ChakraLink\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"link-editor-url-field\"\n fontSize=\"sm\"\n textDecoration=\"underline\"\n px=\"2\"\n truncate\n >\n {linkUrl}\n </ChakraLink>\n <Tooltip content=\"Edit link\">\n <IconButton variant=\"ghost\" size=\"xs\" aria-label=\"Edit link\" onMouseDown={preventFocusLoss} onClick={onEdit}>\n <Pencil size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip content=\"Remove link\">\n <IconButton\n variant=\"destructive-ghost\"\n size=\"xs\"\n aria-label=\"Remove link\"\n onMouseDown={preventFocusLoss}\n onClick={onRemove}\n >\n <Trash2 size={14} />\n </IconButton>\n </Tooltip>\n </Stack>\n );\n}\n\nfunction preventFocusLoss(event: React.MouseEvent) {\n event.preventDefault();\n}\n","export function shouldCancelLinkEdit(isLinkEditMode: boolean, isLink: boolean, linkUrl: string) {\n return isLinkEditMode && isLink && linkUrl === \"\";\n}\n","import { $isLinkNode } from \"@lexical/link\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport type { RangeSelection } from \"lexical\";\nimport { getSelectedNode } from \"./getSelectedNode\";\n\nexport function getSelectionLinkUrl(selection: RangeSelection) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n\n if (linkParent) {\n return linkParent.getURL();\n }\n if ($isLinkNode(node)) {\n return node.getURL();\n }\n return \"\";\n}\n","const SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n}\n\nexport function validateUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return false;\n }\n if (parsedUrl.protocol === \"http:\" || parsedUrl.protocol === \"https:\") {\n return parsedUrl.hostname !== \"\";\n }\n return parsedUrl.pathname.trim() !== \"\";\n } catch {\n return false;\n }\n}\n","import \"./LinkEditorPlugin.css\";\n\nimport { Box } from \"@chakra-ui/react\";\nimport { $createLinkNode, $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n $setSelection,\n type BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n type LexicalEditor,\n SELECTION_CHANGE_COMMAND,\n} from \"lexical\";\nimport type React from \"react\";\nimport { type Dispatch, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { TOGGLE_LINK_EDIT_MODE_COMMAND } from \"./commands\";\nimport { LinkEditorContent } from \"./link-editor-content\";\nimport { getSelectedNode } from \"./utils/getSelectedNode\";\nimport { shouldCancelLinkEdit } from \"./utils/link-edit-state\";\nimport { getSelectionLinkUrl } from \"./utils/selection-link-url\";\nimport { setFloatingElemPos } from \"./utils/setFloatingElemPos\";\nimport { sanitizeUrl, validateUrl } from \"./utils/url\";\n\nconst GAP = 8;\n\nfunction LinkEditor({\n editor,\n isLink,\n setIsLink,\n anchorElem,\n isLinkEditMode,\n setIsLinkEditMode,\n}: {\n editor: LexicalEditor;\n isLink: boolean;\n setIsLink: Dispatch<boolean>;\n anchorElem: HTMLElement;\n isLinkEditMode: boolean;\n setIsLinkEditMode: Dispatch<boolean>;\n}): React.JSX.Element {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const updateLinkEditorRef = useRef<() => void>(() => undefined);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const [editedLinkUrl, setEditedLinkUrl] = useState(\"https://\");\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null);\n const isActive = isLink || isLinkEditMode;\n const editedLinkUrlIsValid = validateUrl(editedLinkUrl);\n\n updateLinkEditorRef.current = () => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const nextLinkUrl = getSelectionLinkUrl(selection);\n setLinkUrl(nextLinkUrl);\n if (shouldCancelLinkEdit(isLinkEditMode, isLink, nextLinkUrl)) {\n closeLinkEditor();\n }\n if (isLinkEditMode && nextLinkUrl !== \"\") {\n setEditedLinkUrl(nextLinkUrl);\n }\n }\n const editorElem = editorRef.current;\n const nativeSelection = window.getSelection();\n const activeElement = document.activeElement;\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n const hasNativeRange = nativeSelection !== null && nativeSelection.rangeCount > 0;\n\n if (\n selection !== null &&\n nativeSelection !== null &&\n hasNativeRange &&\n rootElement?.contains(nativeSelection.anchorNode) &&\n editor.isEditable()\n ) {\n const rangeRect = nativeSelection.getRangeAt(0).getBoundingClientRect();\n const topRect = new DOMRect(rangeRect.left, rangeRect.top, 0, rangeRect.height);\n setFloatingElemPos(topRect, editorElem, anchorElem, GAP, undefined, \"above\", \"viewport\");\n setLastSelection(selection);\n } else if (!editorElem.contains(activeElement)) {\n if (rootElement !== null) {\n setFloatingElemPos(null, editorElem, anchorElem, undefined, undefined, \"legacy\", \"viewport\");\n }\n setLastSelection(null);\n setIsLinkEditMode(false);\n setLinkUrl(\"\");\n }\n };\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement;\n\n const update = () => {\n editor.getEditorState().read(() => {\n updateLinkEditorRef.current();\n });\n };\n\n window.addEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.addEventListener(\"scroll\", update);\n }\n\n return () => {\n window.removeEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.removeEventListener(\"scroll\", update);\n }\n };\n }, [anchorElem.parentElement, editor]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditorRef.current();\n });\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditorRef.current();\n return true;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH,\n ),\n );\n }, [editor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditorRef.current();\n });\n }, [editor]);\n\n useLayoutEffect(() => {\n if (!isActive) {\n return;\n }\n\n editor.getEditorState().read(() => {\n updateLinkEditorRef.current();\n });\n }, [editor, isActive]);\n\n useEffect(() => {\n if (isLinkEditMode && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isLinkEditMode]);\n\n const monitorInputInteraction = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleLinkSubmission();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closeLinkEditor();\n }\n };\n\n const closeLinkEditor = () => {\n setEditedLinkUrl(\"https://\");\n setIsLinkEditMode(false);\n };\n\n const handleLinkSubmission = () => {\n if (lastSelection === null || !editedLinkUrlIsValid) {\n return;\n }\n\n editor.update(() => {\n $setSelection(lastSelection);\n });\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(editedLinkUrl));\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const parent = getSelectedNode(selection).getParent();\n if ($isAutoLinkNode(parent)) {\n const linkNode = $createLinkNode(parent.getURL(), {\n rel: parent.__rel,\n target: parent.__target,\n title: parent.__title,\n });\n parent.replace(linkNode, true);\n }\n }\n });\n closeLinkEditor();\n };\n\n return (\n <Box ref={editorRef} zIndex=\"tooltip\" className={`link-editor ${isActive ? \"active\" : \"\"}`}>\n <LinkEditorContent\n isActive={isActive}\n isLinkEditMode={isLinkEditMode}\n editedLinkUrl={editedLinkUrl}\n editedLinkUrlIsValid={editedLinkUrlIsValid}\n linkUrl={linkUrl}\n href={sanitizeUrl(linkUrl)}\n inputRef={inputRef}\n onEditedLinkUrlChange={setEditedLinkUrl}\n onInputKeyDown={monitorInputInteraction}\n onClose={closeLinkEditor}\n onSubmit={handleLinkSubmission}\n onEdit={() => {\n setEditedLinkUrl(linkUrl);\n setIsLinkEditMode(true);\n }}\n onRemove={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }}\n />\n </Box>\n );\n}\n\nfunction useLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isLinkEditMode: boolean,\n setIsLinkEditMode: Dispatch<boolean>,\n): React.JSX.Element | null {\n const [activeEditor, setActiveEditor] = useState(editor);\n const [isLink, setIsLink] = useState(false);\n\n useEffect(() => {\n function $updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const focusNode = getSelectedNode(selection);\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode);\n const focusAutoLinkNode = $findMatchingParent(focusNode, $isAutoLinkNode);\n if (!(focusLinkNode || focusAutoLinkNode)) {\n setIsLink(false);\n return;\n }\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode);\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode);\n const autoLinkIsUnlinked = $isAutoLinkNode(autoLinkNode) && autoLinkNode.getIsUnlinked();\n return (\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkNode)) ||\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\n (autoLinkNode && (!autoLinkNode.is(focusAutoLinkNode) || autoLinkIsUnlinked))\n );\n });\n if (!badNode) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n $updateToolbar();\n setActiveEditor(newEditor);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(sanitizeUrl(linkNode.getURL()), \"_blank\", \"noopener,noreferrer\");\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n TOGGLE_LINK_EDIT_MODE_COMMAND,\n (payload) => {\n setIsLinkEditMode(payload);\n return true;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n }, [editor, setIsLinkEditMode]);\n\n return createPortal(\n <LinkEditor\n editor={activeEditor}\n isLink={isLink}\n anchorElem={anchorElem}\n setIsLink={setIsLink}\n isLinkEditMode={isLinkEditMode}\n setIsLinkEditMode={setIsLinkEditMode}\n />,\n document.body,\n );\n}\n\nexport default function LinkEditorPlugin({ anchorElem = document.body }: { anchorElem?: HTMLElement }) {\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [editor] = useLexicalComposerContext();\n return useLinkEditorToolbar(editor, anchorElem, isLinkEditMode, setIsLinkEditMode);\n}\n","import { LinkPlugin as LexicalLinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { validateUrl } from \"./utils/url.ts\";\n\nexport default function LinkPlugin(): React.JSX.Element {\n return <LexicalLinkPlugin validateUrl={validateUrl} />;\n}\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useLayoutEffect } from \"react\";\n\nexport default function ToggleEditablePlugin({ isEditable }: { isEditable: boolean }) {\n const [editor] = useLexicalComposerContext();\n\n // Apply the change in the same task as the commit, so no input lands in an editor that was just locked.\n useLayoutEffect(() => {\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","export interface MarkdownSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface MarkdownSectionNavigation {\n anchors: MarkdownSectionAnchor[];\n targetId: string;\n}\n\nexport interface MatchedMarkdownSection {\n id: string;\n headingIndex: number;\n}\n\ninterface MarkdownSectionPosition {\n id: string;\n top: number;\n}\n\nconst normalizeHeading = (value: string) => value.trim().replace(/\\s+/g, \" \");\n\nexport const matchMarkdownSectionAnchors = (headings: string[], anchors: MarkdownSectionAnchor[]) => {\n const normalizedHeadings = headings.map(normalizeHeading);\n const implicitOccurrences = new Map<string, number>();\n const matches: MatchedMarkdownSection[] = [];\n\n for (const anchor of anchors) {\n const heading = normalizeHeading(anchor.heading);\n const occurrence = anchor.occurrence ?? implicitOccurrences.get(heading) ?? 0;\n implicitOccurrences.set(heading, occurrence + 1);\n let seen = 0;\n\n for (const [headingIndex, candidate] of normalizedHeadings.entries()) {\n if (candidate !== heading) continue;\n if (seen === occurrence) {\n matches.push({ id: anchor.id, headingIndex });\n break;\n }\n seen += 1;\n }\n }\n\n return matches.sort((left, right) => left.headingIndex - right.headingIndex);\n};\n\nexport const resolveActiveMarkdownSection = (sections: MarkdownSectionPosition[], threshold: number) => {\n const first = sections[0]?.id;\n let active = first;\n\n for (const section of sections) {\n if (section.top > threshold) break;\n active = section.id;\n }\n\n return active;\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useEffect, useRef } from \"react\";\nimport {\n type MarkdownSectionAnchor,\n matchMarkdownSectionAnchors,\n resolveActiveMarkdownSection,\n} from \"./markdown-section-navigation\";\n\ninterface MarkdownSectionNavigationPluginProps {\n anchors: MarkdownSectionAnchor[];\n targetId: string;\n onActiveSectionChange?: (sectionId: string | null) => void;\n}\n\nconst findScrollContainer = (root: HTMLElement) => {\n let current = root.parentElement;\n\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY)) return current;\n current = current.parentElement;\n }\n\n return null;\n};\n\nexport const MarkdownSectionNavigationPlugin = (props: MarkdownSectionNavigationPluginProps) => {\n const { anchors, targetId, onActiveSectionChange } = props;\n const [editor] = useLexicalComposerContext();\n const callbackRef = useRef(onActiveSectionChange);\n callbackRef.current = onActiveSectionChange;\n\n useEffect(() => {\n let cleanup: () => void = () => {};\n const frame = requestAnimationFrame(() => {\n const root = editor.getRootElement();\n if (!root) return;\n const headingElements = Array.from(root.querySelectorAll<HTMLElement>(\"h1, h2, h3, h4, h5, h6\"));\n const matches = matchMarkdownSectionAnchors(\n headingElements.map((heading) => heading.textContent ?? \"\"),\n anchors,\n );\n const matchedElements = matches.map((match) => ({\n id: match.id,\n element: headingElements[match.headingIndex]!,\n }));\n\n for (const match of matchedElements) match.element.dataset.markdownSectionId = match.id;\n\n const target = matchedElements.find((match) => match.id === targetId);\n if (!target) {\n console.warn(`[markdown section] Unknown section id: ${targetId}`);\n callbackRef.current?.(null);\n return;\n }\n\n target.element.tabIndex = -1;\n target.element.scrollIntoView({ block: \"start\" });\n target.element.focus({ preventScroll: true });\n\n const scrollContainer = findScrollContainer(root);\n let previousId: string | undefined;\n const publishActiveSection = () => {\n const containerTop = scrollContainer?.getBoundingClientRect().top ?? 0;\n const activeId = resolveActiveMarkdownSection(\n matchedElements.map((match) => ({\n id: match.id,\n top: match.element.getBoundingClientRect().top - containerTop,\n })),\n 8,\n );\n if (!activeId || activeId === previousId) return;\n previousId = activeId;\n callbackRef.current?.(activeId);\n };\n\n const scrollTarget: HTMLElement | Window = scrollContainer ?? window;\n scrollTarget.addEventListener(\"scroll\", publishActiveSection, { passive: true });\n publishActiveSection();\n cleanup = () => {\n scrollTarget.removeEventListener(\"scroll\", publishActiveSection);\n };\n });\n\n return () => {\n cancelAnimationFrame(frame);\n cleanup();\n };\n }, [anchors, editor, targetId]);\n\n return null;\n};\n","export type MarkdownTableAlignment = \"left\" | \"center\" | \"right\" | null;\n\nexport interface MarkdownTableColumn {\n id: string;\n label: string;\n alignment: MarkdownTableAlignment;\n}\n\nexport interface MarkdownTableRow {\n id: string;\n cells: Record<string, string>;\n}\n\nexport interface MarkdownTableValue {\n columns: MarkdownTableColumn[];\n rows: MarkdownTableRow[];\n}\n\nexport const updateMarkdownTableColumn = (\n table: MarkdownTableValue,\n columnId: string,\n update: Partial<Pick<MarkdownTableColumn, \"label\" | \"alignment\">>,\n) => ({\n ...table,\n columns: table.columns.map((column) => (column.id === columnId ? { ...column, ...update } : column)),\n});\n\nexport const updateMarkdownTableCell = (table: MarkdownTableValue, rowId: string, columnId: string, value: string) => ({\n ...table,\n rows: table.rows.map((row) =>\n row.id === rowId\n ? {\n ...row,\n cells: { ...row.cells, [columnId]: value },\n }\n : row,\n ),\n});\n\nexport const addMarkdownTableColumn = (table: MarkdownTableValue, column: MarkdownTableColumn) => ({\n columns: [...table.columns, column],\n rows: table.rows.map((row) => ({\n ...row,\n cells: { ...row.cells, [column.id]: \"\" },\n })),\n});\n\nexport const removeMarkdownTableColumn = (table: MarkdownTableValue, columnId: string) => {\n if (table.columns.length === 1 || !table.columns.some((column) => column.id === columnId)) return table;\n\n return {\n columns: table.columns.filter((column) => column.id !== columnId),\n rows: table.rows.map((row) => ({\n ...row,\n cells: Object.fromEntries(Object.entries(row.cells).filter(([key]) => key !== columnId)),\n })),\n };\n};\n\nexport const addMarkdownTableRow = (table: MarkdownTableValue, row: MarkdownTableRow) => ({\n ...table,\n rows: [\n ...table.rows,\n {\n ...row,\n cells: Object.fromEntries(table.columns.map((column) => [column.id, row.cells[column.id] ?? \"\"])),\n },\n ],\n});\n\nexport const removeMarkdownTableRow = (table: MarkdownTableValue, rowId: string) => ({\n ...table,\n rows: table.rows.filter((row) => row.id !== rowId),\n});\n\nexport const createEmptyMarkdownTable = (id: string): MarkdownTableValue => ({\n columns: [\n { id: `${id}-column-1`, label: \"Column 1\", alignment: null },\n { id: `${id}-column-2`, label: \"Column 2\", alignment: null },\n ],\n rows: [\n {\n id: `${id}-row-1`,\n cells: {\n [`${id}-column-1`]: \"\",\n [`${id}-column-2`]: \"\",\n },\n },\n ],\n});\n","import { Box, Button, Dialog, Field, Flex, Icon, Input, Text } from \"@chakra-ui/react\";\nimport { $createCodeNode } from \"@lexical/code\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $createHorizontalRuleNode } from \"@lexical/react/LexicalHorizontalRuleNode\";\nimport { LexicalTypeaheadMenuPlugin, type MenuTextMatch } from \"@lexical/react/LexicalTypeaheadMenuPlugin\";\nimport {\n $addUpdateTag,\n $createParagraphNode,\n $getNodeByKey,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n HISTORY_MERGE_TAG,\n type LexicalNode,\n type TextNode,\n} from \"lexical\";\nimport { Code2, Image as ImageIcon, Minus, Table2 } from \"lucide-react\";\nimport { type ElementType, type FormEvent, useEffect, useState } from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createEmptyMarkdownTable } from \"../../shared/markdown-table\";\nimport { $createDataTableNode } from \"../../shared/nodes/DataTableNode\";\nimport { $createMarkdownImageNode } from \"../../shared/nodes/MarkdownImageNode\";\n\ninterface SlashCommandOption {\n id: \"table\" | \"image\" | \"code\" | \"divider\";\n key: string;\n label: string;\n icon: ElementType;\n setRefElement: (element: HTMLElement | null) => void;\n}\n\nconst commandDefinitions: Array<Omit<SlashCommandOption, \"key\" | \"setRefElement\">> = [\n { id: \"table\", label: \"Table\", icon: Table2 },\n { id: \"image\", label: \"Image\", icon: ImageIcon },\n { id: \"code\", label: \"Code block\", icon: Code2 },\n { id: \"divider\", label: \"Divider\", icon: Minus },\n];\n\nconst slashTrigger = (text: string): MenuTextMatch | null => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return null;\n const anchorNode = selection.anchor.getNode();\n if (!$isParagraphNode(anchorNode.getParent()) || anchorNode.getPreviousSibling()) return null;\n\n const match = /^\\/([a-z ]*)$/i.exec(text);\n if (!match) return null;\n\n return {\n leadOffset: 0,\n matchingString: match[1] ?? \"\",\n replaceableString: match[0],\n };\n};\n\nconst createTableId = () => {\n const unique = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`;\n return `table-${unique}`;\n};\n\nconst replaceSlashWithBlock = (queryNode: TextNode | null, block: LexicalNode) => {\n const parent = queryNode?.getParent();\n if (!$isParagraphNode(parent)) return;\n\n parent.replace(block);\n const nextParagraph = $createParagraphNode();\n block.insertAfter(nextParagraph);\n nextParagraph.select();\n};\n\ninterface SlashCommandMenuProps {\n options: SlashCommandOption[];\n selectedIndex: number | null;\n onSelect: (option: SlashCommandOption, index: number) => void;\n onHighlight: (index: number) => void;\n}\n\nconst SlashCommandMenu = (props: SlashCommandMenuProps) => {\n const { options, selectedIndex, onSelect, onHighlight } = props;\n\n useEffect(() => {\n document.getElementById(`slash-command-${selectedIndex}`)?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex]);\n\n return (\n <Box\n role=\"listbox\"\n aria-label=\"Insert content\"\n position=\"absolute\"\n zIndex=\"popover\"\n layerStyle=\"modal\"\n minWidth=\"13rem\"\n overflow=\"hidden\"\n paddingY=\"2xs\"\n >\n <Text paddingX=\"sm\" paddingY=\"2xs\" color=\"fg.muted\" textStyle=\"label/S/medium\">\n Insert\n </Text>\n {options.length === 0 ? (\n <Text padding=\"sm\" color=\"fg.muted\" textStyle=\"paragraph/S/regular\">\n No matching commands\n </Text>\n ) : null}\n {options.map((option, index) => {\n const selected = selectedIndex === index;\n return (\n <Flex\n key={option.id}\n ref={option.setRefElement}\n id={`slash-command-${index}`}\n role=\"option\"\n aria-selected={selected}\n alignItems=\"center\"\n gap=\"xs\"\n paddingX=\"sm\"\n paddingY=\"xs\"\n cursor=\"pointer\"\n background={selected ? \"bg.active\" : \"transparent\"}\n _hover={{ background: selected ? \"bg.active\" : \"bg.hover\" }}\n onMouseEnter={() => onHighlight(index)}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => onSelect(option, index)}\n >\n <Icon as={option.icon} boxSize=\"16px\" flexShrink={0} />\n <Text minWidth=\"0\" truncate textStyle=\"label/M/medium\">\n {option.label}\n </Text>\n </Flex>\n );\n })}\n </Box>\n );\n};\n\nexport const MarkdownSlashCommandPlugin = () => {\n const [editor] = useLexicalComposerContext();\n const [query, setQuery] = useState<string | null>(null);\n const [imageParagraphKey, setImageParagraphKey] = useState<string | null>(null);\n const [imageUrl, setImageUrl] = useState(\"\");\n const [imageAlt, setImageAlt] = useState(\"Image\");\n const options = commandDefinitions\n .filter((option) => !query || option.label.toLowerCase().includes(query.toLowerCase()))\n .map((option) => ({ ...option, key: option.id, setRefElement: () => {} }));\n\n const closeImageDialog = () => {\n if (imageParagraphKey) {\n editor.update(\n () => {\n const paragraph = $getNodeByKey(imageParagraphKey);\n if ($isParagraphNode(paragraph)) paragraph.selectStart();\n },\n { tag: HISTORY_MERGE_TAG },\n );\n }\n\n setImageParagraphKey(null);\n setTimeout(() => editor.focus(), 0);\n };\n\n const insertImage = (event: FormEvent) => {\n event.preventDefault();\n if (!imageParagraphKey || !imageUrl.trim()) return;\n\n editor.update(\n () => {\n const paragraph = $getNodeByKey(imageParagraphKey);\n if ($isParagraphNode(paragraph)) {\n paragraph.splice(0, 0, [$createMarkdownImageNode(imageUrl.trim(), imageAlt.trim() || \"Image\")]);\n const nextParagraph = $createParagraphNode();\n paragraph.insertAfter(nextParagraph);\n nextParagraph.select();\n }\n },\n { tag: HISTORY_MERGE_TAG },\n );\n setImageParagraphKey(null);\n setTimeout(() => editor.focus(), 0);\n };\n\n return (\n <>\n <LexicalTypeaheadMenuPlugin<SlashCommandOption>\n onQueryChange={setQuery}\n triggerFn={slashTrigger}\n options={options}\n onSelectOption={(option, queryNode, closeMenu) => {\n if (option.id === \"image\") {\n const paragraph = queryNode?.getParent();\n const selection = $getSelection();\n if (!$isParagraphNode(paragraph) || !$isRangeSelection(selection)) return;\n\n // Typeahead text nodes can merge after this update. Keep the paragraph\n // as the insertion position and consume the command before opening the dialog.\n $addUpdateTag(HISTORY_MERGE_TAG);\n selection.anchor.set(paragraph.getKey(), 0, \"element\");\n selection.removeText();\n setImageUrl(\"\");\n setImageAlt(\"Image\");\n setImageParagraphKey(paragraph.getKey());\n closeMenu();\n return;\n }\n\n $addUpdateTag(HISTORY_MERGE_TAG);\n if (option.id === \"table\") {\n replaceSlashWithBlock(queryNode, $createDataTableNode(createEmptyMarkdownTable(createTableId())));\n }\n if (option.id === \"code\") replaceSlashWithBlock(queryNode, $createCodeNode());\n if (option.id === \"divider\") replaceSlashWithBlock(queryNode, $createHorizontalRuleNode());\n closeMenu();\n }}\n menuRenderFn={(anchorElementRef, menu) => {\n if (!anchorElementRef.current) return null;\n return ReactDOM.createPortal(\n <SlashCommandMenu\n options={menu.options}\n selectedIndex={menu.selectedIndex}\n onHighlight={menu.setHighlightedIndex}\n onSelect={(option, index) => {\n menu.setHighlightedIndex(index);\n menu.selectOptionAndCleanUp(option);\n }}\n />,\n anchorElementRef.current,\n );\n }}\n />\n <Dialog.Root\n open={Boolean(imageParagraphKey)}\n finalFocusEl={() => editor.getRootElement()}\n onOpenChange={(details) => {\n if (!details.open && imageParagraphKey) closeImageDialog();\n }}\n >\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content asChild>\n <form onSubmit={insertImage}>\n <Dialog.Header>\n <Dialog.Title>Insert image</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Flex direction=\"column\" gap=\"sm\">\n <Field.Root required>\n <Field.Label>Image URL</Field.Label>\n <Input autoFocus value={imageUrl} onChange={(event) => setImageUrl(event.target.value)} />\n </Field.Root>\n <Field.Root>\n <Field.Label>Alt text</Field.Label>\n <Input value={imageAlt} onChange={(event) => setImageAlt(event.target.value)} />\n </Field.Root>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Button type=\"button\" variant=\"ghost\" onClick={closeImageDialog}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" disabled={!imageUrl.trim()}>\n Insert image\n </Button>\n </Dialog.Footer>\n </form>\n </Dialog.Content>\n </Dialog.Positioner>\n </Dialog.Root>\n </>\n );\n};\n","import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { COMMAND_PRIORITY_HIGH, KEY_DOWN_COMMAND, REDO_COMMAND, UNDO_COMMAND } from \"lexical\";\nimport { useEffect, useState } from \"react\";\n\nexport const MarkdownHistoryPlugin = () => {\n const [editor] = useLexicalComposerContext();\n const [historyState] = useState(() => ({\n current: { editor, editorState: editor.getEditorState() },\n redoStack: [],\n undoStack: [],\n }));\n\n useEffect(() => {\n historyState.current = { editor, editorState: editor.getEditorState() };\n }, [editor, historyState]);\n\n useEffect(\n () =>\n editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event) => {\n const target = event.target;\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) return false;\n if ((!event.ctrlKey && !event.metaKey) || event.key.toLowerCase() !== \"z\") return false;\n\n event.preventDefault();\n editor.dispatchCommand(event.shiftKey ? REDO_COMMAND : UNDO_COMMAND, undefined);\n return true;\n },\n COMMAND_PRIORITY_HIGH,\n ),\n [editor],\n );\n\n return <HistoryPlugin externalHistoryState={historyState} />;\n};\n","import \"../theme/rich-text-theme.css\";\n\nimport { Box, Flex } from \"@chakra-ui/react\";\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { CheckListPlugin } from \"@lexical/react/LexicalCheckListPlugin\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HorizontalRulePlugin } from \"@lexical/react/LexicalHorizontalRulePlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { MarkdownShortcutPlugin } from \"@lexical/react/LexicalMarkdownShortcutPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { TabIndentationPlugin } from \"@lexical/react/LexicalTabIndentationPlugin\";\nimport { $addUpdateTag, $getRoot } from \"lexical\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { ContentEditable } from \"../shared/components/content-editable\";\nimport { editorNodes, editorTheme, editorTransformers } from \"../shared/editor-config\";\nimport { createMarkdownSourceDocument } from \"../shared/markdown-source-document\";\nimport type { MarkdownUrlResolver } from \"../shared/markdown-url\";\nimport { MarkdownUrlProvider } from \"../shared/markdown-url-context\";\nimport { CodeBlockActionsPlugin } from \"../shared/plugins/CodePlugin/CodeBlockActionsPlugin\";\nimport { ImportCodeBlocksPlugin } from \"../shared/plugins/CodePlugin/CodeBlockPlugin\";\nimport { CodeHighlightingPlugin } from \"../shared/plugins/CodePlugin/CodeHighlightingPlugin\";\nimport { EquationPlugin } from \"../shared/plugins/EquationPlugin/EquationPlugin\";\nimport { FloatingTextFormatToolbarPlugin } from \"../shared/plugins/FloatingTextFormatToolbarPlugin\";\nimport { LinkEditorPlugin, LinkPlugin } from \"../shared/plugins/LinkEditorPlugin\";\nimport { ListMarkerWidthPlugin } from \"../shared/plugins/list-marker-width-plugin\";\nimport ToggleEditablePlugin from \"../shared/plugins/ToggleEditablePlugin\";\nimport { TreeViewPlugin } from \"../shared/plugins/TreeViewPlugin/TreeViewPlugin\";\nimport { splitFrontmatter } from \"../utils/markdown\";\nimport { MarkdownSectionNavigationPlugin } from \"./plugins/MarkdownSectionNavigationPlugin\";\nimport { MarkdownSlashCommandPlugin } from \"./plugins/MarkdownSlashCommandPlugin\";\nimport { MarkdownHistoryPlugin } from \"./plugins/markdown-history-plugin\";\nimport type { MarkdownSectionNavigation } from \"./plugins/markdown-section-navigation\";\n\nconst INITIAL_IMPORT_TAG = \"markdown-initial-import\";\n\nexport interface MarkdownEditorProps {\n autoFocus?: boolean;\n debug?: boolean;\n defaultState: string;\n fullWidth?: boolean;\n isEditable?: boolean;\n padding?: string;\n placeholder?: string;\n scrollable?: boolean;\n sectionNavigation?: MarkdownSectionNavigation;\n resolveMarkdownUrl?: MarkdownUrlResolver;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange?: (value: string) => void;\n}\n\nexport function MarkdownEditor(props: MarkdownEditorProps) {\n const {\n autoFocus = false,\n debug = false,\n defaultState = \"\",\n fullWidth = false,\n isEditable = false,\n padding,\n placeholder,\n scrollable = true,\n sectionNavigation,\n resolveMarkdownUrl,\n onActiveSectionChange,\n onChange,\n } = props;\n const { frontmatter, body } = splitFrontmatter(defaultState);\n const shouldTrackChanges = isEditable && Boolean(onChange);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const sourceDocumentRef = useRef<ReturnType<typeof createMarkdownSourceDocument> | null>(null);\n sourceDocumentRef.current ??= createMarkdownSourceDocument(body, resolveMarkdownUrl);\n const sourceDocument = sourceDocumentRef.current;\n const [floatingToolbarAnchorElem, setFloatingToolbarAnchorElem] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n setFloatingToolbarAnchorElem(editorContainerRef.current);\n }, []);\n\n const initialConfig = {\n namespace: \"MARKDOWN_EDITOR\",\n nodes: editorNodes,\n editorState: () => {\n // Tag the mount-time import so change tracking can tell it apart from a\n // real edit. Lexical also tags it history-merge, but slash commands reuse\n // that tag for their inserts, so ignoring history-merge would swallow them.\n $addUpdateTag(INITIAL_IMPORT_TAG);\n sourceDocument.importToLexical();\n },\n onError: (error: Error) => console.error(error),\n editable: isEditable,\n theme: editorTheme,\n };\n\n return (\n <Flex\n ref={editorContainerRef}\n className=\"rich-text\"\n justifyContent=\"space-between\"\n width=\"100%\"\n maxWidth=\"100%\"\n height={scrollable ? \"100%\" : \"auto\"}\n position=\"relative\"\n direction=\"column\"\n overflow=\"visible\"\n >\n <MarkdownUrlProvider resolver={resolveMarkdownUrl}>\n <LexicalComposer initialConfig={initialConfig}>\n {isEditable ? <MarkdownSlashCommandPlugin /> : null}\n {sectionNavigation ? (\n <MarkdownSectionNavigationPlugin\n anchors={sectionNavigation.anchors}\n targetId={sectionNavigation.targetId}\n onActiveSectionChange={onActiveSectionChange}\n />\n ) : null}\n {autoFocus ? <AutoFocusPlugin /> : null}\n <MarkdownHistoryPlugin />\n <LinkPlugin />\n <ListPlugin />\n <ListMarkerWidthPlugin />\n {isEditable ? <TabIndentationPlugin maxIndent={7} /> : null}\n <CheckListPlugin />\n {isEditable ? <MarkdownShortcutPlugin transformers={editorTransformers} /> : null}\n <HorizontalRulePlugin />\n <CodeHighlightingPlugin />\n <ImportCodeBlocksPlugin />\n <CodeBlockActionsPlugin anchorElem={floatingToolbarAnchorElem} />\n <EquationPlugin />\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n fullWidth={fullWidth}\n padding={padding}\n layerStyle=\"markdownEditorInset\"\n scrollable={scrollable}\n />\n }\n placeholder={\n placeholder ? (\n <Flex\n position=\"absolute\"\n layerStyle=\"markdownEditorInset\"\n padding={padding}\n top=\"0\"\n left=\"0\"\n right=\"0\"\n pointerEvents=\"none\"\n userSelect=\"none\"\n justifyContent=\"center\"\n >\n <Box width=\"100%\" maxWidth=\"45rem\" color=\"fg.muted\" textStyle=\"paragraph/M/regular\">\n {placeholder}\n </Box>\n </Flex>\n ) : null\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n {isEditable && floatingToolbarAnchorElem ? (\n <>\n <FloatingTextFormatToolbarPlugin anchorElem={floatingToolbarAnchorElem} />\n <LinkEditorPlugin anchorElem={floatingToolbarAnchorElem} />\n </>\n ) : null}\n {shouldTrackChanges ? (\n <OnChangePlugin\n ignoreSelectionChange\n ignoreHistoryMergeTagChange={false}\n onChange={(editorState, _editor, tags) => {\n // Reporting the mount-time import as a change makes every mount\n // look like an edit and schedules a save of content the user\n // never touched.\n if (tags.has(INITIAL_IMPORT_TAG)) return;\n editorState.read(() => {\n const root = $getRoot();\n const markdownBody = sourceDocument.exportFromLexical(root);\n onChange?.(frontmatter + markdownBody);\n });\n }}\n />\n ) : null}\n <ToggleEditablePlugin isEditable={isEditable} />\n {debug && <TreeViewPlugin />}\n </LexicalComposer>\n </MarkdownUrlProvider>\n </Flex>\n );\n}\n"],"mappings":"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"}