@baasix/lexical 0.0.6 → 0.0.8

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/LexicalEditor.tsx","../src/Editor.tsx","../src/plugins/ActionsPlugin/index.tsx","../src/hooks/useModal.tsx","../src/context/FullscreenContext.tsx","../src/plugins/MarkdownTransformers/index.ts","../src/nodes/TweetNode.tsx","../src/plugins/SpeechToTextPlugin/index.ts","../src/hooks/useReport.ts","../src/plugins/AutocompletePlugin/index.tsx","../src/context/ToolbarContext.tsx","../src/nodes/AutocompleteNode.tsx","../src/utils/swipe.ts","../src/plugins/AutoEmbedPlugin/index.tsx","../src/ui/Dialog.tsx","../src/plugins/FigmaPlugin/index.tsx","../src/nodes/FigmaNode.tsx","../src/plugins/TwitterPlugin/index.ts","../src/plugins/YouTubePlugin/index.ts","../src/nodes/YouTubeNode.tsx","../src/plugins/AutoLinkPlugin/index.tsx","../src/plugins/CodeActionMenuPlugin/index.tsx","../src/plugins/CodeActionMenuPlugin/components/CopyButton/index.tsx","../src/plugins/CodeActionMenuPlugin/utils.ts","../src/plugins/CodeActionMenuPlugin/components/PrettierButton/index.tsx","../src/plugins/CodeHighlightPrismPlugin/index.ts","../src/plugins/CollapsiblePlugin/index.ts","../src/plugins/CollapsiblePlugin/CollapsibleContainerNode.ts","../src/plugins/CollapsiblePlugin/CollapsibleUtils.ts","../src/plugins/CollapsiblePlugin/CollapsibleContentNode.ts","../src/plugins/CollapsiblePlugin/CollapsibleTitleNode.ts","../src/plugins/CommentPlugin/index.tsx","../src/commenting/index.ts","../src/themes/CommentEditorTheme.ts","../src/plugins/ComponentPickerPlugin/index.tsx","../src/plugins/DateTimePlugin/index.tsx","../src/plugins/EquationsPlugin/index.tsx","../src/ui/KatexEquationAlterer.tsx","../src/plugins/ExcalidrawPlugin/index.tsx","../src/plugins/ImagesPlugin/index.tsx","../src/ui/FileInput.tsx","../src/ui/TextInput.tsx","../src/utils/baasixUpload.ts","../src/plugins/LayoutPlugin/InsertLayoutDialog.tsx","../src/ui/DropDown.tsx","../src/utils/focusUtils.ts","../src/plugins/LayoutPlugin/LayoutPlugin.tsx","../src/nodes/LayoutContainerNode.ts","../src/nodes/LayoutItemNode.ts","../src/plugins/PageBreakPlugin/index.tsx","../src/nodes/PageBreakNode/index.tsx","../src/plugins/NotesPlugin/index.tsx","../src/nodes/NotesNode.tsx","../src/utils/tnr-formatters.ts","../src/plugins/PollPlugin/index.tsx","../src/plugins/RevisionPlugin/index.tsx","../src/nodes/RevisionNode.tsx","../src/plugins/TerminologyPlugin/index.tsx","../src/nodes/TerminologyNode.tsx","../src/plugins/TablePlugin.tsx","../src/plugins/ContextMenuPlugin/index.tsx","../src/plugins/DragDropPastePlugin/index.ts","../src/plugins/DraggableBlockPlugin/index.tsx","../src/plugins/EmojiPickerPlugin/index.tsx","../src/plugins/FloatingLinkEditorPlugin/index.tsx","../src/utils/getSelectedNode.ts","../src/utils/setFloatingElemPositionForLinkEditor.ts","../src/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/utils/getDOMRangeRect.ts","../src/utils/setFloatingElemPosition.ts","../src/plugins/MarkdownShortcutPlugin/index.tsx","../src/plugins/MaxLengthPlugin/index.tsx","../src/plugins/ShortcutsPlugin/index.tsx","../src/plugins/ToolbarPlugin/utils.ts","../src/plugins/ShortcutsPlugin/shortcuts.ts","../src/plugins/SpecialTextPlugin/index.ts","../src/nodes/SpecialTextNode.tsx","../src/plugins/TabFocusPlugin/index.tsx","../src/plugins/TableActionMenuPlugin/index.tsx","../src/ui/ColorPicker.tsx","../src/plugins/TableCellResizer/index.tsx","../src/plugins/TableHoverActionsV2Plugin/index.tsx","../src/utils/getThemeSelector.ts","../src/plugins/TableOfContentsPlugin/index.tsx","../src/plugins/TableScrollShadowPlugin/index.tsx","../src/plugins/ToolbarPlugin/index.tsx","../src/ui/DropdownColorPicker.tsx","../src/plugins/ToolbarPlugin/fontSize.tsx","../src/plugins/StickyPlugin/index.ts","../src/nodes/PlaygroundNodes.ts","../src/nodes/HtmlBlockNode.tsx"],"sourcesContent":["\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from \"@lexical/html\";\nimport { $getRoot, $insertNodes, $setSelection, EditorState } from \"lexical\";\nimport type { LexicalEditor as LexicalEditorType } from \"lexical\";\nimport type { Baasix } from '@baasix/sdk';\n\nimport Editor from \"./Editor\";\nimport PlaygroundNodes from \"./nodes/PlaygroundNodes\";\n\nimport PlaygroundEditorTheme from \"./themes/PlaygroundEditorTheme\";\nimport { SharedHistoryContext } from \"./context/SharedHistoryContext\";\nimport { SettingsContext } from \"./context/SettingsContext\";\nimport { ToolbarContext } from \"./context/ToolbarContext\";\nimport { CollaborationContext } from \"@lexical/react/LexicalCollaborationContext\";\nimport { EditorConfigProvider } from \"./context/EditorConfigContext\";\nimport { FullscreenContext } from './context/FullscreenContext';\n\n// ---------------------------------------------------------------------------\n// HtmlPlugin – bridges external HTML value ↔ Lexical editor state\n// ---------------------------------------------------------------------------\n\nfunction HtmlPlugin({\n value,\n onChange,\n debounceMs = 300,\n}: {\n value: string;\n onChange: (html: string) => void;\n debounceMs?: number;\n}) {\n const [editor] = useLexicalComposerContext();\n\n // The last value we pushed into the editor OR received from onChange.\n // Used to detect whether an incoming `value` prop is genuinely new content\n // or just the echo of our own onChange call.\n // Initialised to a sentinel so the first useEffect run always loads content.\n const lastSyncedValue = useRef<string | null>(null);\n // Track whether the user has actually interacted with the editor.\n // Prevents the mount/parse cycle from firing onChange with regenerated HTML.\n const hasUserEdited = useRef(false);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Sync value changes from the outside world → Lexical editor state.\n useEffect(() => {\n // Skip if this value is what we last sent via onChange (echo).\n if (value === lastSyncedValue.current) {\n return;\n }\n\n lastSyncedValue.current = value;\n // New external content (e.g. switching items) — reset the dirty flag.\n hasUserEdited.current = false;\n\n editor.update(\n () => {\n // Null out the selection before clearing the tree to prevent\n // stale selection offsets causing IndexSizeError during reconciliation.\n $setSelection(null);\n const root = $getRoot();\n\n // If value is empty / blank, just clear the editor.\n if (!value || value === \"<p></p>\" || value === \"<p><br></p>\") {\n root.clear();\n return;\n }\n\n const parser = new DOMParser();\n const dom = parser.parseFromString(value, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n\n root.clear();\n $insertNodes(nodes);\n },\n // Prevent scroll-to-top when loading content inside a Sheet\n { tag: \"historic\" }\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, value]);\n\n // Lexical state changed → generate HTML and call onChange (debounced).\n const handleChange = useCallback(\n (_editorState: EditorState, _editor: LexicalEditorType, tags: Set<string>) => {\n // Our external sync uses the \"historic\" tag. Don't treat it as a user edit.\n if (!tags.has('historic')) {\n hasUserEdited.current = true;\n }\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n debounceTimer.current = setTimeout(() => {\n editor.update(() => {\n const html = $generateHtmlFromNodes(editor);\n\n // Avoid triggering onChange when the HTML hasn't actually changed.\n if (html === lastSyncedValue.current) {\n return;\n }\n\n // Don't fire onChange until the user has actually interacted with\n // the editor. This prevents the mount/parse cycle from overwriting\n // the form value with regenerated HTML that may differ from the original.\n if (!hasUserEdited.current) {\n return;\n }\n\n lastSyncedValue.current = html;\n onChange(html);\n });\n }, debounceMs);\n },\n [editor, onChange, debounceMs],\n );\n\n // Cleanup timer on unmount.\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n return <OnChangePlugin onChange={handleChange} ignoreSelectionChange />;\n}\n\n// ---------------------------------------------------------------------------\n// ReadOnlyController – syncs the readOnly prop to editor editable state\n// ---------------------------------------------------------------------------\n\nfunction ReadOnlyController({ readOnly }: { readOnly?: boolean }) {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// LexicalEditor – public API\n// ---------------------------------------------------------------------------\n\nexport interface LexicalEditorProps {\n baasixClient: Baasix;\n value: string;\n onChange: (html: string) => void;\n folder?: string;\n height?: number | string;\n debounceMs?: number;\n placeholder?: string;\n readOnly?: boolean;\n maxLength?: number;\n}\n\nexport default function LexicalEditor({\n baasixClient,\n value,\n onChange,\n folder,\n height = 500,\n debounceMs = 300,\n placeholder,\n readOnly,\n maxLength,\n}: LexicalEditorProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const initialConfig = {\n namespace: \"LexicalEditor\",\n nodes: [...PlaygroundNodes],\n theme: PlaygroundEditorTheme,\n onError: (error: Error) => {\n console.error(\"[LexicalEditor]\", error);\n },\n };\n\n const style: React.CSSProperties = isFullscreen\n ? {\n position: \"fixed\" as const,\n inset: 0,\n zIndex: 9999,\n height: \"100vh\",\n overflow: \"auto\",\n background: \"#fff\",\n }\n : {\n height: typeof height === \"number\" ? `${height}px` : height,\n position: \"relative\" as const,\n overflow: \"auto\",\n };\n\n // Escape key exits fullscreen\n useEffect(() => {\n if (!isFullscreen) return;\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsFullscreen(false);\n };\n document.addEventListener(\"keydown\", handleEsc);\n return () => document.removeEventListener(\"keydown\", handleEsc);\n }, [isFullscreen]);\n\n const toggleFullscreen = useCallback(\n () => setIsFullscreen((f) => !f),\n [],\n );\n\n const fullscreenValue = useMemo(\n () => ({ isFullscreen, toggleFullscreen }),\n [isFullscreen, toggleFullscreen],\n );\n\n const collabContextValue = useMemo(\n () => ({\n color: \"#000\",\n isCollabActive: false,\n name: \"User\",\n yjsDocMap: new Map(),\n }),\n []\n );\n\n return (\n <FullscreenContext.Provider value={fullscreenValue}>\n <EditorConfigProvider baasixClient={baasixClient} folder={folder}>\n <SettingsContext>\n <SharedHistoryContext>\n <LexicalComposer initialConfig={initialConfig}>\n <CollaborationContext.Provider value={collabContextValue}>\n <ToolbarContext>\n <div className=\"editor-shell\" style={style}>\n <Editor placeholder={placeholder} maxLength={maxLength} />\n <HtmlPlugin\n value={value}\n onChange={onChange}\n debounceMs={debounceMs}\n />\n <ReadOnlyController readOnly={readOnly} />\n </div>\n </ToolbarContext>\n </CollaborationContext.Provider>\n </LexicalComposer>\n </SharedHistoryContext>\n </SettingsContext>\n </EditorConfigProvider>\n </FullscreenContext.Provider>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {CharacterLimitPlugin} from '@lexical/react/LexicalCharacterLimitPlugin';\r\nimport {CheckListPlugin} from '@lexical/react/LexicalCheckListPlugin';\r\nimport {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';\r\nimport {ClickableLinkPlugin} from '@lexical/react/LexicalClickableLinkPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {LexicalErrorBoundary} from '@lexical/react/LexicalErrorBoundary';\r\nimport {HashtagPlugin} from '@lexical/react/LexicalHashtagPlugin';\r\nimport {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';\r\nimport {HorizontalRulePlugin} from '@lexical/react/LexicalHorizontalRulePlugin';\r\nimport {ListPlugin} from '@lexical/react/LexicalListPlugin';\r\nimport {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {SelectionAlwaysOnDisplay} from '@lexical/react/LexicalSelectionAlwaysOnDisplay';\r\nimport {TabIndentationPlugin} from '@lexical/react/LexicalTabIndentationPlugin';\r\nimport {TablePlugin} from '@lexical/react/LexicalTablePlugin';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {CAN_USE_DOM} from '@lexical/utils';\r\nimport {useEffect, useState} from 'react';\r\n\r\nimport {useSettings} from './context/SettingsContext';\r\nimport {useSharedHistoryContext} from './context/SharedHistoryContext';\r\nimport ActionsPlugin from './plugins/ActionsPlugin';\r\nimport AutocompletePlugin from './plugins/AutocompletePlugin';\r\nimport AutoEmbedPlugin from './plugins/AutoEmbedPlugin';\r\nimport AutoLinkPlugin from './plugins/AutoLinkPlugin';\r\nimport CodeActionMenuPlugin from './plugins/CodeActionMenuPlugin';\r\nimport CodeHighlightPrismPlugin from './plugins/CodeHighlightPrismPlugin';\r\nimport CollapsiblePlugin from './plugins/CollapsiblePlugin';\r\nimport CommentPlugin from './plugins/CommentPlugin';\r\nimport ComponentPickerPlugin from './plugins/ComponentPickerPlugin';\r\nimport ContextMenuPlugin from './plugins/ContextMenuPlugin';\r\nimport DateTimePlugin from './plugins/DateTimePlugin';\r\nimport DragDropPaste from './plugins/DragDropPastePlugin';\r\nimport DraggableBlockPlugin from './plugins/DraggableBlockPlugin';\r\nimport EmojiPickerPlugin from './plugins/EmojiPickerPlugin';\r\nimport EmojisPlugin from './plugins/EmojisPlugin';\r\nimport EquationsPlugin from './plugins/EquationsPlugin';\r\nimport ExcalidrawPlugin from './plugins/ExcalidrawPlugin';\r\nimport FigmaPlugin from './plugins/FigmaPlugin';\r\nimport FloatingLinkEditorPlugin from './plugins/FloatingLinkEditorPlugin';\r\nimport FloatingTextFormatToolbarPlugin from './plugins/FloatingTextFormatToolbarPlugin';\r\nimport ImagesPlugin from './plugins/ImagesPlugin';\r\nimport KeywordsPlugin from './plugins/KeywordsPlugin';\r\nimport {LayoutPlugin} from './plugins/LayoutPlugin/LayoutPlugin';\r\nimport LinkPlugin from './plugins/LinkPlugin';\r\nimport MarkdownShortcutPlugin from './plugins/MarkdownShortcutPlugin';\r\nimport {MaxLengthPlugin} from './plugins/MaxLengthPlugin';\r\nimport MentionsPlugin from './plugins/MentionsPlugin';\r\nimport PageBreakPlugin from './plugins/PageBreakPlugin';\r\nimport PollPlugin from './plugins/PollPlugin';\r\nimport ShortcutsPlugin from './plugins/ShortcutsPlugin';\r\nimport SpecialTextPlugin from './plugins/SpecialTextPlugin';\r\nimport SpeechToTextPlugin from './plugins/SpeechToTextPlugin';\r\nimport TabFocusPlugin from './plugins/TabFocusPlugin';\r\nimport TableCellActionMenuPlugin from './plugins/TableActionMenuPlugin';\r\nimport TableCellResizer from './plugins/TableCellResizer';\r\nimport TableHoverActionsV2Plugin from './plugins/TableHoverActionsV2Plugin';\r\nimport TableOfContentsPlugin from './plugins/TableOfContentsPlugin';\r\nimport TableScrollShadowPlugin from './plugins/TableScrollShadowPlugin';\r\nimport ToolbarPlugin from './plugins/ToolbarPlugin';\r\nimport TreeViewPlugin from './plugins/TreeViewPlugin';\r\nimport TwitterPlugin from './plugins/TwitterPlugin';\r\nimport StickyPlugin from './plugins/StickyPlugin';\r\nimport TerminologyPlugin from './plugins/TerminologyPlugin';\r\nimport NotesPlugin from './plugins/NotesPlugin';\r\nimport RevisionPlugin from './plugins/RevisionPlugin';\r\nimport YouTubePlugin from './plugins/YouTubePlugin';\r\nimport ContentEditable from './ui/ContentEditable';\r\n\r\ninterface EditorProps {\r\n placeholder?: string;\r\n maxLength?: number;\r\n}\r\n\r\nexport default function Editor({ placeholder: placeholderProp, maxLength }: EditorProps): JSX.Element {\r\n const {historyState} = useSharedHistoryContext();\r\n const {\r\n settings: {\r\n isCodeHighlighted,\r\n isAutocomplete,\r\n isMaxLength,\r\n isCharLimit,\r\n hasLinkAttributes,\r\n hasNestedTables,\r\n hasFitNestedTables,\r\n isCharLimitUtf8,\r\n isRichText,\r\n showTreeView,\r\n showTableOfContents,\r\n shouldUseLexicalContextMenu,\r\n shouldPreserveNewLinesInMarkdown,\r\n tableCellMerge,\r\n tableCellBackgroundColor,\r\n tableHorizontalScroll,\r\n shouldAllowHighlightingWithBrackets,\r\n selectionAlwaysOnDisplay,\r\n listStrictIndent,\r\n shouldDisableFocusOnClickChecklist,\r\n },\r\n } = useSettings();\r\n const isEditable = useLexicalEditable();\r\n const placeholder = placeholderProp ?? (isRichText\r\n ? 'Enter some rich text...'\r\n : 'Enter some plain text...');\r\n const [floatingAnchorElem, setFloatingAnchorElem] =\r\n useState<HTMLDivElement | null>(null);\r\n const [isSmallWidthViewport, setIsSmallWidthViewport] =\r\n useState<boolean>(false);\r\n const [editor] = useLexicalComposerContext();\r\n const [activeEditor, setActiveEditor] = useState(editor);\r\n const [isLinkEditMode, setIsLinkEditMode] = useState<boolean>(false);\r\n\r\n const onRef = (_floatingAnchorElem: HTMLDivElement) => {\r\n if (_floatingAnchorElem !== null) {\r\n setFloatingAnchorElem(_floatingAnchorElem);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const updateViewPortWidth = () => {\r\n const isNextSmallWidthViewport =\r\n CAN_USE_DOM && window.matchMedia('(max-width: 1025px)').matches;\r\n\r\n if (isNextSmallWidthViewport !== isSmallWidthViewport) {\r\n setIsSmallWidthViewport(isNextSmallWidthViewport);\r\n }\r\n };\r\n updateViewPortWidth();\r\n window.addEventListener('resize', updateViewPortWidth);\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateViewPortWidth);\r\n };\r\n }, [isSmallWidthViewport]);\r\n\r\n return (\r\n <>\r\n {isRichText && (\r\n <ToolbarPlugin\r\n editor={editor}\r\n activeEditor={activeEditor}\r\n setActiveEditor={setActiveEditor}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n {isRichText && (\r\n <ShortcutsPlugin\r\n editor={activeEditor}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n <div\r\n className={`editor-container ${showTreeView ? 'tree-view' : ''} ${\r\n !isRichText ? 'plain-text' : ''\r\n }`}>\r\n {(maxLength != null || isMaxLength) && <MaxLengthPlugin maxLength={maxLength ?? 30} />}\r\n <DragDropPaste />\r\n {selectionAlwaysOnDisplay && <SelectionAlwaysOnDisplay />}\r\n <ClearEditorPlugin />\r\n <ComponentPickerPlugin />\r\n <EmojiPickerPlugin />\r\n <AutoEmbedPlugin />\r\n <MentionsPlugin />\r\n <EmojisPlugin />\r\n <HashtagPlugin />\r\n <KeywordsPlugin />\r\n <SpeechToTextPlugin />\r\n <AutoLinkPlugin />\r\n <DateTimePlugin />\r\n <CommentPlugin />\r\n {isRichText ? (\r\n <>\r\n <HistoryPlugin externalHistoryState={historyState} />\r\n <RichTextPlugin\r\n contentEditable={\r\n <div className=\"editor-scroller\">\r\n <div className=\"editor\" ref={onRef}>\r\n <ContentEditable placeholder={placeholder} />\r\n </div>\r\n </div>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <MarkdownShortcutPlugin />\r\n {isCodeHighlighted && <CodeHighlightPrismPlugin />}\r\n <ListPlugin\r\n hasStrictIndent={listStrictIndent}\r\n shouldPreserveNumbering={false}\r\n />\r\n <CheckListPlugin\r\n disableTakeFocusOnClick={shouldDisableFocusOnClickChecklist}\r\n />\r\n <TablePlugin\r\n hasCellMerge={tableCellMerge}\r\n hasCellBackgroundColor={tableCellBackgroundColor}\r\n hasHorizontalScroll={tableHorizontalScroll}\r\n hasFitNestedTables={hasFitNestedTables}\r\n hasNestedTables={hasNestedTables}\r\n />\r\n <TableCellResizer />\r\n <TableScrollShadowPlugin />\r\n <ImagesPlugin />\r\n <LinkPlugin hasLinkAttributes={hasLinkAttributes} />\r\n <PollPlugin />\r\n <TwitterPlugin />\r\n <YouTubePlugin />\r\n <FigmaPlugin />\r\n <ClickableLinkPlugin disabled={isEditable} />\r\n <HorizontalRulePlugin />\r\n <EquationsPlugin />\r\n <ExcalidrawPlugin />\r\n <TabFocusPlugin />\r\n <TabIndentationPlugin maxIndent={7} />\r\n <CollapsiblePlugin />\r\n <PageBreakPlugin />\r\n <LayoutPlugin />\r\n <StickyPlugin />\r\n <TerminologyPlugin />\r\n <NotesPlugin />\r\n <RevisionPlugin />\r\n {floatingAnchorElem && (\r\n <>\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n <TableCellActionMenuPlugin\r\n anchorElem={floatingAnchorElem}\r\n cellMerge={true}\r\n />\r\n </>\r\n )}\r\n {floatingAnchorElem && !isSmallWidthViewport && (\r\n <>\r\n <DraggableBlockPlugin anchorElem={floatingAnchorElem} />\r\n <CodeActionMenuPlugin anchorElem={floatingAnchorElem} />\r\n <TableHoverActionsV2Plugin anchorElem={floatingAnchorElem} />\r\n <FloatingTextFormatToolbarPlugin\r\n anchorElem={floatingAnchorElem}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n </>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <PlainTextPlugin\r\n contentEditable={<ContentEditable placeholder={placeholder} />}\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <HistoryPlugin externalHistoryState={historyState} />\r\n </>\r\n )}\r\n {(isCharLimit || isCharLimitUtf8) && (\r\n <CharacterLimitPlugin\r\n charset={isCharLimit ? 'UTF-16' : 'UTF-8'}\r\n maxLength={5}\r\n />\r\n )}\r\n {isAutocomplete && <AutocompletePlugin />}\r\n <div>{showTableOfContents && <TableOfContentsPlugin />}</div>\r\n {shouldUseLexicalContextMenu && <ContextMenuPlugin />}\r\n {shouldAllowHighlightingWithBrackets && <SpecialTextPlugin />}\r\n <ActionsPlugin\r\n shouldPreserveNewLinesInMarkdown={shouldPreserveNewLinesInMarkdown}\r\n />\r\n </div>\r\n {showTreeView && <TreeViewPlugin />}\r\n </>\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {LexicalEditor} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {$createCodeNode, $isCodeNode} from '@lexical/code';\nimport {\n $convertFromMarkdownString,\n $convertToMarkdownString,\n} from '@lexical/markdown';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {mergeRegister} from '@lexical/utils';\nimport {\n $createTextNode,\n $getRoot,\n $isParagraphNode,\n CLEAR_EDITOR_COMMAND,\n COMMAND_PRIORITY_EDITOR,\n HISTORIC_TAG,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical';\nimport {useCallback, useEffect, useState} from 'react';\n\nimport {INITIAL_SETTINGS} from '../../context/SettingsContext';\nimport useModal from '../../hooks/useModal';\nimport {useFullscreen} from '../../context/FullscreenContext';\nimport Button from '../../ui/Button';\nimport {PLAYGROUND_TRANSFORMERS} from '../MarkdownTransformers';\nimport {\n SPEECH_TO_TEXT_COMMAND,\n SUPPORT_SPEECH_RECOGNITION,\n} from '../SpeechToTextPlugin';\n\nasync function sendEditorState(editor: LexicalEditor): Promise<void> {\n const stringifiedEditorState = JSON.stringify(editor.getEditorState());\n try {\n await fetch('http://localhost:1235/setEditorState', {\n body: stringifiedEditorState,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n },\n method: 'POST',\n });\n } catch {\n // NO-OP\n }\n}\n\nasync function validateEditorState(editor: LexicalEditor): Promise<void> {\n const stringifiedEditorState = JSON.stringify(editor.getEditorState());\n let response = null;\n try {\n response = await fetch('http://localhost:1235/validateEditorState', {\n body: stringifiedEditorState,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n },\n method: 'POST',\n });\n } catch {\n // NO-OP\n }\n if (response !== null && response.status === 403) {\n throw new Error(\n 'Editor state validation failed! Server did not accept changes.',\n );\n }\n}\n\nexport default function ActionsPlugin({\n shouldPreserveNewLinesInMarkdown,\n}: {\n shouldPreserveNewLinesInMarkdown: boolean;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\n const [isSpeechToText, setIsSpeechToText] = useState(false);\n const [isEditorEmpty, setIsEditorEmpty] = useState(true);\n const [isConverting, setIsConverting] = useState(false);\n const [isMarkdown, setIsMarkdown] = useState(false);\n const [modal, showModal] = useModal();\n const {isFullscreen, toggleFullscreen} = useFullscreen();\n\n useEffect(() => {\n return mergeRegister(\n editor.registerEditableListener((editable) => {\n setIsEditable(editable);\n }),\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerUpdateListener(\n ({dirtyElements, tags}) => {\n if (\n !isEditable &&\n dirtyElements.size > 0 &&\n !tags.has(HISTORIC_TAG)\n ) {\n validateEditorState(editor);\n }\n editor.getEditorState().read(() => {\n const root = $getRoot();\n const children = root.getChildren();\n const firstChild = children[0];\n\n // Track whether editor is in markdown (source) mode\n setIsMarkdown(\n children.length === 1 &&\n $isCodeNode(firstChild) &&\n firstChild.getLanguage() === 'markdown',\n );\n\n if (children.length > 1) {\n setIsEditorEmpty(false);\n } else {\n if ($isParagraphNode(firstChild)) {\n const paragraphChildren = firstChild.getChildren();\n setIsEditorEmpty(paragraphChildren.length === 0);\n } else {\n setIsEditorEmpty(false);\n }\n }\n });\n },\n );\n }, [editor, isEditable]);\n\n const handleMarkdownToggle = useCallback(() => {\n if (isConverting) return;\n\n // Check if editor is currently in markdown (code block) mode\n const currentlyMarkdown = editor.getEditorState().read(() => {\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n return $isCodeNode(firstChild) && firstChild.getLanguage() === 'markdown';\n });\n\n if (currentlyMarkdown) {\n // ── Markdown → Rich text ──\n setIsConverting(true);\n\n // Double rAF guarantees the browser has painted the spinner\n // before the synchronous conversion blocks the main thread.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n // Read the markdown text from the code block first\n const markdownText = editor.getEditorState().read(() => {\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n return $isCodeNode(firstChild) ? firstChild.getTextContent() : '';\n });\n\n editor.update(\n () => {\n const root = $getRoot();\n root.clear();\n $convertFromMarkdownString(\n markdownText,\n PLAYGROUND_TRANSFORMERS,\n undefined, // operate on $getRoot()\n shouldPreserveNewLinesInMarkdown,\n );\n // Ensure a valid selection exists on the newly-created content\n $getRoot().selectEnd();\n },\n { tag: 'historic' },\n );\n // Force the ToolbarPlugin to re-read the new editor state\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n } finally {\n setIsConverting(false);\n }\n });\n });\n } else {\n // ── Rich text → Markdown ──\n setIsConverting(true);\n\n // Double rAF guarantees the browser has painted the spinner\n // before the synchronous serialization blocks the main thread.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n // Heavy work: serialize the entire editor tree to markdown\n const markdown = editor.getEditorState().read(() =>\n $convertToMarkdownString(\n PLAYGROUND_TRANSFORMERS,\n undefined,\n shouldPreserveNewLinesInMarkdown,\n ),\n );\n\n // Lightweight: swap the tree for a single code block\n editor.update(\n () => {\n const root = $getRoot();\n const codeNode = $createCodeNode('markdown');\n codeNode.append($createTextNode(markdown));\n root.clear().append(codeNode);\n codeNode.select();\n },\n { tag: 'historic' },\n );\n // Force the ToolbarPlugin to re-read the new editor state\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n } finally {\n setIsConverting(false);\n }\n });\n });\n }\n }, [editor, shouldPreserveNewLinesInMarkdown, isConverting]);\n\n return (\n <div className=\"actions\">\n <button type=\"button\"\n className={`action-button ${isFullscreen ? 'active' : ''}`}\n onClick={toggleFullscreen}\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}>\n <i className={isFullscreen ? 'fullscreen-exit' : 'fullscreen'} />\n </button>\n {SUPPORT_SPEECH_RECOGNITION && (\n <button type=\"button\"\n onClick={() => {\n editor.dispatchCommand(SPEECH_TO_TEXT_COMMAND, !isSpeechToText);\n setIsSpeechToText(!isSpeechToText);\n }}\n className={\n 'action-button action-button-mic ' +\n (isSpeechToText ? 'active' : '')\n }\n title=\"Speech To Text\"\n aria-label={`${\n isSpeechToText ? 'Enable' : 'Disable'\n } speech to text`}>\n <i className=\"mic\" />\n </button>\n )}\n <button type=\"button\"\n className=\"action-button clear\"\n disabled={isEditorEmpty}\n onClick={() => {\n showModal('Clear editor', (onClose) => (\n <ShowClearDialog editor={editor} onClose={onClose} />\n ));\n }}\n title=\"Clear\"\n aria-label=\"Clear editor contents\">\n <i className=\"clear\" />\n </button>\n <button type=\"button\"\n className={`action-button ${!isEditable ? 'unlock' : 'lock'}`}\n onClick={() => {\n if (isEditable) {\n sendEditorState(editor);\n }\n editor.setEditable(!editor.isEditable());\n }}\n title=\"Read-Only Mode\"\n aria-label={`${!isEditable ? 'Unlock' : 'Lock'} read-only mode`}>\n <i className={!isEditable ? 'unlock' : 'lock'} />\n </button>\n <button type=\"button\"\n className={`action-button ${isMarkdown ? 'active' : ''}`}\n onClick={handleMarkdownToggle}\n title={isMarkdown ? 'Convert to Rich Text' : 'Convert to Markdown'}\n aria-label={isMarkdown ? 'Convert to rich text' : 'Convert to markdown'}>\n {isConverting ? (\n <span className=\"action-button-spinner\" />\n ) : (\n <i className=\"markdown\" />\n )}\n </button>\n {modal}\n </div>\n );\n}\n\nfunction ShowClearDialog({\n editor,\n onClose,\n}: {\n editor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n return (\n <>\n Are you sure you want to clear the editor?\n <div className=\"Modal__content\">\n <Button\n onClick={() => {\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined);\n editor.focus();\n onClose();\n }}>\n Clear\n </Button>{' '}\n <Button\n onClick={() => {\n editor.focus();\n onClose();\n }}>\n Cancel\n </Button>\n </div>\n </>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useCallback, useMemo, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport Modal from '../ui/Modal';\r\n\r\nexport default function useModal(): [\r\n JSX.Element | null,\r\n (title: string, showModal: (onClose: () => void) => JSX.Element) => void,\r\n] {\r\n const [modalContent, setModalContent] = useState<null | {\r\n closeOnClickOutside: boolean;\r\n content: JSX.Element;\r\n title: string;\r\n }>(null);\r\n\r\n const onClose = useCallback(() => {\r\n setModalContent(null);\r\n }, []);\r\n\r\n const modal = useMemo(() => {\r\n if (modalContent === null) {\r\n return null;\r\n }\r\n const {title, content, closeOnClickOutside} = modalContent;\r\n return (\r\n <Modal\r\n onClose={onClose}\r\n title={title}\r\n closeOnClickOutside={closeOnClickOutside}>\r\n {content}\r\n </Modal>\r\n );\r\n }, [modalContent, onClose]);\r\n\r\n const showModal = useCallback(\r\n (\r\n title: string,\r\n // eslint-disable-next-line no-shadow\r\n getContent: (onClose: () => void) => JSX.Element,\r\n closeOnClickOutside = false,\r\n ) => {\r\n setModalContent({\r\n closeOnClickOutside,\r\n content: getContent(onClose),\r\n title,\r\n });\r\n },\r\n [onClose],\r\n );\r\n\r\n return [modal, showModal];\r\n}\r\n","import { createContext, useContext } from 'react';\n\nexport type FullscreenContextType = {\n isFullscreen: boolean;\n toggleFullscreen: () => void;\n};\n\nexport const FullscreenContext = createContext<FullscreenContextType>({\n isFullscreen: false,\n toggleFullscreen: () => {},\n});\n\nexport function useFullscreen() {\n return useContext(FullscreenContext);\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {\r\n $convertFromMarkdownString,\r\n $convertToMarkdownString,\r\n CHECK_LIST,\r\n ELEMENT_TRANSFORMERS,\r\n ElementTransformer,\r\n MULTILINE_ELEMENT_TRANSFORMERS,\r\n TEXT_FORMAT_TRANSFORMERS,\r\n TEXT_MATCH_TRANSFORMERS,\r\n TextMatchTransformer,\r\n Transformer,\r\n} from '@lexical/markdown';\r\nimport {\r\n $createHorizontalRuleNode,\r\n $isHorizontalRuleNode,\r\n HorizontalRuleNode,\r\n} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {\r\n $createTableCellNode,\r\n $createTableNode,\r\n $createTableRowNode,\r\n $isTableCellNode,\r\n $isTableNode,\r\n $isTableRowNode,\r\n TableCellHeaderStates,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from '@lexical/table';\r\nimport {\r\n $createTextNode,\r\n $isParagraphNode,\r\n $isTextNode,\r\n LexicalNode,\r\n} from 'lexical';\r\n\r\nimport {\r\n $createEquationNode,\r\n $isEquationNode,\r\n EquationNode,\r\n} from '../../nodes/EquationNode';\r\nimport {$createImageNode, $isImageNode, ImageNode} from '../../nodes/ImageNode';\r\nimport {$createTweetNode, $isTweetNode, TweetNode} from '../../nodes/TweetNode';\r\nimport emojiList from '../../utils/emoji-list';\r\n\r\nexport const HR: ElementTransformer = {\r\n dependencies: [HorizontalRuleNode],\r\n export: (node: LexicalNode) => {\r\n return $isHorizontalRuleNode(node) ? '***' : null;\r\n },\r\n regExp: /^(---|\\*\\*\\*|___)\\s?$/,\r\n replace: (parentNode, _1, _2, isImport) => {\r\n const line = $createHorizontalRuleNode();\r\n\r\n // TODO: Get rid of isImport flag\r\n if (isImport || parentNode.getNextSibling() != null) {\r\n parentNode.replace(line);\r\n } else {\r\n parentNode.insertBefore(line);\r\n }\r\n\r\n line.selectNext();\r\n },\r\n type: 'element',\r\n};\r\n\r\nexport const IMAGE: TextMatchTransformer = {\r\n dependencies: [ImageNode],\r\n export: (node) => {\r\n if (!$isImageNode(node)) {\r\n return null;\r\n }\r\n\r\n return `![${node.getAltText()}](${node.getSrc()})`;\r\n },\r\n importRegExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))/,\r\n regExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))$/,\r\n replace: (textNode, match) => {\r\n const [, altText, src] = match;\r\n const imageNode = $createImageNode({\r\n altText,\r\n maxWidth: 800,\r\n src,\r\n });\r\n textNode.replace(imageNode);\r\n },\r\n trigger: ')',\r\n type: 'text-match',\r\n};\r\n\r\nexport const EMOJI: TextMatchTransformer = {\r\n dependencies: [],\r\n export: () => null,\r\n importRegExp: /:([a-z0-9_]+):/,\r\n regExp: /:([a-z0-9_]+):$/,\r\n replace: (textNode, [, name]) => {\r\n const emoji = emojiList.find((e) => e.aliases.includes(name))?.emoji;\r\n if (emoji) {\r\n textNode.replace($createTextNode(emoji));\r\n }\r\n },\r\n trigger: ':',\r\n type: 'text-match',\r\n};\r\n\r\nexport const EQUATION: TextMatchTransformer = {\r\n dependencies: [EquationNode],\r\n export: (node) => {\r\n if (!$isEquationNode(node)) {\r\n return null;\r\n }\r\n\r\n return `$${node.getEquation()}$`;\r\n },\r\n importRegExp: /\\$([^$]+?)\\$/,\r\n regExp: /\\$([^$]+?)\\$$/,\r\n replace: (textNode, match) => {\r\n const [, equation] = match;\r\n const equationNode = $createEquationNode(equation, true);\r\n textNode.replace(equationNode);\r\n },\r\n trigger: '$',\r\n type: 'text-match',\r\n};\r\n\r\nexport const TWEET: ElementTransformer = {\r\n dependencies: [TweetNode],\r\n export: (node) => {\r\n if (!$isTweetNode(node)) {\r\n return null;\r\n }\r\n\r\n return `<tweet id=\"${node.getId()}\" />`;\r\n },\r\n regExp: /<tweet id=\"([^\"]+?)\"\\s?\\/>\\s?$/,\r\n replace: (textNode, _1, match) => {\r\n const [, id] = match;\r\n const tweetNode = $createTweetNode(id);\r\n textNode.replace(tweetNode);\r\n },\r\n type: 'element',\r\n};\r\n\r\n// Very primitive table setup\r\nconst TABLE_ROW_REG_EXP = /^(?:\\|)(.+)(?:\\|)\\s?$/;\r\nconst TABLE_ROW_DIVIDER_REG_EXP = /^(\\| ?:?-*:? ?)+\\|\\s?$/;\r\n\r\nexport const TABLE: ElementTransformer = {\r\n dependencies: [TableNode, TableRowNode, TableCellNode],\r\n export: (node: LexicalNode) => {\r\n if (!$isTableNode(node)) {\r\n return null;\r\n }\r\n\r\n const output: string[] = [];\r\n\r\n for (const row of node.getChildren()) {\r\n const rowOutput = [];\r\n if (!$isTableRowNode(row)) {\r\n continue;\r\n }\r\n\r\n let isHeaderRow = false;\r\n for (const cell of row.getChildren()) {\r\n // It's TableCellNode so it's just to make flow happy\r\n if ($isTableCellNode(cell)) {\r\n rowOutput.push(\r\n $convertToMarkdownString(PLAYGROUND_TRANSFORMERS, cell)\r\n .replace(/\\n/g, '\\\\n')\r\n .trim(),\r\n );\r\n if (cell.__headerState === TableCellHeaderStates.ROW) {\r\n isHeaderRow = true;\r\n }\r\n }\r\n }\r\n\r\n output.push(`| ${rowOutput.join(' | ')} |`);\r\n if (isHeaderRow) {\r\n output.push(`| ${rowOutput.map((_) => '---').join(' | ')} |`);\r\n }\r\n }\r\n\r\n return output.join('\\n');\r\n },\r\n regExp: TABLE_ROW_REG_EXP,\r\n replace: (parentNode, _1, match) => {\r\n // Header row\r\n if (TABLE_ROW_DIVIDER_REG_EXP.test(match[0])) {\r\n const table = parentNode.getPreviousSibling();\r\n if (!table || !$isTableNode(table)) {\r\n return;\r\n }\r\n\r\n const rows = table.getChildren();\r\n const lastRow = rows[rows.length - 1];\r\n if (!lastRow || !$isTableRowNode(lastRow)) {\r\n return;\r\n }\r\n\r\n // Add header state to row cells\r\n lastRow.getChildren().forEach((cell) => {\r\n if (!$isTableCellNode(cell)) {\r\n return;\r\n }\r\n cell.setHeaderStyles(\r\n TableCellHeaderStates.ROW,\r\n TableCellHeaderStates.ROW,\r\n );\r\n });\r\n\r\n // Remove line\r\n parentNode.remove();\r\n return;\r\n }\r\n\r\n const matchCells = mapToTableCells(match[0]);\r\n\r\n if (matchCells == null) {\r\n return;\r\n }\r\n\r\n const rows = [matchCells];\r\n let sibling = parentNode.getPreviousSibling();\r\n let maxCells = matchCells.length;\r\n\r\n while (sibling) {\r\n if (!$isParagraphNode(sibling)) {\r\n break;\r\n }\r\n\r\n if (sibling.getChildrenSize() !== 1) {\r\n break;\r\n }\r\n\r\n const firstChild = sibling.getFirstChild();\r\n\r\n if (!$isTextNode(firstChild)) {\r\n break;\r\n }\r\n\r\n const cells = mapToTableCells(firstChild.getTextContent());\r\n\r\n if (cells == null) {\r\n break;\r\n }\r\n\r\n maxCells = Math.max(maxCells, cells.length);\r\n rows.unshift(cells);\r\n const previousSibling = sibling.getPreviousSibling();\r\n sibling.remove();\r\n sibling = previousSibling;\r\n }\r\n\r\n const table = $createTableNode();\r\n\r\n for (const cells of rows) {\r\n const tableRow = $createTableRowNode();\r\n table.append(tableRow);\r\n\r\n for (let i = 0; i < maxCells; i++) {\r\n tableRow.append(i < cells.length ? cells[i] : $createTableCell(''));\r\n }\r\n }\r\n\r\n const previousSibling = parentNode.getPreviousSibling();\r\n if (\r\n $isTableNode(previousSibling) &&\r\n getTableColumnsSize(previousSibling) === maxCells\r\n ) {\r\n previousSibling.append(...table.getChildren());\r\n parentNode.remove();\r\n } else {\r\n parentNode.replace(table);\r\n }\r\n\r\n table.selectEnd();\r\n },\r\n type: 'element',\r\n};\r\n\r\nfunction getTableColumnsSize(table: TableNode) {\r\n const row = table.getFirstChild();\r\n return $isTableRowNode(row) ? row.getChildrenSize() : 0;\r\n}\r\n\r\nconst $createTableCell = (textContent: string): TableCellNode => {\r\n textContent = textContent.replace(/\\\\n/g, '\\n');\r\n const cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS);\r\n $convertFromMarkdownString(textContent, PLAYGROUND_TRANSFORMERS, cell);\r\n return cell;\r\n};\r\n\r\nconst mapToTableCells = (textContent: string): Array<TableCellNode> | null => {\r\n const match = textContent.match(TABLE_ROW_REG_EXP);\r\n if (!match || !match[1]) {\r\n return null;\r\n }\r\n return match[1].split('|').map((text) => $createTableCell(text));\r\n};\r\n\r\nexport const PLAYGROUND_TRANSFORMERS: Array<Transformer> = [\r\n TABLE,\r\n HR,\r\n IMAGE,\r\n EMOJI,\r\n EQUATION,\r\n TWEET,\r\n CHECK_LIST,\r\n ...ELEMENT_TRANSFORMERS,\r\n ...MULTILINE_ELEMENT_TRANSFORMERS,\r\n ...TEXT_FORMAT_TRANSFORMERS,\r\n ...TEXT_MATCH_TRANSFORMERS,\r\n];\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nconst WIDGET_SCRIPT_URL = 'https://platform.twitter.com/widgets.js';\r\n\r\ntype TweetComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n loadingComponent?: JSX.Element | string;\r\n nodeKey: NodeKey;\r\n onError?: (error: string) => void;\r\n onLoad?: () => void;\r\n tweetID: string;\r\n}>;\r\n\r\nfunction $convertTweetElement(\r\n domNode: HTMLDivElement,\r\n): DOMConversionOutput | null {\r\n const id = domNode.getAttribute('data-lexical-tweet-id');\r\n if (id) {\r\n const node = $createTweetNode(id);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nlet isTwitterScriptLoading = true;\r\n\r\nfunction TweetComponent({\r\n className,\r\n format,\r\n loadingComponent,\r\n nodeKey,\r\n onError,\r\n onLoad,\r\n tweetID,\r\n}: TweetComponentProps) {\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const previousTweetIDRef = useRef<string>('');\r\n const [isTweetLoading, setIsTweetLoading] = useState(false);\r\n\r\n const createTweet = useCallback(async () => {\r\n try {\r\n // @ts-expect-error Twitter is attached to the window.\r\n await window.twttr.widgets.createTweet(tweetID, containerRef.current);\r\n\r\n setIsTweetLoading(false);\r\n isTwitterScriptLoading = false;\r\n\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n } catch (error) {\r\n if (onError) {\r\n onError(String(error));\r\n }\r\n }\r\n }, [onError, onLoad, tweetID]);\r\n\r\n useEffect(() => {\r\n if (tweetID !== previousTweetIDRef.current) {\r\n setIsTweetLoading(true);\r\n\r\n if (isTwitterScriptLoading) {\r\n const script = document.createElement('script');\r\n script.src = WIDGET_SCRIPT_URL;\r\n script.async = true;\r\n document.body?.appendChild(script);\r\n script.onload = createTweet;\r\n if (onError) {\r\n script.onerror = onError as OnErrorEventHandler;\r\n }\r\n } else {\r\n createTweet();\r\n }\r\n\r\n if (previousTweetIDRef) {\r\n previousTweetIDRef.current = tweetID;\r\n }\r\n }\r\n }, [createTweet, onError, tweetID]);\r\n\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n {isTweetLoading ? loadingComponent : null}\r\n <div\r\n style={{display: 'inline-block', width: '550px'}}\r\n ref={containerRef}\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedTweetNode = Spread<\r\n {\r\n id: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nexport class TweetNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'tweet';\r\n }\r\n\r\n static clone(node: TweetNode): TweetNode {\r\n return new TweetNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedTweetNode): TweetNode {\r\n return $createTweetNode(serializedNode.id).updateFromJSON(serializedNode);\r\n }\r\n\r\n exportJSON(): SerializedTweetNode {\r\n return {\r\n ...super.exportJSON(),\r\n id: this.getId(),\r\n };\r\n }\r\n\r\n static importDOM(): DOMConversionMap<HTMLDivElement> | null {\r\n return {\r\n div: (domNode: HTMLDivElement) => {\r\n if (!domNode.hasAttribute('data-lexical-tweet-id')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertTweetElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.setAttribute('data-lexical-tweet-id', this.__id);\r\n const text = document.createTextNode(this.getTextContent());\r\n element.append(text);\r\n return {element};\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://x.com/i/web/status/${this.__id}`;\r\n }\r\n\r\n decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <TweetComponent\r\n className={className}\r\n format={this.__format}\r\n loadingComponent=\"Loading...\"\r\n nodeKey={this.getKey()}\r\n tweetID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createTweetNode(tweetID: string): TweetNode {\r\n return new TweetNode(tweetID);\r\n}\r\n\r\nexport function $isTweetNode(\r\n node: TweetNode | LexicalNode | null | undefined,\r\n): node is TweetNode {\r\n return node instanceof TweetNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalCommand, LexicalEditor, RangeSelection} from 'lexical';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n REDO_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\n\r\nimport useReport from '../../hooks/useReport';\r\n\r\nexport const SPEECH_TO_TEXT_COMMAND: LexicalCommand<boolean> = createCommand(\r\n 'SPEECH_TO_TEXT_COMMAND',\r\n);\r\n\r\nconst VOICE_COMMANDS: Readonly<\r\n Record<\r\n string,\r\n (arg0: {editor: LexicalEditor; selection: RangeSelection}) => void\r\n >\r\n> = {\r\n '\\n': ({selection}) => {\r\n selection.insertParagraph();\r\n },\r\n redo: ({editor}) => {\r\n editor.dispatchCommand(REDO_COMMAND, undefined);\r\n },\r\n undo: ({editor}) => {\r\n editor.dispatchCommand(UNDO_COMMAND, undefined);\r\n },\r\n};\r\n\r\nexport const SUPPORT_SPEECH_RECOGNITION: boolean =\r\n 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window;\r\n\r\nfunction SpeechToTextPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n const [isEnabled, setIsEnabled] = useState<boolean>(false);\r\n const SpeechRecognition =\r\n // @ts-expect-error missing type\r\n window.SpeechRecognition || window.webkitSpeechRecognition;\r\n const recognition = useRef<typeof SpeechRecognition | null>(null);\r\n const report = useReport();\r\n\r\n useEffect(() => {\r\n if (isEnabled && recognition.current === null) {\r\n recognition.current = new SpeechRecognition();\r\n recognition.current.continuous = true;\r\n recognition.current.interimResults = true;\r\n recognition.current.addEventListener(\r\n 'result',\r\n (event: typeof SpeechRecognition) => {\r\n const resultItem = event.results.item(event.resultIndex);\r\n const {transcript} = resultItem.item(0);\r\n report(transcript);\r\n\r\n if (!resultItem.isFinal) {\r\n return;\r\n }\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n const command = VOICE_COMMANDS[transcript.toLowerCase().trim()];\r\n\r\n if (command) {\r\n command({\r\n editor,\r\n selection,\r\n });\r\n } else if (transcript.match(/\\s*\\n\\s*/)) {\r\n selection.insertParagraph();\r\n } else {\r\n selection.insertText(transcript);\r\n }\r\n }\r\n });\r\n },\r\n );\r\n }\r\n\r\n if (recognition.current) {\r\n if (isEnabled) {\r\n recognition.current.start();\r\n } else {\r\n recognition.current.stop();\r\n }\r\n }\r\n\r\n return () => {\r\n if (recognition.current !== null) {\r\n recognition.current.stop();\r\n }\r\n };\r\n }, [SpeechRecognition, editor, isEnabled, report]);\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n SPEECH_TO_TEXT_COMMAND,\r\n (_isEnabled: boolean) => {\r\n setIsEnabled(_isEnabled);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n\r\nexport default (SUPPORT_SPEECH_RECOGNITION\r\n ? SpeechToTextPlugin\r\n : () => null) as () => null;\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useCallback, useEffect, useRef} from 'react';\r\n\r\nconst getElement = (): HTMLElement => {\r\n let element = document.getElementById('report-container');\r\n\r\n if (element === null) {\r\n element = document.createElement('div');\r\n element.id = 'report-container';\r\n element.style.position = 'fixed';\r\n element.style.top = '50%';\r\n element.style.left = '50%';\r\n element.style.fontSize = '32px';\r\n element.style.transform = 'translate(-50%, -50px)';\r\n element.style.padding = '20px';\r\n element.style.background = 'rgba(240, 240, 240, 0.4)';\r\n element.style.borderRadius = '20px';\r\n\r\n if (document.body) {\r\n document.body.appendChild(element);\r\n }\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport default function useReport(): (\r\n arg0: string,\r\n) => ReturnType<typeof setTimeout> {\r\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const cleanup = useCallback(() => {\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current);\r\n timer.current = null;\r\n }\r\n\r\n if (document.body) {\r\n document.body.removeChild(getElement());\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n return cleanup;\r\n }, [cleanup]);\r\n\r\n return useCallback(\r\n (content) => {\r\n // eslint-disable-next-line no-console\r\n console.log(content);\r\n const element = getElement();\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current);\r\n }\r\n element.innerHTML = content;\r\n timer.current = setTimeout(cleanup, 1000);\r\n return timer.current;\r\n },\r\n [cleanup],\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {BaseSelection, NodeKey, TextNode} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$isAtNodeEnd} from '@lexical/selection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $addUpdateTag,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_LOW,\r\n HISTORY_MERGE_TAG,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_TAB_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect} from 'react';\r\n\r\nimport {useToolbarState} from '../../context/ToolbarContext';\r\nimport {\r\n $createAutocompleteNode,\r\n AutocompleteNode,\r\n} from '../../nodes/AutocompleteNode';\r\nimport {addSwipeRightListener} from '../../utils/swipe';\r\n\r\nconst HISTORY_MERGE = {tag: HISTORY_MERGE_TAG};\r\n\r\ndeclare global {\r\n interface Navigator {\r\n userAgentData?: {\r\n mobile: boolean;\r\n };\r\n }\r\n}\r\n\r\ntype SearchPromise = {\r\n dismiss: () => void;\r\n promise: Promise<null | string>;\r\n};\r\n\r\nexport const uuid = Math.random()\r\n .toString(36)\r\n .replace(/[^a-z]+/g, '')\r\n .substring(0, 5);\r\n\r\n// TODO lookup should be custom\r\nfunction $search(selection: null | BaseSelection): [boolean, string] {\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\r\n return [false, ''];\r\n }\r\n const node = selection.getNodes()[0];\r\n const anchor = selection.anchor;\r\n // Check siblings?\r\n if (!$isTextNode(node) || !node.isSimpleText() || !$isAtNodeEnd(anchor)) {\r\n return [false, ''];\r\n }\r\n const word = [];\r\n const text = node.getTextContent();\r\n let i = node.getTextContentSize();\r\n let c;\r\n while (i-- && i >= 0 && (c = text[i]) !== ' ') {\r\n word.push(c);\r\n }\r\n if (word.length === 0) {\r\n return [false, ''];\r\n }\r\n return [true, word.reverse().join('')];\r\n}\r\n\r\n// TODO query should be custom\r\nfunction useQuery(): (searchText: string) => SearchPromise {\r\n return useCallback((searchText: string) => {\r\n const server = new AutocompleteServer();\r\n console.time('query');\r\n const response = server.query(searchText);\r\n console.timeEnd('query');\r\n return response;\r\n }, []);\r\n}\r\n\r\nfunction formatSuggestionText(suggestion: string): string {\r\n const userAgentData = window.navigator.userAgentData;\r\n const isMobile =\r\n userAgentData !== undefined\r\n ? userAgentData.mobile\r\n : window.innerWidth <= 800 && window.innerHeight <= 600;\r\n\r\n return `${suggestion} ${isMobile ? '(SWIPE \\u2B95)' : '(TAB)'}`;\r\n}\r\n\r\nexport default function AutocompletePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const query = useQuery();\r\n const {toolbarState} = useToolbarState();\r\n\r\n useEffect(() => {\r\n let autocompleteNodeKey: null | NodeKey = null;\r\n let lastMatch: null | string = null;\r\n let lastSuggestion: null | string = null;\r\n let searchPromise: null | SearchPromise = null;\r\n let prevNodeFormat: number = 0;\r\n function $clearSuggestion() {\r\n const autocompleteNode =\r\n autocompleteNodeKey !== null\r\n ? $getNodeByKey(autocompleteNodeKey)\r\n : null;\r\n if (autocompleteNode !== null && autocompleteNode.isAttached()) {\r\n autocompleteNode.remove();\r\n autocompleteNodeKey = null;\r\n }\r\n if (searchPromise !== null) {\r\n searchPromise.dismiss();\r\n searchPromise = null;\r\n }\r\n lastMatch = null;\r\n lastSuggestion = null;\r\n prevNodeFormat = 0;\r\n }\r\n function updateAsyncSuggestion(\r\n refSearchPromise: SearchPromise,\r\n newSuggestion: null | string,\r\n ) {\r\n if (searchPromise !== refSearchPromise || newSuggestion === null) {\r\n // Outdated or no suggestion\r\n return;\r\n }\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n const [hasMatch, match] = $search(selection);\r\n if (!hasMatch || match !== lastMatch || !$isRangeSelection(selection)) {\r\n // Outdated\r\n return;\r\n }\r\n const selectionCopy = selection.clone();\r\n const prevNode = selection.getNodes()[0] as TextNode;\r\n prevNodeFormat = prevNode.getFormat();\r\n const node = $createAutocompleteNode(\r\n formatSuggestionText(newSuggestion),\r\n uuid,\r\n )\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${toolbarState.fontSize}`);\r\n autocompleteNodeKey = node.getKey();\r\n selection.insertNodes([node]);\r\n $setSelection(selectionCopy);\r\n lastSuggestion = newSuggestion;\r\n }, HISTORY_MERGE);\r\n }\r\n\r\n function $handleAutocompleteNodeTransform(node: AutocompleteNode) {\r\n const key = node.getKey();\r\n if (node.__uuid === uuid && key !== autocompleteNodeKey) {\r\n // Max one Autocomplete node per session\r\n $clearSuggestion();\r\n }\r\n }\r\n function handleUpdate() {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n const [hasMatch, match] = $search(selection);\r\n if (!hasMatch) {\r\n $clearSuggestion();\r\n return;\r\n }\r\n if (match === lastMatch) {\r\n return;\r\n }\r\n $clearSuggestion();\r\n searchPromise = query(match);\r\n searchPromise.promise\r\n .then((newSuggestion) => {\r\n if (searchPromise !== null) {\r\n updateAsyncSuggestion(searchPromise, newSuggestion);\r\n }\r\n })\r\n .catch((e) => {\r\n if (e !== 'Dismissed') {\r\n console.error(e);\r\n }\r\n });\r\n lastMatch = match;\r\n }, HISTORY_MERGE);\r\n }\r\n function $handleAutocompleteIntent(): boolean {\r\n if (lastSuggestion === null || autocompleteNodeKey === null) {\r\n return false;\r\n }\r\n const autocompleteNode = $getNodeByKey(autocompleteNodeKey);\r\n if (autocompleteNode === null) {\r\n return false;\r\n }\r\n const textNode = $createTextNode(lastSuggestion)\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${toolbarState.fontSize}`);\r\n autocompleteNode.replace(textNode);\r\n textNode.selectNext();\r\n $clearSuggestion();\r\n return true;\r\n }\r\n function $handleKeypressCommand(e: Event) {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n }\r\n function handleSwipeRight(_force: number, e: TouchEvent) {\r\n editor.update(() => {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault();\r\n } else {\r\n $addUpdateTag(HISTORY_MERGE.tag);\r\n }\r\n });\r\n }\r\n function unmountSuggestion() {\r\n editor.update(() => {\r\n $clearSuggestion();\r\n }, HISTORY_MERGE);\r\n }\r\n\r\n const rootElem = editor.getRootElement();\r\n\r\n return mergeRegister(\r\n editor.registerNodeTransform(\r\n AutocompleteNode,\r\n $handleAutocompleteNodeTransform,\r\n ),\r\n editor.registerUpdateListener(handleUpdate),\r\n editor.registerCommand(\r\n KEY_TAB_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n ...(rootElem !== null\r\n ? [addSwipeRightListener(rootElem, handleSwipeRight)]\r\n : []),\r\n unmountSuggestion,\r\n );\r\n }, [editor, query, toolbarState.fontSize]);\r\n\r\n return null;\r\n}\r\n\r\n/*\r\n * Simulate an asynchronous autocomplete server (typical in more common use cases like GMail where\r\n * the data is not static).\r\n */\r\nclass AutocompleteServer {\r\n DATABASE = DICTIONARY;\r\n LATENCY = 200;\r\n\r\n query = (searchText: string): SearchPromise => {\r\n let isDismissed = false;\r\n\r\n const dismiss = () => {\r\n isDismissed = true;\r\n };\r\n const promise: Promise<null | string> = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n if (isDismissed) {\r\n // TODO cache result\r\n return reject('Dismissed');\r\n }\r\n const searchTextLength = searchText.length;\r\n if (searchText === '' || searchTextLength < 4) {\r\n return resolve(null);\r\n }\r\n const char0 = searchText.charCodeAt(0);\r\n const isCapitalized = char0 >= 65 && char0 <= 90;\r\n const caseInsensitiveSearchText = isCapitalized\r\n ? String.fromCharCode(char0 + 32) + searchText.substring(1)\r\n : searchText;\r\n const match = this.DATABASE.find(\r\n (dictionaryWord) =>\r\n dictionaryWord.startsWith(caseInsensitiveSearchText) ?? null,\r\n );\r\n if (match === undefined) {\r\n return resolve(null);\r\n }\r\n const matchCapitalized = isCapitalized\r\n ? String.fromCharCode(match.charCodeAt(0) - 32) + match.substring(1)\r\n : match;\r\n const autocompleteChunk = matchCapitalized.substring(searchTextLength);\r\n if (autocompleteChunk === '') {\r\n return resolve(null);\r\n }\r\n return resolve(autocompleteChunk);\r\n }, this.LATENCY);\r\n });\r\n\r\n return {\r\n dismiss,\r\n promise,\r\n };\r\n };\r\n}\r\n\r\n// https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-usa-no-swears-long.txt\r\nconst DICTIONARY = [\r\n 'information',\r\n 'available',\r\n 'copyright',\r\n 'university',\r\n 'management',\r\n 'international',\r\n 'development',\r\n 'education',\r\n 'community',\r\n 'technology',\r\n 'following',\r\n 'resources',\r\n 'including',\r\n 'directory',\r\n 'government',\r\n 'department',\r\n 'description',\r\n 'insurance',\r\n 'different',\r\n 'categories',\r\n 'conditions',\r\n 'accessories',\r\n 'september',\r\n 'questions',\r\n 'application',\r\n 'financial',\r\n 'equipment',\r\n 'performance',\r\n 'experience',\r\n 'important',\r\n 'activities',\r\n 'additional',\r\n 'something',\r\n 'professional',\r\n 'committee',\r\n 'washington',\r\n 'california',\r\n 'reference',\r\n 'companies',\r\n 'computers',\r\n 'president',\r\n 'australia',\r\n 'discussion',\r\n 'entertainment',\r\n 'agreement',\r\n 'marketing',\r\n 'association',\r\n 'collection',\r\n 'solutions',\r\n 'electronics',\r\n 'technical',\r\n 'microsoft',\r\n 'conference',\r\n 'environment',\r\n 'statement',\r\n 'downloads',\r\n 'applications',\r\n 'requirements',\r\n 'individual',\r\n 'subscribe',\r\n 'everything',\r\n 'production',\r\n 'commercial',\r\n 'advertising',\r\n 'treatment',\r\n 'newsletter',\r\n 'knowledge',\r\n 'currently',\r\n 'construction',\r\n 'registered',\r\n 'protection',\r\n 'engineering',\r\n 'published',\r\n 'corporate',\r\n 'customers',\r\n 'materials',\r\n 'countries',\r\n 'standards',\r\n 'political',\r\n 'advertise',\r\n 'environmental',\r\n 'availability',\r\n 'employment',\r\n 'commission',\r\n 'administration',\r\n 'institute',\r\n 'sponsored',\r\n 'electronic',\r\n 'condition',\r\n 'effective',\r\n 'organization',\r\n 'selection',\r\n 'corporation',\r\n 'executive',\r\n 'necessary',\r\n 'according',\r\n 'particular',\r\n 'facilities',\r\n 'opportunities',\r\n 'appropriate',\r\n 'statistics',\r\n 'investment',\r\n 'christmas',\r\n 'registration',\r\n 'furniture',\r\n 'wednesday',\r\n 'structure',\r\n 'distribution',\r\n 'industrial',\r\n 'potential',\r\n 'responsible',\r\n 'communications',\r\n 'associated',\r\n 'foundation',\r\n 'documents',\r\n 'communication',\r\n 'independent',\r\n 'operating',\r\n 'developed',\r\n 'telephone',\r\n 'population',\r\n 'navigation',\r\n 'operations',\r\n 'therefore',\r\n 'christian',\r\n 'understand',\r\n 'publications',\r\n 'worldwide',\r\n 'connection',\r\n 'publisher',\r\n 'introduction',\r\n 'properties',\r\n 'accommodation',\r\n 'excellent',\r\n 'opportunity',\r\n 'assessment',\r\n 'especially',\r\n 'interface',\r\n 'operation',\r\n 'restaurants',\r\n 'beautiful',\r\n 'locations',\r\n 'significant',\r\n 'technologies',\r\n 'manufacturer',\r\n 'providing',\r\n 'authority',\r\n 'considered',\r\n 'programme',\r\n 'enterprise',\r\n 'educational',\r\n 'employees',\r\n 'alternative',\r\n 'processing',\r\n 'responsibility',\r\n 'resolution',\r\n 'publication',\r\n 'relations',\r\n 'photography',\r\n 'components',\r\n 'assistance',\r\n 'completed',\r\n 'organizations',\r\n 'otherwise',\r\n 'transportation',\r\n 'disclaimer',\r\n 'membership',\r\n 'recommended',\r\n 'background',\r\n 'character',\r\n 'maintenance',\r\n 'functions',\r\n 'trademarks',\r\n 'phentermine',\r\n 'submitted',\r\n 'television',\r\n 'interested',\r\n 'throughout',\r\n 'established',\r\n 'programming',\r\n 'regarding',\r\n 'instructions',\r\n 'increased',\r\n 'understanding',\r\n 'beginning',\r\n 'associates',\r\n 'instruments',\r\n 'businesses',\r\n 'specified',\r\n 'restaurant',\r\n 'procedures',\r\n 'relationship',\r\n 'traditional',\r\n 'sometimes',\r\n 'themselves',\r\n 'transport',\r\n 'interesting',\r\n 'evaluation',\r\n 'implementation',\r\n 'galleries',\r\n 'references',\r\n 'presented',\r\n 'literature',\r\n 'respective',\r\n 'definition',\r\n 'secretary',\r\n 'networking',\r\n 'australian',\r\n 'magazines',\r\n 'francisco',\r\n 'individuals',\r\n 'guidelines',\r\n 'installation',\r\n 'described',\r\n 'attention',\r\n 'difference',\r\n 'regulations',\r\n 'certificate',\r\n 'directions',\r\n 'documentation',\r\n 'automotive',\r\n 'successful',\r\n 'communities',\r\n 'situation',\r\n 'publishing',\r\n 'emergency',\r\n 'developing',\r\n 'determine',\r\n 'temperature',\r\n 'announcements',\r\n 'historical',\r\n 'ringtones',\r\n 'difficult',\r\n 'scientific',\r\n 'satellite',\r\n 'particularly',\r\n 'functional',\r\n 'monitoring',\r\n 'architecture',\r\n 'recommend',\r\n 'dictionary',\r\n 'accounting',\r\n 'manufacturing',\r\n 'professor',\r\n 'generally',\r\n 'continued',\r\n 'techniques',\r\n 'permission',\r\n 'generation',\r\n 'component',\r\n 'guarantee',\r\n 'processes',\r\n 'interests',\r\n 'paperback',\r\n 'classifieds',\r\n 'supported',\r\n 'competition',\r\n 'providers',\r\n 'characters',\r\n 'thousands',\r\n 'apartments',\r\n 'generated',\r\n 'administrative',\r\n 'practices',\r\n 'reporting',\r\n 'essential',\r\n 'affiliate',\r\n 'immediately',\r\n 'designated',\r\n 'integrated',\r\n 'configuration',\r\n 'comprehensive',\r\n 'universal',\r\n 'presentation',\r\n 'languages',\r\n 'compliance',\r\n 'improvement',\r\n 'pennsylvania',\r\n 'challenge',\r\n 'acceptance',\r\n 'strategies',\r\n 'affiliates',\r\n 'multimedia',\r\n 'certified',\r\n 'computing',\r\n 'interactive',\r\n 'procedure',\r\n 'leadership',\r\n 'religious',\r\n 'breakfast',\r\n 'developer',\r\n 'approximately',\r\n 'recommendations',\r\n 'comparison',\r\n 'automatically',\r\n 'minnesota',\r\n 'adventure',\r\n 'institutions',\r\n 'assistant',\r\n 'advertisement',\r\n 'headlines',\r\n 'yesterday',\r\n 'determined',\r\n 'wholesale',\r\n 'extension',\r\n 'statements',\r\n 'completely',\r\n 'electrical',\r\n 'applicable',\r\n 'manufacturers',\r\n 'classical',\r\n 'dedicated',\r\n 'direction',\r\n 'basketball',\r\n 'wisconsin',\r\n 'personnel',\r\n 'identified',\r\n 'professionals',\r\n 'advantage',\r\n 'newsletters',\r\n 'estimated',\r\n 'anonymous',\r\n 'miscellaneous',\r\n 'integration',\r\n 'interview',\r\n 'framework',\r\n 'installed',\r\n 'massachusetts',\r\n 'associate',\r\n 'frequently',\r\n 'discussions',\r\n 'laboratory',\r\n 'destination',\r\n 'intelligence',\r\n 'specifications',\r\n 'tripadvisor',\r\n 'residential',\r\n 'decisions',\r\n 'industries',\r\n 'partnership',\r\n 'editorial',\r\n 'expression',\r\n 'provisions',\r\n 'principles',\r\n 'suggestions',\r\n 'replacement',\r\n 'strategic',\r\n 'economics',\r\n 'compatible',\r\n 'apartment',\r\n 'netherlands',\r\n 'consulting',\r\n 'recreation',\r\n 'participants',\r\n 'favorites',\r\n 'translation',\r\n 'estimates',\r\n 'protected',\r\n 'philadelphia',\r\n 'officials',\r\n 'contained',\r\n 'legislation',\r\n 'parameters',\r\n 'relationships',\r\n 'tennessee',\r\n 'representative',\r\n 'frequency',\r\n 'introduced',\r\n 'departments',\r\n 'residents',\r\n 'displayed',\r\n 'performed',\r\n 'administrator',\r\n 'addresses',\r\n 'permanent',\r\n 'agriculture',\r\n 'constitutes',\r\n 'portfolio',\r\n 'practical',\r\n 'delivered',\r\n 'collectibles',\r\n 'infrastructure',\r\n 'exclusive',\r\n 'originally',\r\n 'utilities',\r\n 'philosophy',\r\n 'regulation',\r\n 'reduction',\r\n 'nutrition',\r\n 'recording',\r\n 'secondary',\r\n 'wonderful',\r\n 'announced',\r\n 'prevention',\r\n 'mentioned',\r\n 'automatic',\r\n 'healthcare',\r\n 'maintained',\r\n 'increasing',\r\n 'connected',\r\n 'directors',\r\n 'participation',\r\n 'containing',\r\n 'combination',\r\n 'amendment',\r\n 'guaranteed',\r\n 'libraries',\r\n 'distributed',\r\n 'singapore',\r\n 'enterprises',\r\n 'convention',\r\n 'principal',\r\n 'certification',\r\n 'previously',\r\n 'buildings',\r\n 'household',\r\n 'batteries',\r\n 'positions',\r\n 'subscription',\r\n 'contemporary',\r\n 'panasonic',\r\n 'permalink',\r\n 'signature',\r\n 'provision',\r\n 'certainly',\r\n 'newspaper',\r\n 'liability',\r\n 'trademark',\r\n 'trackback',\r\n 'americans',\r\n 'promotion',\r\n 'conversion',\r\n 'reasonable',\r\n 'broadband',\r\n 'influence',\r\n 'importance',\r\n 'webmaster',\r\n 'prescription',\r\n 'specifically',\r\n 'represent',\r\n 'conservation',\r\n 'louisiana',\r\n 'javascript',\r\n 'marketplace',\r\n 'evolution',\r\n 'certificates',\r\n 'objectives',\r\n 'suggested',\r\n 'concerned',\r\n 'structures',\r\n 'encyclopedia',\r\n 'continuing',\r\n 'interracial',\r\n 'competitive',\r\n 'suppliers',\r\n 'preparation',\r\n 'receiving',\r\n 'accordance',\r\n 'discussed',\r\n 'elizabeth',\r\n 'reservations',\r\n 'playstation',\r\n 'instruction',\r\n 'annotation',\r\n 'differences',\r\n 'establish',\r\n 'expressed',\r\n 'paragraph',\r\n 'mathematics',\r\n 'compensation',\r\n 'conducted',\r\n 'percentage',\r\n 'mississippi',\r\n 'requested',\r\n 'connecticut',\r\n 'personals',\r\n 'immediate',\r\n 'agricultural',\r\n 'supporting',\r\n 'collections',\r\n 'participate',\r\n 'specialist',\r\n 'experienced',\r\n 'investigation',\r\n 'institution',\r\n 'searching',\r\n 'proceedings',\r\n 'transmission',\r\n 'characteristics',\r\n 'experiences',\r\n 'extremely',\r\n 'verzeichnis',\r\n 'contracts',\r\n 'concerning',\r\n 'developers',\r\n 'equivalent',\r\n 'chemistry',\r\n 'neighborhood',\r\n 'variables',\r\n 'continues',\r\n 'curriculum',\r\n 'psychology',\r\n 'responses',\r\n 'circumstances',\r\n 'identification',\r\n 'appliances',\r\n 'elementary',\r\n 'unlimited',\r\n 'printable',\r\n 'enforcement',\r\n 'hardcover',\r\n 'celebrity',\r\n 'chocolate',\r\n 'hampshire',\r\n 'bluetooth',\r\n 'controlled',\r\n 'requirement',\r\n 'authorities',\r\n 'representatives',\r\n 'pregnancy',\r\n 'biography',\r\n 'attractions',\r\n 'transactions',\r\n 'authorized',\r\n 'retirement',\r\n 'financing',\r\n 'efficiency',\r\n 'efficient',\r\n 'commitment',\r\n 'specialty',\r\n 'interviews',\r\n 'qualified',\r\n 'discovery',\r\n 'classified',\r\n 'confidence',\r\n 'lifestyle',\r\n 'consistent',\r\n 'clearance',\r\n 'connections',\r\n 'inventory',\r\n 'converter',\r\n 'organisation',\r\n 'objective',\r\n 'indicated',\r\n 'securities',\r\n 'volunteer',\r\n 'democratic',\r\n 'switzerland',\r\n 'parameter',\r\n 'processor',\r\n 'dimensions',\r\n 'contribute',\r\n 'challenges',\r\n 'recognition',\r\n 'submission',\r\n 'encourage',\r\n 'regulatory',\r\n 'inspection',\r\n 'consumers',\r\n 'territory',\r\n 'transaction',\r\n 'manchester',\r\n 'contributions',\r\n 'continuous',\r\n 'resulting',\r\n 'cambridge',\r\n 'initiative',\r\n 'execution',\r\n 'disability',\r\n 'increases',\r\n 'contractor',\r\n 'examination',\r\n 'indicates',\r\n 'committed',\r\n 'extensive',\r\n 'affordable',\r\n 'candidate',\r\n 'databases',\r\n 'outstanding',\r\n 'perspective',\r\n 'messenger',\r\n 'tournament',\r\n 'consideration',\r\n 'discounts',\r\n 'catalogue',\r\n 'publishers',\r\n 'caribbean',\r\n 'reservation',\r\n 'remaining',\r\n 'depending',\r\n 'expansion',\r\n 'purchased',\r\n 'performing',\r\n 'collected',\r\n 'absolutely',\r\n 'featuring',\r\n 'implement',\r\n 'scheduled',\r\n 'calculator',\r\n 'significantly',\r\n 'temporary',\r\n 'sufficient',\r\n 'awareness',\r\n 'vancouver',\r\n 'contribution',\r\n 'measurement',\r\n 'constitution',\r\n 'packaging',\r\n 'consultation',\r\n 'northwest',\r\n 'classroom',\r\n 'democracy',\r\n 'wallpaper',\r\n 'merchandise',\r\n 'resistance',\r\n 'baltimore',\r\n 'candidates',\r\n 'charlotte',\r\n 'biological',\r\n 'transition',\r\n 'preferences',\r\n 'instrument',\r\n 'classification',\r\n 'physician',\r\n 'hollywood',\r\n 'wikipedia',\r\n 'spiritual',\r\n 'photographs',\r\n 'relatively',\r\n 'satisfaction',\r\n 'represents',\r\n 'pittsburgh',\r\n 'preferred',\r\n 'intellectual',\r\n 'comfortable',\r\n 'interaction',\r\n 'listening',\r\n 'effectively',\r\n 'experimental',\r\n 'revolution',\r\n 'consolidation',\r\n 'landscape',\r\n 'dependent',\r\n 'mechanical',\r\n 'consultants',\r\n 'applicant',\r\n 'cooperation',\r\n 'acquisition',\r\n 'implemented',\r\n 'directories',\r\n 'recognized',\r\n 'notification',\r\n 'licensing',\r\n 'textbooks',\r\n 'diversity',\r\n 'cleveland',\r\n 'investments',\r\n 'accessibility',\r\n 'sensitive',\r\n 'templates',\r\n 'completion',\r\n 'universities',\r\n 'technique',\r\n 'contractors',\r\n 'subscriptions',\r\n 'calculate',\r\n 'alexander',\r\n 'broadcast',\r\n 'converted',\r\n 'anniversary',\r\n 'improvements',\r\n 'specification',\r\n 'accessible',\r\n 'accessory',\r\n 'typically',\r\n 'representation',\r\n 'arrangements',\r\n 'conferences',\r\n 'uniprotkb',\r\n 'consumption',\r\n 'birmingham',\r\n 'afternoon',\r\n 'consultant',\r\n 'controller',\r\n 'ownership',\r\n 'committees',\r\n 'legislative',\r\n 'researchers',\r\n 'unsubscribe',\r\n 'molecular',\r\n 'residence',\r\n 'attorneys',\r\n 'operators',\r\n 'sustainable',\r\n 'philippines',\r\n 'statistical',\r\n 'innovation',\r\n 'employers',\r\n 'definitions',\r\n 'elections',\r\n 'stainless',\r\n 'newspapers',\r\n 'hospitals',\r\n 'exception',\r\n 'successfully',\r\n 'indonesia',\r\n 'primarily',\r\n 'capabilities',\r\n 'recommendation',\r\n 'recruitment',\r\n 'organized',\r\n 'improving',\r\n 'expensive',\r\n 'organisations',\r\n 'explained',\r\n 'programmes',\r\n 'expertise',\r\n 'mechanism',\r\n 'jewellery',\r\n 'eventually',\r\n 'agreements',\r\n 'considering',\r\n 'innovative',\r\n 'conclusion',\r\n 'disorders',\r\n 'collaboration',\r\n 'detection',\r\n 'formation',\r\n 'engineers',\r\n 'proposals',\r\n 'moderator',\r\n 'tutorials',\r\n 'settlement',\r\n 'collectables',\r\n 'fantastic',\r\n 'governments',\r\n 'purchasing',\r\n 'appointed',\r\n 'operational',\r\n 'corresponding',\r\n 'descriptions',\r\n 'determination',\r\n 'animation',\r\n 'productions',\r\n 'telecommunications',\r\n 'instructor',\r\n 'approaches',\r\n 'highlights',\r\n 'designers',\r\n 'melbourne',\r\n 'scientists',\r\n 'blackjack',\r\n 'argentina',\r\n 'possibility',\r\n 'commissioner',\r\n 'dangerous',\r\n 'reliability',\r\n 'unfortunately',\r\n 'respectively',\r\n 'volunteers',\r\n 'attachment',\r\n 'appointment',\r\n 'workshops',\r\n 'hurricane',\r\n 'represented',\r\n 'mortgages',\r\n 'responsibilities',\r\n 'carefully',\r\n 'productivity',\r\n 'investors',\r\n 'underground',\r\n 'diagnosis',\r\n 'principle',\r\n 'vacations',\r\n 'calculated',\r\n 'appearance',\r\n 'incorporated',\r\n 'notebooks',\r\n 'algorithm',\r\n 'valentine',\r\n 'involving',\r\n 'investing',\r\n 'christopher',\r\n 'admission',\r\n 'terrorism',\r\n 'parliament',\r\n 'situations',\r\n 'allocated',\r\n 'corrections',\r\n 'structural',\r\n 'municipal',\r\n 'describes',\r\n 'disabilities',\r\n 'substance',\r\n 'prohibited',\r\n 'addressed',\r\n 'simulation',\r\n 'initiatives',\r\n 'concentration',\r\n 'interpretation',\r\n 'bankruptcy',\r\n 'optimization',\r\n 'substances',\r\n 'discovered',\r\n 'restrictions',\r\n 'participating',\r\n 'exhibition',\r\n 'composition',\r\n 'nationwide',\r\n 'definitely',\r\n 'existence',\r\n 'commentary',\r\n 'limousines',\r\n 'developments',\r\n 'immigration',\r\n 'destinations',\r\n 'necessarily',\r\n 'attribute',\r\n 'apparently',\r\n 'surrounding',\r\n 'mountains',\r\n 'popularity',\r\n 'postposted',\r\n 'coordinator',\r\n 'obviously',\r\n 'fundamental',\r\n 'substantial',\r\n 'progressive',\r\n 'championship',\r\n 'sacramento',\r\n 'impossible',\r\n 'depression',\r\n 'testimonials',\r\n 'memorabilia',\r\n 'cartridge',\r\n 'explanation',\r\n 'cincinnati',\r\n 'subsection',\r\n 'electricity',\r\n 'permitted',\r\n 'workplace',\r\n 'confirmed',\r\n 'wallpapers',\r\n 'infection',\r\n 'eligibility',\r\n 'involvement',\r\n 'placement',\r\n 'observations',\r\n 'vbulletin',\r\n 'subsequent',\r\n 'motorcycle',\r\n 'disclosure',\r\n 'establishment',\r\n 'presentations',\r\n 'undergraduate',\r\n 'occupation',\r\n 'donations',\r\n 'associations',\r\n 'citysearch',\r\n 'radiation',\r\n 'seriously',\r\n 'elsewhere',\r\n 'pollution',\r\n 'conservative',\r\n 'guestbook',\r\n 'effectiveness',\r\n 'demonstrate',\r\n 'atmosphere',\r\n 'experiment',\r\n 'purchases',\r\n 'federation',\r\n 'assignment',\r\n 'chemicals',\r\n 'everybody',\r\n 'nashville',\r\n 'counseling',\r\n 'acceptable',\r\n 'satisfied',\r\n 'measurements',\r\n 'milwaukee',\r\n 'medication',\r\n 'warehouse',\r\n 'shareware',\r\n 'violation',\r\n 'configure',\r\n 'stability',\r\n 'southwest',\r\n 'institutional',\r\n 'expectations',\r\n 'independence',\r\n 'metabolism',\r\n 'personally',\r\n 'excellence',\r\n 'somewhere',\r\n 'attributes',\r\n 'recognize',\r\n 'screening',\r\n 'thumbnail',\r\n 'forgotten',\r\n 'intelligent',\r\n 'edinburgh',\r\n 'obligation',\r\n 'regardless',\r\n 'restricted',\r\n 'republican',\r\n 'merchants',\r\n 'attendance',\r\n 'arguments',\r\n 'amsterdam',\r\n 'adventures',\r\n 'announcement',\r\n 'appreciate',\r\n 'regularly',\r\n 'mechanisms',\r\n 'customize',\r\n 'tradition',\r\n 'indicators',\r\n 'emissions',\r\n 'physicians',\r\n 'complaint',\r\n 'experiments',\r\n 'afghanistan',\r\n 'scholarship',\r\n 'governance',\r\n 'supplements',\r\n 'camcorder',\r\n 'implementing',\r\n 'ourselves',\r\n 'conversation',\r\n 'capability',\r\n 'producing',\r\n 'precision',\r\n 'contributed',\r\n 'reproduction',\r\n 'ingredients',\r\n 'franchise',\r\n 'complaints',\r\n 'promotions',\r\n 'rehabilitation',\r\n 'maintaining',\r\n 'environments',\r\n 'reception',\r\n 'correctly',\r\n 'consequences',\r\n 'geography',\r\n 'appearing',\r\n 'integrity',\r\n 'discrimination',\r\n 'processed',\r\n 'implications',\r\n 'functionality',\r\n 'intermediate',\r\n 'emotional',\r\n 'platforms',\r\n 'overnight',\r\n 'geographic',\r\n 'preliminary',\r\n 'districts',\r\n 'introduce',\r\n 'promotional',\r\n 'chevrolet',\r\n 'specialists',\r\n 'generator',\r\n 'suspension',\r\n 'correction',\r\n 'authentication',\r\n 'communicate',\r\n 'supplement',\r\n 'showtimes',\r\n 'promoting',\r\n 'machinery',\r\n 'bandwidth',\r\n 'probability',\r\n 'dimension',\r\n 'schedules',\r\n 'admissions',\r\n 'quarterly',\r\n 'illustrated',\r\n 'continental',\r\n 'alternate',\r\n 'achievement',\r\n 'limitations',\r\n 'automated',\r\n 'passenger',\r\n 'convenient',\r\n 'orientation',\r\n 'childhood',\r\n 'flexibility',\r\n 'jurisdiction',\r\n 'displaying',\r\n 'encouraged',\r\n 'cartridges',\r\n 'declaration',\r\n 'automation',\r\n 'advantages',\r\n 'preparing',\r\n 'recipient',\r\n 'extensions',\r\n 'athletics',\r\n 'southeast',\r\n 'alternatives',\r\n 'determining',\r\n 'personalized',\r\n 'conditioning',\r\n 'partnerships',\r\n 'destruction',\r\n 'increasingly',\r\n 'migration',\r\n 'basically',\r\n 'conventional',\r\n 'applicants',\r\n 'occupational',\r\n 'adjustment',\r\n 'treatments',\r\n 'camcorders',\r\n 'difficulty',\r\n 'collective',\r\n 'coalition',\r\n 'enrollment',\r\n 'producers',\r\n 'collector',\r\n 'interfaces',\r\n 'advertisers',\r\n 'representing',\r\n 'observation',\r\n 'restoration',\r\n 'convenience',\r\n 'returning',\r\n 'opposition',\r\n 'container',\r\n 'defendant',\r\n 'confirmation',\r\n 'supervisor',\r\n 'peripherals',\r\n 'bestsellers',\r\n 'departure',\r\n 'minneapolis',\r\n 'interactions',\r\n 'intervention',\r\n 'attraction',\r\n 'modification',\r\n 'customized',\r\n 'understood',\r\n 'assurance',\r\n 'happening',\r\n 'amendments',\r\n 'metropolitan',\r\n 'compilation',\r\n 'verification',\r\n 'attractive',\r\n 'recordings',\r\n 'jefferson',\r\n 'gardening',\r\n 'obligations',\r\n 'orchestra',\r\n 'polyphonic',\r\n 'outsourcing',\r\n 'adjustable',\r\n 'allocation',\r\n 'discipline',\r\n 'demonstrated',\r\n 'identifying',\r\n 'alphabetical',\r\n 'dispatched',\r\n 'installing',\r\n 'voluntary',\r\n 'photographer',\r\n 'messaging',\r\n 'constructed',\r\n 'additions',\r\n 'requiring',\r\n 'engagement',\r\n 'refinance',\r\n 'calendars',\r\n 'arrangement',\r\n 'conclusions',\r\n 'bibliography',\r\n 'compatibility',\r\n 'furthermore',\r\n 'cooperative',\r\n 'measuring',\r\n 'jacksonville',\r\n 'headquarters',\r\n 'transfers',\r\n 'transformation',\r\n 'attachments',\r\n 'administrators',\r\n 'personality',\r\n 'facilitate',\r\n 'subscriber',\r\n 'priorities',\r\n 'bookstore',\r\n 'parenting',\r\n 'incredible',\r\n 'commonwealth',\r\n 'pharmaceutical',\r\n 'manhattan',\r\n 'workforce',\r\n 'organizational',\r\n 'portuguese',\r\n 'everywhere',\r\n 'discharge',\r\n 'halloween',\r\n 'hazardous',\r\n 'methodology',\r\n 'housewares',\r\n 'reputation',\r\n 'resistant',\r\n 'democrats',\r\n 'recycling',\r\n 'qualifications',\r\n 'slideshow',\r\n 'variation',\r\n 'transferred',\r\n 'photograph',\r\n 'distributor',\r\n 'underlying',\r\n 'wrestling',\r\n 'photoshop',\r\n 'gathering',\r\n 'projection',\r\n 'mathematical',\r\n 'specialized',\r\n 'diagnostic',\r\n 'indianapolis',\r\n 'corporations',\r\n 'criticism',\r\n 'automobile',\r\n 'confidential',\r\n 'statutory',\r\n 'accommodations',\r\n 'northeast',\r\n 'downloaded',\r\n 'paintings',\r\n 'injection',\r\n 'yorkshire',\r\n 'populations',\r\n 'protective',\r\n 'initially',\r\n 'indicator',\r\n 'eliminate',\r\n 'sunglasses',\r\n 'preference',\r\n 'threshold',\r\n 'venezuela',\r\n 'exploration',\r\n 'sequences',\r\n 'astronomy',\r\n 'translate',\r\n 'announces',\r\n 'compression',\r\n 'establishing',\r\n 'constitutional',\r\n 'perfectly',\r\n 'instantly',\r\n 'litigation',\r\n 'submissions',\r\n 'broadcasting',\r\n 'horizontal',\r\n 'terrorist',\r\n 'informational',\r\n 'ecommerce',\r\n 'suffering',\r\n 'prospective',\r\n 'ultimately',\r\n 'artificial',\r\n 'spectacular',\r\n 'coordination',\r\n 'connector',\r\n 'affiliated',\r\n 'activation',\r\n 'naturally',\r\n 'subscribers',\r\n 'mitsubishi',\r\n 'underwear',\r\n 'potentially',\r\n 'constraints',\r\n 'inclusive',\r\n 'dimensional',\r\n 'considerable',\r\n 'selecting',\r\n 'processors',\r\n 'pantyhose',\r\n 'difficulties',\r\n 'complexity',\r\n 'constantly',\r\n 'barcelona',\r\n 'presidential',\r\n 'documentary',\r\n 'territories',\r\n 'palestinian',\r\n 'legislature',\r\n 'hospitality',\r\n 'procurement',\r\n 'theoretical',\r\n 'exercises',\r\n 'surveillance',\r\n 'protocols',\r\n 'highlight',\r\n 'substitute',\r\n 'inclusion',\r\n 'hopefully',\r\n 'brilliant',\r\n 'evaluated',\r\n 'assignments',\r\n 'termination',\r\n 'households',\r\n 'authentic',\r\n 'montgomery',\r\n 'architectural',\r\n 'louisville',\r\n 'macintosh',\r\n 'movements',\r\n 'amenities',\r\n 'virtually',\r\n 'authorization',\r\n 'projector',\r\n 'comparative',\r\n 'psychological',\r\n 'surprised',\r\n 'genealogy',\r\n 'expenditure',\r\n 'liverpool',\r\n 'connectivity',\r\n 'algorithms',\r\n 'similarly',\r\n 'collaborative',\r\n 'excluding',\r\n 'commander',\r\n 'suggestion',\r\n 'spotlight',\r\n 'investigate',\r\n 'connecting',\r\n 'logistics',\r\n 'proportion',\r\n 'significance',\r\n 'symposium',\r\n 'essentials',\r\n 'protecting',\r\n 'transmitted',\r\n 'screenshots',\r\n 'intensive',\r\n 'switching',\r\n 'correspondence',\r\n 'supervision',\r\n 'expenditures',\r\n 'separation',\r\n 'testimony',\r\n 'celebrities',\r\n 'mandatory',\r\n 'boundaries',\r\n 'syndication',\r\n 'celebration',\r\n 'filtering',\r\n 'luxembourg',\r\n 'offensive',\r\n 'deployment',\r\n 'colleagues',\r\n 'separated',\r\n 'directive',\r\n 'governing',\r\n 'retailers',\r\n 'occasionally',\r\n 'attending',\r\n 'recruiting',\r\n 'instructional',\r\n 'traveling',\r\n 'permissions',\r\n 'biotechnology',\r\n 'prescribed',\r\n 'catherine',\r\n 'reproduced',\r\n 'calculation',\r\n 'consolidated',\r\n 'occasions',\r\n 'equations',\r\n 'exceptional',\r\n 'respondents',\r\n 'considerations',\r\n 'queensland',\r\n 'musicians',\r\n 'composite',\r\n 'unavailable',\r\n 'essentially',\r\n 'designing',\r\n 'assessments',\r\n 'brunswick',\r\n 'sensitivity',\r\n 'preservation',\r\n 'streaming',\r\n 'intensity',\r\n 'technological',\r\n 'syndicate',\r\n 'antivirus',\r\n 'addressing',\r\n 'discounted',\r\n 'bangladesh',\r\n 'constitute',\r\n 'concluded',\r\n 'desperate',\r\n 'demonstration',\r\n 'governmental',\r\n 'manufactured',\r\n 'graduation',\r\n 'variations',\r\n 'addiction',\r\n 'springfield',\r\n 'synthesis',\r\n 'undefined',\r\n 'unemployment',\r\n 'enhancement',\r\n 'newcastle',\r\n 'performances',\r\n 'societies',\r\n 'brazilian',\r\n 'identical',\r\n 'petroleum',\r\n 'norwegian',\r\n 'retention',\r\n 'exchanges',\r\n 'soundtrack',\r\n 'wondering',\r\n 'profession',\r\n 'separately',\r\n 'physiology',\r\n 'collecting',\r\n 'participant',\r\n 'scholarships',\r\n 'recreational',\r\n 'dominican',\r\n 'friendship',\r\n 'expanding',\r\n 'provincial',\r\n 'investigations',\r\n 'medications',\r\n 'rochester',\r\n 'advertiser',\r\n 'encryption',\r\n 'downloadable',\r\n 'sophisticated',\r\n 'possession',\r\n 'laboratories',\r\n 'vegetables',\r\n 'thumbnails',\r\n 'stockings',\r\n 'respondent',\r\n 'destroyed',\r\n 'manufacture',\r\n 'wordpress',\r\n 'vulnerability',\r\n 'accountability',\r\n 'celebrate',\r\n 'accredited',\r\n 'appliance',\r\n 'compressed',\r\n 'scheduling',\r\n 'perspectives',\r\n 'mortality',\r\n 'christians',\r\n 'therapeutic',\r\n 'impressive',\r\n 'accordingly',\r\n 'architect',\r\n 'challenging',\r\n 'microwave',\r\n 'accidents',\r\n 'relocation',\r\n 'contributors',\r\n 'violations',\r\n 'temperatures',\r\n 'competitions',\r\n 'discretion',\r\n 'cosmetics',\r\n 'repository',\r\n 'concentrations',\r\n 'christianity',\r\n 'negotiations',\r\n 'realistic',\r\n 'generating',\r\n 'christina',\r\n 'congressional',\r\n 'photographic',\r\n 'modifications',\r\n 'millennium',\r\n 'achieving',\r\n 'fisheries',\r\n 'exceptions',\r\n 'reactions',\r\n 'macromedia',\r\n 'companion',\r\n 'divisions',\r\n 'additionally',\r\n 'fellowship',\r\n 'victorian',\r\n 'copyrights',\r\n 'lithuania',\r\n 'mastercard',\r\n 'chronicles',\r\n 'obtaining',\r\n 'distribute',\r\n 'decorative',\r\n 'enlargement',\r\n 'campaigns',\r\n 'conjunction',\r\n 'instances',\r\n 'indigenous',\r\n 'validation',\r\n 'corruption',\r\n 'incentives',\r\n 'cholesterol',\r\n 'differential',\r\n 'scientist',\r\n 'starsmerchant',\r\n 'arthritis',\r\n 'nevertheless',\r\n 'practitioners',\r\n 'transcript',\r\n 'inflation',\r\n 'compounds',\r\n 'contracting',\r\n 'structured',\r\n 'reasonably',\r\n 'graduates',\r\n 'recommends',\r\n 'controlling',\r\n 'distributors',\r\n 'arlington',\r\n 'particles',\r\n 'extraordinary',\r\n 'indicating',\r\n 'coordinate',\r\n 'exclusively',\r\n 'limitation',\r\n 'widescreen',\r\n 'illustration',\r\n 'construct',\r\n 'inquiries',\r\n 'inspiration',\r\n 'affecting',\r\n 'downloading',\r\n 'aggregate',\r\n 'forecasts',\r\n 'complicated',\r\n 'shopzilla',\r\n 'decorating',\r\n 'expressions',\r\n 'shakespeare',\r\n 'connectors',\r\n 'conflicts',\r\n 'travelers',\r\n 'offerings',\r\n 'incorrect',\r\n 'furnishings',\r\n 'guatemala',\r\n 'perception',\r\n 'renaissance',\r\n 'pathology',\r\n 'ordinance',\r\n 'photographers',\r\n 'infections',\r\n 'configured',\r\n 'festivals',\r\n 'possibilities',\r\n 'contributing',\r\n 'analytical',\r\n 'circulation',\r\n 'assumption',\r\n 'jerusalem',\r\n 'transexuales',\r\n 'invention',\r\n 'technician',\r\n 'executives',\r\n 'enquiries',\r\n 'cognitive',\r\n 'exploring',\r\n 'registrar',\r\n 'supporters',\r\n 'withdrawal',\r\n 'predicted',\r\n 'saskatchewan',\r\n 'cancellation',\r\n 'ministers',\r\n 'veterinary',\r\n 'prostores',\r\n 'relevance',\r\n 'incentive',\r\n 'butterfly',\r\n 'mechanics',\r\n 'numerical',\r\n 'reflection',\r\n 'accompanied',\r\n 'invitation',\r\n 'princeton',\r\n 'spirituality',\r\n 'meanwhile',\r\n 'proprietary',\r\n 'childrens',\r\n 'thumbzilla',\r\n 'porcelain',\r\n 'pichunter',\r\n 'translated',\r\n 'columnists',\r\n 'consensus',\r\n 'delivering',\r\n 'journalism',\r\n 'intention',\r\n 'undertaken',\r\n 'statewide',\r\n 'semiconductor',\r\n 'illustrations',\r\n 'happiness',\r\n 'substantially',\r\n 'identifier',\r\n 'calculations',\r\n 'conducting',\r\n 'accomplished',\r\n 'calculators',\r\n 'impression',\r\n 'correlation',\r\n 'fragrance',\r\n 'neighbors',\r\n 'transparent',\r\n 'charleston',\r\n 'champions',\r\n 'selections',\r\n 'projectors',\r\n 'inappropriate',\r\n 'comparing',\r\n 'vocational',\r\n 'pharmacies',\r\n 'introducing',\r\n 'appreciated',\r\n 'albuquerque',\r\n 'distinguished',\r\n 'projected',\r\n 'assumptions',\r\n 'shareholders',\r\n 'developmental',\r\n 'regulated',\r\n 'anticipated',\r\n 'completing',\r\n 'comparable',\r\n 'confusion',\r\n 'copyrighted',\r\n 'warranties',\r\n 'documented',\r\n 'paperbacks',\r\n 'keyboards',\r\n 'vulnerable',\r\n 'reflected',\r\n 'respiratory',\r\n 'notifications',\r\n 'transexual',\r\n 'mainstream',\r\n 'evaluating',\r\n 'subcommittee',\r\n 'maternity',\r\n 'journalists',\r\n 'foundations',\r\n 'volleyball',\r\n 'liabilities',\r\n 'decreased',\r\n 'tolerance',\r\n 'creativity',\r\n 'describing',\r\n 'lightning',\r\n 'quotations',\r\n 'inspector',\r\n 'bookmarks',\r\n 'behavioral',\r\n 'riverside',\r\n 'bathrooms',\r\n 'abilities',\r\n 'initiated',\r\n 'nonprofit',\r\n 'lancaster',\r\n 'suspended',\r\n 'containers',\r\n 'attitudes',\r\n 'simultaneously',\r\n 'integrate',\r\n 'sociology',\r\n 'screenshot',\r\n 'exhibitions',\r\n 'confident',\r\n 'retrieved',\r\n 'officially',\r\n 'consortium',\r\n 'recipients',\r\n 'delicious',\r\n 'traditions',\r\n 'periodically',\r\n 'hungarian',\r\n 'referring',\r\n 'transform',\r\n 'educators',\r\n 'vegetable',\r\n 'humanities',\r\n 'independently',\r\n 'alignment',\r\n 'henderson',\r\n 'britannica',\r\n 'competitors',\r\n 'visibility',\r\n 'consciousness',\r\n 'encounter',\r\n 'resolutions',\r\n 'accessing',\r\n 'attempted',\r\n 'witnesses',\r\n 'administered',\r\n 'strengthen',\r\n 'frederick',\r\n 'aggressive',\r\n 'advertisements',\r\n 'sublimedirectory',\r\n 'disturbed',\r\n 'determines',\r\n 'sculpture',\r\n 'motivation',\r\n 'pharmacology',\r\n 'passengers',\r\n 'quantities',\r\n 'petersburg',\r\n 'consistently',\r\n 'powerpoint',\r\n 'obituaries',\r\n 'punishment',\r\n 'appreciation',\r\n 'subsequently',\r\n 'providence',\r\n 'restriction',\r\n 'incorporate',\r\n 'backgrounds',\r\n 'treasurer',\r\n 'lightweight',\r\n 'transcription',\r\n 'complications',\r\n 'scripting',\r\n 'remembered',\r\n 'synthetic',\r\n 'testament',\r\n 'specifics',\r\n 'partially',\r\n 'wilderness',\r\n 'generations',\r\n 'tournaments',\r\n 'sponsorship',\r\n 'headphones',\r\n 'proceeding',\r\n 'volkswagen',\r\n 'uncertainty',\r\n 'breakdown',\r\n 'reconstruction',\r\n 'subsidiary',\r\n 'strengths',\r\n 'encouraging',\r\n 'furnished',\r\n 'terrorists',\r\n 'comparisons',\r\n 'beneficial',\r\n 'distributions',\r\n 'viewpicture',\r\n 'threatened',\r\n 'republicans',\r\n 'discusses',\r\n 'responded',\r\n 'abstracts',\r\n 'prediction',\r\n 'pharmaceuticals',\r\n 'thesaurus',\r\n 'individually',\r\n 'battlefield',\r\n 'literally',\r\n 'ecological',\r\n 'appraisal',\r\n 'consisting',\r\n 'submitting',\r\n 'citations',\r\n 'geographical',\r\n 'mozambique',\r\n 'disclaimers',\r\n 'championships',\r\n 'sheffield',\r\n 'finishing',\r\n 'wellington',\r\n 'prospects',\r\n 'bulgarian',\r\n 'aboriginal',\r\n 'remarkable',\r\n 'preventing',\r\n 'productive',\r\n 'boulevard',\r\n 'compliant',\r\n 'penalties',\r\n 'imagination',\r\n 'refurbished',\r\n 'activated',\r\n 'conferencing',\r\n 'armstrong',\r\n 'politicians',\r\n 'trackbacks',\r\n 'accommodate',\r\n 'christine',\r\n 'accepting',\r\n 'precipitation',\r\n 'isolation',\r\n 'sustained',\r\n 'approximate',\r\n 'programmer',\r\n 'greetings',\r\n 'inherited',\r\n 'incomplete',\r\n 'chronicle',\r\n 'legitimate',\r\n 'biographies',\r\n 'investigator',\r\n 'plaintiff',\r\n 'prisoners',\r\n 'mediterranean',\r\n 'nightlife',\r\n 'architects',\r\n 'entrepreneur',\r\n 'freelance',\r\n 'excessive',\r\n 'screensaver',\r\n 'valuation',\r\n 'unexpected',\r\n 'cigarette',\r\n 'characteristic',\r\n 'metallica',\r\n 'consequently',\r\n 'appointments',\r\n 'narrative',\r\n 'academics',\r\n 'quantitative',\r\n 'screensavers',\r\n 'subdivision',\r\n 'distinction',\r\n 'livestock',\r\n 'exemption',\r\n 'sustainability',\r\n 'formatting',\r\n 'nutritional',\r\n 'nicaragua',\r\n 'affiliation',\r\n 'relatives',\r\n 'satisfactory',\r\n 'revolutionary',\r\n 'bracelets',\r\n 'telephony',\r\n 'breathing',\r\n 'thickness',\r\n 'adjustments',\r\n 'graphical',\r\n 'discussing',\r\n 'aerospace',\r\n 'meaningful',\r\n 'maintains',\r\n 'shortcuts',\r\n 'voyeurweb',\r\n 'extending',\r\n 'specifies',\r\n 'accreditation',\r\n 'blackberry',\r\n 'meditation',\r\n 'microphone',\r\n 'macedonia',\r\n 'combining',\r\n 'instrumental',\r\n 'organizing',\r\n 'moderators',\r\n 'kazakhstan',\r\n 'standings',\r\n 'partition',\r\n 'invisible',\r\n 'translations',\r\n 'commodity',\r\n 'kilometers',\r\n 'thanksgiving',\r\n 'guarantees',\r\n 'indication',\r\n 'congratulations',\r\n 'cigarettes',\r\n 'controllers',\r\n 'consultancy',\r\n 'conventions',\r\n 'coordinates',\r\n 'responding',\r\n 'physically',\r\n 'stakeholders',\r\n 'hydrocodone',\r\n 'consecutive',\r\n 'attempting',\r\n 'representations',\r\n 'competing',\r\n 'peninsula',\r\n 'accurately',\r\n 'considers',\r\n 'ministries',\r\n 'vacancies',\r\n 'parliamentary',\r\n 'acknowledge',\r\n 'thoroughly',\r\n 'nottingham',\r\n 'identifies',\r\n 'questionnaire',\r\n 'qualification',\r\n 'modelling',\r\n 'miniature',\r\n 'interstate',\r\n 'consequence',\r\n 'systematic',\r\n 'perceived',\r\n 'madagascar',\r\n 'presenting',\r\n 'troubleshooting',\r\n 'uzbekistan',\r\n 'centuries',\r\n 'magnitude',\r\n 'richardson',\r\n 'fragrances',\r\n 'vocabulary',\r\n 'earthquake',\r\n 'fundraising',\r\n 'geological',\r\n 'assessing',\r\n 'introduces',\r\n 'webmasters',\r\n 'computational',\r\n 'acdbentity',\r\n 'participated',\r\n 'handhelds',\r\n 'answering',\r\n 'impressed',\r\n 'conspiracy',\r\n 'organizer',\r\n 'combinations',\r\n 'preceding',\r\n 'cumulative',\r\n 'amplifier',\r\n 'arbitrary',\r\n 'prominent',\r\n 'lexington',\r\n 'contacted',\r\n 'recorders',\r\n 'occasional',\r\n 'innovations',\r\n 'postcards',\r\n 'reviewing',\r\n 'explicitly',\r\n 'transsexual',\r\n 'citizenship',\r\n 'informative',\r\n 'girlfriend',\r\n 'bloomberg',\r\n 'hierarchy',\r\n 'influenced',\r\n 'abandoned',\r\n 'complement',\r\n 'mauritius',\r\n 'checklist',\r\n 'requesting',\r\n 'lauderdale',\r\n 'scenarios',\r\n 'extraction',\r\n 'elevation',\r\n 'utilization',\r\n 'beverages',\r\n 'calibration',\r\n 'efficiently',\r\n 'entertaining',\r\n 'prerequisite',\r\n 'hypothesis',\r\n 'medicines',\r\n 'regression',\r\n 'enhancements',\r\n 'renewable',\r\n 'intersection',\r\n 'passwords',\r\n 'consistency',\r\n 'collectors',\r\n 'azerbaijan',\r\n 'astrology',\r\n 'occurring',\r\n 'supplemental',\r\n 'travelling',\r\n 'induction',\r\n 'precisely',\r\n 'spreading',\r\n 'provinces',\r\n 'widespread',\r\n 'incidence',\r\n 'incidents',\r\n 'enhancing',\r\n 'interference',\r\n 'palestine',\r\n 'listprice',\r\n 'atmospheric',\r\n 'knowledgestorm',\r\n 'referenced',\r\n 'publicity',\r\n 'proposition',\r\n 'allowance',\r\n 'designation',\r\n 'duplicate',\r\n 'criterion',\r\n 'civilization',\r\n 'vietnamese',\r\n 'tremendous',\r\n 'corrected',\r\n 'encountered',\r\n 'internationally',\r\n 'surrounded',\r\n 'creatures',\r\n 'commented',\r\n 'accomplish',\r\n 'vegetarian',\r\n 'newfoundland',\r\n 'investigated',\r\n 'ambassador',\r\n 'stephanie',\r\n 'contacting',\r\n 'vegetation',\r\n 'findarticles',\r\n 'specially',\r\n 'infectious',\r\n 'continuity',\r\n 'phenomenon',\r\n 'conscious',\r\n 'referrals',\r\n 'differently',\r\n 'integrating',\r\n 'revisions',\r\n 'reasoning',\r\n 'charitable',\r\n 'annotated',\r\n 'convinced',\r\n 'burlington',\r\n 'replacing',\r\n 'researcher',\r\n 'watershed',\r\n 'occupations',\r\n 'acknowledged',\r\n 'equilibrium',\r\n 'characterized',\r\n 'privilege',\r\n 'qualifying',\r\n 'estimation',\r\n 'pediatric',\r\n 'techrepublic',\r\n 'institutes',\r\n 'brochures',\r\n 'traveller',\r\n 'appropriations',\r\n 'suspected',\r\n 'benchmark',\r\n 'beginners',\r\n 'instructors',\r\n 'highlighted',\r\n 'stationery',\r\n 'unauthorized',\r\n 'competent',\r\n 'contributor',\r\n 'demonstrates',\r\n 'gradually',\r\n 'desirable',\r\n 'journalist',\r\n 'afterwards',\r\n 'religions',\r\n 'explosion',\r\n 'signatures',\r\n 'disciplines',\r\n 'daughters',\r\n 'conversations',\r\n 'simplified',\r\n 'motherboard',\r\n 'bibliographic',\r\n 'champagne',\r\n 'deviation',\r\n 'superintendent',\r\n 'housewives',\r\n 'influences',\r\n 'inspections',\r\n 'irrigation',\r\n 'hydraulic',\r\n 'robertson',\r\n 'penetration',\r\n 'conviction',\r\n 'omissions',\r\n 'retrieval',\r\n 'qualities',\r\n 'prototype',\r\n 'importantly',\r\n 'apparatus',\r\n 'explaining',\r\n 'nomination',\r\n 'empirical',\r\n 'dependence',\r\n 'sexuality',\r\n 'polyester',\r\n 'commitments',\r\n 'suggesting',\r\n 'remainder',\r\n 'privileges',\r\n 'televisions',\r\n 'specializing',\r\n 'commodities',\r\n 'motorcycles',\r\n 'concentrate',\r\n 'reproductive',\r\n 'molecules',\r\n 'refrigerator',\r\n 'intervals',\r\n 'sentences',\r\n 'exclusion',\r\n 'workstation',\r\n 'holocaust',\r\n 'receivers',\r\n 'disposition',\r\n 'navigator',\r\n 'investigators',\r\n 'marijuana',\r\n 'cathedral',\r\n 'fairfield',\r\n 'fascinating',\r\n 'landscapes',\r\n 'lafayette',\r\n 'computation',\r\n 'cardiovascular',\r\n 'salvation',\r\n 'predictions',\r\n 'accompanying',\r\n 'selective',\r\n 'arbitration',\r\n 'configuring',\r\n 'editorials',\r\n 'sacrifice',\r\n 'removable',\r\n 'convergence',\r\n 'gibraltar',\r\n 'anthropology',\r\n 'malpractice',\r\n 'reporters',\r\n 'necessity',\r\n 'rendering',\r\n 'hepatitis',\r\n 'nationally',\r\n 'waterproof',\r\n 'specialties',\r\n 'humanitarian',\r\n 'invitations',\r\n 'functioning',\r\n 'economies',\r\n 'alexandria',\r\n 'bacterial',\r\n 'undertake',\r\n 'continuously',\r\n 'achievements',\r\n 'convertible',\r\n 'secretariat',\r\n 'paragraphs',\r\n 'adolescent',\r\n 'nominations',\r\n 'cancelled',\r\n 'introductory',\r\n 'reservoir',\r\n 'occurrence',\r\n 'worcester',\r\n 'demographic',\r\n 'disciplinary',\r\n 'respected',\r\n 'portraits',\r\n 'interpreted',\r\n 'evaluations',\r\n 'elimination',\r\n 'hypothetical',\r\n 'immigrants',\r\n 'complimentary',\r\n 'helicopter',\r\n 'performer',\r\n 'commissions',\r\n 'powerseller',\r\n 'graduated',\r\n 'surprising',\r\n 'unnecessary',\r\n 'dramatically',\r\n 'yugoslavia',\r\n 'characterization',\r\n 'likelihood',\r\n 'fundamentals',\r\n 'contamination',\r\n 'endangered',\r\n 'compromise',\r\n 'expiration',\r\n 'namespace',\r\n 'peripheral',\r\n 'negotiation',\r\n 'opponents',\r\n 'nominated',\r\n 'confidentiality',\r\n 'electoral',\r\n 'changelog',\r\n 'alternatively',\r\n 'greensboro',\r\n 'controversial',\r\n 'recovered',\r\n 'upgrading',\r\n 'frontpage',\r\n 'demanding',\r\n 'defensive',\r\n 'forbidden',\r\n 'programmers',\r\n 'monitored',\r\n 'installations',\r\n 'deutschland',\r\n 'practitioner',\r\n 'motivated',\r\n 'smithsonian',\r\n 'examining',\r\n 'revelation',\r\n 'delegation',\r\n 'dictionaries',\r\n 'greenhouse',\r\n 'transparency',\r\n 'currencies',\r\n 'survivors',\r\n 'positioning',\r\n 'descending',\r\n 'temporarily',\r\n 'frequencies',\r\n 'reflections',\r\n 'municipality',\r\n 'detective',\r\n 'experiencing',\r\n 'fireplace',\r\n 'endorsement',\r\n 'psychiatry',\r\n 'persistent',\r\n 'summaries',\r\n 'looksmart',\r\n 'magnificent',\r\n 'colleague',\r\n 'adaptation',\r\n 'paintball',\r\n 'enclosure',\r\n 'supervisors',\r\n 'westminster',\r\n 'distances',\r\n 'absorption',\r\n 'treasures',\r\n 'transcripts',\r\n 'disappointed',\r\n 'continually',\r\n 'communist',\r\n 'collectible',\r\n 'entrepreneurs',\r\n 'creations',\r\n 'acquisitions',\r\n 'biodiversity',\r\n 'excitement',\r\n 'presently',\r\n 'mysterious',\r\n 'librarian',\r\n 'subsidiaries',\r\n 'stockholm',\r\n 'indonesian',\r\n 'therapist',\r\n 'promising',\r\n 'relaxation',\r\n 'thereafter',\r\n 'commissioners',\r\n 'forwarding',\r\n 'nightmare',\r\n 'reductions',\r\n 'southampton',\r\n 'organisms',\r\n 'telescope',\r\n 'portsmouth',\r\n 'advancement',\r\n 'harassment',\r\n 'generators',\r\n 'generates',\r\n 'replication',\r\n 'inexpensive',\r\n 'receptors',\r\n 'interventions',\r\n 'huntington',\r\n 'internship',\r\n 'aluminium',\r\n 'snowboard',\r\n 'beastality',\r\n 'evanescence',\r\n 'coordinated',\r\n 'shipments',\r\n 'antarctica',\r\n 'chancellor',\r\n 'controversy',\r\n 'legendary',\r\n 'beautifully',\r\n 'antibodies',\r\n 'examinations',\r\n 'immunology',\r\n 'departmental',\r\n 'terminology',\r\n 'gentleman',\r\n 'reproduce',\r\n 'convicted',\r\n 'roommates',\r\n 'threatening',\r\n 'spokesman',\r\n 'activists',\r\n 'frankfurt',\r\n 'encourages',\r\n 'assembled',\r\n 'restructuring',\r\n 'terminals',\r\n 'simulations',\r\n 'sufficiently',\r\n 'conditional',\r\n 'crossword',\r\n 'conceptual',\r\n 'liechtenstein',\r\n 'translator',\r\n 'automobiles',\r\n 'continent',\r\n 'longitude',\r\n 'challenged',\r\n 'telecharger',\r\n 'insertion',\r\n 'instrumentation',\r\n 'constraint',\r\n 'groundwater',\r\n 'strengthening',\r\n 'insulation',\r\n 'infringement',\r\n 'subjective',\r\n 'swaziland',\r\n 'varieties',\r\n 'mediawiki',\r\n 'configurations',\r\n];\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {ElementFormatType} from 'lexical';\r\nimport React, {\r\n createContext,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nexport const MIN_ALLOWED_FONT_SIZE = 8;\r\nexport const MAX_ALLOWED_FONT_SIZE = 72;\r\nexport const DEFAULT_FONT_SIZE = 15;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst rootTypeToRootName = {\r\n root: 'Root',\r\n table: 'Table',\r\n};\r\n\r\nexport const blockTypeToBlockName = {\r\n bullet: 'Bulleted List',\r\n check: 'Check List',\r\n code: 'Code Block',\r\n h1: 'Heading 1',\r\n h2: 'Heading 2',\r\n h3: 'Heading 3',\r\n h4: 'Heading 4',\r\n h5: 'Heading 5',\r\n h6: 'Heading 6',\r\n number: 'Numbered List',\r\n paragraph: 'Normal',\r\n quote: 'Quote',\r\n};\r\n\r\n//disable eslint sorting rule for quick reference to toolbar state\r\n/* eslint-disable */\r\nconst INITIAL_TOOLBAR_STATE = {\r\n bgColor: '#fff',\r\n blockType: 'paragraph' as keyof typeof blockTypeToBlockName,\r\n canRedo: false,\r\n canUndo: false,\r\n codeLanguage: '',\r\n codeTheme: '',\r\n elementFormat: 'left' as ElementFormatType,\r\n fontColor: '#000',\r\n fontFamily: 'Arial',\r\n // Current font size in px\r\n fontSize: `${DEFAULT_FONT_SIZE}px`,\r\n // Font size input value - for controlled input\r\n fontSizeInputValue: `${DEFAULT_FONT_SIZE}`,\r\n isBold: false,\r\n isCode: false,\r\n isHighlight: false,\r\n isImageCaption: false,\r\n isItalic: false,\r\n isLink: false,\r\n isRTL: false,\r\n isStrikethrough: false,\r\n isSubscript: false,\r\n isSuperscript: false,\r\n isUnderline: false,\r\n isLowercase: false,\r\n isUppercase: false,\r\n isCapitalize: false,\r\n rootType: 'root' as keyof typeof rootTypeToRootName,\r\n listStartNumber: null as number | null,\r\n};\r\n\r\ntype ToolbarState = typeof INITIAL_TOOLBAR_STATE;\r\n\r\n// Utility type to get keys and infer value types\r\ntype ToolbarStateKey = keyof ToolbarState;\r\ntype ToolbarStateValue<Key extends ToolbarStateKey> = ToolbarState[Key];\r\n\r\ntype ContextShape = {\r\n toolbarState: ToolbarState;\r\n updateToolbarState<Key extends ToolbarStateKey>(\r\n key: Key,\r\n value: ToolbarStateValue<Key>,\r\n ): void;\r\n};\r\n\r\nconst Context = createContext<ContextShape | undefined>(undefined);\r\n\r\nexport const ToolbarContext = ({\r\n children,\r\n}: {\r\n children: ReactNode;\r\n}): JSX.Element => {\r\n const [toolbarState, setToolbarState] = useState(INITIAL_TOOLBAR_STATE);\r\n const selectionFontSize = toolbarState.fontSize;\r\n\r\n const updateToolbarState = useCallback(\r\n <Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>) => {\r\n setToolbarState((prev) => ({\r\n ...prev,\r\n [key]: value,\r\n }));\r\n },\r\n [],\r\n );\r\n\r\n useEffect(() => {\r\n updateToolbarState('fontSizeInputValue', selectionFontSize.slice(0, -2));\r\n }, [selectionFontSize, updateToolbarState]);\r\n\r\n const contextValue = useMemo(() => {\r\n return {\r\n toolbarState,\r\n updateToolbarState,\r\n };\r\n }, [toolbarState, updateToolbarState]);\r\n\r\n return <Context.Provider value={contextValue}>{children}</Context.Provider>;\r\n};\r\n\r\nexport const useToolbarState = () => {\r\n const context = useContext(Context);\r\n\r\n if (context === undefined) {\r\n throw new Error('useToolbarState must be used within a ToolbarProvider');\r\n }\r\n\r\n return context;\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {TextNode} from 'lexical';\r\n\r\nimport {uuid as UUID} from '../plugins/AutocompletePlugin';\r\n\r\nexport type SerializedAutocompleteNode = Spread<\r\n {\r\n uuid: string;\r\n },\r\n SerializedTextNode\r\n>;\r\n\r\nexport class AutocompleteNode extends TextNode {\r\n /**\r\n * A unique uuid is generated for each session and assigned to the instance.\r\n * This helps to:\r\n * - Ensures max one Autocomplete node per session.\r\n * - Ensure that when collaboration is enabled, this node is not shown in\r\n * other sessions.\r\n * See https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/AutocompletePlugin/index.tsx\r\n */\r\n __uuid: string;\r\n\r\n static clone(node: AutocompleteNode): AutocompleteNode {\r\n return new AutocompleteNode(node.__text, node.__uuid, node.__key);\r\n }\r\n\r\n static getType(): 'autocomplete' {\r\n return 'autocomplete';\r\n }\r\n\r\n static importDOM() {\r\n // Never import from DOM\r\n return null;\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedAutocompleteNode,\r\n ): AutocompleteNode {\r\n return $createAutocompleteNode(\r\n serializedNode.text,\r\n serializedNode.uuid,\r\n ).updateFromJSON(serializedNode);\r\n }\r\n\r\n exportJSON(): SerializedAutocompleteNode {\r\n return {\r\n ...super.exportJSON(),\r\n uuid: this.__uuid,\r\n };\r\n }\r\n\r\n constructor(text: string, uuid: string, key?: NodeKey) {\r\n super(text, key);\r\n this.__uuid = uuid;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n return false;\r\n }\r\n\r\n exportDOM(_: LexicalEditor): DOMExportOutput {\r\n return {element: null};\r\n }\r\n\r\n excludeFromCopy() {\r\n return true;\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config);\r\n dom.classList.add(config.theme.autocomplete);\r\n if (this.__uuid !== UUID) {\r\n dom.style.display = 'none';\r\n }\r\n return dom;\r\n }\r\n}\r\n\r\nexport function $createAutocompleteNode(\r\n text: string,\r\n uuid: string,\r\n): AutocompleteNode {\r\n return new AutocompleteNode(text, uuid).setMode('token');\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\ntype Force = [number, number];\r\ntype Listener = (force: Force, e: TouchEvent) => void;\r\ntype ElementValues = {\r\n start: null | Force;\r\n listeners: Set<Listener>;\r\n handleTouchstart: (e: TouchEvent) => void;\r\n handleTouchend: (e: TouchEvent) => void;\r\n};\r\n\r\nconst elements = new WeakMap<HTMLElement, ElementValues>();\r\n\r\nfunction readTouch(e: TouchEvent): [number, number] | null {\r\n const touch = e.changedTouches[0];\r\n if (touch === undefined) {\r\n return null;\r\n }\r\n return [touch.clientX, touch.clientY];\r\n}\r\n\r\nfunction addListener(element: HTMLElement, cb: Listener): () => void {\r\n let elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n const listeners = new Set<Listener>();\r\n const handleTouchstart = (e: TouchEvent) => {\r\n if (elementValues !== undefined) {\r\n elementValues.start = readTouch(e);\r\n }\r\n };\r\n const handleTouchend = (e: TouchEvent) => {\r\n if (elementValues === undefined) {\r\n return;\r\n }\r\n const start = elementValues.start;\r\n if (start === null) {\r\n return;\r\n }\r\n const end = readTouch(e);\r\n for (const listener of listeners) {\r\n if (end !== null) {\r\n listener([end[0] - start[0], end[1] - start[1]], e);\r\n }\r\n }\r\n };\r\n element.addEventListener('touchstart', handleTouchstart);\r\n element.addEventListener('touchend', handleTouchend);\r\n\r\n elementValues = {\r\n handleTouchend,\r\n handleTouchstart,\r\n listeners,\r\n start: null,\r\n };\r\n elements.set(element, elementValues);\r\n }\r\n elementValues.listeners.add(cb);\r\n return () => deleteListener(element, cb);\r\n}\r\n\r\nfunction deleteListener(element: HTMLElement, cb: Listener): void {\r\n const elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n return;\r\n }\r\n const listeners = elementValues.listeners;\r\n listeners.delete(cb);\r\n if (listeners.size === 0) {\r\n elements.delete(element);\r\n element.removeEventListener('touchstart', elementValues.handleTouchstart);\r\n element.removeEventListener('touchend', elementValues.handleTouchend);\r\n }\r\n}\r\n\r\nexport function addSwipeLeftListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (x < 0 && -x > Math.abs(y)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeRightListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (x > 0 && x > Math.abs(y)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeUpListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (y < 0 && -y > Math.abs(x)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeDownListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (y > 0 && y > Math.abs(x)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {\r\n AutoEmbedOption,\r\n EmbedConfig,\r\n EmbedMatchResult,\r\n LexicalAutoEmbedPlugin,\r\n URL_MATCHER,\r\n} from '@lexical/react/LexicalAutoEmbedPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useMemo, useState} from 'react';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions} from '../../ui/Dialog';\r\nimport {INSERT_FIGMA_COMMAND} from '../FigmaPlugin';\r\nimport {INSERT_TWEET_COMMAND} from '../TwitterPlugin';\r\nimport {INSERT_YOUTUBE_COMMAND} from '../YouTubePlugin';\r\n\r\ninterface PlaygroundEmbedConfig extends EmbedConfig {\r\n // Human readable name of the embedded content e.g. Tweet or Google Map.\r\n contentName: string;\r\n\r\n // Icon for display.\r\n icon?: JSX.Element;\r\n\r\n // An example of a matching url https://twitter.com/jack/status/20\r\n exampleUrl: string;\r\n\r\n // For extra searching.\r\n keywords: Array<string>;\r\n\r\n // Embed a Figma Project.\r\n description?: string;\r\n}\r\n\r\nexport const YoutubeEmbedConfig: PlaygroundEmbedConfig = {\r\n contentName: 'Youtube Video',\r\n\r\n exampleUrl: 'https://www.youtube.com/watch?v=jNQXAC9IVRw',\r\n\r\n // Icon for display.\r\n icon: <i className=\"icon youtube\" />,\r\n\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_YOUTUBE_COMMAND, result.id);\r\n },\r\n\r\n keywords: ['youtube', 'video'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: async (url: string) => {\r\n const match =\r\n /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/.exec(url);\r\n\r\n const id = match ? (match?.[2].length === 11 ? match[2] : null) : null;\r\n\r\n if (id != null) {\r\n return {\r\n id,\r\n url,\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'youtube-video',\r\n};\r\n\r\nexport const TwitterEmbedConfig: PlaygroundEmbedConfig = {\r\n // e.g. Tweet or Google Map.\r\n contentName: 'X(Tweet)',\r\n\r\n exampleUrl: 'https://x.com/jack/status/20',\r\n\r\n // Icon for display.\r\n icon: <i className=\"icon x\" />,\r\n\r\n // Create the Lexical embed node from the url data.\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_TWEET_COMMAND, result.id);\r\n },\r\n\r\n // For extra searching.\r\n keywords: ['tweet', 'twitter', 'x'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: (text: string) => {\r\n const match =\r\n /^https:\\/\\/(twitter|x)\\.com\\/(#!\\/)?(\\w+)\\/status(es)*\\/(\\d+)/.exec(\r\n text,\r\n );\r\n\r\n if (match != null) {\r\n return {\r\n id: match[5],\r\n url: match[1],\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'tweet',\r\n};\r\n\r\nexport const FigmaEmbedConfig: PlaygroundEmbedConfig = {\r\n contentName: 'Figma Document',\r\n\r\n exampleUrl: 'https://www.figma.com/file/LKQ4FJ4bTnCSjedbRpk931/Sample-File',\r\n\r\n icon: <i className=\"icon figma\" />,\r\n\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_FIGMA_COMMAND, result.id);\r\n },\r\n\r\n keywords: ['figma', 'figma.com', 'mock-up'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: (text: string) => {\r\n const match =\r\n /https:\\/\\/([\\w.-]+\\.)?figma.com\\/(file|proto)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?$/.exec(\r\n text,\r\n );\r\n\r\n if (match != null) {\r\n return {\r\n id: match[3],\r\n url: match[0],\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'figma',\r\n};\r\n\r\nexport const EmbedConfigs = [\r\n TwitterEmbedConfig,\r\n YoutubeEmbedConfig,\r\n FigmaEmbedConfig,\r\n];\r\n\r\nfunction AutoEmbedMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: AutoEmbedOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n <span className=\"text\">{option.title}</span>\r\n </li>\r\n );\r\n}\r\n\r\nfunction AutoEmbedMenu({\r\n options,\r\n selectedItemIndex,\r\n onOptionClick,\r\n onOptionMouseEnter,\r\n}: {\r\n selectedItemIndex: number | null;\r\n onOptionClick: (option: AutoEmbedOption, index: number) => void;\r\n onOptionMouseEnter: (index: number) => void;\r\n options: Array<AutoEmbedOption>;\r\n}) {\r\n return (\r\n <div className=\"typeahead-popover\">\r\n <ul>\r\n {options.map((option: AutoEmbedOption, i: number) => (\r\n <AutoEmbedMenuItem\r\n index={i}\r\n isSelected={selectedItemIndex === i}\r\n onClick={() => onOptionClick(option, i)}\r\n onMouseEnter={() => onOptionMouseEnter(i)}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\nconst debounce = (callback: (text: string) => void, delay: number) => {\r\n let timeoutId: number;\r\n return (text: string) => {\r\n window.clearTimeout(timeoutId);\r\n timeoutId = window.setTimeout(() => {\r\n callback(text);\r\n }, delay);\r\n };\r\n};\r\n\r\nexport function AutoEmbedDialog({\r\n embedConfig,\r\n onClose,\r\n}: {\r\n embedConfig: PlaygroundEmbedConfig;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [text, setText] = useState('');\r\n const [editor] = useLexicalComposerContext();\r\n const [embedResult, setEmbedResult] = useState<EmbedMatchResult | null>(null);\r\n\r\n const validateText = useMemo(\r\n () =>\r\n debounce((inputText: string) => {\r\n const urlMatch = URL_MATCHER.exec(inputText);\r\n if (embedConfig != null && inputText != null && urlMatch != null) {\r\n Promise.resolve(embedConfig.parseUrl(inputText)).then(\r\n (parseResult) => {\r\n setEmbedResult(parseResult);\r\n },\r\n );\r\n } else if (embedResult != null) {\r\n setEmbedResult(null);\r\n }\r\n }, 200),\r\n [embedConfig, embedResult],\r\n );\r\n\r\n const onClick = () => {\r\n if (embedResult != null) {\r\n embedConfig.insertNode(editor, embedResult);\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <div style={{width: '600px'}}>\r\n <div className=\"Input__wrapper\">\r\n <input\r\n type=\"text\"\r\n className=\"Input__input\"\r\n placeholder={embedConfig.exampleUrl}\r\n value={text}\r\n data-test-id={`${embedConfig.type}-embed-modal-url`}\r\n onChange={(e) => {\r\n const {value} = e.target;\r\n setText(value);\r\n validateText(value);\r\n }}\r\n />\r\n </div>\r\n <DialogActions>\r\n <Button\r\n disabled={!embedResult}\r\n onClick={onClick}\r\n data-test-id={`${embedConfig.type}-embed-modal-submit-btn`}>\r\n Embed\r\n </Button>\r\n </DialogActions>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function AutoEmbedPlugin(): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n\r\n const openEmbedModal = (embedConfig: PlaygroundEmbedConfig) => {\r\n showModal(`Embed ${embedConfig.contentName}`, (onClose) => (\r\n <AutoEmbedDialog embedConfig={embedConfig} onClose={onClose} />\r\n ));\r\n };\r\n\r\n const getMenuOptions = (\r\n activeEmbedConfig: PlaygroundEmbedConfig,\r\n embedFn: () => void,\r\n dismissFn: () => void,\r\n ) => {\r\n return [\r\n new AutoEmbedOption('Dismiss', {\r\n onSelect: dismissFn,\r\n }),\r\n new AutoEmbedOption(`Embed ${activeEmbedConfig.contentName}`, {\r\n onSelect: embedFn,\r\n }),\r\n ];\r\n };\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalAutoEmbedPlugin<PlaygroundEmbedConfig>\r\n embedConfigs={EmbedConfigs}\r\n onOpenEmbedModalForConfig={openEmbedModal}\r\n getMenuOptions={getMenuOptions}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, options, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) =>\r\n anchorElementRef.current\r\n ? ReactDOM.createPortal(\r\n <div\r\n className=\"typeahead-popover auto-embed-menu\"\r\n style={{\r\n marginLeft: `${Math.max(\r\n parseFloat(anchorElementRef.current.style.width) - 200,\r\n 0,\r\n )}px`,\r\n width: 200,\r\n }}>\r\n <AutoEmbedMenu\r\n options={options}\r\n selectedItemIndex={selectedIndex}\r\n onOptionClick={(option: AutoEmbedOption, index: number) => {\r\n setHighlightedIndex(index);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onOptionMouseEnter={(index: number) => {\r\n setHighlightedIndex(index);\r\n }}\r\n />\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null\r\n }\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Dialog.css';\r\n\r\nimport * as React from 'react';\r\nimport {ReactNode} from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n children: ReactNode;\r\n}>;\r\n\r\nexport function DialogButtonsList({children}: Props): JSX.Element {\r\n return <div className=\"DialogButtonsList\">{children}</div>;\r\n}\r\n\r\nexport function DialogActions({\r\n 'data-test-id': dataTestId,\r\n children,\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"DialogActions\" data-test-id={dataTestId}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createFigmaNode, FigmaNode} from '../../nodes/FigmaNode';\r\n\r\nexport const INSERT_FIGMA_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_FIGMA_COMMAND',\r\n);\r\n\r\nexport default function FigmaPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([FigmaNode])) {\r\n throw new Error('FigmaPlugin: FigmaNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_FIGMA_COMMAND,\r\n (payload) => {\r\n const figmaNode = $createFigmaNode(payload);\r\n $insertNodeToNearestRoot(figmaNode);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\n\r\ntype FigmaComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n documentID: string;\r\n}>;\r\n\r\nfunction FigmaComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n documentID,\r\n}: FigmaComponentProps) {\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n <iframe\r\n width=\"560\"\r\n height=\"315\"\r\n src={`https://www.figma.com/embed?embed_host=lexical&url=\\\r\n https://www.figma.com/file/${documentID}`}\r\n allowFullScreen={true}\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedFigmaNode = Spread<\r\n {\r\n documentID: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nexport class FigmaNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'figma';\r\n }\r\n\r\n static clone(node: FigmaNode): FigmaNode {\r\n return new FigmaNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedFigmaNode): FigmaNode {\r\n return $createFigmaNode(serializedNode.documentID).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportJSON(): SerializedFigmaNode {\r\n return {\r\n ...super.exportJSON(),\r\n documentID: this.__id,\r\n };\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://www.figma.com/file/${this.__id}`;\r\n }\r\n\r\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <FigmaComponent\r\n className={className}\r\n format={this.__format}\r\n nodeKey={this.getKey()}\r\n documentID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createFigmaNode(documentID: string): FigmaNode {\r\n return new FigmaNode(documentID);\r\n}\r\n\r\nexport function $isFigmaNode(\r\n node: FigmaNode | LexicalNode | null | undefined,\r\n): node is FigmaNode {\r\n return node instanceof FigmaNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createTweetNode, TweetNode} from '../../nodes/TweetNode';\r\n\r\nexport const INSERT_TWEET_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_TWEET_COMMAND',\r\n);\r\n\r\nexport default function TwitterPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([TweetNode])) {\r\n throw new Error('TwitterPlugin: TweetNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_TWEET_COMMAND,\r\n (payload) => {\r\n const tweetNode = $createTweetNode(payload);\r\n $insertNodeToNearestRoot(tweetNode);\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createYouTubeNode, YouTubeNode} from '../../nodes/YouTubeNode';\r\n\r\nexport const INSERT_YOUTUBE_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_YOUTUBE_COMMAND',\r\n);\r\n\r\nexport default function YouTubePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([YouTubeNode])) {\r\n throw new Error('YouTubePlugin: YouTubeNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_YOUTUBE_COMMAND,\r\n (payload) => {\r\n const youTubeNode = $createYouTubeNode(payload);\r\n $insertNodeToNearestRoot(youTubeNode);\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\n\r\ntype YouTubeComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n videoID: string;\r\n}>;\r\n\r\nfunction YouTubeComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n videoID,\r\n}: YouTubeComponentProps) {\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n <iframe\r\n width=\"560\"\r\n height=\"315\"\r\n src={`https://www.youtube-nocookie.com/embed/${videoID}`}\r\n frameBorder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen={true}\r\n title=\"YouTube video\"\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedYouTubeNode = Spread<\r\n {\r\n videoID: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nfunction $convertYoutubeElement(\r\n domNode: HTMLElement,\r\n): null | DOMConversionOutput {\r\n const videoID = domNode.getAttribute('data-lexical-youtube');\r\n if (videoID) {\r\n const node = $createYouTubeNode(videoID);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport class YouTubeNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'youtube';\r\n }\r\n\r\n static clone(node: YouTubeNode): YouTubeNode {\r\n return new YouTubeNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\r\n return $createYouTubeNode(serializedNode.videoID).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportJSON(): SerializedYouTubeNode {\r\n return {\r\n ...super.exportJSON(),\r\n videoID: this.__id,\r\n };\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('iframe');\r\n element.setAttribute('data-lexical-youtube', this.__id);\r\n element.setAttribute('width', '560');\r\n element.setAttribute('height', '315');\r\n element.setAttribute(\r\n 'src',\r\n `https://www.youtube-nocookie.com/embed/${this.__id}`,\r\n );\r\n element.setAttribute('frameborder', '0');\r\n element.setAttribute(\r\n 'allow',\r\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\r\n );\r\n element.setAttribute('allowfullscreen', 'true');\r\n element.setAttribute('title', 'YouTube video');\r\n return {element};\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n iframe: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-youtube')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertYoutubeElement,\r\n priority: 1,\r\n };\r\n },\r\n };\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://www.youtube.com/watch?v=${this.__id}`;\r\n }\r\n\r\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <YouTubeComponent\r\n className={className}\r\n format={this.__format}\r\n nodeKey={this.getKey()}\r\n videoID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createYouTubeNode(videoID: string): YouTubeNode {\r\n return new YouTubeNode(videoID);\r\n}\r\n\r\nexport function $isYouTubeNode(\r\n node: YouTubeNode | LexicalNode | null | undefined,\r\n): node is YouTubeNode {\r\n return node instanceof YouTubeNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$isCodeNode} from '@lexical/code';\r\nimport {\r\n AutoLinkPlugin,\r\n createLinkMatcherWithRegExp,\r\n} from '@lexical/react/LexicalAutoLinkPlugin';\r\nimport * as React from 'react';\r\n\r\nconst URL_REGEX =\r\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\r\n\r\nconst EMAIL_REGEX =\r\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/;\r\n\r\nconst MATCHERS = [\r\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\r\n return text.startsWith('http') ? text : `https://${text}`;\r\n }),\r\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\r\n return `mailto:${text}`;\r\n }),\r\n];\r\n\r\nconst EXCLUDE_PARENTS = [$isCodeNode];\r\n\r\nexport default function LexicalAutoLinkPlugin(): JSX.Element {\r\n return (\r\n <AutoLinkPlugin matchers={MATCHERS} excludeParents={EXCLUDE_PARENTS} />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {\r\n $isCodeNode,\r\n CodeNode,\r\n getLanguageFriendlyName,\r\n normalizeCodeLang,\r\n} from '@lexical/code';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$getNearestNodeFromDOMNode, isHTMLElement} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {CopyButton} from './components/CopyButton';\r\nimport {canBePrettier, PrettierButton} from './components/PrettierButton';\r\nimport {useDebounce} from './utils';\r\n\r\nconst CODE_PADDING = 8;\r\n\r\ninterface Position {\r\n top: string;\r\n right: string;\r\n}\r\n\r\nfunction CodeActionMenuContainer({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const [lang, setLang] = useState('');\r\n const [isShown, setShown] = useState<boolean>(false);\r\n const [shouldListenMouseMove, setShouldListenMouseMove] =\r\n useState<boolean>(false);\r\n const [position, setPosition] = useState<Position>({\r\n right: '0',\r\n top: '0',\r\n });\r\n const codeSetRef = useRef<Set<string>>(new Set());\r\n const codeDOMNodeRef = useRef<HTMLElement | null>(null);\r\n\r\n function getCodeDOMNode(): HTMLElement | null {\r\n return codeDOMNodeRef.current;\r\n }\r\n\r\n const debouncedOnMouseMove = useDebounce(\r\n (event: MouseEvent) => {\r\n const {codeDOMNode, isOutside} = getMouseInfo(event);\r\n if (isOutside) {\r\n setShown(false);\r\n return;\r\n }\r\n\r\n if (!codeDOMNode) {\r\n return;\r\n }\r\n\r\n codeDOMNodeRef.current = codeDOMNode;\r\n\r\n let codeNode: CodeNode | null = null;\r\n let _lang = '';\r\n\r\n editor.update(() => {\r\n const maybeCodeNode = $getNearestNodeFromDOMNode(codeDOMNode);\r\n\r\n if ($isCodeNode(maybeCodeNode)) {\r\n codeNode = maybeCodeNode;\r\n _lang = codeNode.getLanguage() || '';\r\n }\r\n });\r\n\r\n if (codeNode) {\r\n const {y: editorElemY, right: editorElemRight} =\r\n anchorElem.getBoundingClientRect();\r\n const {y, right} = codeDOMNode.getBoundingClientRect();\r\n setLang(_lang);\r\n setShown(true);\r\n setPosition({\r\n right: `${editorElemRight - right + CODE_PADDING}px`,\r\n top: `${y - editorElemY}px`,\r\n });\r\n }\r\n },\r\n 50,\r\n 1000,\r\n );\r\n\r\n useEffect(() => {\r\n if (!shouldListenMouseMove) {\r\n return;\r\n }\r\n\r\n document.addEventListener('mousemove', debouncedOnMouseMove);\r\n\r\n return () => {\r\n setShown(false);\r\n debouncedOnMouseMove.cancel();\r\n document.removeEventListener('mousemove', debouncedOnMouseMove);\r\n };\r\n }, [shouldListenMouseMove, debouncedOnMouseMove]);\r\n\r\n useEffect(() => {\r\n return editor.registerMutationListener(\r\n CodeNode,\r\n (mutations) => {\r\n editor.getEditorState().read(() => {\r\n for (const [key, type] of mutations) {\r\n switch (type) {\r\n case 'created':\r\n codeSetRef.current.add(key);\r\n break;\r\n\r\n case 'destroyed':\r\n codeSetRef.current.delete(key);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n });\r\n setShouldListenMouseMove(codeSetRef.current.size > 0);\r\n },\r\n {skipInitialization: false},\r\n );\r\n }, [editor]);\r\n\r\n const normalizedLang = normalizeCodeLang(lang);\r\n const codeFriendlyName = getLanguageFriendlyName(lang);\r\n\r\n return (\r\n <>\r\n {isShown ? (\r\n <div className=\"code-action-menu-container\" style={{...position}}>\r\n <div className=\"code-highlight-language\">{codeFriendlyName}</div>\r\n <CopyButton editor={editor} getCodeDOMNode={getCodeDOMNode} />\r\n {canBePrettier(normalizedLang) ? (\r\n <PrettierButton\r\n editor={editor}\r\n getCodeDOMNode={getCodeDOMNode}\r\n lang={normalizedLang}\r\n />\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\nfunction getMouseInfo(event: MouseEvent): {\r\n codeDOMNode: HTMLElement | null;\r\n isOutside: boolean;\r\n} {\r\n const target = event.target;\r\n\r\n if (isHTMLElement(target)) {\r\n const codeDOMNode = target.closest<HTMLElement>(\r\n 'code.PlaygroundEditorTheme__code',\r\n );\r\n const isOutside = !(\r\n codeDOMNode ||\r\n target.closest<HTMLElement>('div.code-action-menu-container')\r\n );\r\n\r\n return {codeDOMNode, isOutside};\r\n } else {\r\n return {codeDOMNode: null, isOutside: true};\r\n }\r\n}\r\n\r\nexport default function CodeActionMenuPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): React.ReactPortal | null {\r\n return createPortal(\r\n <CodeActionMenuContainer anchorElem={anchorElem} />,\r\n anchorElem,\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport {$isCodeNode} from '@lexical/code';\nimport {\n $getNearestNodeFromDOMNode,\n $getSelection,\n $setSelection,\n LexicalEditor,\n} from 'lexical';\nimport * as React from 'react';\nimport {useState} from 'react';\n\nimport {useDebounce} from '../../utils';\n\ninterface Props {\n editor: LexicalEditor;\n getCodeDOMNode: () => HTMLElement | null;\n}\n\nexport function CopyButton({editor, getCodeDOMNode}: Props) {\n const [isCopyCompleted, setCopyCompleted] = useState<boolean>(false);\n\n const removeSuccessIcon = useDebounce(() => {\n setCopyCompleted(false);\n }, 1000);\n\n async function handleClick(): Promise<void> {\n const codeDOMNode = getCodeDOMNode();\n\n if (!codeDOMNode) {\n return;\n }\n\n let content = '';\n\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n\n if ($isCodeNode(codeNode)) {\n content = codeNode.getTextContent();\n }\n\n const selection = $getSelection();\n $setSelection(selection);\n });\n\n try {\n await navigator.clipboard.writeText(content);\n setCopyCompleted(true);\n removeSuccessIcon();\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n }\n\n return (\n <button type=\"button\" className=\"menu-item\" onClick={handleClick} aria-label=\"copy\">\n {isCopyCompleted ? (\n <i className=\"format success\" />\n ) : (\n <i className=\"format copy\" />\n )}\n </button>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {debounce} from 'lodash-es';\r\nimport {useMemo, useRef} from 'react';\r\n\r\nexport function useDebounce<T extends (...args: never[]) => void>(\r\n fn: T,\r\n ms: number,\r\n maxWait?: number,\r\n) {\r\n const funcRef = useRef<T | null>(null);\r\n funcRef.current = fn;\r\n\r\n return useMemo(\r\n () =>\r\n debounce(\r\n (...args: Parameters<T>) => {\r\n if (funcRef.current) {\r\n funcRef.current(...args);\r\n }\r\n },\r\n ms,\r\n {maxWait},\r\n ),\r\n [ms, maxWait],\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport './index.css';\n\nimport {$isCodeNode} from '@lexical/code';\nimport {$getNearestNodeFromDOMNode, LexicalEditor} from 'lexical';\nimport {Options} from 'prettier';\nimport {useState} from 'react';\n\ninterface Props {\n lang: string;\n editor: LexicalEditor;\n getCodeDOMNode: () => HTMLElement | null;\n}\n\nconst PRETTIER_PARSER_MODULES = {\n css: [() => import('prettier/parser-postcss')],\n html: [() => import('prettier/parser-html')],\n js: [\n () => import('prettier/parser-babel'),\n () => import('prettier/plugins/estree'),\n ],\n markdown: [() => import('prettier/parser-markdown')],\n typescript: [\n () => import('prettier/parser-typescript'),\n () => import('prettier/plugins/estree'),\n ],\n} as const;\n\ntype LanguagesType = keyof typeof PRETTIER_PARSER_MODULES;\n\nasync function loadPrettierParserByLang(lang: string) {\n const dynamicImports = PRETTIER_PARSER_MODULES[lang as LanguagesType];\n const modules = await Promise.all(\n dynamicImports.map((dynamicImport) => dynamicImport()),\n );\n return modules;\n}\n\nasync function loadPrettierFormat() {\n const {format} = await import('prettier/standalone');\n return format;\n}\n\nconst PRETTIER_OPTIONS_BY_LANG: Record<string, Options> = {\n css: {parser: 'css'},\n html: {parser: 'html'},\n js: {parser: 'babel'},\n markdown: {parser: 'markdown'},\n typescript: {parser: 'typescript'},\n};\n\nconst LANG_CAN_BE_PRETTIER = Object.keys(PRETTIER_OPTIONS_BY_LANG);\n\nexport function canBePrettier(lang: string): boolean {\n return LANG_CAN_BE_PRETTIER.includes(lang);\n}\n\nfunction getPrettierOptions(lang: string): Options {\n const options = PRETTIER_OPTIONS_BY_LANG[lang];\n if (!options) {\n throw new Error(\n `CodeActionMenuPlugin: Prettier does not support this language: ${lang}`,\n );\n }\n\n return options;\n}\n\nexport function PrettierButton({lang, editor, getCodeDOMNode}: Props) {\n const [syntaxError, setSyntaxError] = useState<string>('');\n const [tipsVisible, setTipsVisible] = useState<boolean>(false);\n\n async function handleClick(): Promise<void> {\n const codeDOMNode = getCodeDOMNode();\n if (!codeDOMNode) {\n return;\n }\n\n let content = '';\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n if ($isCodeNode(codeNode)) {\n content = codeNode.getTextContent();\n }\n });\n if (content === '') {\n return;\n }\n\n try {\n const format = await loadPrettierFormat();\n const options = getPrettierOptions(lang);\n const prettierParsers = await loadPrettierParserByLang(lang);\n options.plugins = prettierParsers.map(\n (parser) => parser.default || parser,\n );\n const formattedCode = await format(content, options);\n\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n if ($isCodeNode(codeNode)) {\n const selection = codeNode.select(0);\n selection.insertText(formattedCode);\n setSyntaxError('');\n setTipsVisible(false);\n }\n });\n } catch (error: unknown) {\n setError(error);\n }\n }\n\n function setError(error: unknown) {\n if (error instanceof Error) {\n setSyntaxError(error.message);\n setTipsVisible(true);\n } else {\n console.error('Unexpected error: ', error);\n }\n }\n\n function handleMouseEnter() {\n if (syntaxError !== '') {\n setTipsVisible(true);\n }\n }\n\n function handleMouseLeave() {\n if (syntaxError !== '') {\n setTipsVisible(false);\n }\n }\n\n return (\n <div className=\"prettier-wrapper\">\n <button type=\"button\"\n className=\"menu-item\"\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n aria-label=\"prettier\">\n {syntaxError ? (\n <i className=\"format prettier-error\" />\n ) : (\n <i className=\"format prettier\" />\n )}\n </button>\n {tipsVisible ? (\n <pre className=\"code-error-tips\">{syntaxError}</pre>\n ) : null}\n </div>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {registerCodeHighlighting} from '@lexical/code';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nexport default function CodeHighlightPrismPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n return registerCodeHighlighting(editor);\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Collapsible.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $insertNodeToNearestRoot,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n INSERT_PARAGRAPH_COMMAND,\r\n KEY_ARROW_DOWN_COMMAND,\r\n KEY_ARROW_LEFT_COMMAND,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_ARROW_UP_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createCollapsibleContainerNode,\r\n $isCollapsibleContainerNode,\r\n CollapsibleContainerNode,\r\n} from './CollapsibleContainerNode';\r\nimport {\r\n $createCollapsibleContentNode,\r\n $isCollapsibleContentNode,\r\n CollapsibleContentNode,\r\n} from './CollapsibleContentNode';\r\nimport {\r\n $createCollapsibleTitleNode,\r\n $isCollapsibleTitleNode,\r\n CollapsibleTitleNode,\r\n} from './CollapsibleTitleNode';\r\n\r\nexport const INSERT_COLLAPSIBLE_COMMAND = createCommand<void>(\r\n 'INSERT_COLLAPSIBLE_COMMAND',\r\n);\r\n\r\nexport default function CollapsiblePlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (\r\n !editor.hasNodes([\r\n CollapsibleContainerNode,\r\n CollapsibleTitleNode,\r\n CollapsibleContentNode,\r\n ])\r\n ) {\r\n throw new Error(\r\n 'CollapsiblePlugin: CollapsibleContainerNode, CollapsibleTitleNode, or CollapsibleContentNode not registered on editor',\r\n );\r\n }\r\n\r\n const $onEscapeUp = () => {\r\n const selection = $getSelection();\r\n if (\r\n $isRangeSelection(selection) &&\r\n selection.isCollapsed() &&\r\n selection.anchor.offset === 0\r\n ) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isCollapsibleContainerNode,\r\n );\r\n\r\n if ($isCollapsibleContainerNode(container)) {\r\n const parent = container.getParent();\r\n if (\r\n parent !== null &&\r\n parent.getFirstChild() === container &&\r\n selection.anchor.key === container.getFirstDescendant()?.getKey()\r\n ) {\r\n container.insertBefore($createParagraphNode());\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const $onEscapeDown = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) && selection.isCollapsed()) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isCollapsibleContainerNode,\r\n );\r\n\r\n if ($isCollapsibleContainerNode(container)) {\r\n const parent = container.getParent();\r\n if (parent !== null && parent.getLastChild() === container) {\r\n const titleParagraph = container.getFirstDescendant();\r\n const contentParagraph = container.getLastDescendant();\r\n\r\n if (\r\n (contentParagraph !== null &&\r\n selection.anchor.key === contentParagraph.getKey() &&\r\n selection.anchor.offset ===\r\n contentParagraph.getTextContentSize()) ||\r\n (titleParagraph !== null &&\r\n selection.anchor.key === titleParagraph.getKey() &&\r\n selection.anchor.offset === titleParagraph.getTextContentSize())\r\n ) {\r\n container.insertAfter($createParagraphNode());\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n return mergeRegister(\r\n // Structure enforcing transformers for each node type. In case nesting structure is not\r\n // \"Container > Title + Content\" it'll unwrap nodes and convert it back\r\n // to regular content.\r\n editor.registerNodeTransform(CollapsibleContentNode, (node) => {\r\n const parent = node.getParent();\r\n if (!$isCollapsibleContainerNode(parent)) {\r\n const children = node.getChildren();\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(CollapsibleTitleNode, (node) => {\r\n const parent = node.getParent();\r\n if (!$isCollapsibleContainerNode(parent)) {\r\n node.replace($createParagraphNode().append(...node.getChildren()));\r\n return;\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(CollapsibleContainerNode, (node) => {\r\n const children = node.getChildren();\r\n if (\r\n children.length !== 2 ||\r\n !$isCollapsibleTitleNode(children[0]) ||\r\n !$isCollapsibleContentNode(children[1])\r\n ) {\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n\r\n // When collapsible is the last child pressing down/right arrow will insert paragraph\r\n // below it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if trailing paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_DOWN_COMMAND,\r\n $onEscapeDown,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n $onEscapeDown,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n // When collapsible is the first child pressing up/left arrow will insert paragraph\r\n // above it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if leading paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_UP_COMMAND,\r\n $onEscapeUp,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n editor.registerCommand(\r\n KEY_ARROW_LEFT_COMMAND,\r\n $onEscapeUp,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n // Enter goes from Title to Content rather than a new line inside Title\r\n editor.registerCommand(\r\n INSERT_PARAGRAPH_COMMAND,\r\n () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const titleNode = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n (node) => $isCollapsibleTitleNode(node),\r\n );\r\n\r\n if ($isCollapsibleTitleNode(titleNode)) {\r\n const container = titleNode.getParent();\r\n if (container && $isCollapsibleContainerNode(container)) {\r\n if (!container.getOpen()) {\r\n container.toggleOpen();\r\n }\r\n titleNode.getNextSibling()?.selectEnd();\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n INSERT_COLLAPSIBLE_COMMAND,\r\n () => {\r\n editor.update(() => {\r\n const title = $createCollapsibleTitleNode();\r\n const paragraph = $createParagraphNode();\r\n $insertNodeToNearestRoot(\r\n $createCollapsibleContainerNode(true).append(\r\n title.append(paragraph),\r\n $createCollapsibleContentNode().append($createParagraphNode()),\r\n ),\r\n );\r\n paragraph.select();\r\n });\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n $getSiblingCaret,\r\n $isElementNode,\r\n $rewindSiblingCaret,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementNode,\r\n isHTMLElement,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n RangeSelection,\r\n SerializedElementNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {setDomHiddenUntilFound} from './CollapsibleUtils';\r\n\r\ntype SerializedCollapsibleContainerNode = Spread<\r\n {\r\n open: boolean;\r\n },\r\n SerializedElementNode\r\n>;\r\n\r\nexport function $convertDetailsElement(\r\n domNode: HTMLDetailsElement,\r\n): DOMConversionOutput | null {\r\n const isOpen = domNode.open !== undefined ? domNode.open : true;\r\n const node = $createCollapsibleContainerNode(isOpen);\r\n return {\r\n node,\r\n };\r\n}\r\n\r\nexport class CollapsibleContainerNode extends ElementNode {\r\n __open: boolean;\r\n\r\n constructor(open: boolean, key?: NodeKey) {\r\n super(key);\r\n this.__open = open;\r\n }\r\n\r\n static getType(): string {\r\n return 'collapsible-container';\r\n }\r\n\r\n static clone(node: CollapsibleContainerNode): CollapsibleContainerNode {\r\n return new CollapsibleContainerNode(node.__open, node.__key);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n\r\n collapseAtStart(selection: RangeSelection): boolean {\r\n // Unwrap the CollapsibleContainerNode by replacing it with the children\r\n // of its children (CollapsibleTitleNode, CollapsibleContentNode)\r\n const nodesToInsert: LexicalNode[] = [];\r\n for (const child of this.getChildren()) {\r\n if ($isElementNode(child)) {\r\n nodesToInsert.push(...child.getChildren());\r\n }\r\n }\r\n const caret = $rewindSiblingCaret($getSiblingCaret(this, 'previous'));\r\n caret.splice(1, nodesToInsert);\r\n // Merge the first child of the CollapsibleTitleNode with the\r\n // previous sibling of the CollapsibleContainerNode\r\n const [firstChild] = nodesToInsert;\r\n if (firstChild) {\r\n firstChild.selectStart().deleteCharacter(true);\r\n }\r\n return true;\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n // details is not well supported in Chrome #5582\r\n let dom: HTMLElement;\r\n if (IS_CHROME) {\r\n dom = document.createElement('div');\r\n dom.setAttribute('open', '');\r\n } else {\r\n const detailsDom = document.createElement('details');\r\n detailsDom.open = this.__open;\r\n detailsDom.addEventListener('toggle', () => {\r\n const open = editor.getEditorState().read(() => this.getOpen());\r\n if (open !== detailsDom.open) {\r\n editor.update(() => this.toggleOpen());\r\n }\r\n });\r\n dom = detailsDom;\r\n }\r\n dom.classList.add('Collapsible__container');\r\n\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLDetailsElement): boolean {\r\n const currentOpen = this.__open;\r\n if (prevNode.__open !== currentOpen) {\r\n // details is not well supported in Chrome #5582\r\n if (IS_CHROME) {\r\n const contentDom = dom.children[1];\r\n if (!isHTMLElement(contentDom)) {\r\n throw new Error('Expected contentDom to be an HTMLElement');\r\n }\r\n if (currentOpen) {\r\n dom.setAttribute('open', '');\r\n contentDom.hidden = false;\r\n } else {\r\n dom.removeAttribute('open');\r\n setDomHiddenUntilFound(contentDom);\r\n }\r\n } else {\r\n dom.open = this.__open;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap<HTMLDetailsElement> | null {\r\n return {\r\n details: (domNode: HTMLDetailsElement) => {\r\n return {\r\n conversion: $convertDetailsElement,\r\n priority: 1,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedCollapsibleContainerNode,\r\n ): CollapsibleContainerNode {\r\n return $createCollapsibleContainerNode(serializedNode.open).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('details');\r\n element.classList.add('Collapsible__container');\r\n element.setAttribute('open', this.__open.toString());\r\n return {element};\r\n }\r\n\r\n exportJSON(): SerializedCollapsibleContainerNode {\r\n return {\r\n ...super.exportJSON(),\r\n open: this.__open,\r\n };\r\n }\r\n\r\n setOpen(open: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__open = open;\r\n }\r\n\r\n getOpen(): boolean {\r\n return this.getLatest().__open;\r\n }\r\n\r\n toggleOpen(): void {\r\n this.setOpen(!this.getOpen());\r\n }\r\n}\r\n\r\nexport function $createCollapsibleContainerNode(\r\n isOpen: boolean,\r\n): CollapsibleContainerNode {\r\n return new CollapsibleContainerNode(isOpen);\r\n}\r\n\r\nexport function $isCollapsibleContainerNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleContainerNode {\r\n return node instanceof CollapsibleContainerNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nexport function setDomHiddenUntilFound(dom: HTMLElement): void {\r\n // @ts-expect-error — 'until-found' is valid for HTMLElement.hidden but not yet in TS types\r\n dom.hidden = 'until-found';\r\n}\r\n\r\nexport function domOnBeforeMatch(dom: HTMLElement, callback: () => void): void {\r\n dom.onbeforematch = callback;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nimport {$isCollapsibleContainerNode} from './CollapsibleContainerNode';\r\nimport {domOnBeforeMatch, setDomHiddenUntilFound} from './CollapsibleUtils';\r\n\r\ntype SerializedCollapsibleContentNode = SerializedElementNode;\r\n\r\nexport function $convertCollapsibleContentElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const node = $createCollapsibleContentNode();\r\n return {\r\n node,\r\n };\r\n}\r\n\r\nexport class CollapsibleContentNode extends ElementNode {\r\n static getType(): string {\r\n return 'collapsible-content';\r\n }\r\n\r\n static clone(node: CollapsibleContentNode): CollapsibleContentNode {\r\n return new CollapsibleContentNode(node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.classList.add('Collapsible__content');\r\n if (IS_CHROME) {\r\n editor.getEditorState().read(() => {\r\n const containerNode = this.getParentOrThrow();\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n if (!containerNode.__open) {\r\n setDomHiddenUntilFound(dom);\r\n }\r\n });\r\n domOnBeforeMatch(dom, () => {\r\n editor.update(() => {\r\n const containerNode = this.getParentOrThrow().getLatest();\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n if (!containerNode.__open) {\r\n containerNode.toggleOpen();\r\n }\r\n });\r\n });\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-collapsible-content')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertCollapsibleContentElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.classList.add('Collapsible__content');\r\n element.setAttribute('data-lexical-collapsible-content', 'true');\r\n return {element};\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedCollapsibleContentNode,\r\n ): CollapsibleContentNode {\r\n return $createCollapsibleContentNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport function $createCollapsibleContentNode(): CollapsibleContentNode {\r\n return new CollapsibleContentNode();\r\n}\r\n\r\nexport function $isCollapsibleContentNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleContentNode {\r\n return node instanceof CollapsibleContentNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $isElementNode,\r\n buildImportMap,\r\n DOMConversionOutput,\r\n EditorConfig,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n} from 'lexical';\r\n\r\nimport {$isCollapsibleContainerNode} from './CollapsibleContainerNode';\r\nimport {$isCollapsibleContentNode} from './CollapsibleContentNode';\r\n\r\nexport function $convertSummaryElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const node = $createCollapsibleTitleNode();\r\n return {\r\n node,\r\n };\r\n}\r\n\r\n/** @noInheritDoc */\r\nexport class CollapsibleTitleNode extends ElementNode {\r\n /** @internal */\r\n $config() {\r\n return this.config('collapsible-title', {\r\n $transform(node: CollapsibleTitleNode) {\r\n if (node.isEmpty()) {\r\n node.remove();\r\n }\r\n },\r\n extends: ElementNode,\r\n importDOM: buildImportMap({\r\n summary: () => ({\r\n conversion: $convertSummaryElement,\r\n priority: 1,\r\n }),\r\n }),\r\n });\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n const dom = document.createElement('summary');\r\n dom.classList.add('Collapsible__title');\r\n if (IS_CHROME) {\r\n dom.addEventListener('click', () => {\r\n editor.update(() => {\r\n const collapsibleContainer = this.getLatest().getParentOrThrow();\r\n if (!$isCollapsibleContainerNode(collapsibleContainer)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n collapsibleContainer.toggleOpen();\r\n });\r\n });\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n return false;\r\n }\r\n\r\n insertNewAfter(_: RangeSelection, restoreSelection = true): ElementNode {\r\n const containerNode = this.getParentOrThrow();\r\n\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'CollapsibleTitleNode expects to be child of CollapsibleContainerNode',\r\n );\r\n }\r\n\r\n if (containerNode.getOpen()) {\r\n const contentNode = this.getNextSibling();\r\n if (!$isCollapsibleContentNode(contentNode)) {\r\n throw new Error(\r\n 'CollapsibleTitleNode expects to have CollapsibleContentNode sibling',\r\n );\r\n }\r\n\r\n const firstChild = contentNode.getFirstChild();\r\n if ($isElementNode(firstChild)) {\r\n return firstChild;\r\n } else {\r\n const paragraph = $createParagraphNode();\r\n contentNode.append(paragraph);\r\n return paragraph;\r\n }\r\n } else {\r\n const paragraph = $createParagraphNode();\r\n containerNode.insertAfter(paragraph, restoreSelection);\r\n return paragraph;\r\n }\r\n }\r\n}\r\n\r\nexport function $createCollapsibleTitleNode(): CollapsibleTitleNode {\r\n return new CollapsibleTitleNode();\r\n}\r\n\r\nexport function $isCollapsibleTitleNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleTitleNode {\r\n return node instanceof CollapsibleTitleNode;\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {Provider} from '@lexical/yjs';\nimport type {\n EditorState,\n LexicalCommand,\n LexicalEditor,\n NodeKey,\n RangeSelection,\n} from 'lexical';\nimport type {JSX} from 'react';\nimport type {Doc} from 'yjs';\n\nimport './index.css';\n\nimport {\n $createMarkNode,\n $getMarkIDs,\n $isMarkNode,\n $unwrapMarkNode,\n $wrapSelectionInMarkNode,\n MarkNode,\n} from '@lexical/mark';\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\nimport {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\nimport {LexicalComposer} from '@lexical/react/LexicalComposer';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {EditorRefPlugin} from '@lexical/react/LexicalEditorRefPlugin';\nimport {LexicalErrorBoundary} from '@lexical/react/LexicalErrorBoundary';\nimport {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';\nimport {OnChangePlugin} from '@lexical/react/LexicalOnChangePlugin';\nimport {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin';\nimport {createDOMRange, createRectsFromDOMRange} from '@lexical/selection';\nimport {$isRootTextContentEmpty, $rootTextContent} from '@lexical/text';\nimport {mergeRegister, registerNestedElementResolver} from '@lexical/utils';\nimport {\n $getNodeByKey,\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n CLEAR_EDITOR_COMMAND,\n COLLABORATION_TAG,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n} from 'lexical';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as React from 'react';\nimport {createPortal} from 'react-dom';\n\nimport {\n Comment,\n Comments,\n CommentStore,\n createComment,\n createThread,\n Thread,\n useCommentStore,\n} from '../../commenting';\nimport useModal from '../../hooks/useModal';\nimport CommentEditorTheme from '../../themes/CommentEditorTheme';\nimport Button from '../../ui/Button';\nimport ContentEditable from '../../ui/ContentEditable';\n\nexport const INSERT_INLINE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_INLINE_COMMAND',\n);\n\nfunction AddCommentBox({\n anchorKey,\n editor,\n onAddComment,\n}: {\n anchorKey: NodeKey;\n editor: LexicalEditor;\n onAddComment: () => void;\n}): JSX.Element {\n const boxRef = useRef<HTMLDivElement>(null);\n\n const updatePosition = useCallback(() => {\n const boxElem = boxRef.current;\n const rootElement = editor.getRootElement();\n const anchorElement = editor.getElementByKey(anchorKey);\n\n if (boxElem !== null && rootElement !== null && anchorElement !== null) {\n const {right} = rootElement.getBoundingClientRect();\n const {top} = anchorElement.getBoundingClientRect();\n boxElem.style.left = `${right - 20}px`;\n boxElem.style.top = `${top - 30}px`;\n }\n }, [anchorKey, editor]);\n\n useEffect(() => {\n window.addEventListener('resize', updatePosition);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n };\n }, [editor, updatePosition]);\n\n useLayoutEffect(() => {\n updatePosition();\n }, [anchorKey, editor, updatePosition]);\n\n return (\n <div className=\"CommentPlugin_AddCommentBox\" ref={boxRef}>\n <button type=\"button\"\n className=\"CommentPlugin_AddCommentBox_button\"\n onClick={onAddComment}>\n <i className=\"icon add-comment\" />\n </button>\n </div>\n );\n}\n\nfunction EscapeHandlerPlugin({\n onEscape,\n}: {\n onEscape: (e: KeyboardEvent) => boolean;\n}): null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n (event: KeyboardEvent) => {\n return onEscape(event);\n },\n COMMAND_PRIORITY_NORMAL,\n );\n }, [editor, onEscape]);\n\n return null;\n}\n\nfunction PlainTextEditor({\n className,\n autoFocus,\n onEscape,\n onChange,\n editorRef,\n placeholder = 'Type a comment...',\n}: {\n autoFocus?: boolean;\n className?: string;\n editorRef?: {current: null | LexicalEditor};\n onChange: (editorState: EditorState, editor: LexicalEditor) => void;\n onEscape: (e: KeyboardEvent) => boolean;\n placeholder?: string;\n}) {\n const initialConfig = {\n namespace: 'Commenting',\n nodes: [],\n onError: (error: Error) => {\n throw error;\n },\n theme: CommentEditorTheme,\n };\n\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <div className=\"CommentPlugin_CommentInputBox_EditorContainer\">\n <PlainTextPlugin\n contentEditable={\n <ContentEditable placeholder={placeholder} className={className} />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n <OnChangePlugin onChange={onChange} />\n <HistoryPlugin />\n {autoFocus !== false && <AutoFocusPlugin />}\n <EscapeHandlerPlugin onEscape={onEscape} />\n <ClearEditorPlugin />\n {editorRef !== undefined && <EditorRefPlugin editorRef={editorRef} />}\n </div>\n </LexicalComposer>\n );\n}\n\nfunction useOnChange(\n setContent: (text: string) => void,\n setCanSubmit: (canSubmit: boolean) => void,\n) {\n return useCallback(\n (editorState: EditorState, _editor: LexicalEditor) => {\n editorState.read(() => {\n setContent($rootTextContent());\n setCanSubmit(!$isRootTextContentEmpty(_editor.isComposing(), true));\n });\n },\n [setCanSubmit, setContent],\n );\n}\n\nfunction CommentInputBox({\n editor,\n cancelAddComment,\n submitAddComment,\n}: {\n cancelAddComment: () => void;\n editor: LexicalEditor;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n selection?: RangeSelection | null,\n ) => void;\n}) {\n const [content, setContent] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n const boxRef = useRef<HTMLDivElement>(null);\n const selectionState = useMemo(\n () => ({\n container: document.createElement('div'),\n elements: [],\n }),\n [],\n );\n const selectionRef = useRef<RangeSelection | null>(null);\n const author = useCollabAuthorName();\n\n const updateLocation = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n selectionRef.current = selection.clone();\n const anchor = selection.anchor;\n const focus = selection.focus;\n const range = createDOMRange(\n editor,\n anchor.getNode(),\n anchor.offset,\n focus.getNode(),\n focus.offset,\n );\n const boxElem = boxRef.current;\n if (range !== null && boxElem !== null) {\n const {left, bottom, width} = range.getBoundingClientRect();\n const selectionRects = createRectsFromDOMRange(editor, range);\n let correctedLeft =\n selectionRects.length === 1 ? left + width / 2 - 125 : left - 125;\n if (correctedLeft < 10) {\n correctedLeft = 10;\n }\n boxElem.style.left = `${correctedLeft}px`;\n boxElem.style.top = `${\n bottom +\n 20 +\n (window.pageYOffset || document.documentElement.scrollTop)\n }px`;\n const selectionRectsLength = selectionRects.length;\n const {container} = selectionState;\n const elements: Array<HTMLSpanElement> = selectionState.elements;\n const elementsLength = elements.length;\n\n for (let i = 0; i < selectionRectsLength; i++) {\n const selectionRect = selectionRects[i];\n let elem: HTMLSpanElement = elements[i];\n if (elem === undefined) {\n elem = document.createElement('span');\n elements[i] = elem;\n container.appendChild(elem);\n }\n const color = '255, 212, 0';\n const style = `position:absolute;top:${\n selectionRect.top +\n (window.pageYOffset || document.documentElement.scrollTop)\n }px;left:${selectionRect.left}px;height:${\n selectionRect.height\n }px;width:${\n selectionRect.width\n }px;background-color:rgba(${color}, 0.3);pointer-events:none;z-index:5;`;\n elem.style.cssText = style;\n }\n for (let i = elementsLength - 1; i >= selectionRectsLength; i--) {\n const elem = elements[i];\n container.removeChild(elem);\n elements.pop();\n }\n }\n }\n });\n }, [editor, selectionState]);\n\n useLayoutEffect(() => {\n updateLocation();\n const container = selectionState.container;\n const body = document.body;\n if (body !== null) {\n body.appendChild(container);\n return () => {\n body.removeChild(container);\n };\n }\n }, [selectionState.container, updateLocation]);\n\n useEffect(() => {\n window.addEventListener('resize', updateLocation);\n\n return () => {\n window.removeEventListener('resize', updateLocation);\n };\n }, [updateLocation]);\n\n const onEscape = (event: KeyboardEvent): boolean => {\n event.preventDefault();\n cancelAddComment();\n return true;\n };\n\n const submitComment = () => {\n if (canSubmit) {\n let quote = editor.getEditorState().read(() => {\n const selection = selectionRef.current;\n return selection ? selection.getTextContent() : '';\n });\n if (quote.length > 100) {\n quote = quote.slice(0, 99) + '…';\n }\n submitAddComment(\n createThread(quote, [createComment(content, author)]),\n true,\n undefined,\n selectionRef.current,\n );\n selectionRef.current = null;\n }\n };\n\n const onChange = useOnChange(setContent, setCanSubmit);\n\n return (\n <div className=\"CommentPlugin_CommentInputBox\" ref={boxRef}>\n <PlainTextEditor\n className=\"CommentPlugin_CommentInputBox_Editor\"\n onEscape={onEscape}\n onChange={onChange}\n />\n <div className=\"CommentPlugin_CommentInputBox_Buttons\">\n <Button\n onClick={cancelAddComment}\n className=\"CommentPlugin_CommentInputBox_Button\">\n Cancel\n </Button>\n <Button\n onClick={submitComment}\n disabled={!canSubmit}\n className=\"CommentPlugin_CommentInputBox_Button primary\">\n Comment\n </Button>\n </div>\n </div>\n );\n}\n\nfunction CommentsComposer({\n submitAddComment,\n thread,\n placeholder,\n}: {\n placeholder?: string;\n submitAddComment: (\n commentOrThread: Comment,\n isInlineComment: boolean,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n thread?: Thread;\n}) {\n const [content, setContent] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n const editorRef = useRef<LexicalEditor>(null);\n const author = useCollabAuthorName();\n\n const onChange = useOnChange(setContent, setCanSubmit);\n\n const submitComment = () => {\n if (canSubmit) {\n submitAddComment(createComment(content, author), false, thread);\n const editor = editorRef.current;\n if (editor !== null) {\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined);\n }\n }\n };\n\n return (\n <>\n <PlainTextEditor\n className=\"CommentPlugin_CommentsPanel_Editor\"\n autoFocus={false}\n onEscape={() => {\n return true;\n }}\n onChange={onChange}\n editorRef={editorRef}\n placeholder={placeholder}\n />\n <Button\n className=\"CommentPlugin_CommentsPanel_SendButton\"\n onClick={submitComment}\n disabled={!canSubmit}>\n <i className=\"send\" />\n </Button>\n </>\n );\n}\n\nfunction ShowDeleteCommentOrThreadDialog({\n commentOrThread,\n deleteCommentOrThread,\n onClose,\n thread = undefined,\n}: {\n commentOrThread: Comment | Thread;\n\n deleteCommentOrThread: (\n comment: Comment | Thread,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n onClose: () => void;\n thread?: Thread;\n}): JSX.Element {\n return (\n <>\n Are you sure you want to delete this {commentOrThread.type}?\n <div className=\"Modal__content\">\n <Button\n onClick={() => {\n deleteCommentOrThread(commentOrThread, thread);\n onClose();\n }}>\n Delete\n </Button>{' '}\n <Button\n onClick={() => {\n onClose();\n }}>\n Cancel\n </Button>\n </div>\n </>\n );\n}\n\nfunction CommentsPanelListComment({\n comment,\n deleteComment,\n thread,\n rtf,\n}: {\n comment: Comment;\n deleteComment: (\n commentOrThread: Comment | Thread,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n rtf: Intl.RelativeTimeFormat;\n thread?: Thread;\n}): JSX.Element {\n const seconds = Math.round(\n (comment.timeStamp - (performance.timeOrigin + performance.now())) / 1000,\n );\n const minutes = Math.round(seconds / 60);\n const [modal, showModal] = useModal();\n\n return (\n <li className=\"CommentPlugin_CommentsPanel_List_Comment\">\n <div className=\"CommentPlugin_CommentsPanel_List_Details\">\n <span className=\"CommentPlugin_CommentsPanel_List_Comment_Author\">\n {comment.author}\n </span>\n <span className=\"CommentPlugin_CommentsPanel_List_Comment_Time\">\n · {seconds > -10 ? 'Just now' : rtf.format(minutes, 'minute')}\n </span>\n </div>\n <p\n className={\n comment.deleted ? 'CommentPlugin_CommentsPanel_DeletedComment' : ''\n }>\n {comment.content}\n </p>\n {!comment.deleted && (\n <>\n <Button\n onClick={() => {\n showModal('Delete Comment', (onClose) => (\n <ShowDeleteCommentOrThreadDialog\n commentOrThread={comment}\n deleteCommentOrThread={deleteComment}\n thread={thread}\n onClose={onClose}\n />\n ));\n }}\n className=\"CommentPlugin_CommentsPanel_List_DeleteButton\">\n <i className=\"delete\" />\n </Button>\n {modal}\n </>\n )}\n </li>\n );\n}\n\nfunction CommentsPanelList({\n activeIDs,\n comments,\n deleteCommentOrThread,\n listRef,\n submitAddComment,\n markNodeMap,\n}: {\n activeIDs: Array<string>;\n comments: Comments;\n deleteCommentOrThread: (\n commentOrThread: Comment | Thread,\n thread?: Thread,\n ) => void;\n listRef: {current: null | HTMLUListElement};\n markNodeMap: Map<string, Set<NodeKey>>;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n ) => void;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const [counter, setCounter] = useState(0);\n const [modal, showModal] = useModal();\n const rtf = useMemo(\n () =>\n new Intl.RelativeTimeFormat('en', {\n localeMatcher: 'best fit',\n numeric: 'auto',\n style: 'short',\n }),\n [],\n );\n\n useEffect(() => {\n // Used to keep the time stamp up to date\n const id = setTimeout(() => {\n setCounter(counter + 1);\n }, 10000);\n\n return () => {\n clearTimeout(id);\n };\n }, [counter]);\n\n return (\n <ul className=\"CommentPlugin_CommentsPanel_List\" ref={listRef}>\n {comments.map((commentOrThread) => {\n const id = commentOrThread.id;\n if (commentOrThread.type === 'thread') {\n const handleClickThread = () => {\n const markNodeKeys = markNodeMap.get(id);\n if (\n markNodeKeys !== undefined &&\n (activeIDs === null || activeIDs.indexOf(id) === -1)\n ) {\n const activeElement = document.activeElement;\n // Move selection to the start of the mark, so that we\n // update the UI with the selected thread.\n editor.update(\n () => {\n const markNodeKey = Array.from(markNodeKeys)[0];\n const markNode = $getNodeByKey<MarkNode>(markNodeKey);\n if ($isMarkNode(markNode)) {\n markNode.selectStart();\n }\n },\n {\n onUpdate() {\n // Restore selection to the previous element\n if (activeElement !== null) {\n (activeElement as HTMLElement).focus();\n }\n },\n },\n );\n }\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <li\n key={id}\n onClick={handleClickThread}\n className={`CommentPlugin_CommentsPanel_List_Thread ${\n markNodeMap.has(id) ? 'interactive' : ''\n } ${activeIDs.indexOf(id) === -1 ? '' : 'active'}`}>\n <div className=\"CommentPlugin_CommentsPanel_List_Thread_QuoteBox\">\n <blockquote className=\"CommentPlugin_CommentsPanel_List_Thread_Quote\">\n {'> '}\n <span>{commentOrThread.quote}</span>\n </blockquote>\n {/* INTRODUCE DELETE THREAD HERE*/}\n <Button\n onClick={() => {\n showModal('Delete Thread', (onClose) => (\n <ShowDeleteCommentOrThreadDialog\n commentOrThread={commentOrThread}\n deleteCommentOrThread={deleteCommentOrThread}\n onClose={onClose}\n />\n ));\n }}\n className=\"CommentPlugin_CommentsPanel_List_DeleteButton\">\n <i className=\"delete\" />\n </Button>\n {modal}\n </div>\n <ul className=\"CommentPlugin_CommentsPanel_List_Thread_Comments\">\n {commentOrThread.comments.map((comment) => (\n <CommentsPanelListComment\n key={comment.id}\n comment={comment}\n deleteComment={deleteCommentOrThread}\n thread={commentOrThread}\n rtf={rtf}\n />\n ))}\n </ul>\n <div className=\"CommentPlugin_CommentsPanel_List_Thread_Editor\">\n <CommentsComposer\n submitAddComment={submitAddComment}\n thread={commentOrThread}\n placeholder=\"Reply to comment...\"\n />\n </div>\n </li>\n );\n }\n return (\n <CommentsPanelListComment\n key={id}\n comment={commentOrThread}\n deleteComment={deleteCommentOrThread}\n rtf={rtf}\n />\n );\n })}\n </ul>\n );\n}\n\nfunction CommentsPanel({\n activeIDs,\n deleteCommentOrThread,\n comments,\n submitAddComment,\n markNodeMap,\n}: {\n activeIDs: Array<string>;\n comments: Comments;\n deleteCommentOrThread: (\n commentOrThread: Comment | Thread,\n thread?: Thread,\n ) => void;\n markNodeMap: Map<string, Set<NodeKey>>;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n ) => void;\n}): JSX.Element {\n const listRef = useRef<HTMLUListElement>(null);\n const isEmpty = comments.length === 0;\n\n return (\n <div className=\"CommentPlugin_CommentsPanel\">\n <h2 className=\"CommentPlugin_CommentsPanel_Heading\">Comments</h2>\n {isEmpty ? (\n <div className=\"CommentPlugin_CommentsPanel_Empty\">No Comments</div>\n ) : (\n <CommentsPanelList\n activeIDs={activeIDs}\n comments={comments}\n deleteCommentOrThread={deleteCommentOrThread}\n listRef={listRef}\n submitAddComment={submitAddComment}\n markNodeMap={markNodeMap}\n />\n )}\n </div>\n );\n}\n\nfunction useCollabAuthorName(): string {\n const collabContext = useCollaborationContext();\n const {yjsDocMap, name} = collabContext;\n return yjsDocMap.has('comments') ? name : 'Playground User';\n}\n\nexport default function CommentPlugin({\n providerFactory,\n}: {\n providerFactory?: (id: string, yjsDocMap: Map<string, Doc>) => Provider;\n}): JSX.Element {\n const collabContext = useCollaborationContext();\n const [editor] = useLexicalComposerContext();\n const commentStore = useMemo(() => new CommentStore(editor), [editor]);\n const comments = useCommentStore(commentStore);\n const markNodeMap = useMemo<Map<string, Set<NodeKey>>>(() => {\n return new Map();\n }, []);\n const [activeAnchorKey, setActiveAnchorKey] = useState<NodeKey | null>();\n const [activeIDs, setActiveIDs] = useState<Array<string>>([]);\n const [showCommentInput, setShowCommentInput] = useState(false);\n const [showComments, setShowComments] = useState(false);\n const {yjsDocMap} = collabContext;\n\n useEffect(() => {\n if (providerFactory) {\n const provider = providerFactory('comments', yjsDocMap);\n return commentStore.registerCollaboration(provider);\n }\n }, [commentStore, providerFactory, yjsDocMap]);\n\n const cancelAddComment = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n // Restore selection\n if (selection !== null) {\n selection.dirty = true;\n }\n });\n setShowCommentInput(false);\n }, [editor]);\n\n const deleteCommentOrThread = useCallback(\n (comment: Comment | Thread, thread?: Thread) => {\n if (comment.type === 'comment') {\n const deletionInfo = commentStore.deleteCommentOrThread(\n comment,\n thread,\n );\n if (!deletionInfo) {\n return;\n }\n const {markedComment, index} = deletionInfo;\n commentStore.addComment(markedComment, thread, index);\n } else {\n commentStore.deleteCommentOrThread(comment);\n // Remove ids from associated marks\n const id = thread !== undefined ? thread.id : comment.id;\n const markNodeKeys = markNodeMap.get(id);\n if (markNodeKeys !== undefined) {\n // Do async to avoid causing a React infinite loop\n setTimeout(() => {\n editor.update(() => {\n for (const key of markNodeKeys) {\n const node: null | MarkNode = $getNodeByKey(key);\n if ($isMarkNode(node)) {\n node.deleteID(id);\n if (node.getIDs().length === 0) {\n $unwrapMarkNode(node);\n }\n }\n }\n });\n });\n }\n }\n },\n [commentStore, editor, markNodeMap],\n );\n\n const submitAddComment = useCallback(\n (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n selection?: RangeSelection | null,\n ) => {\n commentStore.addComment(commentOrThread, thread);\n if (isInlineComment) {\n editor.update(() => {\n if ($isRangeSelection(selection)) {\n const isBackward = selection.isBackward();\n const id = commentOrThread.id;\n\n // Wrap content in a MarkNode\n $wrapSelectionInMarkNode(selection, isBackward, id);\n }\n });\n setShowCommentInput(false);\n }\n },\n [commentStore, editor],\n );\n\n useEffect(() => {\n const changedElems: Array<HTMLElement> = [];\n for (let i = 0; i < activeIDs.length; i++) {\n const id = activeIDs[i];\n const keys = markNodeMap.get(id);\n if (keys !== undefined) {\n for (const key of keys) {\n const elem = editor.getElementByKey(key);\n if (elem !== null) {\n elem.classList.add('selected');\n changedElems.push(elem);\n setShowComments(true);\n }\n }\n }\n }\n return () => {\n for (let i = 0; i < changedElems.length; i++) {\n const changedElem = changedElems[i];\n changedElem.classList.remove('selected');\n }\n };\n }, [activeIDs, editor, markNodeMap]);\n\n useEffect(() => {\n const markNodeKeysToIDs: Map<NodeKey, Array<string>> = new Map();\n\n return mergeRegister(\n registerNestedElementResolver<MarkNode>(\n editor,\n MarkNode,\n (from: MarkNode) => {\n return $createMarkNode(from.getIDs());\n },\n (from: MarkNode, to: MarkNode) => {\n // Merge the IDs\n const ids = from.getIDs();\n ids.forEach((id) => {\n to.addID(id);\n });\n },\n ),\n editor.registerMutationListener(\n MarkNode,\n (mutations) => {\n editor.getEditorState().read(() => {\n for (const [key, mutation] of mutations) {\n const node: null | MarkNode = $getNodeByKey(key);\n let ids: NodeKey[] = [];\n\n if (mutation === 'destroyed') {\n ids = markNodeKeysToIDs.get(key) || [];\n } else if ($isMarkNode(node)) {\n ids = node.getIDs();\n }\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n let markNodeKeys = markNodeMap.get(id);\n markNodeKeysToIDs.set(key, ids);\n\n if (mutation === 'destroyed') {\n if (markNodeKeys !== undefined) {\n markNodeKeys.delete(key);\n if (markNodeKeys.size === 0) {\n markNodeMap.delete(id);\n }\n }\n } else {\n if (markNodeKeys === undefined) {\n markNodeKeys = new Set();\n markNodeMap.set(id, markNodeKeys);\n }\n if (!markNodeKeys.has(key)) {\n markNodeKeys.add(key);\n }\n }\n }\n }\n });\n },\n {skipInitialization: false},\n ),\n editor.registerUpdateListener(({editorState, tags}) => {\n editorState.read(() => {\n const selection = $getSelection();\n let hasActiveIds = false;\n let hasAnchorKey = false;\n\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n\n if ($isTextNode(anchorNode)) {\n const commentIDs = $getMarkIDs(\n anchorNode,\n selection.anchor.offset,\n );\n if (commentIDs !== null) {\n setActiveIDs(commentIDs);\n hasActiveIds = true;\n }\n if (!selection.isCollapsed()) {\n setActiveAnchorKey(anchorNode.getKey());\n hasAnchorKey = true;\n }\n }\n }\n if (!hasActiveIds) {\n setActiveIDs((_activeIds) =>\n _activeIds.length === 0 ? _activeIds : [],\n );\n }\n if (!hasAnchorKey) {\n setActiveAnchorKey(null);\n }\n if (!tags.has(COLLABORATION_TAG) && $isRangeSelection(selection)) {\n setShowCommentInput(false);\n }\n });\n }),\n editor.registerCommand(\n INSERT_INLINE_COMMAND,\n () => {\n const domSelection = getDOMSelection(editor._window);\n if (domSelection !== null) {\n domSelection.removeAllRanges();\n }\n setShowCommentInput(true);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n );\n }, [editor, markNodeMap]);\n\n const onAddComment = () => {\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\n };\n\n return (\n <>\n {showCommentInput &&\n createPortal(\n <CommentInputBox\n editor={editor}\n cancelAddComment={cancelAddComment}\n submitAddComment={submitAddComment}\n />,\n document.body,\n )}\n {activeAnchorKey !== null &&\n activeAnchorKey !== undefined &&\n !showCommentInput &&\n createPortal(\n <AddCommentBox\n anchorKey={activeAnchorKey}\n editor={editor}\n onAddComment={onAddComment}\n />,\n document.body,\n )}\n {createPortal(\n <Button\n className={`CommentPlugin_ShowCommentsButton ${\n showComments ? 'active' : ''\n }`}\n onClick={() => setShowComments(!showComments)}\n title={showComments ? 'Hide Comments' : 'Show Comments'}>\n <i className=\"comments\" />\n </Button>,\n document.body,\n )}\n {showComments &&\n createPortal(\n <CommentsPanel\n comments={comments}\n submitAddComment={submitAddComment}\n deleteCommentOrThread={deleteCommentOrThread}\n activeIDs={activeIDs}\n markNodeMap={markNodeMap}\n />,\n document.body,\n )}\n </>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalEditor} from 'lexical';\r\n\r\nimport {Provider, TOGGLE_CONNECT_COMMAND} from '@lexical/yjs';\r\nimport {COMMAND_PRIORITY_LOW} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\nimport {\r\n Array as YArray,\r\n Map as YMap,\r\n Transaction,\r\n YArrayEvent,\r\n YEvent,\r\n} from 'yjs';\r\n\r\nexport type Comment = {\r\n author: string;\r\n content: string;\r\n deleted: boolean;\r\n id: string;\r\n timeStamp: number;\r\n type: 'comment';\r\n};\r\n\r\nexport type Thread = {\r\n comments: Array<Comment>;\r\n id: string;\r\n quote: string;\r\n type: 'thread';\r\n};\r\n\r\nexport type Comments = Array<Thread | Comment>;\r\n\r\nfunction createUID(): string {\r\n return Math.random()\r\n .toString(36)\r\n .replace(/[^a-z]+/g, '')\r\n .substring(0, 5);\r\n}\r\n\r\nexport function createComment(\r\n content: string,\r\n author: string,\r\n id?: string,\r\n timeStamp?: number,\r\n deleted?: boolean,\r\n): Comment {\r\n return {\r\n author,\r\n content,\r\n deleted: deleted === undefined ? false : deleted,\r\n id: id === undefined ? createUID() : id,\r\n timeStamp:\r\n timeStamp === undefined\r\n ? performance.timeOrigin + performance.now()\r\n : timeStamp,\r\n type: 'comment',\r\n };\r\n}\r\n\r\nexport function createThread(\r\n quote: string,\r\n comments: Array<Comment>,\r\n id?: string,\r\n): Thread {\r\n return {\r\n comments,\r\n id: id === undefined ? createUID() : id,\r\n quote,\r\n type: 'thread',\r\n };\r\n}\r\n\r\nfunction cloneThread(thread: Thread): Thread {\r\n return {\r\n comments: Array.from(thread.comments),\r\n id: thread.id,\r\n quote: thread.quote,\r\n type: 'thread',\r\n };\r\n}\r\n\r\nfunction markDeleted(comment: Comment): Comment {\r\n return {\r\n author: comment.author,\r\n content: '[Deleted Comment]',\r\n deleted: true,\r\n id: comment.id,\r\n timeStamp: comment.timeStamp,\r\n type: 'comment',\r\n };\r\n}\r\n\r\nfunction triggerOnChange(commentStore: CommentStore): void {\r\n const listeners = commentStore._changeListeners;\r\n for (const listener of listeners) {\r\n listener();\r\n }\r\n}\r\n\r\nexport class CommentStore {\r\n _editor: LexicalEditor;\r\n _comments: Comments;\r\n _changeListeners: Set<() => void>;\r\n _collabProvider: null | Provider;\r\n\r\n constructor(editor: LexicalEditor) {\r\n this._comments = [];\r\n this._editor = editor;\r\n this._collabProvider = null;\r\n this._changeListeners = new Set();\r\n }\r\n\r\n isCollaborative(): boolean {\r\n return this._collabProvider !== null;\r\n }\r\n\r\n getComments(): Comments {\r\n return this._comments;\r\n }\r\n\r\n addComment(\r\n commentOrThread: Comment | Thread,\r\n thread?: Thread,\r\n offset?: number,\r\n ): void {\r\n const nextComments = Array.from(this._comments);\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sharedCommentsArray: YArray<any> | null = this._getCollabComments();\r\n\r\n if (thread !== undefined && commentOrThread.type === 'comment') {\r\n for (let i = 0; i < nextComments.length; i++) {\r\n const comment = nextComments[i];\r\n if (comment.type === 'thread' && comment.id === thread.id) {\r\n const newThread = cloneThread(comment);\r\n nextComments.splice(i, 1, newThread);\r\n const insertOffset =\r\n offset !== undefined ? offset : newThread.comments.length;\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n const parentSharedArray = sharedCommentsArray\r\n .get(i)\r\n .get('comments');\r\n this._withRemoteTransaction(() => {\r\n const sharedMap = this._createCollabSharedMap(commentOrThread);\r\n parentSharedArray.insert(insertOffset, [sharedMap]);\r\n });\r\n }\r\n newThread.comments.splice(insertOffset, 0, commentOrThread);\r\n break;\r\n }\r\n }\r\n } else {\r\n const insertOffset = offset !== undefined ? offset : nextComments.length;\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n this._withRemoteTransaction(() => {\r\n const sharedMap = this._createCollabSharedMap(commentOrThread);\r\n sharedCommentsArray.insert(insertOffset, [sharedMap]);\r\n });\r\n }\r\n nextComments.splice(insertOffset, 0, commentOrThread);\r\n }\r\n this._comments = nextComments;\r\n triggerOnChange(this);\r\n }\r\n\r\n deleteCommentOrThread(\r\n commentOrThread: Comment | Thread,\r\n thread?: Thread,\r\n ): {markedComment: Comment; index: number} | null {\r\n const nextComments = Array.from(this._comments);\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sharedCommentsArray: YArray<any> | null = this._getCollabComments();\r\n let commentIndex: number | null = null;\r\n\r\n if (thread !== undefined) {\r\n for (let i = 0; i < nextComments.length; i++) {\r\n const nextComment = nextComments[i];\r\n if (nextComment.type === 'thread' && nextComment.id === thread.id) {\r\n const newThread = cloneThread(nextComment);\r\n nextComments.splice(i, 1, newThread);\r\n const threadComments = newThread.comments;\r\n commentIndex = threadComments.indexOf(commentOrThread as Comment);\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n const parentSharedArray = sharedCommentsArray\r\n .get(i)\r\n .get('comments');\r\n this._withRemoteTransaction(() => {\r\n parentSharedArray.delete(commentIndex);\r\n });\r\n }\r\n threadComments.splice(commentIndex, 1);\r\n break;\r\n }\r\n }\r\n } else {\r\n commentIndex = nextComments.indexOf(commentOrThread);\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n this._withRemoteTransaction(() => {\r\n sharedCommentsArray.delete(commentIndex as number);\r\n });\r\n }\r\n nextComments.splice(commentIndex, 1);\r\n }\r\n this._comments = nextComments;\r\n triggerOnChange(this);\r\n\r\n if (commentOrThread.type === 'comment') {\r\n return {\r\n index: commentIndex as number,\r\n markedComment: markDeleted(commentOrThread),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n registerOnChange(onChange: () => void): () => void {\r\n const changeListeners = this._changeListeners;\r\n changeListeners.add(onChange);\r\n return () => {\r\n changeListeners.delete(onChange);\r\n };\r\n }\r\n\r\n _withRemoteTransaction(fn: () => void): void {\r\n const provider = this._collabProvider;\r\n if (provider !== null) {\r\n // @ts-expect-error doc does exist\r\n const doc = provider.doc;\r\n doc.transact(fn, this);\r\n }\r\n }\r\n\r\n _withLocalTransaction(fn: () => void): void {\r\n const collabProvider = this._collabProvider;\r\n try {\r\n this._collabProvider = null;\r\n fn();\r\n } finally {\r\n this._collabProvider = collabProvider;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n _getCollabComments(): null | YArray<any> {\r\n const provider = this._collabProvider;\r\n if (provider !== null) {\r\n // @ts-expect-error doc does exist\r\n const doc = provider.doc;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return doc.get('comments', YArray) as YArray<any>;\r\n }\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n _createCollabSharedMap(commentOrThread: Comment | Thread): YMap<any> {\r\n const sharedMap = new YMap();\r\n const type = commentOrThread.type;\r\n const id = commentOrThread.id;\r\n sharedMap.set('type', type);\r\n sharedMap.set('id', id);\r\n if (type === 'comment') {\r\n sharedMap.set('author', commentOrThread.author);\r\n sharedMap.set('content', commentOrThread.content);\r\n sharedMap.set('deleted', commentOrThread.deleted);\r\n sharedMap.set('timeStamp', commentOrThread.timeStamp);\r\n } else {\r\n sharedMap.set('quote', commentOrThread.quote);\r\n const commentsArray = new YArray();\r\n commentOrThread.comments.forEach((comment, i) => {\r\n const sharedChildComment = this._createCollabSharedMap(comment);\r\n commentsArray.insert(i, [sharedChildComment]);\r\n });\r\n sharedMap.set('comments', commentsArray);\r\n }\r\n return sharedMap;\r\n }\r\n\r\n registerCollaboration(provider: Provider): () => void {\r\n this._collabProvider = provider;\r\n const sharedCommentsArray = this._getCollabComments();\r\n\r\n const connect = () => {\r\n provider.connect();\r\n };\r\n\r\n const disconnect = () => {\r\n try {\r\n provider.disconnect();\r\n } catch (_e) {\r\n // Do nothing\r\n }\r\n };\r\n\r\n const unsubscribe = this._editor.registerCommand(\r\n TOGGLE_CONNECT_COMMAND,\r\n (payload) => {\r\n if (connect !== undefined && disconnect !== undefined) {\r\n const shouldConnect = payload;\r\n\r\n if (shouldConnect) {\r\n // eslint-disable-next-line no-console\r\n console.log('Comments connected!');\r\n connect();\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.log('Comments disconnected!');\r\n disconnect();\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n\r\n const onSharedCommentChanges = (\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n events: Array<YEvent<any>>,\r\n transaction: Transaction,\r\n ) => {\r\n if (transaction.origin !== this) {\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i];\r\n\r\n if (event instanceof YArrayEvent) {\r\n const target = event.target;\r\n const deltas = event.delta;\r\n let offset = 0;\r\n\r\n for (let s = 0; s < deltas.length; s++) {\r\n const delta = deltas[s];\r\n const insert = delta.insert;\r\n const retain = delta.retain;\r\n const del = delta.delete;\r\n const parent = target.parent;\r\n const parentThread =\r\n target === sharedCommentsArray\r\n ? undefined\r\n : parent instanceof YMap &&\r\n (this._comments.find((t) => t.id === parent.get('id')) as\r\n | Thread\r\n | undefined);\r\n\r\n if (Array.isArray(insert)) {\r\n insert\r\n .slice()\r\n .reverse()\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .forEach((map: YMap<any>) => {\r\n const id = map.get('id');\r\n const type = map.get('type');\r\n\r\n const commentOrThread =\r\n type === 'thread'\r\n ? createThread(\r\n map.get('quote'),\r\n map\r\n .get('comments')\r\n .toArray()\r\n .map(\r\n (\r\n innerComment: Map<\r\n string,\r\n string | number | boolean\r\n >,\r\n ) =>\r\n createComment(\r\n innerComment.get('content') as string,\r\n innerComment.get('author') as string,\r\n innerComment.get('id') as string,\r\n innerComment.get('timeStamp') as number,\r\n innerComment.get('deleted') as boolean,\r\n ),\r\n ),\r\n id,\r\n )\r\n : createComment(\r\n map.get('content'),\r\n map.get('author'),\r\n id,\r\n map.get('timeStamp'),\r\n map.get('deleted'),\r\n );\r\n this._withLocalTransaction(() => {\r\n this.addComment(\r\n commentOrThread,\r\n parentThread as Thread,\r\n offset,\r\n );\r\n });\r\n });\r\n } else if (typeof retain === 'number') {\r\n offset += retain;\r\n } else if (typeof del === 'number') {\r\n for (let d = 0; d < del; d++) {\r\n const commentOrThread =\r\n parentThread === undefined || parentThread === false\r\n ? this._comments[offset]\r\n : parentThread.comments[offset];\r\n this._withLocalTransaction(() => {\r\n this.deleteCommentOrThread(\r\n commentOrThread,\r\n parentThread as Thread,\r\n );\r\n });\r\n offset++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (sharedCommentsArray === null) {\r\n return () => null;\r\n }\r\n\r\n sharedCommentsArray.observeDeep(onSharedCommentChanges);\r\n\r\n connect();\r\n\r\n return () => {\r\n sharedCommentsArray.unobserveDeep(onSharedCommentChanges);\r\n unsubscribe();\r\n this._collabProvider = null;\r\n };\r\n }\r\n}\r\n\r\nexport function useCommentStore(commentStore: CommentStore): Comments {\r\n const [comments, setComments] = useState<Comments>(\r\n commentStore.getComments(),\r\n );\r\n\r\n useEffect(() => {\r\n return commentStore.registerOnChange(() => {\r\n setComments(commentStore.getComments());\r\n });\r\n }, [commentStore]);\r\n\r\n return comments;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {EditorThemeClasses} from 'lexical';\r\n\r\nimport './CommentEditorTheme.css';\r\n\r\nimport baseTheme from './PlaygroundEditorTheme';\r\n\r\nconst theme: EditorThemeClasses = {\r\n ...baseTheme,\r\n paragraph: 'CommentEditorTheme__paragraph',\r\n};\r\n\r\nexport default theme;\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$createCodeNode} from '@lexical/code';\r\nimport {\r\n INSERT_CHECK_LIST_COMMAND,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport {INSERT_EMBED_COMMAND} from '@lexical/react/LexicalAutoEmbedPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {INSERT_HORIZONTAL_RULE_COMMAND} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {\r\n LexicalTypeaheadMenuPlugin,\r\n MenuOption,\r\n useBasicTypeaheadTriggerMatch,\r\n} from '@lexical/react/LexicalTypeaheadMenuPlugin';\r\nimport {$createHeadingNode, $createQuoteNode} from '@lexical/rich-text';\r\nimport {$setBlocksType} from '@lexical/selection';\r\nimport {INSERT_TABLE_COMMAND} from '@lexical/table';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n LexicalEditor,\r\n TextNode,\r\n} from 'lexical';\r\nimport {useCallback, useMemo, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport {EmbedConfigs} from '../AutoEmbedPlugin';\r\nimport {INSERT_COLLAPSIBLE_COMMAND} from '../CollapsiblePlugin';\r\nimport {INSERT_DATETIME_COMMAND} from '../DateTimePlugin';\r\nimport {InsertEquationDialog} from '../EquationsPlugin';\r\nimport {INSERT_EXCALIDRAW_COMMAND} from '../ExcalidrawPlugin';\r\nimport {InsertImageDialog} from '../ImagesPlugin';\r\nimport InsertLayoutDialog from '../LayoutPlugin/InsertLayoutDialog';\r\nimport {INSERT_PAGE_BREAK} from '../PageBreakPlugin';\r\nimport {InsertNotesDialog} from '../NotesPlugin';\r\nimport {InsertPollDialog} from '../PollPlugin';\r\nimport {InsertRevisionDialog} from '../RevisionPlugin';\r\nimport {InsertTerminologyDialog} from '../TerminologyPlugin';\r\nimport {InsertTableDialog} from '../TablePlugin';\r\n\r\nexport class ComponentPickerOption extends MenuOption {\r\n // What shows up in the editor\r\n title: string;\r\n // Icon for display\r\n icon?: JSX.Element;\r\n // For extra searching.\r\n keywords: Array<string>;\r\n // TBD\r\n keyboardShortcut?: string;\r\n // What happens when you select this option?\r\n onSelect: (queryString: string) => void;\r\n\r\n constructor(\r\n title: string,\r\n options: {\r\n icon?: JSX.Element;\r\n keywords?: Array<string>;\r\n keyboardShortcut?: string;\r\n onSelect: (queryString: string) => void;\r\n },\r\n ) {\r\n super(title);\r\n this.title = title;\r\n this.keywords = options.keywords || [];\r\n this.icon = options.icon;\r\n this.keyboardShortcut = options.keyboardShortcut;\r\n this.onSelect = options.onSelect.bind(this);\r\n }\r\n}\r\n\r\nexport function ComponentPickerMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: ComponentPickerOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n {option.icon}\r\n <span className=\"text\">{option.title}</span>\r\n </li>\r\n );\r\n}\r\n\r\nexport function getDynamicOptions(editor: LexicalEditor, queryString: string) {\r\n const options: Array<ComponentPickerOption> = [];\r\n\r\n if (queryString == null) {\r\n return options;\r\n }\r\n\r\n const tableMatch = queryString.match(/^([1-9]\\d?)(?:x([1-9]\\d?)?)?$/);\r\n\r\n if (tableMatch !== null) {\r\n const rows = tableMatch[1];\r\n const colOptions = tableMatch[2]\r\n ? [tableMatch[2]]\r\n : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(String);\r\n\r\n options.push(\r\n ...colOptions.map(\r\n (columns) =>\r\n new ComponentPickerOption(`${rows}x${columns} Table`, {\r\n icon: <i className=\"icon table\" />,\r\n keywords: ['table'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {columns, rows}),\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n return options;\r\n}\r\n\r\nexport type ShowModal = ReturnType<typeof useModal>[1];\r\n\r\nexport function getBaseOptions(editor: LexicalEditor, showModal: ShowModal) {\r\n return [\r\n new ComponentPickerOption('Paragraph', {\r\n icon: <i className=\"icon paragraph\" />,\r\n keywords: ['normal', 'paragraph', 'p', 'text'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n }\r\n }),\r\n }),\r\n ...([1, 2, 3] as const).map(\r\n (n) =>\r\n new ComponentPickerOption(`Heading ${n}`, {\r\n icon: <i className={`icon h${n}`} />,\r\n keywords: ['heading', 'header', `h${n}`],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(`h${n}`));\r\n }\r\n }),\r\n }),\r\n ),\r\n new ComponentPickerOption('Table', {\r\n icon: <i className=\"icon table\" />,\r\n keywords: ['table', 'grid', 'spreadsheet', 'rows', 'columns'],\r\n onSelect: () =>\r\n showModal('Insert Table', (onClose) => (\r\n <InsertTableDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Numbered List', {\r\n icon: <i className=\"icon number\" />,\r\n keywords: ['numbered list', 'ordered list', 'ol'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Bulleted List', {\r\n icon: <i className=\"icon bullet\" />,\r\n keywords: ['bulleted list', 'unordered list', 'ul'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Check List', {\r\n icon: <i className=\"icon check\" />,\r\n keywords: ['check list', 'todo list'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Quote', {\r\n icon: <i className=\"icon quote\" />,\r\n keywords: ['block quote'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n }),\r\n }),\r\n new ComponentPickerOption('Code', {\r\n icon: <i className=\"icon code\" />,\r\n keywords: ['javascript', 'python', 'js', 'codeblock'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n if (selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n } else {\r\n // Will this ever happen?\r\n const textContent = selection.getTextContent();\r\n const codeNode = $createCodeNode();\r\n selection.insertNodes([codeNode]);\r\n selection.insertRawText(textContent);\r\n }\r\n }\r\n }),\r\n }),\r\n new ComponentPickerOption('Divider', {\r\n icon: <i className=\"icon horizontal-rule\" />,\r\n keywords: ['horizontal rule', 'divider', 'hr'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Page Break', {\r\n icon: <i className=\"icon page-break\" />,\r\n keywords: ['page break', 'divider'],\r\n onSelect: () => editor.dispatchCommand(INSERT_PAGE_BREAK, undefined),\r\n }),\r\n new ComponentPickerOption('Excalidraw', {\r\n icon: <i className=\"icon diagram-2\" />,\r\n keywords: ['excalidraw', 'diagram', 'drawing'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_EXCALIDRAW_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Poll', {\r\n icon: <i className=\"icon poll\" />,\r\n keywords: ['poll', 'vote'],\r\n onSelect: () =>\r\n showModal('Insert Poll', (onClose) => (\r\n <InsertPollDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n ...EmbedConfigs.map(\r\n (embedConfig) =>\r\n new ComponentPickerOption(`Embed ${embedConfig.contentName}`, {\r\n icon: embedConfig.icon,\r\n keywords: [...embedConfig.keywords, 'embed'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_EMBED_COMMAND, embedConfig.type),\r\n }),\r\n ),\r\n new ComponentPickerOption('Date', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Today', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'today'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Tomorrow', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'tomorrow'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setDate(dateTime.getDate() + 1);\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Yesterday', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'yesterday'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setDate(dateTime.getDate() - 1);\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Equation', {\r\n icon: <i className=\"icon equation\" />,\r\n keywords: ['equation', 'latex', 'math'],\r\n onSelect: () =>\r\n showModal('Insert Equation', (onClose) => (\r\n <InsertEquationDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('GIF', {\r\n icon: <i className=\"icon gif\" />,\r\n keywords: ['gif', 'animate', 'image', 'file'],\r\n onSelect: () =>\r\n showModal('Insert GIF', (onClose) => (\r\n <InsertImageDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Image', {\r\n icon: <i className=\"icon image\" />,\r\n keywords: ['image', 'photo', 'picture', 'file'],\r\n onSelect: () =>\r\n showModal('Insert Image', (onClose) => (\r\n <InsertImageDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Collapsible', {\r\n icon: <i className=\"icon caret-right\" />,\r\n keywords: ['collapse', 'collapsible', 'toggle'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_COLLAPSIBLE_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Columns Layout', {\r\n icon: <i className=\"icon columns\" />,\r\n keywords: ['columns', 'layout', 'grid'],\r\n onSelect: () =>\r\n showModal('Insert Columns Layout', (onClose) => (\r\n <InsertLayoutDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Terminology', {\r\n icon: <i className=\"icon quote\" />,\r\n keywords: ['terminology', 'terms', 'definitions', 'glossary', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Terminology', (onClose) => (\r\n <InsertTerminologyDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Notes', {\r\n icon: <i className=\"icon paragraph\" />,\r\n keywords: ['notes', 'formatted', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Notes', (onClose) => (\r\n <InsertNotesDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Revision Points', {\r\n icon: <i className=\"icon check-list\" />,\r\n keywords: ['revision', 'review', 'checklist', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Revision Points', (onClose) => (\r\n <InsertRevisionDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n ...(['left', 'center', 'right', 'justify'] as const).map(\r\n (alignment) =>\r\n new ComponentPickerOption(`Align ${alignment}`, {\r\n icon: <i className={`icon ${alignment}-align`} />,\r\n keywords: ['align', 'justify', alignment],\r\n onSelect: () =>\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment),\r\n }),\r\n ),\r\n ];\r\n}\r\n\r\nexport default function ComponentPickerMenuPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [modal, showModal] = useModal();\r\n const [queryString, setQueryString] = useState<string | null>(null);\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch('/', {\r\n allowWhitespace: true,\r\n minLength: 0,\r\n });\r\n\r\n const options = useMemo(() => {\r\n const baseOptions = getBaseOptions(editor, showModal);\r\n\r\n if (!queryString) {\r\n return baseOptions;\r\n }\r\n\r\n const regex = new RegExp(queryString, 'i');\r\n\r\n return [\r\n ...getDynamicOptions(editor, queryString),\r\n ...baseOptions.filter(\r\n (option) =>\r\n regex.test(option.title) ||\r\n option.keywords.some((keyword) => regex.test(keyword)),\r\n ),\r\n ];\r\n }, [editor, queryString, showModal]);\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: ComponentPickerOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void,\r\n matchingString: string,\r\n ) => {\r\n editor.update(() => {\r\n nodeToRemove?.remove();\r\n selectedOption.onSelect(matchingString);\r\n closeMenu();\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalTypeaheadMenuPlugin<ComponentPickerOption>\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForTriggerMatch}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) =>\r\n anchorElementRef.current && options.length\r\n ? ReactDOM.createPortal(\r\n <div className=\"typeahead-popover component-picker-menu\">\r\n <ul>\r\n {options.map((option, i: number) => (\r\n <ComponentPickerMenuItem\r\n index={i}\r\n isSelected={selectedIndex === i}\r\n onClick={() => {\r\n setHighlightedIndex(i);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onMouseEnter={() => {\r\n setHighlightedIndex(i);\r\n }}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null\r\n }\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createDateTimeNode,\r\n DateTimeNode,\r\n} from '../../nodes/DateTimeNode/DateTimeNode';\r\n\r\ntype CommandPayload = {\r\n dateTime: Date;\r\n};\r\n\r\nexport const INSERT_DATETIME_COMMAND: LexicalCommand<CommandPayload> =\r\n createCommand('INSERT_DATETIME_COMMAND');\r\n\r\nexport default function DateTimePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([DateTimeNode])) {\r\n throw new Error('DateTimePlugin: DateTimeNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<CommandPayload>(\r\n INSERT_DATETIME_COMMAND,\r\n (payload) => {\r\n const {dateTime} = payload;\r\n const dateTimeNode = $createDateTimeNode(dateTime);\r\n\r\n $insertNodes([dateTimeNode]);\r\n if ($isRootOrShadowRoot(dateTimeNode.getParentOrThrow())) {\r\n $wrapNodeInElement(dateTimeNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useCallback, useEffect} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {$createEquationNode, EquationNode} from '../../nodes/EquationNode';\r\nimport KatexEquationAlterer from '../../ui/KatexEquationAlterer';\r\n\r\ntype CommandPayload = {\r\n equation: string;\r\n inline: boolean;\r\n};\r\n\r\nexport const INSERT_EQUATION_COMMAND: LexicalCommand<CommandPayload> =\r\n createCommand('INSERT_EQUATION_COMMAND');\r\n\r\nexport function InsertEquationDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const onEquationConfirm = useCallback(\r\n (equation: string, inline: boolean) => {\r\n activeEditor.dispatchCommand(INSERT_EQUATION_COMMAND, {equation, inline});\r\n onClose();\r\n },\r\n [activeEditor, onClose],\r\n );\r\n\r\n return <KatexEquationAlterer onConfirm={onEquationConfirm} />;\r\n}\r\n\r\nexport default function EquationsPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([EquationNode])) {\r\n throw new Error(\r\n 'EquationsPlugins: EquationsNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerCommand<CommandPayload>(\r\n INSERT_EQUATION_COMMAND,\r\n (payload) => {\r\n const {equation, inline} = payload;\r\n const equationNode = $createEquationNode(equation, inline);\r\n\r\n $insertNodes([equationNode]);\r\n if ($isRootOrShadowRoot(equationNode.getParentOrThrow())) {\r\n $wrapNodeInElement(equationNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './KatexEquationAlterer.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport * as React from 'react';\r\nimport {useCallback, useState} from 'react';\r\nimport {ErrorBoundary} from 'react-error-boundary';\r\n\r\nimport Button from '../ui/Button';\r\nimport KatexRenderer from './KatexRenderer';\r\n\r\ntype Props = {\r\n initialEquation?: string;\r\n onConfirm: (equation: string, inline: boolean) => void;\r\n};\r\n\r\nexport default function KatexEquationAlterer({\r\n onConfirm,\r\n initialEquation = '',\r\n}: Props): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [equation, setEquation] = useState<string>(initialEquation);\r\n const [inline, setInline] = useState<boolean>(true);\r\n\r\n const onClick = useCallback(() => {\r\n onConfirm(equation, inline);\r\n }, [onConfirm, equation, inline]);\r\n\r\n const onCheckboxChange = useCallback(() => {\r\n setInline(!inline);\r\n }, [setInline, inline]);\r\n\r\n return (\r\n <>\r\n <div className=\"KatexEquationAlterer_defaultRow\">\r\n Inline\r\n <input type=\"checkbox\" checked={inline} onChange={onCheckboxChange} />\r\n </div>\r\n <div className=\"KatexEquationAlterer_defaultRow\">Equation </div>\r\n <div className=\"KatexEquationAlterer_centerRow\">\r\n {inline ? (\r\n <input\r\n onChange={(event) => {\r\n setEquation(event.target.value);\r\n }}\r\n value={equation}\r\n className=\"KatexEquationAlterer_textArea\"\r\n />\r\n ) : (\r\n <textarea\r\n onChange={(event) => {\r\n setEquation(event.target.value);\r\n }}\r\n value={equation}\r\n className=\"KatexEquationAlterer_textArea\"\r\n />\r\n )}\r\n </div>\r\n <div className=\"KatexEquationAlterer_defaultRow\">Visualization </div>\r\n <div className=\"KatexEquationAlterer_centerRow\">\r\n <ErrorBoundary onError={(e: unknown) => editor._onError(e instanceof Error ? e : new Error(String(e)))} fallback={null}>\r\n <KatexRenderer\r\n equation={equation}\r\n inline={false}\r\n onDoubleClick={() => null}\r\n />\r\n </ErrorBoundary>\r\n </div>\r\n <div className=\"KatexEquationAlterer_dialogActions\">\r\n <Button onClick={onClick}>Confirm</Button>\r\n </div>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {ExcalidrawInitialElements} from '../../ui/ExcalidrawModal';\r\nimport type {AppState, BinaryFiles} from '@excalidraw/excalidraw/types';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\n\r\nimport {\r\n $createExcalidrawNode,\r\n ExcalidrawNode,\r\n} from '../../nodes/ExcalidrawNode';\r\nimport ExcalidrawModal from '../../ui/ExcalidrawModal';\r\n\r\nexport const INSERT_EXCALIDRAW_COMMAND: LexicalCommand<void> = createCommand(\r\n 'INSERT_EXCALIDRAW_COMMAND',\r\n);\r\n\r\nexport default function ExcalidrawPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const [isModalOpen, setModalOpen] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([ExcalidrawNode])) {\r\n throw new Error(\r\n 'ExcalidrawPlugin: ExcalidrawNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerCommand(\r\n INSERT_EXCALIDRAW_COMMAND,\r\n () => {\r\n setModalOpen(true);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n const onClose = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const onDelete = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const onSave = (\r\n elements: ExcalidrawInitialElements,\r\n appState: Partial<AppState>,\r\n files: BinaryFiles,\r\n ) => {\r\n editor.update(() => {\r\n const excalidrawNode = $createExcalidrawNode();\r\n excalidrawNode.setData(\r\n JSON.stringify({\r\n appState,\r\n elements,\r\n files,\r\n }),\r\n );\r\n $insertNodes([excalidrawNode]);\r\n if ($isRootOrShadowRoot(excalidrawNode.getParentOrThrow())) {\r\n $wrapNodeInElement(excalidrawNode, $createParagraphNode).selectEnd();\r\n }\r\n });\r\n setModalOpen(false);\r\n };\r\n\r\n return isModalOpen ? (\r\n <ExcalidrawModal\r\n initialElements={[]}\r\n initialAppState={{} as AppState}\r\n initialFiles={{}}\r\n isShown={isModalOpen}\r\n onDelete={onDelete}\r\n onClose={onClose}\r\n onSave={onSave}\r\n closeOnClickOutside={false}\r\n />\r\n ) : null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n LinkNode,\r\n TOGGLE_LINK_COMMAND,\r\n} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $wrapNodeInElement,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $createRangeSelection,\r\n $getSelection,\r\n $insertNodes,\r\n $isNodeSelection,\r\n $isRootOrShadowRoot,\r\n $setSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGOVER_COMMAND,\r\n DRAGSTART_COMMAND,\r\n DROP_COMMAND,\r\n getDOMSelectionFromTarget,\r\n isHTMLElement,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {useEditorConfig} from '../../context/EditorConfigContext';\r\nimport landscapeImageImport from '../../images/landscape.jpg';\r\nimport yellowFlowerImageImport from '../../images/yellow-flower.jpg';\r\nimport {\r\n $createImageNode,\r\n $isImageNode,\r\n ImageNode,\r\n ImagePayload,\r\n} from '../../nodes/ImageNode';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions, DialogButtonsList} from '../../ui/Dialog';\r\nimport FileInput from '../../ui/FileInput';\r\nimport TextInput from '../../ui/TextInput';\r\nimport {uploadImageToBaasix} from '../../utils/baasixUpload';\r\n\r\nconst landscapeImage = (typeof landscapeImageImport === 'string' ? landscapeImageImport : (landscapeImageImport as {src: string}).src) as string;\r\nconst yellowFlowerImage = (typeof yellowFlowerImageImport === 'string' ? yellowFlowerImageImport : (yellowFlowerImageImport as {src: string}).src) as string;\r\n\r\nexport type InsertImagePayload = Readonly<ImagePayload>;\r\n\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<InsertImagePayload> =\r\n createCommand('INSERT_IMAGE_COMMAND');\r\n\r\nexport function InsertImageUriDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void;\r\n}) {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n\r\n const isDisabled = src === '';\r\n\r\n return (\r\n <>\r\n <TextInput\r\n label=\"Image URL\"\r\n placeholder=\"i.e. https://source.unsplash.com/random\"\r\n onChange={setSrc}\r\n value={src}\r\n data-test-id=\"image-modal-url-input\"\r\n />\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Random unsplash image\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-confirm-btn\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({altText, src})}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function InsertImageUploadedDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void;\r\n}) {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n const [isUploading, setIsUploading] = useState(false);\r\n const {baasixClient, folder} = useEditorConfig();\r\n\r\n const isDisabled = src === '' || isUploading;\r\n\r\n const loadImage = (files: FileList | null) => {\r\n if (files === null || files.length === 0) {\r\n return;\r\n }\r\n const file = files[0];\r\n setIsUploading(true);\r\n uploadImageToBaasix(baasixClient, file, folder)\r\n .then((url) => {\r\n setSrc(url);\r\n if (!altText) {\r\n setAltText(file.name);\r\n }\r\n })\r\n .catch(() => {\r\n // Fall back to data URL if upload fails\r\n const reader = new FileReader();\r\n reader.onload = function () {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n })\r\n .finally(() => {\r\n setIsUploading(false);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n <FileInput\r\n label=\"Image Upload\"\r\n onChange={loadImage}\r\n accept=\"image/*\"\r\n data-test-id=\"image-modal-file-upload\"\r\n />\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({altText, src})}>\r\n {isUploading ? 'Uploading...' : 'Confirm'}\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function InsertImageDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [mode, setMode] = useState<null | 'url' | 'file'>(null);\r\n const hasModifier = useRef(false);\r\n\r\n useEffect(() => {\r\n hasModifier.current = false;\r\n const handler = (e: KeyboardEvent) => {\r\n hasModifier.current = e.altKey;\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => {\r\n document.removeEventListener('keydown', handler);\r\n };\r\n }, [activeEditor]);\r\n\r\n const onClick = (payload: InsertImagePayload) => {\r\n activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n {!mode && (\r\n <DialogButtonsList>\r\n <Button\r\n data-test-id=\"image-modal-option-sample\"\r\n onClick={() =>\r\n onClick(\r\n hasModifier.current\r\n ? {\r\n altText:\r\n 'Daylight fir trees forest glacier green high ice landscape',\r\n src: landscapeImage,\r\n }\r\n : {\r\n altText: 'Yellow flower in tilt shift lens',\r\n src: yellowFlowerImage,\r\n },\r\n )\r\n }>\r\n Sample\r\n </Button>\r\n <Button\r\n data-test-id=\"image-modal-option-url\"\r\n onClick={() => setMode('url')}>\r\n URL\r\n </Button>\r\n <Button\r\n data-test-id=\"image-modal-option-file\"\r\n onClick={() => setMode('file')}>\r\n File\r\n </Button>\r\n </DialogButtonsList>\r\n )}\r\n {mode === 'url' && <InsertImageUriDialogBody onClick={onClick} />}\r\n {mode === 'file' && <InsertImageUploadedDialogBody onClick={onClick} />}\r\n </>\r\n );\r\n}\r\n\r\nexport default function ImagesPlugin({\r\n captionsEnabled,\r\n}: {\r\n captionsEnabled?: boolean;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([ImageNode])) {\r\n throw new Error('ImagesPlugin: ImageNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<InsertImagePayload>(\r\n INSERT_IMAGE_COMMAND,\r\n (payload) => {\r\n const imageNode = $createImageNode(payload);\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n return $onDragStart(event);\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => {\r\n return $onDragover(event);\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => {\r\n return $onDrop(event, editor);\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n );\r\n }, [captionsEnabled, editor]);\r\n\r\n return null;\r\n}\r\n\r\nconst TRANSPARENT_IMAGE =\r\n 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\r\nconst img = document.createElement('img');\r\nimg.src = TRANSPARENT_IMAGE;\r\n\r\nfunction $onDragStart(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) {\r\n return false;\r\n }\r\n dataTransfer.setData('text/plain', '_');\r\n dataTransfer.setDragImage(img, 0, 0);\r\n dataTransfer.setData(\r\n 'application/x-lexical-drag',\r\n JSON.stringify({\r\n data: {\r\n altText: node.__altText,\r\n caption: node.__caption,\r\n height: node.__height,\r\n key: node.getKey(),\r\n maxWidth: node.__maxWidth,\r\n showCaption: node.__showCaption,\r\n src: node.__src,\r\n width: node.__width,\r\n },\r\n type: 'image',\r\n }),\r\n );\r\n\r\n return true;\r\n}\r\n\r\nfunction $onDragover(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return false;\r\n}\r\n\r\nfunction $onDrop(event: DragEvent, editor: LexicalEditor): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n const data = getDragImageData(event);\r\n if (!data) {\r\n return false;\r\n }\r\n const existingLink = $findMatchingParent(\r\n node,\r\n (parent): parent is LinkNode =>\r\n !$isAutoLinkNode(parent) && $isLinkNode(parent),\r\n );\r\n event.preventDefault();\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n const rangeSelection = $createRangeSelection();\r\n if (range !== null && range !== undefined) {\r\n rangeSelection.applyDOMRange(range);\r\n }\r\n $setSelection(rangeSelection);\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, data);\r\n if (existingLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, existingLink.getURL());\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction $getImageNodeInSelection(): ImageNode | null {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) {\r\n return null;\r\n }\r\n const nodes = selection.getNodes();\r\n const node = nodes[0];\r\n return $isImageNode(node) ? node : null;\r\n}\r\n\r\nfunction getDragImageData(event: DragEvent): null | InsertImagePayload {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) {\r\n return null;\r\n }\r\n const {type, data} = JSON.parse(dragData);\r\n if (type !== 'image') {\r\n return null;\r\n }\r\n\r\n return data;\r\n}\r\n\r\ndeclare global {\r\n interface DragEvent {\r\n rangeOffset?: number;\r\n rangeParent?: Node;\r\n }\r\n}\r\n\r\nfunction canDropImage(event: DragEvent): boolean {\r\n const target = event.target;\r\n return !!(\r\n isHTMLElement(target) &&\r\n !target.closest('code, span.editor-image') &&\r\n isHTMLElement(target.parentElement) &&\r\n target.parentElement.closest('div.ContentEditable__root')\r\n );\r\n}\r\n\r\nfunction getDragSelection(event: DragEvent): Range | null | undefined {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if (event.rangeParent && domSelection !== null) {\r\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0);\r\n range = domSelection.getRangeAt(0);\r\n } else {\r\n throw Error(`Cannot get the selection when dragging`);\r\n }\r\n\r\n return range;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Input.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n accept?: string;\r\n label: string;\r\n onChange: (files: FileList | null) => void;\r\n}>;\r\n\r\nexport default function FileInput({\r\n accept,\r\n label,\r\n onChange,\r\n 'data-test-id': dataTestId,\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label className=\"Input__label\">{label}</label>\r\n <input\r\n type=\"file\"\r\n accept={accept}\r\n className=\"Input__input\"\r\n onChange={(e) => onChange(e.target.files)}\r\n data-test-id={dataTestId}\r\n />\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Input.css';\r\n\r\nimport * as React from 'react';\r\nimport {HTMLInputTypeAttribute} from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n label: string;\r\n onChange: (val: string) => void;\r\n placeholder?: string;\r\n value: string;\r\n type?: HTMLInputTypeAttribute;\r\n}>;\r\n\r\nexport default function TextInput({\r\n label,\r\n value,\r\n onChange,\r\n placeholder = '',\r\n 'data-test-id': dataTestId,\r\n type = 'text',\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label className=\"Input__label\">{label}</label>\r\n <input\r\n type={type}\r\n className=\"Input__input\"\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(e) => {\r\n onChange(e.target.value);\r\n }}\r\n data-test-id={dataTestId}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { Baasix } from '@baasix/sdk';\n\nexport async function uploadImageToBaasix(\n client: Baasix,\n file: File,\n folder?: string,\n): Promise<string> {\n const result: any = await client.files.upload(file, {\n folder: folder || undefined,\n });\n const id =\n result?.id ||\n result?.data?.id ||\n (typeof result?.data === 'string' ? result.data : undefined) ||\n (typeof result === 'string' ? result : undefined);\n return client.files.getAssetUrl(id);\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {LexicalEditor} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useState} from 'react';\r\n\r\nimport Button from '../../ui/Button';\r\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\r\nimport {INSERT_LAYOUT_COMMAND} from './LayoutPlugin';\r\n\r\nconst LAYOUTS = [\r\n {label: '2 columns (equal width)', value: '1fr 1fr'},\r\n {label: '2 columns (25% - 75%)', value: '1fr 3fr'},\r\n {label: '3 columns (equal width)', value: '1fr 1fr 1fr'},\r\n {label: '3 columns (25% - 50% - 25%)', value: '1fr 2fr 1fr'},\r\n {label: '4 columns (equal width)', value: '1fr 1fr 1fr 1fr'},\r\n];\r\n\r\nexport default function InsertLayoutDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [layout, setLayout] = useState(LAYOUTS[0].value);\r\n const buttonLabel = LAYOUTS.find((item) => item.value === layout)?.label;\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_LAYOUT_COMMAND, layout);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <DropDown\r\n buttonClassName=\"toolbar-item dialog-dropdown\"\r\n buttonLabel={buttonLabel}>\r\n {LAYOUTS.map(({label, value}) => (\r\n <DropDownItem\r\n key={value}\r\n className=\"item\"\r\n onClick={() => setLayout(value)}>\r\n <span className=\"text\">{label}</span>\r\n </DropDownItem>\r\n ))}\r\n </DropDown>\r\n <Button onClick={onClick}>Insert</Button>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {calculateZoomLevel} from '@lexical/utils';\r\nimport {isDOMNode} from 'lexical';\r\nimport * as React from 'react';\r\nimport {\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {focusNearestDescendant, isKeyboardInput} from '../utils/focusUtils';\r\n\r\ntype DropDownContextType = {\r\n registerItem: (ref: React.RefObject<null | HTMLButtonElement>) => void;\r\n};\r\n\r\nconst DropDownContext = React.createContext<DropDownContextType | null>(null);\r\n\r\nconst dropDownPadding = 4;\r\n\r\nexport function DropDownItem({\r\n children,\r\n className,\r\n onClick,\r\n title,\r\n}: {\r\n children: React.ReactNode;\r\n className: string;\r\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\r\n title?: string;\r\n}) {\r\n const ref = useRef<null | HTMLButtonElement>(null);\r\n\r\n const dropDownContext = React.useContext(DropDownContext);\r\n\r\n if (dropDownContext === null) {\r\n throw new Error('DropDownItem must be used within a DropDown');\r\n }\r\n\r\n const {registerItem} = dropDownContext;\r\n\r\n useEffect(() => {\r\n if (ref && ref.current) {\r\n registerItem(ref);\r\n }\r\n }, [ref, registerItem]);\r\n\r\n return (\r\n <button\r\n className={className}\r\n onClick={onClick}\r\n ref={ref}\r\n title={title}\r\n type=\"button\">\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nfunction DropDownItems({\r\n children,\r\n dropDownRef,\r\n onClose,\r\n autofocus,\r\n}: {\r\n children: React.ReactNode;\r\n dropDownRef: React.RefObject<HTMLDivElement | null>;\r\n onClose: () => void;\r\n autofocus: boolean;\r\n}) {\r\n const [items, setItems] =\r\n useState<React.RefObject<null | HTMLButtonElement>[]>();\r\n const [highlightedItem, setHighlightedItem] =\r\n useState<React.RefObject<null | HTMLButtonElement>>();\r\n\r\n const registerItem = useCallback(\r\n (itemRef: React.RefObject<null | HTMLButtonElement>) => {\r\n setItems((prev) => (prev ? [...prev, itemRef] : [itemRef]));\r\n },\r\n [setItems],\r\n );\r\n\r\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n const key = event.key;\r\n if (key === 'Escape') {\r\n onClose();\r\n }\r\n if (!items) {\r\n return;\r\n }\r\n\r\n if (['Escape', 'ArrowUp', 'ArrowDown', 'Tab'].includes(key)) {\r\n event.preventDefault();\r\n }\r\n\r\n if (key === 'Escape' || key === 'Tab') {\r\n onClose();\r\n } else if (key === 'ArrowUp') {\r\n setHighlightedItem((prev) => {\r\n if (!prev) {\r\n return items[0];\r\n }\r\n const index = items.indexOf(prev) - 1;\r\n return items[index === -1 ? items.length - 1 : index];\r\n });\r\n } else if (key === 'ArrowDown') {\r\n setHighlightedItem((prev) => {\r\n if (!prev) {\r\n return items[0];\r\n }\r\n return items[items.indexOf(prev) + 1];\r\n });\r\n }\r\n };\r\n\r\n const contextValue = useMemo(\r\n () => ({\r\n registerItem,\r\n }),\r\n [registerItem],\r\n );\r\n\r\n useEffect(() => {\r\n if (items && !highlightedItem) {\r\n setHighlightedItem(items[0]);\r\n }\r\n\r\n if (highlightedItem && highlightedItem.current) {\r\n highlightedItem.current.focus();\r\n }\r\n }, [items, highlightedItem]);\r\n\r\n useEffect(() => {\r\n if (autofocus && dropDownRef.current) {\r\n focusNearestDescendant(dropDownRef.current);\r\n }\r\n }, [autofocus, dropDownRef]);\r\n\r\n return (\r\n <DropDownContext.Provider value={contextValue}>\r\n <div className=\"dropdown\" ref={dropDownRef as React.RefObject<HTMLDivElement>} onKeyDown={handleKeyDown}>\r\n {children}\r\n </div>\r\n </DropDownContext.Provider>\r\n );\r\n}\r\n\r\nexport default function DropDown({\r\n disabled = false,\r\n buttonLabel,\r\n buttonAriaLabel,\r\n buttonClassName,\r\n buttonIconClassName,\r\n children,\r\n stopCloseOnClickSelf,\r\n hideChevron,\r\n}: {\r\n disabled?: boolean;\r\n buttonAriaLabel?: string;\r\n buttonClassName: string;\r\n buttonIconClassName?: string;\r\n buttonLabel?: string;\r\n children: ReactNode;\r\n stopCloseOnClickSelf?: boolean;\r\n hideChevron?: boolean;\r\n}): JSX.Element {\r\n const dropDownRef = useRef<HTMLDivElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const [showDropDown, setShowDropDown] = useState(false);\r\n const [shouldAutofocus, setShouldAutofocus] = useState(false);\r\n\r\n const handleClose = () => {\r\n setShowDropDown(false);\r\n if (buttonRef && buttonRef.current) {\r\n buttonRef.current.focus();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const button = buttonRef.current;\r\n const dropDown = dropDownRef.current;\r\n const zoom = calculateZoomLevel(dropDown, true);\r\n if (showDropDown && button !== null && dropDown !== null) {\r\n const {top, left} = button.getBoundingClientRect();\r\n dropDown.style.top = `${top / zoom + button.offsetHeight + dropDownPadding}px`;\r\n dropDown.style.left = `${\r\n Math.min(left, window.innerWidth - dropDown.offsetWidth - 20) / zoom\r\n }px`;\r\n }\r\n }, [dropDownRef, buttonRef, showDropDown]);\r\n\r\n useEffect(() => {\r\n const button = buttonRef.current;\r\n\r\n if (button !== null && showDropDown) {\r\n const handle = (event: PointerEvent) => {\r\n const target = event.target;\r\n if (!isDOMNode(target)) {\r\n return;\r\n }\r\n\r\n const targetIsDropDownItem =\r\n dropDownRef.current && dropDownRef.current.contains(target);\r\n if (stopCloseOnClickSelf && targetIsDropDownItem) {\r\n return;\r\n }\r\n\r\n if (!button.contains(target)) {\r\n setShowDropDown(false);\r\n\r\n if (targetIsDropDownItem && isKeyboardInput(event)) {\r\n button.focus();\r\n }\r\n }\r\n };\r\n document.addEventListener('click', handle);\r\n\r\n return () => {\r\n document.removeEventListener('click', handle);\r\n };\r\n }\r\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);\r\n\r\n useEffect(() => {\r\n const handleButtonPositionUpdate = () => {\r\n if (showDropDown) {\r\n const button = buttonRef.current;\r\n const dropDown = dropDownRef.current;\r\n const zoom = calculateZoomLevel(dropDown, true);\r\n if (button !== null && dropDown !== null) {\r\n const {top, left} = button.getBoundingClientRect();\r\n const newTop = top / zoom + button.offsetHeight + dropDownPadding;\r\n if (newTop !== dropDown.getBoundingClientRect().top / zoom) {\r\n dropDown.style.top = `${newTop}px`;\r\n }\r\n const newLeft = Math.min(left, window.innerWidth - dropDown.offsetWidth - 20) / zoom;\r\n dropDown.style.left = `${newLeft}px`;\r\n }\r\n }\r\n };\r\n\r\n // Collect ancestor scrollable containers (e.g. Sheet/Dialog overlay)\r\n const scrollableAncestors: (HTMLElement | Document)[] = [document];\r\n if (buttonRef.current) {\r\n let parent = buttonRef.current.parentElement;\r\n while (parent) {\r\n const style = window.getComputedStyle(parent);\r\n const overflow = style.overflow + style.overflowY;\r\n if (/auto|scroll/.test(overflow)) {\r\n scrollableAncestors.push(parent);\r\n }\r\n parent = parent.parentElement;\r\n }\r\n }\r\n\r\n for (const el of scrollableAncestors) {\r\n el.addEventListener('scroll', handleButtonPositionUpdate);\r\n }\r\n\r\n return () => {\r\n for (const el of scrollableAncestors) {\r\n el.removeEventListener('scroll', handleButtonPositionUpdate);\r\n }\r\n };\r\n }, [buttonRef, dropDownRef, showDropDown]);\r\n\r\n const handleOnClick = (e: React.MouseEvent) => {\r\n setShowDropDown(!showDropDown);\r\n setShouldAutofocus(isKeyboardInput(e));\r\n };\r\n\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-label={buttonAriaLabel || buttonLabel}\r\n className={buttonClassName}\r\n onClick={handleOnClick}\r\n ref={buttonRef}>\r\n {buttonIconClassName && <span className={buttonIconClassName} />}\r\n {buttonLabel && (\r\n <span className=\"text dropdown-button-text\">{buttonLabel}</span>\r\n )}\r\n {!hideChevron && <i className=\"chevron-down\" />}\r\n </button>\r\n\r\n {showDropDown &&\r\n createPortal(\r\n <DropDownItems\r\n dropDownRef={dropDownRef}\r\n onClose={handleClose}\r\n autofocus={shouldAutofocus}>\r\n {children}\r\n </DropDownItems>,\r\n document.body,\r\n )}\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nexport const findFirstFocusableDescendant = (\r\n startElement: HTMLElement,\r\n): HTMLElement | null => {\r\n const focusableSelector =\r\n 'button, a[href], input, select, textarea, details, summary [tabindex], [contenteditable]';\r\n\r\n const focusableDescendants = startElement.querySelector(\r\n focusableSelector,\r\n ) as HTMLElement;\r\n\r\n return focusableDescendants;\r\n};\r\n\r\nexport const focusNearestDescendant = (\r\n startElement: HTMLElement,\r\n): HTMLElement | null => {\r\n const el = findFirstFocusableDescendant(startElement);\r\n el?.focus();\r\n return el;\r\n};\r\n\r\nexport const isKeyboardInput = (\r\n event: MouseEvent | PointerEvent | React.MouseEvent,\r\n): boolean => {\r\n if ('pointerId' in event && 'pointerType' in event) {\r\n return event.pointerId === -1 && event.pointerType === '';\r\n }\r\n\r\n return event?.detail === 0;\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {ElementNode, LexicalCommand, LexicalNode, NodeKey} from 'lexical';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $insertNodeToNearestRoot,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n KEY_ARROW_DOWN_COMMAND,\r\n KEY_ARROW_LEFT_COMMAND,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_ARROW_UP_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createLayoutContainerNode,\r\n $isLayoutContainerNode,\r\n LayoutContainerNode,\r\n} from '../../nodes/LayoutContainerNode';\r\nimport {\r\n $createLayoutItemNode,\r\n $isLayoutItemNode,\r\n LayoutItemNode,\r\n} from '../../nodes/LayoutItemNode';\r\n\r\nexport const INSERT_LAYOUT_COMMAND: LexicalCommand<string> =\r\n createCommand<string>();\r\n\r\nexport const UPDATE_LAYOUT_COMMAND: LexicalCommand<{\r\n template: string;\r\n nodeKey: NodeKey;\r\n}> = createCommand<{template: string; nodeKey: NodeKey}>();\r\n\r\nexport function LayoutPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([LayoutContainerNode, LayoutItemNode])) {\r\n throw new Error(\r\n 'LayoutPlugin: LayoutContainerNode, or LayoutItemNode not registered on editor',\r\n );\r\n }\r\n\r\n const $onEscape = (before: boolean) => {\r\n const selection = $getSelection();\r\n if (\r\n $isRangeSelection(selection) &&\r\n selection.isCollapsed() &&\r\n selection.anchor.offset === 0\r\n ) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isLayoutContainerNode,\r\n );\r\n\r\n if ($isLayoutContainerNode(container)) {\r\n const parent = container.getParent<ElementNode>();\r\n const child =\r\n parent &&\r\n (before\r\n ? parent.getFirstChild<LexicalNode>()\r\n : parent?.getLastChild<LexicalNode>());\r\n const descendant = before\r\n ? container.getFirstDescendant<LexicalNode>()?.getKey()\r\n : container.getLastDescendant<LexicalNode>()?.getKey();\r\n\r\n if (\r\n parent !== null &&\r\n child === container &&\r\n selection.anchor.key === descendant\r\n ) {\r\n if (before) {\r\n container.insertBefore($createParagraphNode());\r\n } else {\r\n container.insertAfter($createParagraphNode());\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const $fillLayoutItemIfEmpty = (node: LayoutItemNode) => {\r\n if (node.isEmpty()) {\r\n node.append($createParagraphNode());\r\n }\r\n };\r\n\r\n const $removeIsolatedLayoutItem = (node: LayoutItemNode): boolean => {\r\n const parent = node.getParent<ElementNode>();\r\n if (!$isLayoutContainerNode(parent)) {\r\n const children = node.getChildren<LexicalNode>();\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n return mergeRegister(\r\n // When layout is the last child pressing down/right arrow will insert paragraph\r\n // below it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if trailing paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_DOWN_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n // When layout is the first child pressing up/left arrow will insert paragraph\r\n // above it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if leading paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_UP_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_LEFT_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n INSERT_LAYOUT_COMMAND,\r\n (template) => {\r\n editor.update(() => {\r\n const container = $createLayoutContainerNode(template);\r\n const itemsCount = getItemsCountFromTemplate(template);\r\n\r\n for (let i = 0; i < itemsCount; i++) {\r\n container.append(\r\n $createLayoutItemNode().append($createParagraphNode()),\r\n );\r\n }\r\n\r\n $insertNodeToNearestRoot(container);\r\n container.selectStart();\r\n });\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n editor.registerCommand(\r\n UPDATE_LAYOUT_COMMAND,\r\n ({template, nodeKey}) => {\r\n editor.update(() => {\r\n const container = $getNodeByKey<LexicalNode>(nodeKey);\r\n\r\n if (!$isLayoutContainerNode(container)) {\r\n return;\r\n }\r\n\r\n const itemsCount = getItemsCountFromTemplate(template);\r\n const prevItemsCount = getItemsCountFromTemplate(\r\n container.getTemplateColumns(),\r\n );\r\n\r\n // Add or remove extra columns if new template does not match existing one\r\n if (itemsCount > prevItemsCount) {\r\n for (let i = prevItemsCount; i < itemsCount; i++) {\r\n container.append(\r\n $createLayoutItemNode().append($createParagraphNode()),\r\n );\r\n }\r\n } else if (itemsCount < prevItemsCount) {\r\n for (let i = prevItemsCount - 1; i >= itemsCount; i--) {\r\n const layoutItem = container.getChildAtIndex<LexicalNode>(i);\r\n\r\n if ($isLayoutItemNode(layoutItem)) {\r\n layoutItem.remove();\r\n }\r\n }\r\n }\r\n\r\n container.setTemplateColumns(template);\r\n });\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n\r\n editor.registerNodeTransform(LayoutItemNode, (node) => {\r\n // Structure enforcing transformers for each node type. In case nesting structure is not\r\n // \"Container > Item\" it'll unwrap nodes and convert it back\r\n // to regular content.\r\n const isRemoved = $removeIsolatedLayoutItem(node);\r\n\r\n if (!isRemoved) {\r\n // Layout item should always have a child. this function will listen\r\n // for any empty layout item and fill it with a paragraph node\r\n $fillLayoutItemIfEmpty(node);\r\n }\r\n }),\r\n editor.registerNodeTransform(LayoutContainerNode, (node) => {\r\n const children = node.getChildren<LexicalNode>();\r\n if (!children.every($isLayoutItemNode)) {\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n\r\nfunction getItemsCountFromTemplate(template: string): number {\r\n return template.trim().split(/\\s+/).length;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedElementNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {ElementNode} from 'lexical';\r\n\r\nexport type SerializedLayoutContainerNode = Spread<\r\n {\r\n templateColumns: string;\r\n },\r\n SerializedElementNode\r\n>;\r\n\r\nfunction $convertLayoutContainerElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const styleAttributes = window.getComputedStyle(domNode);\r\n const templateColumns = styleAttributes.getPropertyValue(\r\n 'grid-template-columns',\r\n );\r\n if (templateColumns) {\r\n const node = $createLayoutContainerNode(templateColumns);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport class LayoutContainerNode extends ElementNode {\r\n __templateColumns: string;\r\n\r\n constructor(templateColumns: string, key?: NodeKey) {\r\n super(key);\r\n this.__templateColumns = templateColumns;\r\n }\r\n\r\n static getType(): string {\r\n return 'layout-container';\r\n }\r\n\r\n static clone(node: LayoutContainerNode): LayoutContainerNode {\r\n return new LayoutContainerNode(node.__templateColumns, node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.style.gridTemplateColumns = this.__templateColumns;\r\n if (typeof config.theme.layoutContainer === 'string') {\r\n addClassNamesToElement(dom, config.theme.layoutContainer);\r\n }\r\n return dom;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.style.gridTemplateColumns = this.__templateColumns;\r\n element.setAttribute('data-lexical-layout-container', 'true');\r\n return {element};\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n if (prevNode.__templateColumns !== this.__templateColumns) {\r\n dom.style.gridTemplateColumns = this.__templateColumns;\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-layout-container')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertLayoutContainerElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(json: SerializedLayoutContainerNode): LayoutContainerNode {\r\n return $createLayoutContainerNode().updateFromJSON(json);\r\n }\r\n\r\n updateFromJSON(\r\n serializedNode: LexicalUpdateJSON<SerializedLayoutContainerNode>,\r\n ): this {\r\n return super\r\n .updateFromJSON(serializedNode)\r\n .setTemplateColumns(serializedNode.templateColumns);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n\r\n canBeEmpty(): boolean {\r\n return false;\r\n }\r\n\r\n exportJSON(): SerializedLayoutContainerNode {\r\n return {\r\n ...super.exportJSON(),\r\n templateColumns: this.__templateColumns,\r\n };\r\n }\r\n\r\n getTemplateColumns(): string {\r\n return this.getLatest().__templateColumns;\r\n }\r\n\r\n setTemplateColumns(templateColumns: string): this {\r\n const self = this.getWritable();\r\n self.__templateColumns = templateColumns;\r\n return self;\r\n }\r\n}\r\n\r\nexport function $createLayoutContainerNode(\r\n templateColumns: string = '',\r\n): LayoutContainerNode {\r\n return new LayoutContainerNode(templateColumns);\r\n}\r\n\r\nexport function $isLayoutContainerNode(\r\n node: LexicalNode | null | undefined,\r\n): node is LayoutContainerNode {\r\n return node instanceof LayoutContainerNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {$isParagraphNode, ElementNode} from 'lexical';\r\n\r\nexport type SerializedLayoutItemNode = SerializedElementNode;\r\n\r\nfunction $convertLayoutItemElement(): DOMConversionOutput | null {\r\n return {node: $createLayoutItemNode()};\r\n}\r\n\r\nexport function $isEmptyLayoutItemNode(node: LexicalNode): boolean {\r\n if (!$isLayoutItemNode(node) || node.getChildrenSize() !== 1) {\r\n return false;\r\n }\r\n const firstChild = node.getFirstChild();\r\n return $isParagraphNode(firstChild) && firstChild.isEmpty();\r\n}\r\n\r\nexport class LayoutItemNode extends ElementNode {\r\n static getType(): string {\r\n return 'layout-item';\r\n }\r\n\r\n static clone(node: LayoutItemNode): LayoutItemNode {\r\n return new LayoutItemNode(node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.setAttribute('data-lexical-layout-item', 'true');\r\n if (typeof config.theme.layoutItem === 'string') {\r\n addClassNamesToElement(dom, config.theme.layoutItem);\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n collapseAtStart(): boolean {\r\n const parent = this.getParentOrThrow();\r\n if (\r\n this.is(parent.getFirstChild()) &&\r\n parent.getChildren().every($isEmptyLayoutItemNode)\r\n ) {\r\n parent.remove();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-layout-item')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertLayoutItemElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(serializedNode: SerializedLayoutItemNode): LayoutItemNode {\r\n return $createLayoutItemNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport function $createLayoutItemNode(): LayoutItemNode {\r\n return new LayoutItemNode();\r\n}\r\n\r\nexport function $isLayoutItemNode(\r\n node: LexicalNode | null | undefined,\r\n): node is LayoutItemNode {\r\n return node instanceof LayoutItemNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createPageBreakNode, PageBreakNode} from '../../nodes/PageBreakNode';\r\n\r\nexport const INSERT_PAGE_BREAK: LexicalCommand<undefined> = createCommand();\r\n\r\nexport default function PageBreakPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([PageBreakNode])) {\r\n throw new Error(\r\n 'PageBreakPlugin: PageBreakNode is not registered on editor',\r\n );\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand(\r\n INSERT_PAGE_BREAK,\r\n () => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return false;\r\n }\r\n\r\n const focusNode = selection.focus.getNode();\r\n if (focusNode !== null) {\r\n const pgBreak = $createPageBreakNode();\r\n $insertNodeToNearestRoot(pgBreak);\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n DecoratorNode,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedLexicalNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useEffect} from 'react';\r\n\r\nexport type SerializedPageBreakNode = SerializedLexicalNode;\r\n\r\nfunction PageBreakComponent({nodeKey}: {nodeKey: NodeKey}) {\r\n const [editor] = useLexicalComposerContext();\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (event: MouseEvent) => {\r\n const pbElem = editor.getElementByKey(nodeKey);\r\n\r\n if (event.target === pbElem) {\r\n if (!event.shiftKey) {\r\n clearSelection();\r\n }\r\n setSelected(!isSelected);\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, setSelected]);\r\n\r\n useEffect(() => {\r\n const pbElem = editor.getElementByKey(nodeKey);\r\n if (pbElem !== null) {\r\n pbElem.className = isSelected ? 'selected' : '';\r\n }\r\n }, [editor, isSelected, nodeKey]);\r\n\r\n return null;\r\n}\r\n\r\nexport class PageBreakNode extends DecoratorNode<JSX.Element> {\r\n static getType(): string {\r\n return 'page-break';\r\n }\r\n\r\n static clone(node: PageBreakNode): PageBreakNode {\r\n return new PageBreakNode(node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedPageBreakNode): PageBreakNode {\r\n return $createPageBreakNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n figure: (domNode: HTMLElement) => {\r\n const tp = domNode.getAttribute('type');\r\n if (tp !== this.getType()) {\r\n return null;\r\n }\r\n\r\n return {\r\n conversion: $convertPageBreakElement,\r\n priority: COMMAND_PRIORITY_HIGH,\r\n };\r\n },\r\n };\r\n }\r\n\r\n createDOM(): HTMLElement {\r\n const el = document.createElement('figure');\r\n el.style.pageBreakAfter = 'always';\r\n el.setAttribute('type', this.getType());\r\n return el;\r\n }\r\n\r\n getTextContent(): string {\r\n return '\\n';\r\n }\r\n\r\n isInline(): false {\r\n return false;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return <PageBreakComponent nodeKey={this.__key} />;\r\n }\r\n}\r\n\r\nfunction $convertPageBreakElement(): DOMConversionOutput {\r\n return {node: $createPageBreakNode()};\r\n}\r\n\r\nexport function $createPageBreakNode(): PageBreakNode {\r\n return new PageBreakNode();\r\n}\r\n\r\nexport function $isPageBreakNode(\r\n node: LexicalNode | null | undefined,\r\n): node is PageBreakNode {\r\n return node instanceof PageBreakNode;\r\n}\r\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createNotesNode, NotesNode} from '../../nodes/NotesNode';\nimport {convertNotes} from '../../utils/tnr-formatters';\n\nexport const INSERT_NOTES_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_NOTES_COMMAND',\n);\n\nexport default function NotesPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([NotesNode])) {\n throw new Error('NotesPlugin: NotesNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_NOTES_COMMAND,\n (payload) => {\n const node = $createNotesNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertNotesDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertNotes(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_NOTES_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste notes here...\\nExample:\\nSuperficial Fascia\\nThe superficial fascia is a layer of loose...\\n\\nFunctions\\n- Passageway for vessels\\n- Insulation'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertNotes,\n parseNotesHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype NotesComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction NotesComponent({\n className,\n format,\n nodeKey,\n html,\n}: NotesComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [editText, setEditText] = useState('');\n\n const openEditor = useCallback(() => {\n setEditText(parseNotesHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n return editText.trim() ? convertNotes(editText) : '';\n }, [isEditing, editText]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isNotesNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: CARD_STYLES.notes.headingColor,\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Notes\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: CARD_STYLES.notes.headingColor}}>\n Edit Notes\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n <textarea\n value={editText}\n onChange={(e) => setEditText(e.target.value)}\n style={{\n width: '100%', minHeight: 150, fontFamily: 'monospace', fontSize: 12,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n }}\n />\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedNotesNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-notes';\n\nexport class NotesNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'notes-block';\n }\n\n static clone(node: NotesNode): NotesNode {\n return new NotesNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedNotesNode): NotesNode {\n return $createNotesNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedNotesNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertNotesElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <NotesComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertNotesElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createNotesNode(html)};\n return null;\n}\n\nexport function $createNotesNode(html: string): NotesNode {\n return new NotesNode(html);\n}\n\nexport function $isNotesNode(node: LexicalNode | null | undefined): node is NotesNode {\n return node instanceof NotesNode;\n}\n","// ===================================================================\n// Card style constants (from TNR_Tool.html)\n// ===================================================================\n\nexport const CARD_STYLES = {\n terminology: {\n light: \"rgba(191, 236, 233, 0.5)\",\n border: \"rgba(191, 236, 233, 1)\",\n keyColor: \"#2a8a85\",\n },\n revision: {\n light: \"rgba(251, 224, 203, 0.6)\",\n border: \"rgba(251, 224, 203, 1)\",\n },\n notes: {\n headingBorder: \"rgba(254, 158, 159, 0.6)\",\n headingColor: \"#6b5b95\",\n },\n};\n\n// ===================================================================\n// Utilities\n// ===================================================================\n\n/** Strip whitespace-only text nodes between HTML tags */\nexport function compactHtml(html: string): string {\n return html.replace(/>\\s+</g, \"><\");\n}\n\n// ===================================================================\n// Forward converters (plain text → styled HTML)\n// ===================================================================\n\nexport function convertTerminology(input: string): string {\n if (!input.trim()) return \"\";\n\n const style = CARD_STYLES.terminology;\n let html = '<div class=\"term-wrapper\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n const listItems = doc.querySelectorAll(\"li\");\n\n listItems.forEach((li) => {\n let term = \"\";\n let definition = \"\";\n let foundStrong = false;\n\n Array.from(li.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim() || \"\";\n if (text && foundStrong) {\n definition += text + \" \";\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tagName = el.tagName;\n\n if (tagName === \"STRONG\" || tagName === \"B\") {\n term = (el.textContent?.trim() || \"\").replace(/:$/, \"\");\n foundStrong = true;\n } else if (tagName === \"SPAN\") {\n const innerStrong = el.querySelector(\"strong, b\");\n if (innerStrong) {\n term = (innerStrong.textContent?.trim() || \"\").replace(/:$/, \"\");\n foundStrong = true;\n } else {\n const text = el.textContent?.trim() || \"\";\n if (text) definition += text + \" \";\n }\n } else {\n const text = el.textContent?.trim() || \"\";\n if (text) definition += text + \" \";\n }\n }\n });\n\n definition = definition.trim().replace(/^:\\s*/, \"\");\n\n if (term) {\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${term}:</strong> ${definition}\n </div>\\n`;\n } else if (definition) {\n html += ` <div style=\"background: rgba(0,0,0,0.03); padding: 12px; margin-bottom: 10px; border-radius: 4px; font-family: sans-serif;\">${definition}</div>\\n`;\n }\n });\n\n if (listItems.length === 0) {\n const paragraphs = doc.querySelectorAll(\"p\");\n paragraphs.forEach((p) => {\n const text = p.textContent?.trim() || \"\";\n const colonIndex = text.indexOf(\":\");\n if (colonIndex > -1) {\n const t = text.substring(0, colonIndex).trim();\n const def = text.substring(colonIndex + 1).trim();\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${t}:</strong> ${def}\n </div>\\n`;\n }\n });\n }\n } else {\n const lines = input.split(\"\\n\").filter((l) => l.trim());\n lines.forEach((line) => {\n line = line.trim();\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > -1) {\n const term = line.substring(0, colonIndex).trim();\n const def = line.substring(colonIndex + 1).trim();\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${term}:</strong> ${def}\n </div>\\n`;\n } else {\n html += ` <div style=\"background: rgba(0,0,0,0.03); padding: 12px; margin-bottom: 10px; border-radius: 4px; font-family: sans-serif;\">${line}</div>\\n`;\n }\n });\n }\n\n html += \"</div>\";\n return compactHtml(html);\n}\n\nexport function processNode(node: ChildNode): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\";\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return \"\";\n\n const el = node as Element;\n const tagName = el.tagName;\n\n if (tagName === \"IMG\") {\n return `<div style=\"margin: 20px 0; text-align: center;\">\n <img src=\"${(el as HTMLImageElement).src}\" style=\"max-width: 100%; height: auto; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);\">\n </div>`;\n }\n\n const childrenHtml = Array.from(el.childNodes).map(processNode).join(\"\");\n\n if (tagName === \"UL\" || tagName === \"OL\") {\n let listType = el.getAttribute(\"type\");\n if (!listType) {\n listType = tagName === \"UL\" ? \"disc\" : \"decimal\";\n }\n return `<${tagName.toLowerCase()} style=\"margin-left: 20px; padding-left: 20px; margin-bottom: 25px; margin-top: 10px; list-style-type: ${listType};\">${childrenHtml}</${tagName.toLowerCase()}>`;\n }\n\n if (tagName === \"LI\") {\n return `<li style=\"margin-bottom: 8px; padding-left: 5px;\">${childrenHtml}</li>`;\n }\n\n if (/^H[1-6]$/.test(tagName) || tagName === \"P\") {\n const text = (el.textContent || \"\").trim();\n if (childrenHtml.includes('<div style=\"margin: 20px')) {\n return childrenHtml;\n }\n if (!text && !el.querySelector(\"img\")) return \"\";\n\n const strong = el.querySelector(\"strong\") || el.querySelector(\"b\");\n const isBold = strong && text === (strong.textContent || \"\").trim();\n const isShort = text.length < 150;\n\n if (/^H[1-6]$/.test(tagName) || (tagName === \"P\" && isBold && isShort)) {\n const cleanContent = childrenHtml.replace(/<\\/?strong>/g, \"\").replace(/<\\/?b>/g, \"\");\n const style = CARD_STYLES.notes;\n return `<h3 style=\"color: ${style.headingColor}; border-bottom: 2px solid ${style.headingBorder}; padding-bottom: 5px; margin-top: 25px; margin-bottom: 15px;\">${cleanContent}</h3>`;\n }\n\n return `<p style=\"margin-bottom: 15px;\">${childrenHtml}</p>`;\n }\n\n if ([\"STRONG\", \"B\", \"EM\", \"I\", \"U\", \"SUB\", \"SUP\", \"A\"].includes(tagName)) {\n let attrs = \"\";\n if (tagName === \"A\" && (el as HTMLAnchorElement).href) {\n attrs = ` href=\"${(el as HTMLAnchorElement).href}\" target=\"_blank\" style=\"color: inherit; text-decoration: underline;\"`;\n }\n return `<${tagName.toLowerCase()}${attrs}>${childrenHtml}</${tagName.toLowerCase()}>`;\n }\n\n if ([\"SPAN\", \"FONT\", \"DIV\", \"CENTER\", \"SECTION\", \"ARTICLE\"].includes(tagName)) {\n return childrenHtml;\n }\n\n if (tagName === \"BR\") return \"<br>\";\n\n return childrenHtml;\n}\n\nexport function convertNotes(input: string): string {\n if (!input.trim()) return \"\";\n\n let html = '<div style=\"font-family: sans-serif; line-height: 1.6; color: inherit;\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n html += Array.from(doc.body.childNodes).map(processNode).join(\"\");\n } else {\n const paragraphs = input.split(/\\n\\s*\\n/);\n const style = CARD_STYLES.notes;\n\n paragraphs.forEach((p) => {\n p = p.trim();\n if (!p) return;\n\n if (p.match(/^[-•*]/) || p.match(/^\\d+\\./)) {\n const items = p\n .split(/\\n/)\n .map((l) => l.trim())\n .filter((l) => l);\n const isOrdered = p.match(/^\\d+\\./);\n const tag = isOrdered ? \"ol\" : \"ul\";\n\n html += ` <${tag} style=\"margin-left: 20px; padding-left: 20px; margin-bottom: 15px;\">\\n`;\n items.forEach((item) => {\n const cleanItem = item.replace(/^([-•*]|\\d+\\.)\\s*/, \"\");\n if (cleanItem) {\n html += ` <li style=\"margin-bottom: 5px;\">${cleanItem}</li>\\n`;\n }\n });\n html += ` </${tag}>\\n`;\n } else if (p.length < 100 && !p.endsWith(\".\")) {\n html += ` <h3 style=\"color: ${style.headingColor}; border-bottom: 2px solid ${style.headingBorder}; padding-bottom: 5px; margin-top: 25px; margin-bottom: 15px;\">${p}</h3>\\n`;\n } else {\n html += ` <p style=\"margin-bottom: 15px;\">${p}</p>\\n`;\n }\n });\n }\n\n html += \"</div>\";\n return compactHtml(html);\n}\n\nexport function convertRevision(input: string): string {\n if (!input.trim()) return \"\";\n\n const style = CARD_STYLES.revision;\n let html = `<div style=\"background: ${style.light}; padding: 20px; border-radius: 8px; border: 1px solid ${style.border}; font-family: sans-serif;\">\\n`;\n html += ' <ul style=\"list-style-type: none; padding: 0; margin: 0;\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n const listItems = doc.querySelectorAll(\"li\");\n\n const extractContent = (el: Element): string => {\n let result = \"\";\n Array.from(el.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n result += node.textContent || \"\";\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const child = node as Element;\n const tag = child.tagName;\n if (tag === \"STRONG\" || tag === \"B\") {\n result += `<strong>${extractContent(child)}</strong>`;\n } else if (tag === \"EM\" || tag === \"I\") {\n result += `<em>${extractContent(child)}</em>`;\n } else {\n result += extractContent(child);\n }\n }\n });\n return result;\n };\n\n listItems.forEach((li) => {\n const content = extractContent(li).trim();\n if (content) {\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${content}\n </li>\\n`;\n }\n });\n\n if (listItems.length === 0) {\n const paragraphs = doc.querySelectorAll(\"p\");\n paragraphs.forEach((p) => {\n const text = (p.textContent || \"\").trim();\n if (text) {\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${text}\n </li>\\n`;\n }\n });\n }\n } else {\n const lines = input.split(\"\\n\").filter((l) => l.trim());\n lines.forEach((line) => {\n const clean = line\n .replace(/^[-•*]\\s*/, \"\")\n .replace(/^\\d+\\.\\s*/, \"\")\n .trim();\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${clean}\n </li>\\n`;\n });\n }\n\n html += \" </ul>\\n</div>\";\n return compactHtml(html);\n}\n\n// ===================================================================\n// Reverse parsers (styled HTML → editable data)\n// ===================================================================\n\nexport function parseTerminologyHtml(html: string): Array<{term: string; definition: string}> {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const items: Array<{term: string; definition: string}> = [];\n\n const cards = doc.querySelectorAll('div[style*=\"border-left\"]');\n cards.forEach((card) => {\n const strong = card.querySelector('strong');\n if (strong) {\n const term = (strong.textContent || '').replace(/:$/, '').trim();\n const clone = card.cloneNode(true) as Element;\n const strongClone = clone.querySelector('strong');\n if (strongClone) strongClone.remove();\n const definition = (clone.textContent || '').trim();\n items.push({term, definition});\n } else {\n const text = (card.textContent || '').trim();\n if (text) items.push({term: '', definition: text});\n }\n });\n\n return items;\n}\n\nexport function parseNotesHtml(html: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const lines: string[] = [];\n\n const children = doc.body.firstElementChild?.children || doc.body.children;\n Array.from(children).forEach((el) => {\n const tag = el.tagName;\n if (tag === 'H3' || tag === 'H2' || tag === 'H1') {\n if (lines.length > 0) lines.push('');\n lines.push((el.textContent || '').trim());\n } else if (tag === 'P') {\n lines.push((el.textContent || '').trim());\n } else if (tag === 'UL' || tag === 'OL') {\n const items = el.querySelectorAll('li');\n items.forEach((li) => {\n lines.push(`- ${(li.textContent || '').trim()}`);\n });\n }\n });\n\n return lines.join('\\n');\n}\n\nexport function parseRevisionHtml(html: string): string[] {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const items: string[] = [];\n\n const listItems = doc.querySelectorAll('li');\n listItems.forEach((li) => {\n const clone = li.cloneNode(true) as Element;\n const spans = clone.querySelectorAll('span');\n spans.forEach((span) => span.remove());\n const text = (clone.textContent || '').trim();\n if (text) items.push(text);\n });\n\n return items;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n $createPollNode,\r\n createPollOption,\r\n PollNode,\r\n} from '../../nodes/PollNode';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions} from '../../ui/Dialog';\r\nimport TextInput from '../../ui/TextInput';\r\n\r\nexport const INSERT_POLL_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_POLL_COMMAND',\r\n);\r\n\r\nexport function InsertPollDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [question, setQuestion] = useState('');\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_POLL_COMMAND, question);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <TextInput label=\"Question\" onChange={setQuestion} value={question} />\r\n <DialogActions>\r\n <Button disabled={question.trim() === ''} onClick={onClick}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function PollPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([PollNode])) {\r\n throw new Error('PollPlugin: PollNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_POLL_COMMAND,\r\n (payload) => {\r\n const pollNode = $createPollNode(payload, [\r\n createPollOption(),\r\n createPollOption(),\r\n ]);\r\n $insertNodes([pollNode]);\r\n if ($isRootOrShadowRoot(pollNode.getParentOrThrow())) {\r\n $wrapNodeInElement(pollNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n return null;\r\n}\r\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createRevisionNode, RevisionNode} from '../../nodes/RevisionNode';\nimport {convertRevision} from '../../utils/tnr-formatters';\n\nexport const INSERT_REVISION_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_REVISION_COMMAND',\n);\n\nexport default function RevisionPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([RevisionNode])) {\n throw new Error('RevisionPlugin: RevisionNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_REVISION_COMMAND,\n (payload) => {\n const node = $createRevisionNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertRevisionDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertRevision(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_REVISION_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste revision points here...\\nExample:\\n- The superficial fascia is a subcutaneous layer.\\n- It connects the dermis to deep fascia.'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertRevision,\n parseRevisionHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype RevisionComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction RevisionComponent({\n className,\n format,\n nodeKey,\n html,\n}: RevisionComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [items, setItems] = useState<string[]>([]);\n\n const openEditor = useCallback(() => {\n setItems(parseRevisionHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n const filtered = items.filter((i) => i.trim());\n return filtered.length > 0 ? convertRevision(filtered.join('\\n')) : '';\n }, [isEditing, items]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isRevisionNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n const updateItem = useCallback((index: number, value: string) => {\n setItems((prev) => prev.map((item, i) => (i === index ? value : item)));\n }, []);\n\n const addItem = useCallback(() => {\n setItems((prev) => [...prev, '']);\n }, []);\n\n const removeItem = useCallback((index: number) => {\n setItems((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: '#c2703a',\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Revision\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: '#c2703a'}}>\n Edit Revision Points\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n {items.map((item, index) => (\n <div key={index} style={{display: 'flex', gap: 4, marginBottom: 4, alignItems: 'center'}}>\n <input\n type=\"text\" placeholder=\"Revision point\" value={item}\n onChange={(e) => updateItem(index, e.target.value)}\n style={{flex: 1, padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <button type=\"button\" onClick={() => removeItem(index)}\n style={{padding: '2px 6px', fontSize: 14, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', color: '#e11d48'}}>\n ×\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addItem}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', marginTop: 4}}>\n + Add Point\n </button>\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedRevisionNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-revision';\n\nexport class RevisionNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'revision-block';\n }\n\n static clone(node: RevisionNode): RevisionNode {\n return new RevisionNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedRevisionNode): RevisionNode {\n return $createRevisionNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedRevisionNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertRevisionElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <RevisionComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertRevisionElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createRevisionNode(html)};\n return null;\n}\n\nexport function $createRevisionNode(html: string): RevisionNode {\n return new RevisionNode(html);\n}\n\nexport function $isRevisionNode(node: LexicalNode | null | undefined): node is RevisionNode {\n return node instanceof RevisionNode;\n}\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createTerminologyNode, TerminologyNode} from '../../nodes/TerminologyNode';\nimport {convertTerminology} from '../../utils/tnr-formatters';\n\nexport const INSERT_TERMINOLOGY_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_TERMINOLOGY_COMMAND',\n);\n\nexport default function TerminologyPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([TerminologyNode])) {\n throw new Error('TerminologyPlugin: TerminologyNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_TERMINOLOGY_COMMAND,\n (payload) => {\n const node = $createTerminologyNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertTerminologyDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertTerminology(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_TERMINOLOGY_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste terminology here...\\nExample:\\nSuperficial fascia: A layer of loose connective tissue...\\nDermis: The layer of skin deep to the epidermis...'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertTerminology,\n parseTerminologyHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype TerminologyComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction TerminologyComponent({\n className,\n format,\n nodeKey,\n html,\n}: TerminologyComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [items, setItems] = useState<Array<{term: string; definition: string}>>([]);\n\n const openEditor = useCallback(() => {\n setItems(parseTerminologyHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n const text = items\n .filter((i) => i.term || i.definition)\n .map((i) => (i.term ? `${i.term}: ${i.definition}` : i.definition))\n .join('\\n');\n return text ? convertTerminology(text) : '';\n }, [isEditing, items]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isTerminologyNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n const updateItem = useCallback((index: number, field: 'term' | 'definition', value: string) => {\n setItems((prev) => prev.map((item, i) => (i === index ? {...item, [field]: value} : item)));\n }, []);\n\n const addItem = useCallback(() => {\n setItems((prev) => [...prev, {term: '', definition: ''}]);\n }, []);\n\n const removeItem = useCallback((index: number) => {\n setItems((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: CARD_STYLES.terminology.keyColor,\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Terminology\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: CARD_STYLES.terminology.keyColor}}>\n Edit Terminology\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n {items.map((item, index) => (\n <div key={index} style={{display: 'flex', gap: 4, marginBottom: 4, alignItems: 'center'}}>\n <input\n type=\"text\" placeholder=\"Term\" value={item.term}\n onChange={(e) => updateItem(index, 'term', e.target.value)}\n style={{width: '30%', padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <input\n type=\"text\" placeholder=\"Definition\" value={item.definition}\n onChange={(e) => updateItem(index, 'definition', e.target.value)}\n style={{flex: 1, padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <button type=\"button\" onClick={() => removeItem(index)}\n style={{padding: '2px 6px', fontSize: 14, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', color: '#e11d48'}}>\n ×\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addItem}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', marginTop: 4}}>\n + Add Term\n </button>\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedTerminologyNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-terminology';\n\nexport class TerminologyNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'terminology-block';\n }\n\n static clone(node: TerminologyNode): TerminologyNode {\n return new TerminologyNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedTerminologyNode): TerminologyNode {\n return $createTerminologyNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedTerminologyNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertTerminologyElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <TerminologyComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertTerminologyElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createTerminologyNode(html)};\n return null;\n}\n\nexport function $createTerminologyNode(html: string): TerminologyNode {\n return new TerminologyNode(html);\n}\n\nexport function $isTerminologyNode(node: LexicalNode | null | undefined): node is TerminologyNode {\n return node instanceof TerminologyNode;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n INSERT_TABLE_COMMAND,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from '@lexical/table';\r\nimport {EditorThemeClasses, Klass, LexicalEditor, LexicalNode} from 'lexical';\r\nimport {createContext, useContext, useEffect, useMemo, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport TextInput from '../ui/TextInput';\r\n\r\nexport type InsertTableCommandPayload = Readonly<{\r\n columns: string;\r\n rows: string;\r\n includeHeaders?: boolean;\r\n}>;\r\n\r\nexport type CellContextShape = {\r\n cellEditorConfig: null | CellEditorConfig;\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>;\r\n set: (\r\n cellEditorConfig: null | CellEditorConfig,\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>,\r\n ) => void;\r\n};\r\n\r\nexport type CellEditorConfig = Readonly<{\r\n namespace: string;\r\n nodes?: ReadonlyArray<Klass<LexicalNode>>;\r\n onError: (error: Error, editor: LexicalEditor) => void;\r\n readOnly?: boolean;\r\n theme?: EditorThemeClasses;\r\n}>;\r\n\r\nexport const CellContext = createContext<CellContextShape>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n set: () => {\r\n // Empty\r\n },\r\n});\r\n\r\nexport function TableContext({children}: {children: JSX.Element}) {\r\n const [contextValue, setContextValue] = useState<{\r\n cellEditorConfig: null | CellEditorConfig;\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>;\r\n }>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n });\r\n return (\r\n <CellContext.Provider\r\n value={useMemo(\r\n () => ({\r\n cellEditorConfig: contextValue.cellEditorConfig,\r\n cellEditorPlugins: contextValue.cellEditorPlugins,\r\n set: (cellEditorConfig, cellEditorPlugins) => {\r\n setContextValue({cellEditorConfig, cellEditorPlugins});\r\n },\r\n }),\r\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\r\n )}>\r\n {children}\r\n </CellContext.Provider>\r\n );\r\n}\r\n\r\nexport function InsertTableDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [rows, setRows] = useState('5');\r\n const [columns, setColumns] = useState('5');\r\n const [isDisabled, setIsDisabled] = useState(true);\r\n\r\n useEffect(() => {\r\n const row = Number(rows);\r\n const column = Number(columns);\r\n if (row && row > 0 && row <= 500 && column && column > 0 && column <= 50) {\r\n setIsDisabled(false);\r\n } else {\r\n setIsDisabled(true);\r\n }\r\n }, [rows, columns]);\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_TABLE_COMMAND, {\r\n columns,\r\n rows,\r\n });\r\n\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <TextInput\r\n placeholder={'# of rows (1-500)'}\r\n label=\"Rows\"\r\n onChange={setRows}\r\n value={rows}\r\n data-test-id=\"table-modal-rows\"\r\n type=\"number\"\r\n />\r\n <TextInput\r\n placeholder={'# of columns (1-50)'}\r\n label=\"Columns\"\r\n onChange={setColumns}\r\n value={columns}\r\n data-test-id=\"table-modal-columns\"\r\n type=\"number\"\r\n />\r\n <DialogActions data-test-id=\"table-model-confirm-insert\">\r\n <Button disabled={isDisabled} onClick={onClick}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function TablePlugin({\r\n cellEditorConfig,\r\n children,\r\n}: {\r\n cellEditorConfig: CellEditorConfig;\r\n children: JSX.Element | Array<JSX.Element>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const cellContext = useContext(CellContext);\r\n useEffect(() => {\r\n if (!editor.hasNodes([TableNode, TableRowNode, TableCellNode])) {\r\n throw new Error(\r\n 'TablePlugin: TableNode, TableRowNode, or TableCellNode is not registered on editor',\r\n );\r\n }\r\n }, [editor]);\r\n useEffect(() => {\r\n cellContext.set(cellEditorConfig, children);\r\n }, [cellContext, cellEditorConfig, children]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n NodeContextMenuOption,\r\n NodeContextMenuPlugin,\r\n NodeContextMenuSeparator,\r\n} from '@lexical/react/LexicalNodeContextMenuPlugin';\r\nimport {\r\n $getSelection,\r\n $isDecoratorNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n COPY_COMMAND,\r\n CUT_COMMAND,\r\n type LexicalNode,\r\n PASTE_COMMAND,\r\n} from 'lexical';\r\nimport {useMemo} from 'react';\r\n\r\nexport default function ContextMenuPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const items = useMemo(() => {\r\n return [\r\n new NodeContextMenuOption(`Remove Link`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n },\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon\" />,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n }),\r\n new NodeContextMenuOption(`Cut`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(CUT_COMMAND, null);\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon page-break\" />\r\n ),\r\n }),\r\n new NodeContextMenuOption(`Copy`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(COPY_COMMAND, null);\r\n },\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon copy\" />,\r\n }),\r\n new NodeContextMenuOption(`Paste`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (...args) {\r\n const data = new DataTransfer();\r\n\r\n const readClipboardItems = await navigator.clipboard.read();\r\n const item = readClipboardItems[0];\r\n\r\n const permission = await navigator.permissions.query({\r\n // @ts-expect-error These types are incorrect.\r\n name: 'clipboard-read',\r\n });\r\n if (permission.state === 'denied') {\r\n alert('Not allowed to paste from clipboard.');\r\n return;\r\n }\r\n\r\n for (const type of item.types) {\r\n const dataString = await (await item.getType(type)).text();\r\n data.setData(type, dataString);\r\n }\r\n\r\n const event = new ClipboardEvent('paste', {\r\n clipboardData: data,\r\n });\r\n\r\n editor.dispatchCommand(PASTE_COMMAND, event);\r\n });\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon paste\" />\r\n ),\r\n }),\r\n new NodeContextMenuOption(`Paste as Plain Text`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (...args) {\r\n const permission = await navigator.permissions.query({\r\n // @ts-expect-error These types are incorrect.\r\n name: 'clipboard-read',\r\n });\r\n\r\n if (permission.state === 'denied') {\r\n alert('Not allowed to paste from clipboard.');\r\n return;\r\n }\r\n\r\n const data = new DataTransfer();\r\n const clipboardText = await navigator.clipboard.readText();\r\n data.setData('text/plain', clipboardText);\r\n\r\n const event = new ClipboardEvent('paste', {\r\n clipboardData: data,\r\n });\r\n editor.dispatchCommand(PASTE_COMMAND, event);\r\n });\r\n },\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon\" />,\r\n }),\r\n new NodeContextMenuSeparator(),\r\n new NodeContextMenuOption(`Delete Node`, {\r\n $onSelect: () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const currentNode = selection.anchor.getNode();\r\n const ancestorNodeWithRootAsParent = currentNode\r\n .getParents()\r\n .at(-2);\r\n\r\n ancestorNodeWithRootAsParent?.remove();\r\n } else if ($isNodeSelection(selection)) {\r\n const selectedNodes = selection.getNodes();\r\n selectedNodes.forEach((node) => {\r\n if ($isDecoratorNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon clear\" />\r\n ),\r\n }),\r\n ];\r\n }, [editor]);\r\n\r\n return (\r\n <NodeContextMenuPlugin\r\n className=\"PlaygroundEditorTheme__contextMenu\"\r\n itemClassName=\"PlaygroundEditorTheme__contextMenuItem\"\r\n separatorClassName=\"PlaygroundEditorTheme__contextMenuSeparator\"\r\n items={items}\r\n />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {DRAG_DROP_PASTE} from '@lexical/rich-text';\r\nimport {isMimeType, mediaFileReader} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_LOW} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {useEditorConfig} from '../../context/EditorConfigContext';\r\nimport {uploadImageToBaasix} from '../../utils/baasixUpload';\r\nimport {INSERT_IMAGE_COMMAND} from '../ImagesPlugin';\r\n\r\nconst ACCEPTABLE_IMAGE_TYPES = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n];\r\n\r\nexport default function DragDropPaste(): null {\r\n const [editor] = useLexicalComposerContext();\r\n const {baasixClient, folder} = useEditorConfig();\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n DRAG_DROP_PASTE,\r\n (files) => {\r\n (async () => {\r\n const filesResult = await mediaFileReader(\r\n files,\r\n [ACCEPTABLE_IMAGE_TYPES].flatMap((x) => x),\r\n );\r\n for (const {file, result} of filesResult) {\r\n if (isMimeType(file, ACCEPTABLE_IMAGE_TYPES)) {\r\n let src: string;\r\n try {\r\n src = await uploadImageToBaasix(baasixClient, file, folder);\r\n } catch {\r\n // Fall back to data URL if upload fails\r\n src = result;\r\n }\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\r\n altText: file.name,\r\n src,\r\n });\r\n }\r\n }\r\n })();\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor, folder]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {DraggableBlockPlugin_EXPERIMENTAL} from '@lexical/react/LexicalDraggableBlockPlugin';\r\nimport {\r\n $createParagraphNode,\r\n $createTextNode,\r\n $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\r\n $isParagraphNode,\r\n $isTextNode,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport {\r\n ComponentPickerMenuItem,\r\n ComponentPickerOption,\r\n getBaseOptions,\r\n getDynamicOptions,\r\n} from '../ComponentPickerPlugin';\r\n\r\nconst DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu';\r\n\r\ntype PickerState = {\r\n insertBefore: boolean;\r\n targetNodeKey: NodeKey;\r\n};\r\n\r\nfunction isOnMenu(element: HTMLElement): boolean {\r\n return !!element.closest(`.${DRAGGABLE_BLOCK_MENU_CLASSNAME}`);\r\n}\r\n\r\nexport default function DraggableBlockPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [modal, showModal] = useModal();\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const pickerRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n const targetLineRef = useRef<HTMLDivElement>(null);\r\n const [draggableElement, setDraggableElement] = useState<HTMLElement | null>(\r\n null,\r\n );\r\n const [pickerState, setPickerState] = useState<PickerState | null>(null);\r\n const [isPickerOpen, setIsPickerOpen] = useState(false);\r\n const [queryString, setQueryString] = useState('');\r\n const [highlightedIndex, setHighlightedIndex] = useState(0);\r\n const [pickerPosition, setPickerPosition] = useState<{\r\n left: number;\r\n top: number;\r\n } | null>(null);\r\n\r\n const options = useMemo(() => {\r\n const baseOptions = getBaseOptions(editor, showModal);\r\n\r\n if (!queryString) {\r\n return baseOptions;\r\n }\r\n\r\n const regex = new RegExp(queryString, 'i');\r\n return [\r\n ...getDynamicOptions(editor, queryString),\r\n ...baseOptions.filter(\r\n (option) =>\r\n regex.test(option.title) ||\r\n option.keywords.some((keyword) => regex.test(keyword)),\r\n ),\r\n ];\r\n }, [editor, queryString, showModal]);\r\n\r\n useEffect(() => {\r\n if (isPickerOpen && searchInputRef.current) {\r\n // Use preventScroll to avoid the Sheet scrolling to top when the\r\n // picker is portaled outside the Sheet's DOM tree.\r\n searchInputRef.current.focus({preventScroll: true});\r\n }\r\n }, [isPickerOpen]);\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen || !options.length) {\r\n return;\r\n }\r\n setHighlightedIndex((current) =>\r\n Math.min(current, Math.max(options.length - 1, 0)),\r\n );\r\n }, [isPickerOpen, options.length]);\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen) {\r\n return;\r\n }\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node | null;\r\n if (\r\n (pickerRef.current && pickerRef.current.contains(target)) ||\r\n (menuRef.current && menuRef.current.contains(target))\r\n ) {\r\n return;\r\n }\r\n setIsPickerOpen(false);\r\n setPickerState(null);\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isPickerOpen]);\r\n\r\n const selectOption = useCallback(\r\n (option: ComponentPickerOption) => {\r\n if (!pickerState) {\r\n setIsPickerOpen(false);\r\n return;\r\n }\r\n setIsPickerOpen(false);\r\n editor.update(() => {\r\n const node = $getNodeByKey(pickerState.targetNodeKey);\r\n if (!node) {\r\n return;\r\n }\r\n const placeholder = $createParagraphNode();\r\n const textNode = $createTextNode('');\r\n placeholder.append(textNode);\r\n if (pickerState.insertBefore) {\r\n node.insertBefore(placeholder);\r\n } else {\r\n node.insertAfter(placeholder);\r\n }\r\n textNode.select();\r\n option.onSelect(queryString);\r\n const latestPlaceholder = placeholder.getLatest();\r\n if ($isParagraphNode(latestPlaceholder)) {\r\n const onlyChild = latestPlaceholder.getFirstChild();\r\n if (\r\n $isTextNode(onlyChild) &&\r\n onlyChild.getTextContent().length === 0 &&\r\n latestPlaceholder.getChildrenSize() === 1\r\n ) {\r\n latestPlaceholder.remove();\r\n }\r\n }\r\n });\r\n },\r\n [editor, pickerState, queryString],\r\n );\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen) {\r\n return;\r\n }\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (!isPickerOpen || !options.length) {\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n setHighlightedIndex((index) =>\r\n index + 1 >= options.length ? 0 : index + 1,\r\n );\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n setHighlightedIndex((index) =>\r\n index - 1 < 0 ? options.length - 1 : index - 1,\r\n );\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n const option = options[highlightedIndex];\r\n if (option) {\r\n selectOption(option);\r\n }\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n setIsPickerOpen(false);\r\n setPickerState(null);\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [highlightedIndex, isPickerOpen, options, selectOption]);\r\n\r\n function openComponentPicker(e: React.MouseEvent) {\r\n if (!draggableElement || !editor) {\r\n return;\r\n }\r\n\r\n let targetNodeKey: NodeKey | null = null;\r\n editor.read(() => {\r\n const resolvedNode = $getNearestNodeFromDOMNode(draggableElement);\r\n if (resolvedNode) {\r\n targetNodeKey = resolvedNode.getKey();\r\n }\r\n });\r\n\r\n if (!targetNodeKey) {\r\n return;\r\n }\r\n\r\n const insertBefore = e.altKey || e.ctrlKey;\r\n const rect = menuRef.current?.getBoundingClientRect();\r\n setPickerPosition(\r\n rect\r\n ? {\r\n left: rect.left + rect.width + window.scrollX + 8,\r\n top: rect.top + window.scrollY,\r\n }\r\n : null,\r\n );\r\n setPickerState({insertBefore, targetNodeKey});\r\n setQueryString('');\r\n setHighlightedIndex(0);\r\n setIsPickerOpen(true);\r\n }\r\n\r\n return (\r\n <>\r\n {modal}\r\n {isPickerOpen && pickerPosition\r\n ? ReactDOM.createPortal(\r\n <div\r\n className=\"typeahead-popover component-picker-menu draggable-block-component-picker\"\r\n ref={pickerRef}\r\n style={{\r\n left: pickerPosition.left,\r\n position: 'absolute',\r\n top: pickerPosition.top,\r\n zIndex: 10,\r\n }}>\r\n <input\r\n className=\"component-picker-search\"\r\n placeholder=\"Filter blocks...\"\r\n value={queryString}\r\n ref={searchInputRef}\r\n onChange={(event) => setQueryString(event.target.value)}\r\n />\r\n <ul>\r\n {options.map((option, i: number) => (\r\n <ComponentPickerMenuItem\r\n index={i}\r\n isSelected={highlightedIndex === i}\r\n onClick={() => {\r\n setHighlightedIndex(i);\r\n selectOption(option);\r\n }}\r\n onMouseEnter={() => setHighlightedIndex(i)}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n document.body,\r\n )\r\n : null}\r\n <DraggableBlockPlugin_EXPERIMENTAL\r\n anchorElem={anchorElem}\r\n menuRef={menuRef}\r\n targetLineRef={targetLineRef}\r\n menuComponent={\r\n <div ref={menuRef} className=\"icon draggable-block-menu\">\r\n <button\r\n type=\"button\"\r\n title=\"Click to add below\"\r\n className=\"icon icon-plus\"\r\n onClick={openComponentPicker}\r\n />\r\n <div className=\"icon\" />\r\n </div>\r\n }\r\n targetLineComponent={\r\n <div ref={targetLineRef} className=\"draggable-block-target-line\" />\r\n }\r\n isOnMenu={isOnMenu}\r\n onElementChanged={setDraggableElement}\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n LexicalTypeaheadMenuPlugin,\r\n MenuOption,\r\n useBasicTypeaheadTriggerMatch,\r\n} from '@lexical/react/LexicalTypeaheadMenuPlugin';\r\nimport {\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nclass EmojiOption extends MenuOption {\r\n title: string;\r\n emoji: string;\r\n keywords: Array<string>;\r\n\r\n constructor(\r\n title: string,\r\n emoji: string,\r\n options: {\r\n keywords?: Array<string>;\r\n },\r\n ) {\r\n super(title);\r\n this.title = title;\r\n this.emoji = emoji;\r\n this.keywords = options.keywords || [];\r\n }\r\n}\r\nfunction EmojiMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: EmojiOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n <span className=\"text\">\r\n {option.emoji} {option.title}\r\n </span>\r\n </li>\r\n );\r\n}\r\n\r\ntype Emoji = {\r\n emoji: string;\r\n description: string;\r\n category: string;\r\n aliases: Array<string>;\r\n tags: Array<string>;\r\n unicode_version: string;\r\n ios_version: string;\r\n skin_tones?: boolean;\r\n};\r\n\r\nconst MAX_EMOJI_SUGGESTION_COUNT = 10;\r\n\r\nexport default function EmojiPickerPlugin() {\r\n const [editor] = useLexicalComposerContext();\r\n const [queryString, setQueryString] = useState<string | null>(null);\r\n const [emojis, setEmojis] = useState<Array<Emoji>>([]);\r\n\r\n useEffect(() => {\r\n import('../../utils/emoji-list').then((file) => setEmojis(file.default));\r\n }, []);\r\n\r\n const emojiOptions = useMemo(\r\n () =>\r\n emojis != null\r\n ? emojis.map(\r\n ({emoji, aliases, tags}) =>\r\n new EmojiOption(aliases[0], emoji, {\r\n keywords: [...aliases, ...tags],\r\n }),\r\n )\r\n : [],\r\n [emojis],\r\n );\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(':', {\r\n minLength: 0,\r\n punctuation: '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>:;', // allow _ and -\r\n });\r\n\r\n const options: Array<EmojiOption> = useMemo(() => {\r\n return emojiOptions\r\n .filter((option: EmojiOption) => {\r\n return queryString != null\r\n ? new RegExp(queryString, 'gi').exec(option.title) ||\r\n option.keywords != null\r\n ? option.keywords.some((keyword: string) =>\r\n new RegExp(queryString, 'gi').exec(keyword),\r\n )\r\n : false\r\n : emojiOptions;\r\n })\r\n .slice(0, MAX_EMOJI_SUGGESTION_COUNT);\r\n }, [emojiOptions, queryString]);\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: EmojiOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void,\r\n ) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection) || selectedOption == null) {\r\n return;\r\n }\r\n\r\n if (nodeToRemove) {\r\n nodeToRemove.remove();\r\n }\r\n\r\n selection.insertNodes([$createTextNode(selectedOption.emoji)]);\r\n\r\n closeMenu();\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n return (\r\n <LexicalTypeaheadMenuPlugin\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForTriggerMatch}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) => {\r\n if (anchorElementRef.current == null || options.length === 0) {\r\n return null;\r\n }\r\n\r\n return anchorElementRef.current && options.length\r\n ? ReactDOM.createPortal(\r\n <div className=\"typeahead-popover emoji-menu\">\r\n <ul>\r\n {options.map((option: EmojiOption, index) => (\r\n <EmojiMenuItem\r\n key={option.key}\r\n index={index}\r\n isSelected={selectedIndex === index}\r\n onClick={() => {\r\n setHighlightedIndex(index);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onMouseEnter={() => {\r\n setHighlightedIndex(index);\r\n }}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null;\r\n }}\r\n />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {\r\n $createLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n TOGGLE_LINK_COMMAND,\r\n} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$findMatchingParent, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isLineBreakNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n getDOMSelection,\r\n KEY_ESCAPE_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPositionForLinkEditor} from '../../utils/setFloatingElemPositionForLinkEditor';\r\nimport {sanitizeUrl} from '../../utils/url';\r\n\r\nfunction preventDefault(\r\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\r\n): void {\r\n event.preventDefault();\r\n}\r\n\r\nfunction FloatingLinkEditor({\r\n editor,\r\n isLink,\r\n setIsLink,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n isLink: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n anchorElem: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element {\r\n const editorRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const [editedLinkUrl, setEditedLinkUrl] = useState('https://');\r\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(\r\n null,\r\n );\r\n\r\n const $updateLinkEditor = useCallback(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection);\r\n const linkParent = $findMatchingParent(node, $isLinkNode);\r\n\r\n if (linkParent) {\r\n setLinkUrl(linkParent.getURL());\r\n } else if ($isLinkNode(node)) {\r\n setLinkUrl(node.getURL());\r\n } else {\r\n setLinkUrl('');\r\n }\r\n if (isLinkEditMode) {\r\n setEditedLinkUrl(linkUrl);\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length > 0) {\r\n const node = nodes[0];\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent)) {\r\n setLinkUrl(parent.getURL());\r\n } else if ($isLinkNode(node)) {\r\n setLinkUrl(node.getURL());\r\n } else {\r\n setLinkUrl('');\r\n }\r\n if (isLinkEditMode) {\r\n setEditedLinkUrl(linkUrl);\r\n }\r\n }\r\n }\r\n\r\n const editorElem = editorRef.current;\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const activeElement = document.activeElement;\r\n\r\n if (editorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n\r\n if (selection !== null && rootElement !== null && editor.isEditable()) {\r\n let domRect: DOMRect | undefined;\r\n\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length > 0) {\r\n const element = editor.getElementByKey(nodes[0].getKey());\r\n if (element) {\r\n domRect = element.getBoundingClientRect();\r\n }\r\n }\r\n } else if (\r\n nativeSelection !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n domRect =\r\n nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\r\n }\r\n\r\n if (domRect) {\r\n domRect.y += 40;\r\n setFloatingElemPositionForLinkEditor(domRect, editorElem, anchorElem);\r\n }\r\n setLastSelection(selection);\r\n } else if (!activeElement || activeElement.className !== 'link-input') {\r\n if (rootElement !== null) {\r\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem);\r\n }\r\n setLastSelection(null);\r\n setIsLinkEditMode(false);\r\n setLinkUrl('');\r\n }\r\n\r\n return true;\r\n }, [anchorElem, editor, setIsLinkEditMode, isLinkEditMode, linkUrl]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [anchorElem.parentElement, editor, $updateLinkEditor]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateLinkEditor();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateLinkEditor();\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n () => {\r\n if (isLink) {\r\n setIsLink(false);\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n );\r\n }, [editor, $updateLinkEditor, setIsLink, isLink]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n }, [editor, $updateLinkEditor]);\r\n\r\n useEffect(() => {\r\n if (isLinkEditMode && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [isLinkEditMode, isLink]);\r\n\r\n useEffect(() => {\r\n const editorElement = editorRef.current;\r\n if (editorElement === null) {\r\n return;\r\n }\r\n const handleBlur = (event: FocusEvent) => {\r\n if (!editorElement.contains(event.relatedTarget as Element) && isLink) {\r\n setIsLink(false);\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n editorElement.addEventListener('focusout', handleBlur);\r\n return () => {\r\n editorElement.removeEventListener('focusout', handleBlur);\r\n };\r\n }, [editorRef, setIsLink, setIsLinkEditMode, isLink]);\r\n\r\n const monitorInputInteraction = (\r\n event: React.KeyboardEvent<HTMLInputElement>,\r\n ) => {\r\n if (event.key === 'Enter') {\r\n handleLinkSubmission(event);\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n\r\n const handleLinkSubmission = (\r\n event:\r\n | React.KeyboardEvent<HTMLInputElement>\r\n | React.MouseEvent<HTMLElement>,\r\n ) => {\r\n event.preventDefault();\r\n if (lastSelection !== null) {\r\n if (linkUrl !== '') {\r\n editor.update(() => {\r\n editor.dispatchCommand(\r\n TOGGLE_LINK_COMMAND,\r\n sanitizeUrl(editedLinkUrl),\r\n );\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const parent = getSelectedNode(selection).getParent();\r\n if ($isAutoLinkNode(parent)) {\r\n const linkNode = $createLinkNode(parent.getURL(), {\r\n rel: parent.__rel,\r\n target: parent.__target,\r\n title: parent.__title,\r\n });\r\n parent.replace(linkNode, true);\r\n }\r\n }\r\n });\r\n }\r\n setEditedLinkUrl('https://');\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n\r\n return (\r\n <div ref={editorRef} className=\"link-editor\">\r\n {!isLink ? null : isLinkEditMode ? (\r\n <>\r\n <input\r\n ref={inputRef}\r\n className=\"link-input\"\r\n value={editedLinkUrl}\r\n onChange={(event) => {\r\n setEditedLinkUrl(event.target.value);\r\n }}\r\n onKeyDown={(event) => {\r\n monitorInputInteraction(event);\r\n }}\r\n />\r\n <div>\r\n <div\r\n className=\"link-cancel\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n setIsLinkEditMode(false);\r\n }}\r\n />\r\n\r\n <div\r\n className=\"link-confirm\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={handleLinkSubmission}\r\n />\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"link-view\">\r\n <a\r\n href={sanitizeUrl(linkUrl)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n {linkUrl}\r\n </a>\r\n <div\r\n className=\"link-edit\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={(event) => {\r\n event.preventDefault();\r\n setEditedLinkUrl(linkUrl);\r\n setIsLinkEditMode(true);\r\n }}\r\n />\r\n <div\r\n className=\"link-trash\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingLinkEditorToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n isLinkEditMode: boolean,\r\n setIsLinkEditMode: Dispatch<boolean>,\r\n): JSX.Element | null {\r\n const [activeEditor, setActiveEditor] = useState(editor);\r\n const [isLink, setIsLink] = useState(false);\r\n\r\n useEffect(() => {\r\n function $updateToolbar() {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const focusNode = getSelectedNode(selection);\r\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode);\r\n const focusAutoLinkNode = $findMatchingParent(\r\n focusNode,\r\n $isAutoLinkNode,\r\n );\r\n if (!(focusLinkNode || focusAutoLinkNode)) {\r\n setIsLink(false);\r\n return;\r\n }\r\n const badNode = selection\r\n .getNodes()\r\n .filter((node) => !$isLineBreakNode(node))\r\n .find((node) => {\r\n const linkNode = $findMatchingParent(node, $isLinkNode);\r\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode);\r\n return (\r\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\r\n (linkNode && !linkNode.is(focusLinkNode)) ||\r\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\r\n (autoLinkNode &&\r\n (!autoLinkNode.is(focusAutoLinkNode) ||\r\n autoLinkNode.getIsUnlinked()))\r\n );\r\n });\r\n if (!badNode) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length === 0) {\r\n setIsLink(false);\r\n return;\r\n }\r\n const node = nodes[0];\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n }\r\n }\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateToolbar();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_payload, newEditor) => {\r\n $updateToolbar();\r\n setActiveEditor(newEditor);\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL,\r\n ),\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection);\r\n const linkNode = $findMatchingParent(node, $isLinkNode);\r\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\r\n window.open(linkNode.getURL(), '_blank');\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return createPortal(\r\n <FloatingLinkEditor\r\n editor={activeEditor}\r\n isLink={isLink}\r\n anchorElem={anchorElem}\r\n setIsLink={setIsLink}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingLinkEditorPlugin({\r\n anchorElem = document.body,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingLinkEditorToolbar(\r\n editor,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {$isAtNodeEnd} from '@lexical/selection';\r\nimport {ElementNode, RangeSelection, TextNode} from 'lexical';\r\n\r\nexport function getSelectedNode(\r\n selection: RangeSelection,\r\n): TextNode | ElementNode {\r\n const anchor = selection.anchor;\r\n const focus = selection.focus;\r\n const anchorNode = selection.anchor.getNode();\r\n const focusNode = selection.focus.getNode();\r\n if (anchorNode === focusNode) {\r\n return anchorNode;\r\n }\r\n const isBackward = selection.isBackward();\r\n if (isBackward) {\r\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\r\n } else {\r\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\r\n }\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPositionForLinkEditor(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n top += floatingElemRect.height + targetRect.height + verticalGap * 2;\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n getDOMSelection,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isUppercase,\r\n isLowercase,\r\n isCapitalize,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isUppercase: boolean;\r\n isLowercase: boolean;\r\n isCapitalize: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n setIsLinkEditMode(true);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n setIsLinkEditMode(false);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink, setIsLinkEditMode]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const $updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = getDOMSelection(editor._window);\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, $updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n title=\"Bold\"\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n title=\"Italic\"\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n title=\"Underline\"\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n title=\"Strikethrough\"\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n }}\r\n className={'popup-item spaced ' + (isUppercase ? 'active' : '')}\r\n title=\"Uppercase\"\r\n aria-label=\"Format text to uppercase\">\r\n <i className=\"format uppercase\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n }}\r\n className={'popup-item spaced ' + (isLowercase ? 'active' : '')}\r\n title=\"Lowercase\"\r\n aria-label=\"Format text to lowercase\">\r\n <i className=\"format lowercase\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n }}\r\n className={'popup-item spaced ' + (isCapitalize ? 'active' : '')}\r\n title=\"Capitalize\"\r\n aria-label=\"Format text to capitalize\">\r\n <i className=\"format capitalize\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n title=\"Insert code block\"\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n title=\"Insert link\"\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n title=\"Insert comment\"\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n setIsLinkEditMode: Dispatch<boolean>,\r\n): JSX.Element | null {\r\n const [isText, setIsText] = useState(false);\r\n const [isLink, setIsLink] = useState(false);\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isUppercase, setIsUppercase] = useState(false);\r\n const [isLowercase, setIsLowercase] = useState(false);\r\n const [isCapitalize, setIsCapitalize] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n\r\n const updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsUppercase(selection.hasFormat('uppercase'));\r\n setIsLowercase(selection.hasFormat('lowercase'));\r\n setIsCapitalize(selection.hasFormat('capitalize'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isUppercase={isUppercase}\r\n isLowercase={isLowercase}\r\n isCapitalize={isCapitalize}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem, setIsLinkEditMode);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n // Check if text is end-aligned\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const textNode = range.startContainer;\r\n if (textNode.nodeType === Node.ELEMENT_NODE || textNode.parentElement) {\r\n const textElement =\r\n textNode.nodeType === Node.ELEMENT_NODE\r\n ? (textNode as Element)\r\n : (textNode.parentElement as Element);\r\n const textAlign = window.getComputedStyle(textElement).textAlign;\r\n\r\n if (textAlign === 'right' || textAlign === 'end') {\r\n // For end-aligned text, position the toolbar relative to the text end\r\n left = targetRect.right - floatingElemRect.width + horizontalOffset;\r\n }\r\n }\r\n }\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n if (left < editorScrollerRect.left) {\r\n left = editorScrollerRect.left + horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {MarkdownShortcutPlugin} from '@lexical/react/LexicalMarkdownShortcutPlugin';\r\nimport * as React from 'react';\r\n\r\nimport {PLAYGROUND_TRANSFORMERS} from '../MarkdownTransformers';\r\n\r\nexport default function MarkdownPlugin(): JSX.Element {\r\n return <MarkdownShortcutPlugin transformers={PLAYGROUND_TRANSFORMERS} />;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$trimTextContentFromAnchor} from '@lexical/selection';\r\nimport {$restoreEditorState} from '@lexical/utils';\r\nimport {$getSelection, $isRangeSelection, EditorState, RootNode} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nexport function MaxLengthPlugin({maxLength}: {maxLength: number}): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n let lastRestoredEditorState: EditorState | null = null;\r\n\r\n return editor.registerNodeTransform(RootNode, (rootNode: RootNode) => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\r\n return;\r\n }\r\n const prevEditorState = editor.getEditorState();\r\n const prevTextContentSize = prevEditorState.read(() =>\r\n rootNode.getTextContentSize(),\r\n );\r\n const textContentSize = rootNode.getTextContentSize();\r\n if (prevTextContentSize !== textContentSize) {\r\n const delCount = textContentSize - maxLength;\r\n const anchor = selection.anchor;\r\n\r\n if (delCount > 0) {\r\n // Restore the old editor state instead if the last\r\n // text content was already at the limit.\r\n if (\r\n prevTextContentSize === maxLength &&\r\n lastRestoredEditorState !== prevEditorState\r\n ) {\r\n lastRestoredEditorState = prevEditorState;\r\n $restoreEditorState(editor, prevEditorState);\r\n } else {\r\n $trimTextContentFromAnchor(editor, anchor, delCount);\r\n }\r\n }\r\n }\r\n });\r\n }, [editor, maxLength]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {HeadingTagType} from '@lexical/rich-text';\r\nimport {\r\n COMMAND_PRIORITY_NORMAL,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n INDENT_CONTENT_COMMAND,\r\n isModifierMatch,\r\n KEY_DOWN_COMMAND,\r\n LexicalEditor,\r\n OUTDENT_CONTENT_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useEffect} from 'react';\r\n\r\nimport {useToolbarState} from '../../context/ToolbarContext';\r\nimport {sanitizeUrl} from '../../utils/url';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\nimport {\r\n clearFormatting,\r\n formatBulletList,\r\n formatCheckList,\r\n formatCode,\r\n formatHeading,\r\n formatNumberedList,\r\n formatParagraph,\r\n formatQuote,\r\n updateFontSize,\r\n UpdateFontSizeType,\r\n} from '../ToolbarPlugin/utils';\r\nimport {\r\n isAddComment,\r\n isCapitalize,\r\n isCenterAlign,\r\n isClearFormatting,\r\n isDecreaseFontSize,\r\n isFormatBulletList,\r\n isFormatCheckList,\r\n isFormatCode,\r\n isFormatHeading,\r\n isFormatNumberedList,\r\n isFormatParagraph,\r\n isFormatQuote,\r\n isIncreaseFontSize,\r\n isIndent,\r\n isInsertCodeBlock,\r\n isInsertLink,\r\n isJustifyAlign,\r\n isLeftAlign,\r\n isLowercase,\r\n isOutdent,\r\n isRightAlign,\r\n isStrikeThrough,\r\n isSubscript,\r\n isSuperscript,\r\n isUppercase,\r\n} from './shortcuts';\r\n\r\nexport default function ShortcutsPlugin({\r\n editor,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): null {\r\n const {toolbarState} = useToolbarState();\r\n\r\n useEffect(() => {\r\n const keyboardShortcutsHandler = (event: KeyboardEvent) => {\r\n // Short-circuit, a least one modifier must be set\r\n if (isModifierMatch(event, {})) {\r\n return false;\r\n } else if (isFormatParagraph(event)) {\r\n formatParagraph(editor);\r\n } else if (isFormatHeading(event)) {\r\n const {code} = event;\r\n const headingSize = `h${code[code.length - 1]}` as HeadingTagType;\r\n formatHeading(editor, toolbarState.blockType, headingSize);\r\n } else if (isFormatBulletList(event)) {\r\n formatBulletList(editor, toolbarState.blockType);\r\n } else if (isFormatNumberedList(event)) {\r\n formatNumberedList(editor, toolbarState.blockType);\r\n } else if (isFormatCheckList(event)) {\r\n formatCheckList(editor, toolbarState.blockType);\r\n } else if (isFormatCode(event)) {\r\n formatCode(editor, toolbarState.blockType);\r\n } else if (isFormatQuote(event)) {\r\n formatQuote(editor, toolbarState.blockType);\r\n } else if (isStrikeThrough(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n } else if (isLowercase(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n } else if (isUppercase(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n } else if (isCapitalize(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n } else if (isIndent(event)) {\r\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined);\r\n } else if (isOutdent(event)) {\r\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined);\r\n } else if (isCenterAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\r\n } else if (isLeftAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\r\n } else if (isRightAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\r\n } else if (isJustifyAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\r\n } else if (isSubscript(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n } else if (isSuperscript(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n } else if (isInsertCodeBlock(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n } else if (isIncreaseFontSize(event)) {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.increment,\r\n toolbarState.fontSizeInputValue,\r\n );\r\n } else if (isDecreaseFontSize(event)) {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.decrement,\r\n toolbarState.fontSizeInputValue,\r\n );\r\n } else if (isClearFormatting(event)) {\r\n clearFormatting(editor);\r\n } else if (isInsertLink(event)) {\r\n const url = toolbarState.isLink ? null : sanitizeUrl('https://');\r\n setIsLinkEditMode(!toolbarState.isLink);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\r\n } else if (isAddComment(event)) {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n } else {\r\n // No match for any of the event handlers\r\n return false;\r\n }\r\n event.preventDefault();\r\n return true;\r\n };\r\n\r\n return editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n keyboardShortcutsHandler,\r\n COMMAND_PRIORITY_NORMAL,\r\n );\r\n }, [\r\n editor,\r\n toolbarState.isLink,\r\n toolbarState.blockType,\r\n toolbarState.fontSizeInputValue,\r\n setIsLinkEditMode,\r\n ]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {$createCodeNode} from '@lexical/code';\r\nimport {\r\n INSERT_CHECK_LIST_COMMAND,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport {$isDecoratorBlockNode} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport {\r\n $createHeadingNode,\r\n $createQuoteNode,\r\n $isHeadingNode,\r\n $isQuoteNode,\r\n HeadingTagType,\r\n} from '@lexical/rich-text';\r\nimport {$patchStyleText, $setBlocksType} from '@lexical/selection';\r\nimport {$isTableSelection} from '@lexical/table';\r\nimport {$getNearestBlockElementAncestorOrThrow} from '@lexical/utils';\r\nimport {\r\n $addUpdateTag,\r\n $createParagraphNode,\r\n $createRangeSelection,\r\n $getSelection,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n $splitNode,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n SKIP_DOM_SELECTION_TAG,\r\n SKIP_SELECTION_FOCUS_TAG,\r\n} from 'lexical';\r\n\r\nimport {\r\n DEFAULT_FONT_SIZE,\r\n MAX_ALLOWED_FONT_SIZE,\r\n MIN_ALLOWED_FONT_SIZE,\r\n} from '../../context/ToolbarContext';\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum UpdateFontSizeType {\r\n increment = 1,\r\n decrement,\r\n}\r\n\r\n/**\r\n * Calculates the new font size based on the update type.\r\n * @param currentFontSize - The current font size\r\n * @param updateType - The type of change, either increment or decrement\r\n * @returns the next font size\r\n */\r\nexport const calculateNextFontSize = (\r\n currentFontSize: number,\r\n updateType: UpdateFontSizeType | null,\r\n) => {\r\n if (!updateType) {\r\n return currentFontSize;\r\n }\r\n\r\n let updatedFontSize: number = currentFontSize;\r\n switch (updateType) {\r\n case UpdateFontSizeType.decrement:\r\n switch (true) {\r\n case currentFontSize > MAX_ALLOWED_FONT_SIZE:\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n break;\r\n case currentFontSize >= 48:\r\n updatedFontSize -= 12;\r\n break;\r\n case currentFontSize >= 24:\r\n updatedFontSize -= 4;\r\n break;\r\n case currentFontSize >= 14:\r\n updatedFontSize -= 2;\r\n break;\r\n case currentFontSize >= 9:\r\n updatedFontSize -= 1;\r\n break;\r\n default:\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n break;\r\n }\r\n break;\r\n\r\n case UpdateFontSizeType.increment:\r\n switch (true) {\r\n case currentFontSize < MIN_ALLOWED_FONT_SIZE:\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n break;\r\n case currentFontSize < 12:\r\n updatedFontSize += 1;\r\n break;\r\n case currentFontSize < 20:\r\n updatedFontSize += 2;\r\n break;\r\n case currentFontSize < 36:\r\n updatedFontSize += 4;\r\n break;\r\n case currentFontSize <= 60:\r\n updatedFontSize += 12;\r\n break;\r\n default:\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n break;\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n return updatedFontSize;\r\n};\r\n\r\n/**\r\n * Patches the selection with the updated font size.\r\n */\r\nexport const updateFontSizeInSelection = (\r\n editor: LexicalEditor,\r\n newFontSize: string | null,\r\n updateType: UpdateFontSizeType | null,\r\n skipRefocus: boolean,\r\n) => {\r\n const getNextFontSize = (prevFontSize: string | null): string => {\r\n if (!prevFontSize) {\r\n prevFontSize = `${DEFAULT_FONT_SIZE}px`;\r\n }\r\n prevFontSize = prevFontSize.slice(0, -2);\r\n const nextFontSize = calculateNextFontSize(\r\n Number(prevFontSize),\r\n updateType,\r\n );\r\n return `${nextFontSize}px`;\r\n };\r\n\r\n editor.update(() => {\r\n if (skipRefocus) {\r\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\r\n }\r\n if (editor.isEditable()) {\r\n const selection = $getSelection();\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n 'font-size': newFontSize || getNextFontSize,\r\n });\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const updateFontSize = (\r\n editor: LexicalEditor,\r\n updateType: UpdateFontSizeType,\r\n inputValue: string,\r\n skipRefocus: boolean = false,\r\n) => {\r\n if (inputValue !== '') {\r\n const nextFontSize = calculateNextFontSize(Number(inputValue), updateType);\r\n updateFontSizeInSelection(\r\n editor,\r\n String(nextFontSize) + 'px',\r\n null,\r\n skipRefocus,\r\n );\r\n } else {\r\n updateFontSizeInSelection(editor, null, updateType, skipRefocus);\r\n }\r\n};\r\n\r\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n });\r\n};\r\n\r\nexport const formatHeading = (\r\n editor: LexicalEditor,\r\n blockType: string,\r\n headingSize: HeadingTagType,\r\n) => {\r\n if (blockType !== headingSize) {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\r\n });\r\n }\r\n};\r\n\r\nexport const formatBulletList = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'bullet') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatCheckList = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'check') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatNumberedList = (\r\n editor: LexicalEditor,\r\n blockType: string,\r\n) => {\r\n if (blockType !== 'number') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatQuote = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'quote') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n });\r\n }\r\n};\r\n\r\nfunction $splitParagraphsByLineBreaks(selection: RangeSelection): void {\r\n const blocks: Set<ElementNode> = new Set();\r\n for (const node of selection.getNodes()) {\r\n const block = $isParagraphNode(node) ? node : $findParagraphParent(node);\r\n if (block !== null) {\r\n blocks.add(block);\r\n }\r\n }\r\n for (const point of [selection.anchor, selection.focus]) {\r\n const block = $findParagraphParent(point.getNode());\r\n if (block !== null) {\r\n blocks.add(block);\r\n }\r\n }\r\n\r\n const anchorKey = selection.anchor.key;\r\n const anchorOffset = selection.anchor.offset;\r\n const anchorType = selection.anchor.type;\r\n const focusKey = selection.focus.key;\r\n const focusOffset = selection.focus.offset;\r\n const focusType = selection.focus.type;\r\n\r\n for (const block of blocks) {\r\n const children = block.getChildren();\r\n const lbIndices: number[] = [];\r\n for (let i = 0; i < children.length; i++) {\r\n if ($isLineBreakNode(children[i])) {\r\n lbIndices.push(i);\r\n }\r\n }\r\n if (lbIndices.length === 0) {\r\n continue;\r\n }\r\n for (let j = lbIndices.length - 1; j >= 0; j--) {\r\n const [, rightBlock] = $splitNode(block, lbIndices[j]);\r\n const firstChild = rightBlock.getFirstChild();\r\n if ($isLineBreakNode(firstChild)) {\r\n firstChild.remove();\r\n }\r\n }\r\n }\r\n\r\n const newSelection = $createRangeSelection();\r\n newSelection.anchor.set(anchorKey, anchorOffset, anchorType);\r\n newSelection.focus.set(focusKey, focusOffset, focusType);\r\n $setSelection(newSelection);\r\n}\r\n\r\nfunction $findParagraphParent(node: LexicalNode): ElementNode | null {\r\n if ($isParagraphNode(node)) {\r\n return node;\r\n }\r\n const parent = node.getParent();\r\n return $isElementNode(parent) && $isParagraphNode(parent) ? parent : null;\r\n}\r\n\r\nexport const formatCode = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'code') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n let selection = $getSelection();\r\n if (!selection) {\r\n return;\r\n }\r\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n } else {\r\n $splitParagraphsByLineBreaks(selection);\r\n selection = $getSelection();\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n const textContent = selection.getTextContent();\r\n const codeNode = $createCodeNode();\r\n selection.insertNodes([codeNode]);\r\n selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n selection.insertRawText(textContent);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const clearFormatting = (\r\n editor: LexicalEditor,\r\n skipRefocus: boolean = false,\r\n) => {\r\n editor.update(() => {\r\n if (skipRefocus) {\r\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\r\n }\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const anchor = selection.anchor;\r\n const focus = selection.focus;\r\n const nodes = selection.getNodes();\r\n const extractedNodes = selection.extract();\r\n\r\n if (anchor.key === focus.key && anchor.offset === focus.offset) {\r\n return;\r\n }\r\n\r\n nodes.forEach((node, idx) => {\r\n // We split the first and last node by the selection\r\n // So that we don't format unselected text inside those nodes\r\n if ($isTextNode(node)) {\r\n // Use a separate variable to ensure TS does not lose the refinement\r\n let textNode = node;\r\n if (idx === 0 && anchor.offset !== 0) {\r\n textNode = textNode.splitText(anchor.offset)[1] || textNode;\r\n }\r\n if (idx === nodes.length - 1) {\r\n textNode = textNode.splitText(focus.offset)[0] || textNode;\r\n }\r\n /**\r\n * If the selected text has one format applied\r\n * selecting a portion of the text, could\r\n * clear the format to the wrong portion of the text.\r\n *\r\n * The cleared text is based on the length of the selected text.\r\n */\r\n // We need this in case the selected text only has one format\r\n const extractedTextNode = extractedNodes[0];\r\n if (nodes.length === 1 && $isTextNode(extractedTextNode)) {\r\n textNode = extractedTextNode;\r\n }\r\n\r\n if (textNode.__style !== '') {\r\n textNode.setStyle('');\r\n }\r\n if (textNode.__format !== 0) {\r\n textNode.setFormat(0);\r\n }\r\n const nearestBlockElement =\r\n $getNearestBlockElementAncestorOrThrow(textNode);\r\n if (nearestBlockElement.__format !== 0) {\r\n nearestBlockElement.setFormat('');\r\n }\r\n if (nearestBlockElement.__indent !== 0) {\r\n nearestBlockElement.setIndent(0);\r\n }\r\n node = textNode;\r\n } else if ($isHeadingNode(node) || $isQuoteNode(node)) {\r\n node.replace($createParagraphNode(), true);\r\n } else if ($isDecoratorBlockNode(node)) {\r\n node.setFormat('');\r\n }\r\n });\r\n }\r\n });\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_APPLE} from '@lexical/utils';\r\nimport {isModifierMatch} from 'lexical';\r\n\r\n//disable eslint sorting rule for quick reference to shortcuts\r\n/* eslint-disable */\r\nexport const SHORTCUTS = Object.freeze({\r\n // (Ctrl|⌘) + (Alt|Option) + <key> shortcuts\r\n NORMAL: IS_APPLE ? '⌘+Opt+0' : 'Ctrl+Alt+0',\r\n HEADING1: IS_APPLE ? '⌘+Opt+1' : 'Ctrl+Alt+1',\r\n HEADING2: IS_APPLE ? '⌘+Opt+2' : 'Ctrl+Alt+2',\r\n HEADING3: IS_APPLE ? '⌘+Opt+3' : 'Ctrl+Alt+3',\r\n NUMBERED_LIST: IS_APPLE ? '⌘+Shift+7' : 'Ctrl+Shift+7',\r\n BULLET_LIST: IS_APPLE ? '⌘+Shift+8' : 'Ctrl+Shift+8',\r\n CHECK_LIST: IS_APPLE ? '⌘+Shift+9' : 'Ctrl+Shift+9',\r\n CODE_BLOCK: IS_APPLE ? '⌘+Opt+C' : 'Ctrl+Alt+C',\r\n QUOTE: IS_APPLE ? '⌃+Shift+Q' : 'Ctrl+Shift+Q',\r\n ADD_COMMENT: IS_APPLE ? '⌘+Opt+M' : 'Ctrl+Alt+M',\r\n\r\n // (Ctrl|⌘) + Shift + <key> shortcuts\r\n INCREASE_FONT_SIZE: IS_APPLE ? '⌘+Shift+.' : 'Ctrl+Shift+.',\r\n DECREASE_FONT_SIZE: IS_APPLE ? '⌘+Shift+,' : 'Ctrl+Shift+,',\r\n INSERT_CODE_BLOCK: IS_APPLE ? '⌘+Shift+C' : 'Ctrl+Shift+C',\r\n STRIKETHROUGH: IS_APPLE ? '⌘+Shift+X' : 'Ctrl+Shift+X',\r\n LOWERCASE: IS_APPLE ? '⌃+Shift+1' : 'Ctrl+Shift+1',\r\n UPPERCASE: IS_APPLE ? '⌃+Shift+2' : 'Ctrl+Shift+2',\r\n CAPITALIZE: IS_APPLE ? '⌃+Shift+3' : 'Ctrl+Shift+3',\r\n CENTER_ALIGN: IS_APPLE ? '⌘+Shift+E' : 'Ctrl+Shift+E',\r\n JUSTIFY_ALIGN: IS_APPLE ? '⌘+Shift+J' : 'Ctrl+Shift+J',\r\n LEFT_ALIGN: IS_APPLE ? '⌘+Shift+L' : 'Ctrl+Shift+L',\r\n RIGHT_ALIGN: IS_APPLE ? '⌘+Shift+R' : 'Ctrl+Shift+R',\r\n\r\n // (Ctrl|⌘) + <key> shortcuts\r\n SUBSCRIPT: IS_APPLE ? '⌘+,' : 'Ctrl+,',\r\n SUPERSCRIPT: IS_APPLE ? '⌘+.' : 'Ctrl+.',\r\n INDENT: IS_APPLE ? '⌘+]' : 'Ctrl+]',\r\n OUTDENT: IS_APPLE ? '⌘+[' : 'Ctrl+[',\r\n CLEAR_FORMATTING: IS_APPLE ? '⌘+\\\\' : 'Ctrl+\\\\',\r\n REDO: IS_APPLE ? '⌘+Shift+Z' : 'Ctrl+Y',\r\n UNDO: IS_APPLE ? '⌘+Z' : 'Ctrl+Z',\r\n BOLD: IS_APPLE ? '⌘+B' : 'Ctrl+B',\r\n ITALIC: IS_APPLE ? '⌘+I' : 'Ctrl+I',\r\n UNDERLINE: IS_APPLE ? '⌘+U' : 'Ctrl+U',\r\n INSERT_LINK: IS_APPLE ? '⌘+K' : 'Ctrl+K',\r\n});\r\n\r\nconst CONTROL_OR_META = {ctrlKey: !IS_APPLE, metaKey: IS_APPLE};\r\n\r\nexport function isFormatParagraph(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n\r\n return (\r\n (code === 'Numpad0' || code === 'Digit0') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatHeading(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n\r\n // Apple pencil keyboard events don't have a code property\r\n if (!code) {\r\n return false;\r\n }\r\n\r\n const keyNumber = code[code.length - 1];\r\n\r\n return (\r\n ['1', '2', '3'].includes(keyNumber) &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatNumberedList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad7' || code === 'Digit7') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatBulletList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad8' || code === 'Digit8') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatCheckList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad9' || code === 'Digit9') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatCode(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyC' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatQuote(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyQ' &&\r\n isModifierMatch(event, {\r\n ctrlKey: true,\r\n shiftKey: true,\r\n })\r\n );\r\n}\r\n\r\nexport function isLowercase(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad1' || code === 'Digit1') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isUppercase(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad2' || code === 'Digit2') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isCapitalize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad3' || code === 'Digit3') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isStrikeThrough(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyX' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isIndent(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'BracketRight' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isOutdent(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'BracketLeft' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isCenterAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyE' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isLeftAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyL' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isRightAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyR' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isJustifyAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyJ' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isSubscript(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Comma' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isSuperscript(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Period' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isInsertCodeBlock(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyC' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isIncreaseFontSize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'Period' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isDecreaseFontSize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'Comma' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isClearFormatting(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Backslash' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isInsertLink(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'KeyK' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isAddComment(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyM' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {TextNode} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createSpecialTextNode,\r\n SpecialTextNode,\r\n} from '../../nodes/SpecialTextNode';\r\n\r\nconst BRACKETED_TEXT_REGEX = /\\[([^\\[\\]]+)\\]/; // eslint-disable-line\r\n\r\nfunction $findAndTransformText(node: TextNode): null | TextNode {\r\n const text = node.getTextContent();\r\n\r\n const match = BRACKETED_TEXT_REGEX.exec(text);\r\n if (match) {\r\n const matchedText = match[1];\r\n const startIndex = match.index;\r\n\r\n let targetNode;\r\n if (startIndex === 0) {\r\n [targetNode] = node.splitText(startIndex + match[0].length);\r\n } else {\r\n [, targetNode] = node.splitText(startIndex, startIndex + match[0].length);\r\n }\r\n\r\n const specialTextNode = $createSpecialTextNode(matchedText);\r\n targetNode.replace(specialTextNode);\r\n return specialTextNode;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction $textNodeTransform(node: TextNode): void {\r\n let targetNode: TextNode | null = node;\r\n\r\n while (targetNode !== null) {\r\n if (!targetNode.isSimpleText()) {\r\n return;\r\n }\r\n\r\n targetNode = $findAndTransformText(targetNode);\r\n }\r\n}\r\n\r\nfunction useTextTransformation(editor: LexicalEditor): void {\r\n useEffect(() => {\r\n if (!editor.hasNodes([SpecialTextNode])) {\r\n throw new Error(\r\n 'SpecialTextPlugin: SpecialTextNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerNodeTransform(TextNode, $textNodeTransform);\r\n }, [editor]);\r\n}\r\n\r\nexport default function SpecialTextPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useTextTransformation(editor);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {EditorConfig, LexicalNode, SerializedTextNode} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {$applyNodeReplacement, TextNode} from 'lexical';\r\n\r\n/** @noInheritDoc */\r\nexport class SpecialTextNode extends TextNode {\r\n static getType(): string {\r\n return 'specialText';\r\n }\r\n\r\n static clone(node: SpecialTextNode): SpecialTextNode {\r\n return new SpecialTextNode(node.__text, node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('span');\r\n addClassNamesToElement(dom, config.theme.specialText);\r\n dom.textContent = this.getTextContent();\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n if (prevNode.__text.startsWith('[') && prevNode.__text.endsWith(']')) {\r\n const strippedText = this.__text.substring(1, this.__text.length - 1); // Strip brackets again\r\n dom.textContent = strippedText; // Update the text content\r\n }\r\n\r\n addClassNamesToElement(dom, config.theme.specialText);\r\n\r\n return false;\r\n }\r\n\r\n static importJSON(serializedNode: SerializedTextNode): SpecialTextNode {\r\n return $createSpecialTextNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isTextEntity(): true {\r\n return true;\r\n }\r\n canInsertTextAfter(): boolean {\r\n return false; // Prevents appending text to this node\r\n }\r\n}\r\n\r\n/**\r\n * Creates a SpecialTextNode with the given text.\r\n * @param text - Text content for the SpecialTextNode.\r\n * @returns A new SpecialTextNode instance.\r\n */\r\nexport function $createSpecialTextNode(text = ''): SpecialTextNode {\r\n return $applyNodeReplacement(new SpecialTextNode(text));\r\n}\r\n\r\n/**\r\n * Checks if a node is a SpecialTextNode.\r\n * @param node - Node to check.\r\n * @returns True if the node is a SpecialTextNode.\r\n */\r\nexport function $isSpecialTextNode(\r\n node: LexicalNode | null | undefined,\r\n): node is SpecialTextNode {\r\n return node instanceof SpecialTextNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n COMMAND_PRIORITY_LOW,\r\n FOCUS_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nconst TAB_TO_FOCUS_INTERVAL = 100;\r\n\r\nlet lastTabKeyDownTimestamp = 0;\r\nlet hasRegisteredKeyDownListener = false;\r\n\r\nfunction registerKeyTimeStampTracker() {\r\n window.addEventListener(\r\n 'keydown',\r\n (event: KeyboardEvent) => {\r\n // Tab\r\n if (event.key === 'Tab') {\r\n lastTabKeyDownTimestamp = event.timeStamp;\r\n }\r\n },\r\n true,\r\n );\r\n}\r\n\r\nexport default function TabFocusPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!hasRegisteredKeyDownListener) {\r\n registerKeyTimeStampTracker();\r\n hasRegisteredKeyDownListener = true;\r\n }\r\n\r\n return editor.registerCommand(\r\n FOCUS_COMMAND,\r\n (event: FocusEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n if (\r\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL >\r\n event.timeStamp\r\n ) {\r\n $setSelection(selection.clone());\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {ElementNode, LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {\r\n $computeTableMapSkipCellCheck,\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $getNodeTriplet,\r\n $getTableCellNodeFromLexicalNode,\r\n $getTableColumnIndexFromTableCellNode,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $insertTableColumnAtSelection,\r\n $insertTableRowAtSelection,\r\n $isTableCellNode,\r\n $isTableSelection,\r\n $mergeCells,\r\n $unmergeCell,\r\n getTableElement,\r\n getTableObserverFromTableElement,\r\n TableCellHeaderStates,\r\n TableCellNode,\r\n TableObserver,\r\n TableSelection,\r\n} from '@lexical/table';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n getDOMSelection,\r\n isDOMNode,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {ReactPortal, useCallback, useEffect, useRef, useState} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport ColorPicker from '../../ui/ColorPicker';\r\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\r\n\r\nfunction computeSelectionCount(selection: TableSelection): {\r\n columns: number;\r\n rows: number;\r\n} {\r\n const selectionShape = selection.getShape();\r\n return {\r\n columns: selectionShape.toX - selectionShape.fromX + 1,\r\n rows: selectionShape.toY - selectionShape.fromY + 1,\r\n };\r\n}\r\n\r\nfunction $canUnmerge(): boolean {\r\n const selection = $getSelection();\r\n if (\r\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\r\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\r\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\r\n ) {\r\n return false;\r\n }\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n return cell.__colSpan > 1 || cell.__rowSpan > 1;\r\n}\r\n\r\nfunction $selectLastDescendant(node: ElementNode): void {\r\n const lastDescendant = node.getLastDescendant();\r\n if ($isTextNode(lastDescendant)) {\r\n lastDescendant.select();\r\n } else if ($isElementNode(lastDescendant)) {\r\n lastDescendant.selectEnd();\r\n } else if (lastDescendant !== null) {\r\n lastDescendant.selectNext();\r\n }\r\n}\r\n\r\nfunction currentCellBackgroundColor(editor: LexicalEditor): null | string {\r\n return editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n return cell.getBackgroundColor();\r\n }\r\n }\r\n return null;\r\n });\r\n}\r\n\r\ntype TableCellActionMenuProps = Readonly<{\r\n contextRef: {current: null | HTMLElement};\r\n onClose: () => void;\r\n setIsMenuOpen: (isOpen: boolean) => void;\r\n showColorPickerModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element,\r\n ) => void;\r\n tableCellNode: TableCellNode;\r\n cellMerge: boolean;\r\n}>;\r\n\r\nfunction TableActionMenu({\r\n onClose,\r\n tableCellNode: _tableCellNode,\r\n setIsMenuOpen,\r\n contextRef,\r\n cellMerge,\r\n showColorPickerModal,\r\n}: TableCellActionMenuProps) {\r\n const [editor] = useLexicalComposerContext();\r\n const dropDownRef = useRef<HTMLDivElement | null>(null);\r\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode);\r\n const [selectionCounts, updateSelectionCounts] = useState({\r\n columns: 1,\r\n rows: 1,\r\n });\r\n const [canMergeCells, setCanMergeCells] = useState(false);\r\n const [canUnmergeCell, setCanUnmergeCell] = useState(false);\r\n const [backgroundColor, setBackgroundColor] = useState(\r\n () => currentCellBackgroundColor(editor) || '',\r\n );\r\n\r\n useEffect(() => {\r\n return editor.registerMutationListener(\r\n TableCellNode,\r\n (nodeMutations) => {\r\n const nodeUpdated =\r\n nodeMutations.get(tableCellNode.getKey()) === 'updated';\r\n\r\n if (nodeUpdated) {\r\n editor.getEditorState().read(() => {\r\n updateTableCellNode(tableCellNode.getLatest());\r\n });\r\n setBackgroundColor(currentCellBackgroundColor(editor) || '');\r\n }\r\n },\r\n {skipInitialization: true},\r\n );\r\n }, [editor, tableCellNode]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n // Merge cells\r\n if ($isTableSelection(selection)) {\r\n const currentSelectionCounts = computeSelectionCount(selection);\r\n updateSelectionCounts(computeSelectionCount(selection));\r\n setCanMergeCells(\r\n currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1,\r\n );\r\n }\r\n // Unmerge cell\r\n setCanUnmergeCell($canUnmerge());\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n const menuButtonElement = contextRef.current;\r\n const dropDownElement = dropDownRef.current;\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n menuButtonElement != null &&\r\n dropDownElement != null &&\r\n rootElement != null\r\n ) {\r\n const rootEleRect = rootElement.getBoundingClientRect();\r\n const menuButtonRect = menuButtonElement.getBoundingClientRect();\r\n dropDownElement.style.opacity = '1';\r\n const dropDownElementRect = dropDownElement.getBoundingClientRect();\r\n const margin = 5;\r\n let leftPosition = menuButtonRect.right + margin;\r\n if (\r\n leftPosition + dropDownElementRect.width > window.innerWidth ||\r\n leftPosition + dropDownElementRect.width > rootEleRect.right\r\n ) {\r\n const position =\r\n menuButtonRect.left - dropDownElementRect.width - margin;\r\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset;\r\n }\r\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`;\r\n\r\n let topPosition = menuButtonRect.top;\r\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\r\n const position = menuButtonRect.bottom - dropDownElementRect.height;\r\n topPosition = position < 0 ? margin : position;\r\n }\r\n dropDownElement.style.top = `${topPosition}px`;\r\n }\r\n }, [contextRef, dropDownRef, editor]);\r\n\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (\r\n dropDownRef.current != null &&\r\n contextRef.current != null &&\r\n isDOMNode(event.target) &&\r\n !dropDownRef.current.contains(event.target) &&\r\n !contextRef.current.contains(event.target)\r\n ) {\r\n setIsMenuOpen(false);\r\n }\r\n }\r\n\r\n window.addEventListener('click', handleClickOutside);\r\n\r\n return () => window.removeEventListener('click', handleClickOutside);\r\n }, [setIsMenuOpen, contextRef]);\r\n\r\n const clearTableSelection = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n\r\n const tableObserver = getTableObserverFromTableElement(tableElement);\r\n if (tableObserver !== null) {\r\n tableObserver.$clearHighlight();\r\n }\r\n\r\n tableNode.markDirty();\r\n updateTableCellNode(tableCellNode.getLatest());\r\n }\r\n $setSelection(null);\r\n });\r\n }, [editor, tableCellNode]);\r\n\r\n const mergeTableCellsAtSelection = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (!$isTableSelection(selection)) {\r\n return;\r\n }\r\n\r\n const nodes = selection.getNodes();\r\n const tableCells = nodes.filter($isTableCellNode);\r\n const targetCell = $mergeCells(tableCells);\r\n\r\n if (targetCell) {\r\n $selectLastDescendant(targetCell);\r\n onClose();\r\n }\r\n });\r\n };\r\n\r\n const unmergeTableCellsAtSelection = () => {\r\n editor.update(() => {\r\n $unmergeCell();\r\n });\r\n };\r\n\r\n const insertTableRowAtSelection = useCallback(\r\n (shouldInsertAfter: boolean) => {\r\n editor.update(() => {\r\n for (let i = 0; i < selectionCounts.rows; i++) {\r\n $insertTableRowAtSelection(shouldInsertAfter);\r\n }\r\n onClose();\r\n });\r\n },\r\n [editor, onClose, selectionCounts.rows],\r\n );\r\n\r\n const insertTableColumnAtSelection = useCallback(\r\n (shouldInsertAfter: boolean) => {\r\n editor.update(() => {\r\n for (let i = 0; i < selectionCounts.columns; i++) {\r\n $insertTableColumnAtSelection(shouldInsertAfter);\r\n }\r\n onClose();\r\n });\r\n },\r\n [editor, onClose, selectionCounts.columns],\r\n );\r\n\r\n const deleteTableRowAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n $deleteTableRowAtSelection();\r\n onClose();\r\n });\r\n }, [editor, onClose]);\r\n\r\n const deleteTableAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n tableNode.remove();\r\n\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const deleteTableColumnAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n $deleteTableColumnAtSelection();\r\n onClose();\r\n });\r\n }, [editor, onClose]);\r\n\r\n const toggleTableRowIsHeader = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n\r\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);\r\n\r\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\r\n\r\n const rowCells = new Set<TableCellNode>();\r\n\r\n const newStyle =\r\n tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW;\r\n\r\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\r\n const mapCell = gridMap[tableRowIndex][col];\r\n\r\n if (!mapCell?.cell) {\r\n continue;\r\n }\r\n\r\n if (!rowCells.has(mapCell.cell)) {\r\n rowCells.add(mapCell.cell);\r\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleTableColumnIsHeader = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n\r\n const tableColumnIndex =\r\n $getTableColumnIndexFromTableCellNode(tableCellNode);\r\n\r\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\r\n\r\n const columnCells = new Set<TableCellNode>();\r\n const newStyle =\r\n tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN;\r\n\r\n for (let row = 0; row < gridMap.length; row++) {\r\n const mapCell = gridMap[row][tableColumnIndex];\r\n\r\n if (!mapCell?.cell) {\r\n continue;\r\n }\r\n\r\n if (!columnCells.has(mapCell.cell)) {\r\n columnCells.add(mapCell.cell);\r\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleRowStriping = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setRowStriping(!tableNode.getRowStriping());\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleFirstRowFreeze = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setFrozenRows(tableNode.getFrozenRows() === 0 ? 1 : 0);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleFirstColumnFreeze = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setFrozenColumns(\r\n tableNode.getFrozenColumns() === 0 ? 1 : 0,\r\n );\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const handleCellBackgroundColor = useCallback(\r\n (value: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n cell.setBackgroundColor(value);\r\n }\r\n\r\n if ($isTableSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if ($isTableCellNode(node)) {\r\n node.setBackgroundColor(value);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n const formatVerticalAlign = (value: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n cell.setVerticalAlign(value);\r\n }\r\n\r\n if ($isTableSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if ($isTableCellNode(node)) {\r\n node.setVerticalAlign(value);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n let mergeCellButton: null | JSX.Element = null;\r\n if (cellMerge) {\r\n if (canMergeCells) {\r\n mergeCellButton = (\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => mergeTableCellsAtSelection()}\r\n data-test-id=\"table-merge-cells\">\r\n <span className=\"text\">Merge cells</span>\r\n </button>\r\n );\r\n } else if (canUnmergeCell) {\r\n mergeCellButton = (\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => unmergeTableCellsAtSelection()}\r\n data-test-id=\"table-unmerge-cells\">\r\n <span className=\"text\">Unmerge cells</span>\r\n </button>\r\n );\r\n }\r\n }\r\n\r\n return createPortal(\r\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\r\n <div\r\n className=\"dropdown\"\r\n ref={dropDownRef}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n }}>\r\n {mergeCellButton}\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() =>\r\n showColorPickerModal('Cell background color', () => (\r\n <ColorPicker\r\n color={backgroundColor}\r\n onChange={handleCellBackgroundColor}\r\n />\r\n ))\r\n }\r\n data-test-id=\"table-background-color\">\r\n <span className=\"text\">Background color</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleRowStriping()}\r\n data-test-id=\"table-row-striping\">\r\n <span className=\"text\">Toggle Row Striping</span>\r\n </button>\r\n <DropDown\r\n buttonLabel=\"Vertical Align\"\r\n buttonClassName=\"item\"\r\n buttonAriaLabel=\"Formatting options for vertical alignment\">\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('top');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-top\" />\r\n <span className=\"text\">Top Align</span>\r\n </div>\r\n </DropDownItem>\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('middle');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-middle\" />\r\n <span className=\"text\">Middle Align</span>\r\n </div>\r\n </DropDownItem>\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('bottom');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-bottom\" />\r\n <span className=\"text\">Bottom Align</span>\r\n </div>\r\n </DropDownItem>\r\n </DropDown>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleFirstRowFreeze()}\r\n data-test-id=\"table-freeze-first-row\">\r\n <span className=\"text\">Toggle First Row Freeze</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleFirstColumnFreeze()}\r\n data-test-id=\"table-freeze-first-column\">\r\n <span className=\"text\">Toggle First Column Freeze</span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableRowAtSelection(false)}\r\n data-test-id=\"table-insert-row-above\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`}{' '}\r\n above\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableRowAtSelection(true)}\r\n data-test-id=\"table-insert-row-below\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`}{' '}\r\n below\r\n </span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableColumnAtSelection(false)}\r\n data-test-id=\"table-insert-column-before\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.columns === 1\r\n ? 'column'\r\n : `${selectionCounts.columns} columns`}{' '}\r\n left\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableColumnAtSelection(true)}\r\n data-test-id=\"table-insert-column-after\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.columns === 1\r\n ? 'column'\r\n : `${selectionCounts.columns} columns`}{' '}\r\n right\r\n </span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableColumnAtSelection()}\r\n data-test-id=\"table-delete-columns\">\r\n <span className=\"text\">Delete column</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableRowAtSelection()}\r\n data-test-id=\"table-delete-rows\">\r\n <span className=\"text\">Delete row</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableAtSelection()}\r\n data-test-id=\"table-delete\">\r\n <span className=\"text\">Delete table</span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleTableRowIsHeader()}\r\n data-test-id=\"table-row-header\">\r\n <span className=\"text\">\r\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) ===\r\n TableCellHeaderStates.ROW\r\n ? 'Remove'\r\n : 'Add'}{' '}\r\n row header\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleTableColumnIsHeader()}\r\n data-test-id=\"table-column-header\">\r\n <span className=\"text\">\r\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\r\n TableCellHeaderStates.COLUMN\r\n ? 'Remove'\r\n : 'Add'}{' '}\r\n column header\r\n </span>\r\n </button>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nfunction TableCellActionMenuContainer({\r\n anchorElem,\r\n cellMerge,\r\n}: {\r\n anchorElem: HTMLElement;\r\n cellMerge: boolean;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const menuButtonRef = useRef<HTMLDivElement | null>(null);\r\n const menuRootRef = useRef<HTMLButtonElement | null>(null);\r\n const [isMenuOpen, setIsMenuOpen] = useState(false);\r\n\r\n const [tableCellNode, setTableMenuCellNode] = useState<TableCellNode | null>(\r\n null,\r\n );\r\n\r\n const [colorPickerModal, showColorPickerModal] = useModal();\r\n\r\n const checkTableCellOverflow = useCallback(\r\n (tableCellParentNodeDOM: HTMLElement): boolean => {\r\n const scrollableContainer = tableCellParentNodeDOM.closest(\r\n '.PlaygroundEditorTheme__tableScrollableWrapper',\r\n );\r\n if (scrollableContainer) {\r\n const containerRect = (\r\n scrollableContainer as HTMLElement\r\n ).getBoundingClientRect();\r\n const cellRect = tableCellParentNodeDOM.getBoundingClientRect();\r\n\r\n // Calculate where the action button would be positioned (5px from right edge of cell)\r\n // Also account for the button width and table cell padding (8px)\r\n const actionButtonRight = cellRect.right - 5;\r\n const actionButtonLeft = actionButtonRight - 28; // 20px width + 8px padding\r\n\r\n // Only hide if the action button would overflow the container\r\n if (\r\n actionButtonRight > containerRect.right ||\r\n actionButtonLeft < containerRect.left\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [],\r\n );\r\n\r\n const $moveMenu = useCallback(() => {\r\n const menu = menuButtonRef.current;\r\n const selection = $getSelection();\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const activeElement = document.activeElement;\r\n function disable() {\r\n if (menu) {\r\n menu.classList.remove('table-cell-action-button-container--active');\r\n menu.classList.add('table-cell-action-button-container--inactive');\r\n }\r\n setTableMenuCellNode(null);\r\n }\r\n\r\n if (selection == null || menu == null) {\r\n return disable();\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n let tableObserver: TableObserver | null = null;\r\n let tableCellParentNodeDOM: HTMLElement | null = null;\r\n\r\n if (\r\n $isRangeSelection(selection) &&\r\n rootElement !== null &&\r\n nativeSelection !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\r\n selection.anchor.getNode(),\r\n );\r\n\r\n if (tableCellNodeFromSelection == null) {\r\n return disable();\r\n }\r\n\r\n tableCellParentNodeDOM = editor.getElementByKey(\r\n tableCellNodeFromSelection.getKey(),\r\n );\r\n\r\n if (\r\n tableCellParentNodeDOM == null ||\r\n !tableCellNodeFromSelection.isAttached()\r\n ) {\r\n return disable();\r\n }\r\n\r\n if (checkTableCellOverflow(tableCellParentNodeDOM)) {\r\n return disable();\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(\r\n tableCellNodeFromSelection,\r\n );\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n\r\n tableObserver = getTableObserverFromTableElement(tableElement);\r\n setTableMenuCellNode(tableCellNodeFromSelection);\r\n } else if ($isTableSelection(selection)) {\r\n const anchorNode = $getTableCellNodeFromLexicalNode(\r\n selection.anchor.getNode(),\r\n );\r\n if (!$isTableCellNode(anchorNode)) {\r\n throw new Error('TableSelection anchorNode must be a TableCellNode');\r\n }\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n tableObserver = getTableObserverFromTableElement(tableElement);\r\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey());\r\n\r\n if (tableCellParentNodeDOM === null) {\r\n return disable();\r\n }\r\n\r\n if (checkTableCellOverflow(tableCellParentNodeDOM)) {\r\n return disable();\r\n }\r\n } else if (!activeElement) {\r\n return disable();\r\n }\r\n if (tableObserver === null || tableCellParentNodeDOM === null) {\r\n return disable();\r\n }\r\n const enabled = !tableObserver || !tableObserver.isSelecting;\r\n menu.classList.toggle(\r\n 'table-cell-action-button-container--active',\r\n enabled,\r\n );\r\n menu.classList.toggle(\r\n 'table-cell-action-button-container--inactive',\r\n !enabled,\r\n );\r\n if (enabled) {\r\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect();\r\n const anchorRect = anchorElem.getBoundingClientRect();\r\n const top = tableCellRect.top - anchorRect.top;\r\n const left = tableCellRect.right - anchorRect.left;\r\n menu.style.transform = `translate(${left}px, ${top}px)`;\r\n }\r\n }, [editor, anchorElem, checkTableCellOverflow]);\r\n\r\n useEffect(() => {\r\n // We call the $moveMenu callback every time the selection changes,\r\n // once up front, and once after each pointerUp\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\r\n const callback = () => {\r\n timeoutId = undefined;\r\n editor.getEditorState().read($moveMenu);\r\n };\r\n const delayedCallback = () => {\r\n if (timeoutId === undefined) {\r\n timeoutId = setTimeout(callback, 0);\r\n }\r\n return false;\r\n };\r\n return mergeRegister(\r\n editor.registerUpdateListener(delayedCallback),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n delayedCallback,\r\n COMMAND_PRIORITY_CRITICAL,\r\n ),\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('pointerup', delayedCallback);\r\n }\r\n if (rootElement) {\r\n rootElement.addEventListener('pointerup', delayedCallback);\r\n delayedCallback();\r\n }\r\n }),\r\n () => clearTimeout(timeoutId),\r\n );\r\n });\r\n\r\n const prevTableCellDOM = useRef(tableCellNode);\r\n\r\n useEffect(() => {\r\n if (prevTableCellDOM.current !== tableCellNode) {\r\n setIsMenuOpen(false);\r\n }\r\n\r\n prevTableCellDOM.current = tableCellNode;\r\n }, [prevTableCellDOM, tableCellNode]);\r\n\r\n return (\r\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\r\n {tableCellNode != null && (\r\n <>\r\n <button\r\n type=\"button\"\r\n className=\"table-cell-action-button chevron-down\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(!isMenuOpen);\r\n }}\r\n ref={menuRootRef}>\r\n <i className=\"chevron-down\" />\r\n </button>\r\n {colorPickerModal}\r\n {isMenuOpen && (\r\n <TableActionMenu\r\n contextRef={menuRootRef}\r\n setIsMenuOpen={setIsMenuOpen}\r\n onClose={() => setIsMenuOpen(false)}\r\n tableCellNode={tableCellNode}\r\n cellMerge={cellMerge}\r\n showColorPickerModal={showColorPickerModal}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableActionMenuPlugin({\r\n anchorElem = document.body,\r\n cellMerge = false,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n cellMerge?: boolean;\r\n}): null | ReactPortal {\r\n const isEditable = useLexicalEditable();\r\n return createPortal(\r\n isEditable ? (\r\n <TableCellActionMenuContainer\r\n anchorElem={anchorElem}\r\n cellMerge={cellMerge}\r\n />\r\n ) : null,\r\n anchorElem,\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {JSX} from 'react';\n\nimport './ColorPicker.css';\n\nimport {calculateZoomLevel} from '@lexical/utils';\nimport {useMemo, useRef, useState} from 'react';\nimport * as React from 'react';\n\nimport {isKeyboardInput} from '../utils/focusUtils';\nimport TextInput from './TextInput';\n\nlet skipAddingToHistoryStack = false;\n\ninterface ColorPickerProps {\n color: string;\n onChange?: (\n value: string,\n skipHistoryStack: boolean,\n skipRefocus: boolean,\n ) => void;\n}\n\nexport function parseAllowedColor(input: string) {\n return /^rgb\\(\\d+, \\d+, \\d+\\)$/.test(input) ? input : '';\n}\n\nconst basicColors = [\n '#d0021b',\n '#f5a623',\n '#f8e71c',\n '#8b572a',\n '#7ed321',\n '#417505',\n '#bd10e0',\n '#9013fe',\n '#4a90e2',\n '#50e3c2',\n '#b8e986',\n '#000000',\n '#4a4a4a',\n '#9b9b9b',\n '#ffffff',\n];\n\nconst WIDTH = 214;\nconst HEIGHT = 150;\n\nexport default function ColorPicker({\n color,\n onChange,\n}: Readonly<ColorPickerProps>): JSX.Element {\n const [selfColor, setSelfColor] = useState(transformColor('hex', color));\n const [inputColor, setInputColor] = useState(\n transformColor('hex', color).hex,\n );\n const innerDivRef = useRef(null);\n\n const saturationPosition = useMemo(\n () => ({\n x: (selfColor.hsv.s / 100) * WIDTH,\n y: ((100 - selfColor.hsv.v) / 100) * HEIGHT,\n }),\n [selfColor.hsv.s, selfColor.hsv.v],\n );\n\n const huePosition = useMemo(\n () => ({\n x: (selfColor.hsv.h / 360) * WIDTH,\n }),\n [selfColor.hsv],\n );\n\n const emitOnChange = (newColor: string, skipRefocus: boolean = false) => {\n // Check if the dropdown is actually active\n if (innerDivRef.current !== null && onChange) {\n onChange(newColor, skipAddingToHistoryStack, skipRefocus);\n }\n };\n\n const onSetHex = (hex: string) => {\n setInputColor(hex);\n if (/^#[0-9A-Fa-f]{6}$/i.test(hex)) {\n const newColor = transformColor('hex', hex);\n setSelfColor(newColor);\n emitOnChange(newColor.hex);\n }\n };\n\n const onMoveSaturation = ({x, y}: Position) => {\n const newHsv = {\n ...selfColor.hsv,\n s: (x / WIDTH) * 100,\n v: 100 - (y / HEIGHT) * 100,\n };\n const newColor = transformColor('hsv', newHsv);\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex);\n };\n\n const onMoveHue = ({x}: Position) => {\n const newHsv = {...selfColor.hsv, h: (x / WIDTH) * 360};\n const newColor = transformColor('hsv', newHsv);\n\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex);\n };\n\n const onBasicColorClick = (e: React.MouseEvent, basicColor: string) => {\n const newColor = transformColor('hex', basicColor);\n\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex, isKeyboardInput(e));\n };\n\n return (\n <div\n className=\"color-picker-wrapper\"\n style={{width: WIDTH}}\n ref={innerDivRef}>\n <TextInput label=\"Hex\" onChange={onSetHex} value={inputColor} />\n <div className=\"color-picker-basic-color\">\n {basicColors.map((basicColor) => (\n <button type=\"button\"\n className={basicColor === selfColor.hex ? ' active' : ''}\n key={basicColor}\n style={{backgroundColor: basicColor}}\n onClick={(e) => onBasicColorClick(e, basicColor)}\n />\n ))}\n </div>\n <MoveWrapper\n className=\"color-picker-saturation\"\n style={{backgroundColor: `hsl(${selfColor.hsv.h}, 100%, 50%)`}}\n onChange={onMoveSaturation}>\n <div\n className=\"color-picker-saturation_cursor\"\n style={{\n backgroundColor: selfColor.hex,\n left: saturationPosition.x,\n top: saturationPosition.y,\n }}\n />\n </MoveWrapper>\n <MoveWrapper className=\"color-picker-hue\" onChange={onMoveHue}>\n <div\n className=\"color-picker-hue_cursor\"\n style={{\n backgroundColor: `hsl(${selfColor.hsv.h}, 100%, 50%)`,\n left: huePosition.x,\n }}\n />\n </MoveWrapper>\n <div\n className=\"color-picker-color\"\n style={{backgroundColor: selfColor.hex}}\n />\n </div>\n );\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface MoveWrapperProps {\n className?: string;\n style?: React.CSSProperties;\n onChange: (position: Position) => void;\n children: JSX.Element;\n}\n\nfunction MoveWrapper({className, style, onChange, children}: MoveWrapperProps) {\n const divRef = useRef<HTMLDivElement>(null);\n const draggedRef = useRef(false);\n\n const move = (e: React.MouseEvent | MouseEvent): void => {\n if (divRef.current) {\n const {current: div} = divRef;\n const {width, height, left, top} = div.getBoundingClientRect();\n const zoom = calculateZoomLevel(div);\n const x = clamp(e.clientX / zoom - left, width, 0);\n const y = clamp(e.clientY / zoom - top, height, 0);\n\n onChange({x, y});\n }\n };\n\n const onMouseDown = (e: React.MouseEvent): void => {\n if (e.button !== 0) {\n return;\n }\n\n move(e);\n\n const onMouseMove = (_e: MouseEvent): void => {\n draggedRef.current = true;\n skipAddingToHistoryStack = true;\n move(_e);\n };\n\n const onMouseUp = (_e: MouseEvent): void => {\n if (draggedRef.current) {\n skipAddingToHistoryStack = false;\n }\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n move(_e);\n draggedRef.current = false;\n };\n\n document.addEventListener('mousemove', onMouseMove, false);\n document.addEventListener('mouseup', onMouseUp, false);\n };\n\n return (\n <div\n ref={divRef}\n className={className}\n style={style}\n onMouseDown={onMouseDown}>\n {children}\n </div>\n );\n}\n\nfunction clamp(value: number, max: number, min: number) {\n return value > max ? max : value < min ? min : value;\n}\n\ninterface RGB {\n b: number;\n g: number;\n r: number;\n}\ninterface HSV {\n h: number;\n s: number;\n v: number;\n}\ninterface Color {\n hex: string;\n hsv: HSV;\n rgb: RGB;\n}\n\nexport function toHex(value: string): string {\n if (!value.startsWith('#')) {\n const ctx = document.createElement('canvas').getContext('2d');\n\n if (!ctx) {\n throw new Error('2d context not supported or canvas already initialized');\n }\n\n ctx.fillStyle = value;\n\n return ctx.fillStyle;\n } else if (value.length === 4 || value.length === 5) {\n value = value\n .split('')\n .map((v, i) => (i ? v + v : '#'))\n .join('');\n\n return value;\n } else if (value.length === 7 || value.length === 9) {\n return value;\n }\n\n return '#000000';\n}\n\nfunction hex2rgb(hex: string): RGB {\n const rbgArr = (\n hex\n .replace(\n /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,\n (m, r, g, b) => '#' + r + r + g + g + b + b,\n )\n .substring(1)\n .match(/.{2}/g) || []\n ).map((x) => parseInt(x, 16));\n\n return {\n b: rbgArr[2],\n g: rbgArr[1],\n r: rbgArr[0],\n };\n}\n\nfunction rgb2hsv({r, g, b}: RGB): HSV {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const d = max - Math.min(r, g, b);\n\n const h = d\n ? (max === r\n ? (g - b) / d + (g < b ? 6 : 0)\n : max === g\n ? 2 + (b - r) / d\n : 4 + (r - g) / d) * 60\n : 0;\n const s = max ? (d / max) * 100 : 0;\n const v = max * 100;\n\n return {h, s, v};\n}\n\nfunction hsv2rgb({h, s, v}: HSV): RGB {\n s /= 100;\n v /= 100;\n\n const i = ~~(h / 60);\n const f = h / 60 - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n const index = i % 6;\n\n const r = Math.round([v, q, p, p, t, v][index] * 255);\n const g = Math.round([t, v, v, q, p, p][index] * 255);\n const b = Math.round([p, p, t, v, v, q][index] * 255);\n\n return {b, g, r};\n}\n\nfunction rgb2hex({b, g, r}: RGB): string {\n return '#' + [r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('');\n}\n\nfunction transformColor<M extends keyof Color, C extends Color[M]>(\n format: M,\n color: C,\n): Color {\n let hex: Color['hex'] = toHex('#121212');\n let rgb: Color['rgb'] = hex2rgb(hex);\n let hsv: Color['hsv'] = rgb2hsv(rgb);\n\n if (format === 'hex') {\n const value = color as Color['hex'];\n\n hex = toHex(value);\n rgb = hex2rgb(hex);\n hsv = rgb2hsv(rgb);\n } else if (format === 'rgb') {\n const value = color as Color['rgb'];\n\n rgb = value;\n hex = rgb2hex(rgb);\n hsv = rgb2hsv(rgb);\n } else if (format === 'hsv') {\n const value = color as Color['hsv'];\n\n hsv = value;\n rgb = hsv2rgb(hsv);\n hex = rgb2hex(rgb);\n }\n\n return {hex, hsv, rgb};\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {TableCellNode, TableDOMCell, TableMapType} from '@lexical/table';\r\nimport type {LexicalEditor, NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {\r\n $computeTableMapSkipCellCheck,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $isTableCellNode,\r\n $isTableRowNode,\r\n getDOMCellFromTarget,\r\n getTableElement,\r\n TableNode,\r\n} from '@lexical/table';\r\nimport {calculateZoomLevel, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNearestNodeFromDOMNode,\r\n isHTMLElement,\r\n SKIP_SCROLL_INTO_VIEW_TAG,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {\r\n CSSProperties,\r\n PointerEventHandler,\r\n ReactPortal,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\ntype PointerPosition = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\ntype PointerDraggingDirection = 'right' | 'bottom';\r\n\r\nconst MIN_ROW_HEIGHT = 33;\r\nconst MIN_COLUMN_WIDTH = 92;\r\nconst ACTIVE_RESIZER_COLOR = '#76b6ff';\r\n\r\nfunction TableCellResizer({editor}: {editor: LexicalEditor}): JSX.Element {\r\n const targetRef = useRef<HTMLElement | null>(null);\r\n const resizerRef = useRef<HTMLDivElement | null>(null);\r\n const tableRectRef = useRef<ClientRect | null>(null);\r\n const [hasTable, setHasTable] = useState(false);\r\n\r\n const pointerStartPosRef = useRef<PointerPosition | null>(null);\r\n const [pointerCurrentPos, updatePointerCurrentPos] =\r\n useState<PointerPosition | null>(null);\r\n\r\n const [activeCell, updateActiveCell] = useState<TableDOMCell | null>(null);\r\n const [draggingDirection, updateDraggingDirection] =\r\n useState<PointerDraggingDirection | null>(null);\r\n const [hoveredDirection, updateHoveredDirection] =\r\n useState<PointerDraggingDirection | null>(null);\r\n\r\n const resetState = useCallback(() => {\r\n updateActiveCell(null);\r\n targetRef.current = null;\r\n updateDraggingDirection(null);\r\n updateHoveredDirection(null);\r\n pointerStartPosRef.current = null;\r\n tableRectRef.current = null;\r\n }, []);\r\n\r\n useEffect(() => {\r\n const tableKeys = new Set<NodeKey>();\r\n return mergeRegister(\r\n editor.registerMutationListener(TableNode, (nodeMutations) => {\r\n for (const [nodeKey, mutation] of nodeMutations) {\r\n if (mutation === 'destroyed') {\r\n tableKeys.delete(nodeKey);\r\n } else {\r\n tableKeys.add(nodeKey);\r\n }\r\n }\r\n setHasTable(tableKeys.size > 0);\r\n }),\r\n editor.registerNodeTransform(TableNode, (tableNode) => {\r\n if (tableNode.getColWidths()) {\r\n return tableNode;\r\n }\r\n\r\n const numColumns = tableNode.getColumnCount();\r\n const columnWidth = MIN_COLUMN_WIDTH;\r\n\r\n tableNode.setColWidths(Array(numColumns).fill(columnWidth));\r\n return tableNode;\r\n }),\r\n );\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (!hasTable) {\r\n return;\r\n }\r\n\r\n const onPointerMove = (event: PointerEvent) => {\r\n const target = event.target;\r\n if (!isHTMLElement(target)) {\r\n return;\r\n }\r\n\r\n if (draggingDirection) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n updatePointerCurrentPos({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n return;\r\n }\r\n if (resizerRef.current && resizerRef.current.contains(target)) {\r\n return;\r\n }\r\n\r\n if (targetRef.current !== target) {\r\n targetRef.current = target;\r\n const cell = getDOMCellFromTarget(target);\r\n\r\n if (cell && activeCell !== cell) {\r\n editor.getEditorState().read(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem);\r\n if (!tableCellNode) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode =\r\n $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (!tableElement) {\r\n throw new Error('TableCellResizer: Table element not found.');\r\n }\r\n\r\n targetRef.current = target;\r\n tableRectRef.current = tableElement.getBoundingClientRect();\r\n updateActiveCell(cell);\r\n },\r\n {editor},\r\n );\r\n } else if (cell == null) {\r\n resetState();\r\n }\r\n }\r\n };\r\n\r\n const onPointerDown = (event: PointerEvent) => {\r\n const isTouchEvent = event.pointerType === 'touch';\r\n if (isTouchEvent) {\r\n onPointerMove(event);\r\n }\r\n };\r\n\r\n const resizerContainer = resizerRef.current;\r\n resizerContainer?.addEventListener('pointermove', onPointerMove, {\r\n capture: true,\r\n });\r\n\r\n const removeRootListener = editor.registerRootListener(\r\n (rootElement, prevRootElement) => {\r\n prevRootElement?.removeEventListener('pointermove', onPointerMove);\r\n prevRootElement?.removeEventListener('pointerdown', onPointerDown);\r\n rootElement?.addEventListener('pointermove', onPointerMove);\r\n rootElement?.addEventListener('pointerdown', onPointerDown);\r\n },\r\n );\r\n\r\n return () => {\r\n removeRootListener();\r\n resizerContainer?.removeEventListener('pointermove', onPointerMove);\r\n };\r\n }, [activeCell, draggingDirection, editor, resetState, hasTable]);\r\n\r\n const isHeightChanging = (direction: PointerDraggingDirection) => {\r\n if (direction === 'bottom') {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const updateRowHeight = useCallback(\r\n (heightChange: number) => {\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n editor.update(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const baseRowIndex =\r\n $getTableRowIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n // Determine if this is a full row merge by checking colspan\r\n const isFullRowMerge =\r\n tableCellNode.getColSpan() === tableNode.getColumnCount();\r\n\r\n // For full row merges, apply to first row. For partial merges, apply to last row\r\n const tableRowIndex = isFullRowMerge\r\n ? baseRowIndex\r\n : baseRowIndex + tableCellNode.getRowSpan() - 1;\r\n\r\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\r\n throw new Error('Expected table cell to be inside of table row.');\r\n }\r\n\r\n const tableRow = tableRows[tableRowIndex];\r\n\r\n if (!$isTableRowNode(tableRow)) {\r\n throw new Error('Expected table row');\r\n }\r\n\r\n let height = tableRow.getHeight();\r\n if (height === undefined) {\r\n const rowCells = tableRow.getChildren<TableCellNode>();\r\n height = Math.min(\r\n ...rowCells.map(\r\n (cell) => getCellNodeHeight(cell, editor) ?? Infinity,\r\n ),\r\n );\r\n }\r\n\r\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT);\r\n tableRow.setHeight(newHeight);\r\n },\r\n {tag: SKIP_SCROLL_INTO_VIEW_TAG},\r\n );\r\n },\r\n [activeCell, editor],\r\n );\r\n\r\n const getCellNodeHeight = (\r\n cell: TableCellNode,\r\n activeEditor: LexicalEditor,\r\n ): number | undefined => {\r\n const domCellNode = activeEditor.getElementByKey(cell.getKey());\r\n return domCellNode?.clientHeight;\r\n };\r\n\r\n const getCellColumnIndex = (\r\n tableCellNode: TableCellNode,\r\n tableMap: TableMapType,\r\n ) => {\r\n for (let row = 0; row < tableMap.length; row++) {\r\n for (let column = 0; column < tableMap[row].length; column++) {\r\n if (tableMap[row][column].cell === tableCellNode) {\r\n return column;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const updateColumnWidth = useCallback(\r\n (widthChange: number) => {\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n editor.update(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const [tableMap] = $computeTableMapSkipCellCheck(\r\n tableNode,\r\n null,\r\n null,\r\n );\r\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap);\r\n if (columnIndex === undefined) {\r\n throw new Error('TableCellResizer: Table column not found.');\r\n }\r\n\r\n const colWidths = tableNode.getColWidths();\r\n if (!colWidths) {\r\n return;\r\n }\r\n const width = colWidths[columnIndex];\r\n if (width === undefined) {\r\n return;\r\n }\r\n const newColWidths = [...colWidths];\r\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH);\r\n newColWidths[columnIndex] = newWidth;\r\n tableNode.setColWidths(newColWidths);\r\n },\r\n {tag: SKIP_SCROLL_INTO_VIEW_TAG},\r\n );\r\n },\r\n [activeCell, editor],\r\n );\r\n\r\n const pointerUpHandler = useCallback(\r\n (direction: PointerDraggingDirection) => {\r\n const handler = (event: PointerEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n if (pointerStartPosRef.current) {\r\n const {x, y} = pointerStartPosRef.current;\r\n\r\n if (activeCell === null) {\r\n return;\r\n }\r\n const zoom = calculateZoomLevel(event.target as Element);\r\n\r\n if (isHeightChanging(direction)) {\r\n const heightChange = (event.clientY - y) / zoom;\r\n updateRowHeight(heightChange);\r\n } else {\r\n const widthChange = (event.clientX - x) / zoom;\r\n updateColumnWidth(widthChange);\r\n }\r\n\r\n resetState();\r\n document.removeEventListener('pointerup', handler);\r\n }\r\n };\r\n return handler;\r\n },\r\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\r\n );\r\n\r\n const toggleResize = useCallback(\r\n (\r\n direction: PointerDraggingDirection,\r\n ): PointerEventHandler<HTMLDivElement> =>\r\n (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n pointerStartPosRef.current = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n updatePointerCurrentPos(pointerStartPosRef.current);\r\n updateDraggingDirection(direction);\r\n\r\n document.addEventListener('pointerup', pointerUpHandler(direction));\r\n },\r\n [activeCell, pointerUpHandler],\r\n );\r\n\r\n const getResizers = useCallback(() => {\r\n if (activeCell) {\r\n const {height, width, top, left} =\r\n activeCell.elem.getBoundingClientRect();\r\n const zoom = calculateZoomLevel(activeCell.elem);\r\n const zoneWidth = 16; // Pixel width of the zone where you can drag the edge\r\n const styles: Record<string, CSSProperties> = {\r\n bottom: {\r\n backgroundColor: 'transparent',\r\n cursor: 'row-resize',\r\n height: `${zoneWidth}px`,\r\n left: `${window.scrollX + left}px`,\r\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\r\n width: `${width}px`,\r\n },\r\n right: {\r\n backgroundColor: 'transparent',\r\n cursor: 'col-resize',\r\n height: `${height}px`,\r\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\r\n top: `${window.scrollY + top}px`,\r\n width: `${zoneWidth}px`,\r\n },\r\n };\r\n\r\n const tableRect = tableRectRef.current;\r\n\r\n if (draggingDirection && pointerCurrentPos && tableRect) {\r\n if (isHeightChanging(draggingDirection)) {\r\n styles[draggingDirection].left = `${\r\n window.scrollX + tableRect.left\r\n }px`;\r\n styles[draggingDirection].top = `${\r\n window.scrollY + pointerCurrentPos.y / zoom\r\n }px`;\r\n styles[draggingDirection].height = '3px';\r\n styles[draggingDirection].width = `${tableRect.width}px`;\r\n } else {\r\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`;\r\n styles[draggingDirection].left = `${\r\n window.scrollX + pointerCurrentPos.x / zoom\r\n }px`;\r\n styles[draggingDirection].width = '3px';\r\n styles[draggingDirection].height = `${tableRect.height}px`;\r\n }\r\n\r\n styles[draggingDirection].backgroundColor = '#adf';\r\n styles[draggingDirection].mixBlendMode = 'unset';\r\n } else if (!draggingDirection && hoveredDirection === 'right') {\r\n const halfZoneWidth = zoneWidth / 2;\r\n const highlightWidth = 2;\r\n const highlightStart = halfZoneWidth - highlightWidth / 2;\r\n styles.right.backgroundImage = `linear-gradient(90deg, transparent ${highlightStart}px, ${ACTIVE_RESIZER_COLOR} ${highlightStart}px, ${ACTIVE_RESIZER_COLOR} ${\r\n highlightStart + highlightWidth\r\n }px, transparent ${highlightStart + highlightWidth}px)`;\r\n styles.right.mixBlendMode = 'unset';\r\n if (tableRect) {\r\n styles.right.top = `${window.scrollY + tableRect.top}px`;\r\n styles.right.height = `${tableRect.height}px`;\r\n }\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n return {\r\n bottom: null,\r\n left: null,\r\n right: null,\r\n top: null,\r\n };\r\n }, [activeCell, draggingDirection, hoveredDirection, pointerCurrentPos]);\r\n\r\n const handlePointerEnter = useCallback(\r\n (\r\n direction: PointerDraggingDirection,\r\n ): PointerEventHandler<HTMLDivElement> =>\r\n () => {\r\n if (!draggingDirection) {\r\n updateHoveredDirection(direction);\r\n }\r\n },\r\n [draggingDirection],\r\n );\r\n\r\n const handlePointerLeave = useCallback(() => {\r\n if (!draggingDirection) {\r\n updateHoveredDirection(null);\r\n }\r\n }, [draggingDirection]);\r\n\r\n const resizerStyles = getResizers();\r\n\r\n return (\r\n <div ref={resizerRef}>\r\n {activeCell != null && (\r\n <>\r\n <div\r\n className=\"TableCellResizer__resizer TableCellResizer__ui\"\r\n style={resizerStyles.right || undefined}\r\n onPointerEnter={handlePointerEnter('right')}\r\n onPointerLeave={handlePointerLeave}\r\n onPointerDown={toggleResize('right')}\r\n />\r\n <div\r\n className=\"TableCellResizer__resizer TableCellResizer__ui\"\r\n style={resizerStyles.bottom || undefined}\r\n onPointerDown={toggleResize('bottom')}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableCellResizerPlugin(): null | ReactPortal {\r\n const [editor] = useLexicalComposerContext();\r\n const isEditable = useLexicalEditable();\r\n\r\n return useMemo(\r\n () =>\r\n isEditable\r\n ? createPortal(<TableCellResizer editor={editor} />, document.body)\r\n : null,\r\n [editor, isEditable],\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type {JSX} from 'react';\n\nimport './index.css';\n\nimport DropIndicator from '@atlaskit/drag-and-drop-indicator/box';\nimport {\n draggable,\n dropTargetForElements,\n type ElementDragPayload,\n} from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport {\n autoUpdate,\n offset,\n shift,\n useFloating,\n type VirtualElement,\n} from '@floating-ui/react';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport {\n $computeTableMapSkipCellCheck,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isSimpleTable,\n $isTableCellNode,\n $isTableNode,\n $isTableRowNode,\n $moveTableColumn,\n} from '@lexical/table';\nimport {\n $getChildCaret,\n $getNearestNodeFromDOMNode,\n $getSiblingCaret,\n type EditorThemeClasses,\n isHTMLElement,\n} from 'lexical';\nimport {useEffect, useRef, useState} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\nimport {getThemeSelector} from '../../utils/getThemeSelector';\n\nconst INDICATOR_SIZE_PX = 18;\nconst SIDE_INDICATOR_SIZE_PX = 18;\nconst TOP_BUTTON_OVERHANG = INDICATOR_SIZE_PX / 2;\nconst LEFT_BUTTON_OVERHANG = SIDE_INDICATOR_SIZE_PX / 2;\n\nfunction getTableFromMouseEvent(\n event: MouseEvent,\n getTheme: () => EditorThemeClasses | null | undefined,\n): {\n isOutside: boolean;\n tableElement: HTMLTableElement | null;\n} {\n if (!isHTMLElement(event.target)) {\n return {isOutside: true, tableElement: null};\n }\n\n const cellSelector = `td${getThemeSelector(getTheme, 'tableCell')}, th${getThemeSelector(getTheme, 'tableCell')}`;\n const cell = event.target.closest<HTMLTableCellElement>(cellSelector);\n const tableElement = cell?.closest<HTMLTableElement>('table') ?? null;\n\n return {\n isOutside: tableElement == null,\n tableElement,\n };\n}\n\nfunction getClosestTopCellPosition(\n tableElement: HTMLTableElement,\n clientX: number,\n): {centerX: number; top: number; cell: HTMLTableCellElement} | null {\n const firstRow = tableElement.rows[0];\n if (!firstRow) {\n return null;\n }\n\n let closest: {\n cell: HTMLTableCellElement;\n centerX: number;\n top: number;\n } | null = null;\n let smallestDelta = Number.POSITIVE_INFINITY;\n\n for (const cell of Array.from(firstRow.cells)) {\n const rect = cell.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const delta = Math.abs(centerX - clientX);\n if (delta < smallestDelta) {\n smallestDelta = delta;\n closest = {cell, centerX, top: rect.top};\n }\n }\n\n return closest;\n}\n\nfunction isTableFromEditor(\n tableElement: HTMLTableElement | null,\n editor: ReturnType<typeof useLexicalComposerContext>[0],\n): boolean {\n const root = editor.getRootElement();\n return !!root && !!tableElement && root.contains(tableElement);\n}\n\ntype ColumnDragData = {\n columnIndex: number;\n tableKey: string | null;\n type: 'table-column';\n};\n\ntype DropIndicatorState = {\n edge: 'left' | 'right';\n height: number;\n left: number;\n top: number;\n};\n\nfunction getBoundaryIndex(cell: HTMLTableCellElement, clientX: number): number {\n const rect = cell.getBoundingClientRect();\n const isRightHalf = clientX > rect.left + rect.width / 2;\n const cellIndex = cell.cellIndex ?? 0;\n return cellIndex + (isRightHalf ? 1 : 0);\n}\n\nfunction getDropIndicatorState(\n headerRow: HTMLTableRowElement,\n tableRect: DOMRect,\n boundaryIndex: number,\n): DropIndicatorState | null {\n const cellCount = headerRow.cells.length;\n if (cellCount === 0) {\n return null;\n }\n const clampedIndex = Math.max(0, Math.min(boundaryIndex, cellCount));\n if (clampedIndex === 0) {\n const firstRect = headerRow.cells[0].getBoundingClientRect();\n return {\n edge: 'left',\n height: tableRect.height,\n left: firstRect.left,\n top: tableRect.top,\n };\n }\n if (clampedIndex === cellCount) {\n const lastRect = headerRow.cells[cellCount - 1].getBoundingClientRect();\n return {\n edge: 'right',\n height: tableRect.height,\n left: lastRect.right,\n top: tableRect.top,\n };\n }\n const targetRect = headerRow.cells[clampedIndex].getBoundingClientRect();\n return {\n edge: 'left',\n height: tableRect.height,\n left: targetRect.left,\n top: tableRect.top,\n };\n}\n\nfunction isColumnDrag(\n source: ElementDragPayload,\n tableKey: string | null,\n): source is ElementDragPayload & {data: ColumnDragData} {\n const data = source?.data as ColumnDragData | undefined;\n return data?.type === 'table-column' && data.tableKey === tableKey;\n}\n\nfunction getTableKey(tableElement: HTMLTableElement | null): string | null {\n return tableElement?.getAttribute('data-lexical-key') ?? null;\n}\n\nfunction TableHoverActionsV2({\n anchorElem,\n}: {\n anchorElem: HTMLElement;\n}): JSX.Element | null {\n const [editor, {getTheme}] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isVisible, setIsVisible] = useState(false);\n const [isLeftVisible, setIsLeftVisible] = useState(false);\n const virtualRef = useRef<VirtualElement>({\n getBoundingClientRect: () => new DOMRect(),\n });\n const leftVirtualRef = useRef<VirtualElement>({\n getBoundingClientRect: () => new DOMRect(),\n });\n const floatingElemRef = useRef<HTMLElement | null>(null);\n const leftFloatingElemRef = useRef<HTMLElement | null>(null);\n const dragHandleRef = useRef<HTMLButtonElement | null>(null);\n const hoveredLeftCellRef = useRef<HTMLTableCellElement | null>(null);\n const hoveredTopCellRef = useRef<HTMLTableCellElement | null>(null);\n const handleMouseLeaveRef = useRef<((event: MouseEvent) => void) | null>(\n null,\n );\n const dropIndicatorCleanupRef = useRef<Array<() => void>>([]);\n const [hoveredTable, setHoveredTable] = useState<HTMLTableElement | null>(\n null,\n );\n const [hoveredColumnIndex, setHoveredColumnIndex] = useState<number | null>(\n null,\n );\n const [canReorder, setCanReorder] = useState(false);\n const [dropIndicatorState, setDropIndicatorState] =\n useState<DropIndicatorState | null>(null);\n\n const {refs, floatingStyles, update} = useFloating({\n middleware: [\n offset({mainAxis: -TOP_BUTTON_OVERHANG}),\n shift({\n padding: 8,\n }),\n ],\n placement: 'top',\n strategy: 'fixed',\n whileElementsMounted: autoUpdate,\n });\n\n const {\n refs: leftRefs,\n floatingStyles: leftFloatingStyles,\n update: updateLeft,\n } = useFloating({\n middleware: [\n offset({mainAxis: -LEFT_BUTTON_OVERHANG}),\n shift({\n padding: 8,\n }),\n ],\n placement: 'left',\n strategy: 'fixed',\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (!isEditable) {\n return;\n }\n\n const handleMouseMove = (event: MouseEvent) => {\n if (\n (floatingElemRef.current &&\n event.target instanceof Node &&\n floatingElemRef.current.contains(event.target)) ||\n (leftFloatingElemRef.current &&\n event.target instanceof Node &&\n leftFloatingElemRef.current.contains(event.target))\n ) {\n return;\n }\n\n const {tableElement, isOutside} = getTableFromMouseEvent(event, getTheme);\n\n if (\n isOutside ||\n tableElement == null ||\n (anchorElem && !anchorElem.contains(tableElement))\n ) {\n setIsVisible(false);\n setIsLeftVisible(false);\n setHoveredTable(null);\n setHoveredColumnIndex(null);\n setDropIndicatorState(null);\n return;\n }\n\n const cellSelector = `td${getThemeSelector(getTheme, 'tableCell')}, th${getThemeSelector(getTheme, 'tableCell')}`;\n const hoveredCell = isHTMLElement(event.target)\n ? event.target.closest<HTMLTableCellElement>(cellSelector)\n : null;\n\n if (!hoveredCell) {\n setIsVisible(false);\n setIsLeftVisible(false);\n hoveredTopCellRef.current = null;\n hoveredLeftCellRef.current = null;\n return;\n }\n\n const rowIndex =\n hoveredCell.parentElement instanceof HTMLTableRowElement\n ? hoveredCell.parentElement.rowIndex\n : -1;\n const colIndex = hoveredCell.cellIndex ?? -1;\n\n const closestTopCell = getClosestTopCellPosition(\n tableElement,\n event.clientX,\n );\n\n if (!closestTopCell || rowIndex !== 0) {\n setIsVisible(false);\n hoveredTopCellRef.current = null;\n setHoveredTable(null);\n setHoveredColumnIndex(null);\n } else {\n hoveredTopCellRef.current = closestTopCell.cell;\n setHoveredTable(tableElement);\n setHoveredColumnIndex(closestTopCell.cell.cellIndex ?? null);\n virtualRef.current.getBoundingClientRect = () =>\n new DOMRect(closestTopCell.centerX, closestTopCell.top, 0, 0);\n refs.setPositionReference(virtualRef.current);\n setIsVisible(true);\n update?.();\n }\n\n const tableRect = tableElement.getBoundingClientRect();\n if (colIndex !== 0) {\n setIsLeftVisible(false);\n hoveredLeftCellRef.current = null;\n } else {\n const {top, height} = hoveredCell.getBoundingClientRect();\n const centerY = top + height / 2;\n hoveredLeftCellRef.current = hoveredCell;\n leftVirtualRef.current.getBoundingClientRect = () =>\n new DOMRect(tableRect.left, centerY, 0, 0);\n leftRefs.setPositionReference(leftVirtualRef.current);\n setIsLeftVisible(true);\n updateLeft?.();\n }\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n setIsVisible(false);\n setIsLeftVisible(false);\n };\n }, [anchorElem, getTheme, isEditable, leftRefs, refs, update, updateLeft]);\n\n useEffect(() => {\n const handleMouseLeave = (event: MouseEvent) => {\n const nextTarget = event.relatedTarget;\n if (\n nextTarget &&\n floatingElemRef.current &&\n floatingElemRef.current.contains(nextTarget as Node)\n ) {\n return;\n }\n if (\n nextTarget &&\n leftFloatingElemRef.current &&\n leftFloatingElemRef.current.contains(nextTarget as Node)\n ) {\n return;\n }\n setIsVisible(false);\n setIsLeftVisible(false);\n };\n handleMouseLeaveRef.current = handleMouseLeave;\n\n return editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement && handleMouseLeaveRef.current) {\n prevRootElement.removeEventListener(\n 'mouseleave',\n handleMouseLeaveRef.current,\n );\n }\n if (rootElement && handleMouseLeaveRef.current) {\n rootElement.addEventListener('mouseleave', handleMouseLeaveRef.current);\n }\n });\n }, [editor]);\n\n useEffect(() => {\n if (!hoveredTable) {\n setCanReorder(false);\n return;\n }\n if (!isTableFromEditor(hoveredTable, editor)) {\n setCanReorder(false);\n return;\n }\n editor.getEditorState().read(\n () => {\n const tableNode = $getNearestNodeFromDOMNode(hoveredTable);\n setCanReorder($isTableNode(tableNode) && $isSimpleTable(tableNode));\n },\n {editor},\n );\n }, [editor, hoveredTable]);\n\n useEffect(() => {\n const handle = dragHandleRef.current;\n const tableElement = hoveredTable;\n const columnIndex = hoveredColumnIndex;\n if (!handle || tableElement == null || columnIndex == null || !canReorder) {\n return;\n }\n\n const cleanup = draggable({\n canDrag: () => canReorder,\n element: handle,\n getInitialData: () => ({\n columnIndex,\n tableKey: getTableKey(tableElement),\n type: 'table-column',\n }),\n onDrop: () => setDropIndicatorState(null),\n });\n\n return cleanup;\n }, [canReorder, hoveredColumnIndex, hoveredTable]);\n\n useEffect(() => {\n dropIndicatorCleanupRef.current.forEach((cleanup) => cleanup());\n dropIndicatorCleanupRef.current = [];\n if (!hoveredTable || !canReorder) {\n return;\n }\n const headerRow = hoveredTable.rows[0];\n if (!headerRow) {\n return;\n }\n if (!isTableFromEditor(hoveredTable, editor)) {\n return;\n }\n const tableKey = getTableKey(hoveredTable);\n const registerDropTarget = (cell: HTMLTableCellElement) =>\n dropTargetForElements({\n canDrop: ({source}: {source: any}) => isColumnDrag(source, tableKey),\n element: cell,\n getData: ({input}: {input: any}) => ({\n boundaryIndex: getBoundaryIndex(cell, input.clientX),\n }),\n onDrag: ({location, source}: {location: any; source: any}) => {\n if (!isColumnDrag(source, tableKey)) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const tableRect = hoveredTable.getBoundingClientRect();\n setDropIndicatorState(\n getDropIndicatorState(headerRow, tableRect, boundaryIndex),\n );\n },\n onDragEnter: ({location, source}: {location: any; source: any}) => {\n if (!isColumnDrag(source, tableKey)) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const tableRect = hoveredTable.getBoundingClientRect();\n setDropIndicatorState(\n getDropIndicatorState(headerRow, tableRect, boundaryIndex),\n );\n },\n onDragLeave: () => setDropIndicatorState(null),\n onDrop: ({location, source}: {location: any; source: any}) => {\n setDropIndicatorState(null);\n const data = (source?.data ?? {}) as ColumnDragData;\n if (data.columnIndex == null) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const targetTable = cell.closest('table');\n if (!isHTMLElement(targetTable) || !isColumnDrag(source, tableKey)) {\n return;\n }\n editor.update(() => {\n const tableNode = $getNearestNodeFromDOMNode(targetTable);\n if (!$isTableNode(tableNode)) {\n return;\n }\n const columnCount = tableNode.getColumnCount();\n const clampedBoundary = Math.max(\n 0,\n Math.min(boundaryIndex, columnCount),\n );\n const startIndex = data.columnIndex;\n if (\n clampedBoundary === startIndex ||\n clampedBoundary === startIndex + 1 ||\n startIndex < 0 ||\n startIndex >= columnCount\n ) {\n return;\n }\n const finishIndex =\n clampedBoundary > startIndex\n ? clampedBoundary - 1\n : clampedBoundary;\n $moveTableColumn(tableNode, startIndex, finishIndex);\n });\n },\n });\n\n dropIndicatorCleanupRef.current = Array.from(headerRow.cells).map((cell) =>\n registerDropTarget(cell),\n );\n\n return () => {\n dropIndicatorCleanupRef.current.forEach((cleanup) => cleanup());\n dropIndicatorCleanupRef.current = [];\n setDropIndicatorState(null);\n };\n }, [canReorder, editor, hoveredTable]);\n\n if (!isEditable) {\n return null;\n }\n\n const handleAddColumn = () => {\n const targetCell = hoveredTopCellRef.current;\n if (!targetCell) {\n return;\n }\n editor.update(() => {\n const maybeCellNode = $getNearestNodeFromDOMNode(targetCell);\n if ($isTableCellNode(maybeCellNode)) {\n maybeCellNode.selectEnd();\n $insertTableColumnAtSelection();\n }\n });\n };\n\n const handleAddRow = () => {\n const targetCell = hoveredLeftCellRef.current;\n if (!targetCell) {\n return;\n }\n editor.update(() => {\n const maybeCellNode = $getNearestNodeFromDOMNode(targetCell);\n if ($isTableCellNode(maybeCellNode)) {\n maybeCellNode.selectEnd();\n $insertTableRowAtSelection();\n }\n });\n };\n\n const handleSortColumn = (direction: 'asc' | 'desc') => {\n const targetCell = hoveredTopCellRef.current;\n if (!targetCell) {\n return;\n }\n\n editor.update(() => {\n const cellNode = $getNearestNodeFromDOMNode(targetCell);\n if (!$isTableCellNode(cellNode)) {\n return;\n }\n\n const rowNode = cellNode.getParent();\n if (!rowNode || !$isTableRowNode(rowNode)) {\n return;\n }\n\n const tableNode = rowNode.getParent();\n if (!$isTableNode(tableNode) || !$isSimpleTable(tableNode)) {\n return;\n }\n\n const colIndex = cellNode.getIndexWithinParent();\n const rows = tableNode.getChildren().filter($isTableRowNode);\n\n const [tableMap] = $computeTableMapSkipCellCheck(\n tableNode,\n cellNode,\n cellNode,\n );\n\n const headerCell = tableMap[0]?.[colIndex]?.cell;\n const shouldSkipTopRow = headerCell?.hasHeader() ?? false;\n\n const sortableRows = shouldSkipTopRow ? rows.slice(1) : rows;\n\n if (sortableRows.length <= 1) {\n return;\n }\n\n sortableRows.sort((a, b) => {\n const aRowIndex = rows.indexOf(a);\n const bRowIndex = rows.indexOf(b);\n\n const aMapRow = tableMap[aRowIndex] ?? [];\n const bMapRow = tableMap[bRowIndex] ?? [];\n\n const aCellValue = aMapRow[colIndex];\n const bCellValue = bMapRow[colIndex];\n\n const aText = aCellValue?.cell.getTextContent() ?? '';\n const bText = bCellValue?.cell.getTextContent() ?? '';\n const result = aText.localeCompare(bText, undefined, {numeric: true});\n return direction === 'asc' ? -result : result;\n });\n\n const insertionCaret = shouldSkipTopRow\n ? $getSiblingCaret(rows[0], 'next')\n : $getChildCaret(tableNode, 'next');\n\n insertionCaret?.splice(0, sortableRows);\n });\n };\n\n return (\n <>\n <div\n ref={(node) => {\n floatingElemRef.current = node;\n refs.setFloating(node);\n }}\n style={{\n ...floatingStyles,\n opacity: isVisible ? 1 : 0,\n }}\n className=\"floating-top-actions\">\n <button\n ref={dragHandleRef}\n className=\"floating-drag-indicator\"\n aria-label=\"Drag to reorder column\"\n type=\"button\"\n />\n <DropDown\n buttonAriaLabel=\"Sort column\"\n buttonClassName=\"floating-filter-indicator\"\n hideChevron={true}>\n <DropDownItem\n className=\"item\"\n onClick={() => handleSortColumn('desc')}>\n Sort Ascending\n </DropDownItem>\n <DropDownItem\n className=\"item\"\n onClick={() => handleSortColumn('asc')}>\n Sort Descending\n </DropDownItem>\n </DropDown>\n <button\n className=\"floating-add-indicator\"\n aria-label=\"Add column\"\n type=\"button\"\n onClick={handleAddColumn}\n />\n </div>\n <button\n ref={(node) => {\n leftFloatingElemRef.current = node;\n leftRefs.setFloating(node);\n }}\n style={{\n ...leftFloatingStyles,\n opacity: isLeftVisible ? 1 : 0,\n }}\n className=\"floating-add-indicator\"\n aria-label=\"Add row\"\n type=\"button\"\n onClick={handleAddRow}\n />\n {dropIndicatorState ? (\n <div\n style={{\n height: dropIndicatorState.height,\n left: dropIndicatorState.left,\n pointerEvents: 'none',\n position: 'fixed',\n top: dropIndicatorState.top,\n width: 2,\n zIndex: 20,\n }}>\n <DropIndicator edge={dropIndicatorState.edge} />\n </div>\n ) : null}\n </>\n );\n}\n\nexport default function TableHoverActionsV2Plugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement;\n}): React.ReactPortal | null {\n const isEditable = useLexicalEditable();\n\n return isEditable\n ? createPortal(<TableHoverActionsV2 anchorElem={anchorElem} />, anchorElem)\n : null;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {EditorThemeClasses} from 'lexical';\r\n\r\nexport function getThemeSelector(\r\n getTheme: () => EditorThemeClasses | null | undefined,\r\n name: keyof EditorThemeClasses,\r\n): string {\r\n const className = getTheme()?.[name];\r\n if (typeof className !== 'string') {\r\n throw new Error(\r\n `getThemeClass: required theme property ${name} not defined`,\r\n );\r\n }\r\n return className\r\n .split(/\\s+/g)\r\n .map((cls) => `.${cls}`)\r\n .join();\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {TableOfContentsEntry} from '@lexical/react/LexicalTableOfContentsPlugin';\r\nimport type {HeadingTagType} from '@lexical/rich-text';\r\nimport type {NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {TableOfContentsPlugin as LexicalTableOfContentsPlugin} from '@lexical/react/LexicalTableOfContentsPlugin';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nconst MARGIN_ABOVE_EDITOR = 624;\r\nconst HEADING_WIDTH = 9;\r\n\r\nfunction indent(tagName: HeadingTagType) {\r\n if (tagName === 'h2') {\r\n return 'heading2';\r\n } else if (tagName === 'h3') {\r\n return 'heading3';\r\n }\r\n}\r\n\r\nfunction isHeadingAtTheTopOfThePage(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return (\r\n elementYPosition >= MARGIN_ABOVE_EDITOR &&\r\n elementYPosition <= MARGIN_ABOVE_EDITOR + HEADING_WIDTH\r\n );\r\n}\r\nfunction isHeadingAboveViewport(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return elementYPosition < MARGIN_ABOVE_EDITOR;\r\n}\r\nfunction isHeadingBelowTheTopOfThePage(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return elementYPosition >= MARGIN_ABOVE_EDITOR + HEADING_WIDTH;\r\n}\r\n\r\nfunction TableOfContentsList({\r\n tableOfContents,\r\n}: {\r\n tableOfContents: Array<TableOfContentsEntry>;\r\n}): JSX.Element {\r\n const [selectedKey, setSelectedKey] = useState('');\r\n const selectedIndex = useRef(0);\r\n const [editor] = useLexicalComposerContext();\r\n\r\n function scrollToNode(key: NodeKey, currIndex: number) {\r\n editor.getEditorState().read(() => {\r\n const domElement = editor.getElementByKey(key);\r\n if (domElement !== null) {\r\n domElement.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n setSelectedKey(key);\r\n selectedIndex.current = currIndex;\r\n }\r\n });\r\n }\r\n\r\n useEffect(() => {\r\n function scrollCallback() {\r\n if (\r\n tableOfContents.length !== 0 &&\r\n selectedIndex.current < tableOfContents.length - 1\r\n ) {\r\n let currentHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current][0],\r\n );\r\n if (currentHeading !== null) {\r\n if (isHeadingBelowTheTopOfThePage(currentHeading)) {\r\n //On natural scroll, user is scrolling up\r\n while (\r\n currentHeading !== null &&\r\n isHeadingBelowTheTopOfThePage(currentHeading) &&\r\n selectedIndex.current > 0\r\n ) {\r\n const prevHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current - 1][0],\r\n );\r\n if (\r\n prevHeading !== null &&\r\n (isHeadingAboveViewport(prevHeading) ||\r\n isHeadingBelowTheTopOfThePage(prevHeading))\r\n ) {\r\n selectedIndex.current--;\r\n }\r\n currentHeading = prevHeading;\r\n }\r\n const prevHeadingKey = tableOfContents[selectedIndex.current][0];\r\n setSelectedKey(prevHeadingKey);\r\n } else if (isHeadingAboveViewport(currentHeading)) {\r\n //On natural scroll, user is scrolling down\r\n while (\r\n currentHeading !== null &&\r\n isHeadingAboveViewport(currentHeading) &&\r\n selectedIndex.current < tableOfContents.length - 1\r\n ) {\r\n const nextHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current + 1][0],\r\n );\r\n if (\r\n nextHeading !== null &&\r\n (isHeadingAtTheTopOfThePage(nextHeading) ||\r\n isHeadingAboveViewport(nextHeading))\r\n ) {\r\n selectedIndex.current++;\r\n }\r\n currentHeading = nextHeading;\r\n }\r\n const nextHeadingKey = tableOfContents[selectedIndex.current][0];\r\n setSelectedKey(nextHeadingKey);\r\n }\r\n }\r\n } else {\r\n selectedIndex.current = 0;\r\n }\r\n }\r\n let timerId: ReturnType<typeof setTimeout>;\r\n\r\n function debounceFunction(func: () => void, delay: number) {\r\n clearTimeout(timerId);\r\n timerId = setTimeout(func, delay);\r\n }\r\n\r\n function onScroll(): void {\r\n debounceFunction(scrollCallback, 10);\r\n }\r\n\r\n document.addEventListener('scroll', onScroll);\r\n return () => document.removeEventListener('scroll', onScroll);\r\n }, [tableOfContents, editor]);\r\n\r\n return (\r\n <div className=\"table-of-contents\">\r\n <ul className=\"headings\">\r\n {tableOfContents.map(([key, text, tag], index) => {\r\n if (index === 0) {\r\n return (\r\n <div className=\"normal-heading-wrapper\" key={key}>\r\n <div\r\n className=\"first-heading\"\r\n onClick={() => scrollToNode(key, index)}\r\n role=\"button\"\r\n tabIndex={0}>\r\n {('' + text).length > 20\r\n ? text.substring(0, 20) + '...'\r\n : text}\r\n </div>\r\n <br />\r\n </div>\r\n );\r\n } else {\r\n return (\r\n <div\r\n className={`normal-heading-wrapper ${\r\n selectedKey === key ? 'selected-heading-wrapper' : ''\r\n }`}\r\n key={key}>\r\n <div\r\n onClick={() => scrollToNode(key, index)}\r\n role=\"button\"\r\n className={indent(tag)}\r\n tabIndex={0}>\r\n <li\r\n className={`normal-heading ${\r\n selectedKey === key ? 'selected-heading' : ''\r\n }\r\n `}>\r\n {('' + text).length > 27\r\n ? text.substring(0, 27) + '...'\r\n : text}\r\n </li>\r\n </div>\r\n </div>\r\n );\r\n }\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableOfContentsPlugin() {\r\n return (\r\n <LexicalTableOfContentsPlugin>\r\n {(tableOfContents) => {\r\n return <TableOfContentsList tableOfContents={tableOfContents} />;\r\n }}\r\n </LexicalTableOfContentsPlugin>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nconst SCROLLABLE_WRAPPER_CLASS =\r\n 'PlaygroundEditorTheme__tableScrollableWrapper';\r\nconst HAS_SCROLL_RIGHT_CLASS = 'PlaygroundEditorTheme__tableScrollRight';\r\nconst HAS_SCROLL_LEFT_CLASS = 'PlaygroundEditorTheme__tableScrollLeft';\r\nconst HAS_SCROLL_MIDDLE_CLASS = 'PlaygroundEditorTheme__tableScrollMiddle';\r\n\r\nfunction updateTableScrollState(element: HTMLElement): void {\r\n const hasScroll = element.scrollWidth > element.clientWidth;\r\n // Adding and removing 1 and -1 for floating point precision\r\n const isScrolledToRight =\r\n element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;\r\n const isScrolledToLeft = element.scrollLeft <= 1;\r\n\r\n // Remove all scroll classes first\r\n element.classList.remove(HAS_SCROLL_RIGHT_CLASS);\r\n element.classList.remove(HAS_SCROLL_LEFT_CLASS);\r\n element.classList.remove(HAS_SCROLL_MIDDLE_CLASS);\r\n\r\n if (hasScroll) {\r\n // Middle state: not at either edge\r\n if (!isScrolledToLeft && !isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_MIDDLE_CLASS);\r\n }\r\n // Right edge\r\n else if (isScrolledToLeft && !isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_RIGHT_CLASS);\r\n }\r\n // Left edge\r\n else if (!isScrolledToLeft && isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_LEFT_CLASS);\r\n }\r\n }\r\n}\r\n\r\nexport default function TableScrollShadowPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const editorElement = editor.getRootElement();\r\n if (!editorElement) {\r\n return;\r\n }\r\n\r\n const updateAllTableScrollStates = () => {\r\n const wrappers = editorElement.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n wrappers.forEach(updateTableScrollState);\r\n };\r\n\r\n // Initial check\r\n updateAllTableScrollStates();\r\n\r\n // Watch for new table wrappers being added\r\n const observer = new MutationObserver(() => {\r\n updateAllTableScrollStates();\r\n });\r\n\r\n observer.observe(editorElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n // Also watch for resize events on the wrappers themselves\r\n const resizeObserver = new ResizeObserver(() => {\r\n updateAllTableScrollStates();\r\n });\r\n\r\n const scrollHandlers = new Map<HTMLElement, () => void>();\r\n\r\n const addScrollListener = (wrapper: HTMLElement) => {\r\n if (scrollHandlers.has(wrapper)) {\r\n return; // Already has a listener\r\n }\r\n const handler = () => {\r\n updateTableScrollState(wrapper);\r\n };\r\n wrapper.addEventListener('scroll', handler, {passive: true});\r\n scrollHandlers.set(wrapper, handler);\r\n };\r\n\r\n const wrappers = editorElement.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n wrappers.forEach((wrapper) => {\r\n resizeObserver.observe(wrapper);\r\n addScrollListener(wrapper);\r\n });\r\n\r\n // Watch for new wrappers to observe\r\n const wrapperObserver = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n mutation.addedNodes.forEach((node) => {\r\n if (node instanceof HTMLElement) {\r\n if (node.classList.contains(SCROLLABLE_WRAPPER_CLASS)) {\r\n resizeObserver.observe(node);\r\n addScrollListener(node);\r\n updateTableScrollState(node);\r\n }\r\n\r\n const childWrappers = node.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n childWrappers.forEach((wrapper) => {\r\n resizeObserver.observe(wrapper);\r\n addScrollListener(wrapper);\r\n updateTableScrollState(wrapper);\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n wrapperObserver.observe(editorElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n return () => {\r\n observer.disconnect();\r\n resizeObserver.disconnect();\r\n wrapperObserver.disconnect();\r\n\r\n scrollHandlers.forEach((handler, wrapper) => {\r\n wrapper.removeEventListener('scroll', handler);\r\n });\r\n scrollHandlers.clear();\r\n };\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {JSX} from 'react';\n\nimport {\n $isCodeNode,\n getCodeLanguageOptions as getCodeLanguageOptionsPrism,\n normalizeCodeLanguage as normalizeCodeLanguagePrism,\n} from '@lexical/code';\nimport {\n getCodeLanguageOptions as getCodeLanguageOptionsShiki,\n getCodeThemeOptions as getCodeThemeOptionsShiki,\n normalizeCodeLanguage as normalizeCodeLanguageShiki,\n} from '@lexical/code-shiki';\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\nimport {$isListNode, ListNode} from '@lexical/list';\nimport {INSERT_EMBED_COMMAND} from '@lexical/react/LexicalAutoEmbedPlugin';\nimport {INSERT_HORIZONTAL_RULE_COMMAND} from '@lexical/react/LexicalHorizontalRuleNode';\nimport {$isHeadingNode} from '@lexical/rich-text';\nimport {\n $getSelectionStyleValueForProperty,\n $isParentElementRTL,\n $patchStyleText,\n} from '@lexical/selection';\nimport {$isTableNode, $isTableSelection} from '@lexical/table';\nimport {\n $findMatchingParent,\n $getNearestNodeOfType,\n $isEditorIsNestedEditor,\n IS_APPLE,\n mergeRegister,\n} from '@lexical/utils';\nimport {\n $addUpdateTag,\n $getNodeByKey,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isNodeSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n CommandPayloadType,\n ElementFormatType,\n FORMAT_ELEMENT_COMMAND,\n FORMAT_TEXT_COMMAND,\n HISTORIC_TAG,\n INDENT_CONTENT_COMMAND,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n OUTDENT_CONTENT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n SKIP_DOM_SELECTION_TAG,\n SKIP_SELECTION_FOCUS_TAG,\n TextFormatType,\n UNDO_COMMAND,\n} from 'lexical';\nimport {Dispatch, useCallback, useEffect, useState} from 'react';\n\nimport {useSettings} from '../../context/SettingsContext';\nimport {\n blockTypeToBlockName,\n useToolbarState,\n} from '../../context/ToolbarContext';\nimport useModal from '../../hooks/useModal';\nimport {$createStickyNode} from '../../nodes/StickyNode';\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\nimport DropdownColorPicker from '../../ui/DropdownColorPicker';\nimport {isKeyboardInput} from '../../utils/focusUtils';\nimport {getSelectedNode} from '../../utils/getSelectedNode';\nimport {sanitizeUrl} from '../../utils/url';\nimport {EmbedConfigs} from '../AutoEmbedPlugin';\nimport {INSERT_COLLAPSIBLE_COMMAND} from '../CollapsiblePlugin';\nimport {INSERT_DATETIME_COMMAND} from '../DateTimePlugin';\nimport {InsertEquationDialog} from '../EquationsPlugin';\nimport {INSERT_EXCALIDRAW_COMMAND} from '../ExcalidrawPlugin';\nimport {\n InsertImageDialog,\n} from '../ImagesPlugin';\nimport InsertLayoutDialog from '../LayoutPlugin/InsertLayoutDialog';\nimport {INSERT_PAGE_BREAK} from '../PageBreakPlugin';\nimport {InsertNotesDialog} from '../NotesPlugin';\nimport {InsertPollDialog} from '../PollPlugin';\nimport {InsertRevisionDialog} from '../RevisionPlugin';\nimport {InsertTerminologyDialog} from '../TerminologyPlugin';\nimport {SHORTCUTS} from '../ShortcutsPlugin/shortcuts';\nimport {InsertTableDialog} from '../TablePlugin';\nimport FontSize, {parseFontSizeForToolbar} from './fontSize';\nimport {\n clearFormatting,\n formatBulletList,\n formatCheckList,\n formatCode,\n formatHeading,\n formatNumberedList,\n formatParagraph,\n formatQuote,\n} from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst rootTypeToRootName = {\n root: 'Root',\n table: 'Table',\n};\n\nconst CODE_LANGUAGE_OPTIONS_PRISM: [string, string][] =\n getCodeLanguageOptionsPrism().filter((option) =>\n [\n 'c',\n 'clike',\n 'cpp',\n 'css',\n 'html',\n 'java',\n 'js',\n 'javascript',\n 'markdown',\n 'objc',\n 'objective-c',\n 'plain',\n 'powershell',\n 'py',\n 'python',\n 'rust',\n 'sql',\n 'swift',\n 'typescript',\n 'xml',\n ].includes(option[0]),\n );\n\nconst CODE_LANGUAGE_OPTIONS_SHIKI: [string, string][] =\n getCodeLanguageOptionsShiki().filter((option) =>\n [\n 'c',\n 'clike',\n 'cpp',\n 'css',\n 'html',\n 'java',\n 'js',\n 'javascript',\n 'markdown',\n 'objc',\n 'objective-c',\n 'plain',\n 'powershell',\n 'py',\n 'python',\n 'rust',\n 'sql',\n 'typescript',\n 'xml',\n ].includes(option[0]),\n );\n\nconst CODE_THEME_OPTIONS_SHIKI: [string, string][] =\n getCodeThemeOptionsShiki().filter((option) =>\n [\n 'catppuccin-latte',\n 'everforest-light',\n 'github-light',\n 'gruvbox-light-medium',\n 'kanagawa-lotus',\n 'dark-plus',\n 'light-plus',\n 'material-theme-lighter',\n 'min-light',\n 'one-light',\n 'rose-pine-dawn',\n 'slack-ochin',\n 'snazzy-light',\n 'solarized-light',\n 'vitesse-light',\n ].includes(option[0]),\n );\n\nconst FONT_FAMILY_OPTIONS: [string, string][] = [\n ['Arial', 'Arial'],\n ['Courier New', 'Courier New'],\n ['Georgia', 'Georgia'],\n ['Times New Roman', 'Times New Roman'],\n ['Trebuchet MS', 'Trebuchet MS'],\n ['Verdana', 'Verdana'],\n];\n\nconst FONT_SIZE_OPTIONS: [string, string][] = [\n ['10px', '10px'],\n ['11px', '11px'],\n ['12px', '12px'],\n ['13px', '13px'],\n ['14px', '14px'],\n ['15px', '15px'],\n ['16px', '16px'],\n ['17px', '17px'],\n ['18px', '18px'],\n ['19px', '19px'],\n ['20px', '20px'],\n];\n\nconst ELEMENT_FORMAT_OPTIONS: {\n [key in Exclude<ElementFormatType, ''>]: {\n icon: string;\n iconRTL: string;\n name: string;\n };\n} = {\n center: {\n icon: 'center-align',\n iconRTL: 'center-align',\n name: 'Center Align',\n },\n end: {\n icon: 'right-align',\n iconRTL: 'left-align',\n name: 'End Align',\n },\n justify: {\n icon: 'justify-align',\n iconRTL: 'justify-align',\n name: 'Justify Align',\n },\n left: {\n icon: 'left-align',\n iconRTL: 'left-align',\n name: 'Left Align',\n },\n right: {\n icon: 'right-align',\n iconRTL: 'right-align',\n name: 'Right Align',\n },\n start: {\n icon: 'left-align',\n iconRTL: 'right-align',\n name: 'Start Align',\n },\n};\n\nfunction dropDownActiveClass(active: boolean) {\n if (active) {\n return 'active dropdown-item-active';\n } else {\n return '';\n }\n}\n\nfunction BlockFormatDropDown({\n editor,\n blockType,\n rootType,\n disabled = false,\n}: {\n blockType: keyof typeof blockTypeToBlockName;\n rootType: keyof typeof rootTypeToRootName;\n editor: LexicalEditor;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <DropDown\n disabled={disabled}\n buttonClassName=\"toolbar-item block-controls\"\n buttonIconClassName={'icon block-type ' + blockType}\n buttonLabel={blockTypeToBlockName[blockType]}\n buttonAriaLabel=\"Formatting options for text style\">\n <DropDownItem\n className={\n 'item wide ' + dropDownActiveClass(blockType === 'paragraph')\n }\n onClick={() => formatParagraph(editor)}>\n <div className=\"icon-text-container\">\n <i className=\"icon paragraph\" />\n <span className=\"text\">Normal</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.NORMAL}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h1')}\n onClick={() => formatHeading(editor, blockType, 'h1')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h1\" />\n <span className=\"text\">Heading 1</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING1}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h2')}\n onClick={() => formatHeading(editor, blockType, 'h2')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h2\" />\n <span className=\"text\">Heading 2</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING2}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h3')}\n onClick={() => formatHeading(editor, blockType, 'h3')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h3\" />\n <span className=\"text\">Heading 3</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING3}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'number')}\n onClick={() => formatNumberedList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon numbered-list\" />\n <span className=\"text\">Numbered List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.NUMBERED_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'bullet')}\n onClick={() => formatBulletList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon bullet-list\" />\n <span className=\"text\">Bullet List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.BULLET_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'check')}\n onClick={() => formatCheckList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon check-list\" />\n <span className=\"text\">Check List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CHECK_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'quote')}\n onClick={() => formatQuote(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon quote\" />\n <span className=\"text\">Quote</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.QUOTE}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'code')}\n onClick={() => formatCode(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon code\" />\n <span className=\"text\">Code Block</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CODE_BLOCK}</span>\n </DropDownItem>\n </DropDown>\n );\n}\n\nfunction Divider(): JSX.Element {\n return <div className=\"divider\" />;\n}\n\nfunction FontDropDown({\n editor,\n value,\n style,\n disabled = false,\n}: {\n editor: LexicalEditor;\n value: string;\n style: string;\n disabled?: boolean;\n}): JSX.Element {\n const handleClick = useCallback(\n (option: string) => {\n editor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n const selection = $getSelection();\n if (selection !== null) {\n $patchStyleText(selection, {\n [style]: option,\n });\n }\n });\n },\n [editor, style],\n );\n\n const buttonAriaLabel =\n style === 'font-family'\n ? 'Formatting options for font family'\n : 'Formatting options for font size';\n\n return (\n <DropDown\n disabled={disabled}\n buttonClassName={'toolbar-item ' + style}\n buttonLabel={value}\n buttonIconClassName={\n style === 'font-family' ? 'icon block-type font-family' : ''\n }\n buttonAriaLabel={buttonAriaLabel}>\n {(style === 'font-family' ? FONT_FAMILY_OPTIONS : FONT_SIZE_OPTIONS).map(\n ([option, text]) => (\n <DropDownItem\n className={`item ${dropDownActiveClass(value === option)} ${\n style === 'font-size' ? 'fontsize-item' : ''\n }`}\n onClick={() => handleClick(option)}\n key={option}>\n <span className=\"text\">{text}</span>\n </DropDownItem>\n ),\n )}\n </DropDown>\n );\n}\n\nfunction ElementFormatDropdown({\n editor,\n value,\n isRTL,\n disabled = false,\n}: {\n editor: LexicalEditor;\n value: ElementFormatType;\n isRTL: boolean;\n disabled: boolean;\n}) {\n const formatOption = ELEMENT_FORMAT_OPTIONS[value || 'left'];\n\n return (\n <DropDown\n disabled={disabled}\n buttonLabel={formatOption.name}\n buttonIconClassName={`icon ${\n isRTL ? formatOption.iconRTL : formatOption.icon\n }`}\n buttonClassName=\"toolbar-item spaced alignment\"\n buttonAriaLabel=\"Formatting options for text alignment\">\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon left-align\" />\n <span className=\"text\">Left Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.LEFT_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon center-align\" />\n <span className=\"text\">Center Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CENTER_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon right-align\" />\n <span className=\"text\">Right Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.RIGHT_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon justify-align\" />\n <span className=\"text\">Justify Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.JUSTIFY_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'start');\n }}\n className=\"item wide\">\n <i\n className={`icon ${\n isRTL\n ? ELEMENT_FORMAT_OPTIONS.start.iconRTL\n : ELEMENT_FORMAT_OPTIONS.start.icon\n }`}\n />\n <span className=\"text\">Start Align</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'end');\n }}\n className=\"item wide\">\n <i\n className={`icon ${\n isRTL\n ? ELEMENT_FORMAT_OPTIONS.end.iconRTL\n : ELEMENT_FORMAT_OPTIONS.end.icon\n }`}\n />\n <span className=\"text\">End Align</span>\n </DropDownItem>\n <Divider />\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined);\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className={'icon ' + (isRTL ? 'indent' : 'outdent')} />\n <span className=\"text\">Outdent</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.OUTDENT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined);\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className={'icon ' + (isRTL ? 'outdent' : 'indent')} />\n <span className=\"text\">Indent</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.INDENT}</span>\n </DropDownItem>\n </DropDown>\n );\n}\n\nfunction $findTopLevelElement(node: LexicalNode) {\n let topLevelElement =\n node.getKey() === 'root'\n ? node\n : $findMatchingParent(node, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (topLevelElement === null) {\n topLevelElement = node.getTopLevelElementOrThrow();\n }\n return topLevelElement;\n}\n\nexport default function ToolbarPlugin({\n editor,\n activeEditor,\n setActiveEditor,\n setIsLinkEditMode,\n}: {\n editor: LexicalEditor;\n activeEditor: LexicalEditor;\n setActiveEditor: Dispatch<LexicalEditor>;\n setIsLinkEditMode: Dispatch<boolean>;\n}): JSX.Element {\n const [selectedElementKey, setSelectedElementKey] = useState<NodeKey | null>(\n null,\n );\n const [modal, showModal] = useModal();\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\n const {toolbarState, updateToolbarState} = useToolbarState();\n\n const dispatchToolbarCommand = <T extends LexicalCommand<unknown>>(\n command: T,\n payload: CommandPayloadType<T> | undefined = undefined,\n skipRefocus: boolean = false,\n ) => {\n activeEditor.update(() => {\n if (skipRefocus) {\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\n }\n\n // Re-assert on Type so that payload can have a default param\n activeEditor.dispatchCommand(command, payload as CommandPayloadType<T>);\n });\n };\n\n const dispatchFormatTextCommand = (\n payload: TextFormatType,\n skipRefocus: boolean = false,\n ) => dispatchToolbarCommand(FORMAT_TEXT_COMMAND, payload, skipRefocus);\n\n const $handleHeadingNode = useCallback(\n (selectedElement: LexicalNode) => {\n const type = $isHeadingNode(selectedElement)\n ? selectedElement.getTag()\n : selectedElement.getType();\n\n if (type in blockTypeToBlockName) {\n updateToolbarState(\n 'blockType',\n type as keyof typeof blockTypeToBlockName,\n );\n }\n },\n [updateToolbarState],\n );\n\n const {\n settings: {isCodeHighlighted, isCodeShiki},\n } = useSettings();\n\n const $handleCodeNode = useCallback(\n (element: LexicalNode): boolean => {\n if ($isCodeNode(element)) {\n const language = element.getLanguage();\n updateToolbarState(\n 'codeLanguage',\n language\n ? (isCodeHighlighted &&\n (isCodeShiki\n ? normalizeCodeLanguageShiki(language)\n : normalizeCodeLanguagePrism(language))) ||\n language\n : '',\n );\n const theme = element.getTheme();\n updateToolbarState('codeTheme', theme || '');\n return true;\n }\n return false;\n },\n [updateToolbarState, isCodeHighlighted, isCodeShiki],\n );\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (activeEditor !== editor && $isEditorIsNestedEditor(activeEditor)) {\n const rootElement = activeEditor.getRootElement();\n updateToolbarState(\n 'isImageCaption',\n !!rootElement?.parentElement?.classList.contains(\n 'image-caption-container',\n ),\n );\n } else {\n updateToolbarState('isImageCaption', false);\n }\n\n const anchorNode = selection.anchor.getNode();\n const element = $findTopLevelElement(anchorNode);\n const elementKey = element.getKey();\n const elementDOM = activeEditor.getElementByKey(elementKey);\n\n updateToolbarState('isRTL', $isParentElementRTL(selection));\n\n // Update links\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isLink = $isLinkNode(parent) || $isLinkNode(node);\n updateToolbarState('isLink', isLink);\n\n const tableNode = $findMatchingParent(node, $isTableNode);\n if ($isTableNode(tableNode)) {\n updateToolbarState('rootType', 'table');\n } else {\n updateToolbarState('rootType', 'root');\n }\n\n if (elementDOM !== null) {\n setSelectedElementKey(elementKey);\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(\n anchorNode,\n ListNode,\n );\n const type = parentList\n ? parentList.getListType()\n : element.getListType();\n\n updateToolbarState('blockType', type);\n } else {\n $handleHeadingNode(element);\n if ($handleCodeNode(element)) {\n return;\n }\n }\n }\n\n // Handle buttons\n updateToolbarState(\n 'fontColor',\n $getSelectionStyleValueForProperty(selection, 'color', '#000'),\n );\n updateToolbarState(\n 'bgColor',\n $getSelectionStyleValueForProperty(\n selection,\n 'background-color',\n '#fff',\n ),\n );\n updateToolbarState(\n 'fontFamily',\n $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial'),\n );\n let matchingParent;\n if ($isLinkNode(parent)) {\n // If node is a link, we need to fetch the parent paragraph node to set format\n matchingParent = $findMatchingParent(\n node,\n (parentNode) => $isElementNode(parentNode) && !parentNode.isInline(),\n );\n }\n\n // If matchingParent is a valid node, pass it's format type\n updateToolbarState(\n 'elementFormat',\n $isElementNode(matchingParent)\n ? matchingParent.getFormatType()\n : $isElementNode(node)\n ? node.getFormatType()\n : parent?.getFormatType() || 'left',\n );\n }\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n // Update text format\n updateToolbarState('isBold', selection.hasFormat('bold'));\n updateToolbarState('isItalic', selection.hasFormat('italic'));\n updateToolbarState('isUnderline', selection.hasFormat('underline'));\n updateToolbarState(\n 'isStrikethrough',\n selection.hasFormat('strikethrough'),\n );\n updateToolbarState('isSubscript', selection.hasFormat('subscript'));\n updateToolbarState('isSuperscript', selection.hasFormat('superscript'));\n updateToolbarState('isHighlight', selection.hasFormat('highlight'));\n updateToolbarState('isCode', selection.hasFormat('code'));\n updateToolbarState(\n 'fontSize',\n $getSelectionStyleValueForProperty(selection, 'font-size', '15px'),\n );\n updateToolbarState('isLowercase', selection.hasFormat('lowercase'));\n updateToolbarState('isUppercase', selection.hasFormat('uppercase'));\n updateToolbarState('isCapitalize', selection.hasFormat('capitalize'));\n }\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n for (const selectedNode of nodes) {\n const parentList = $getNearestNodeOfType<ListNode>(\n selectedNode,\n ListNode,\n );\n if (parentList) {\n const type = parentList.getListType();\n updateToolbarState('blockType', type);\n } else {\n const selectedElement = $findTopLevelElement(selectedNode);\n $handleHeadingNode(selectedElement);\n $handleCodeNode(selectedElement);\n // Update elementFormat for node selection (e.g., images)\n if ($isElementNode(selectedElement)) {\n updateToolbarState(\n 'elementFormat',\n selectedElement.getFormatType(),\n );\n }\n }\n }\n }\n }, [\n activeEditor,\n editor,\n updateToolbarState,\n $handleHeadingNode,\n $handleCodeNode,\n ]);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n setActiveEditor(newEditor);\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor, $updateToolbar, setActiveEditor]);\n\n useEffect(() => {\n activeEditor.getEditorState().read(\n () => {\n $updateToolbar();\n },\n {editor: activeEditor},\n );\n }, [activeEditor, $updateToolbar]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerEditableListener((editable) => {\n setIsEditable(editable);\n }),\n activeEditor.registerUpdateListener(({editorState}) => {\n editorState.read(\n () => {\n $updateToolbar();\n },\n {editor: activeEditor},\n );\n }),\n activeEditor.registerCommand<boolean>(\n CAN_UNDO_COMMAND,\n (payload) => {\n updateToolbarState('canUndo', payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n activeEditor.registerCommand<boolean>(\n CAN_REDO_COMMAND,\n (payload) => {\n updateToolbarState('canRedo', payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n );\n }, [$updateToolbar, activeEditor, editor, updateToolbarState]);\n\n const applyStyleText = useCallback(\n (\n styles: Record<string, string>,\n skipHistoryStack?: boolean,\n skipRefocus: boolean = false,\n ) => {\n activeEditor.update(\n () => {\n if (skipRefocus) {\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\n }\n const selection = $getSelection();\n if (selection !== null) {\n $patchStyleText(selection, styles);\n }\n },\n skipHistoryStack ? {tag: HISTORIC_TAG} : {},\n );\n },\n [activeEditor],\n );\n\n const onFontColorSelect = useCallback(\n (value: string, skipHistoryStack: boolean, skipRefocus: boolean) => {\n applyStyleText({color: value}, skipHistoryStack, skipRefocus);\n },\n [applyStyleText],\n );\n\n const onBgColorSelect = useCallback(\n (value: string, skipHistoryStack: boolean, skipRefocus: boolean) => {\n applyStyleText(\n {'background-color': value},\n skipHistoryStack,\n skipRefocus,\n );\n },\n [applyStyleText],\n );\n\n const insertLink = useCallback(() => {\n if (!toolbarState.isLink) {\n setIsLinkEditMode(true);\n activeEditor.dispatchCommand(\n TOGGLE_LINK_COMMAND,\n sanitizeUrl('https://'),\n );\n } else {\n setIsLinkEditMode(false);\n activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [activeEditor, setIsLinkEditMode, toolbarState.isLink]);\n\n const onCodeLanguageSelect = useCallback(\n (value: string) => {\n activeEditor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n if (selectedElementKey !== null) {\n const node = $getNodeByKey(selectedElementKey);\n if ($isCodeNode(node)) {\n node.setLanguage(value);\n }\n }\n });\n },\n [activeEditor, selectedElementKey],\n );\n const onCodeThemeSelect = useCallback(\n (value: string) => {\n activeEditor.update(() => {\n if (selectedElementKey !== null) {\n const node = $getNodeByKey(selectedElementKey);\n if ($isCodeNode(node)) {\n node.setTheme(value);\n }\n }\n });\n },\n [activeEditor, selectedElementKey],\n );\n const canViewerSeeInsertDropdown = !toolbarState.isImageCaption;\n const canViewerSeeInsertCodeButton = !toolbarState.isImageCaption;\n\n return (\n <div className=\"toolbar\">\n <button\n disabled={!toolbarState.canUndo || !isEditable}\n onClick={(e) =>\n dispatchToolbarCommand(UNDO_COMMAND, undefined, isKeyboardInput(e))\n }\n title={IS_APPLE ? 'Undo (⌘Z)' : 'Undo (Ctrl+Z)'}\n type=\"button\"\n className=\"toolbar-item spaced\"\n aria-label=\"Undo\">\n <i className=\"format undo\" />\n </button>\n <button\n disabled={!toolbarState.canRedo || !isEditable}\n onClick={(e) =>\n dispatchToolbarCommand(REDO_COMMAND, undefined, isKeyboardInput(e))\n }\n title={IS_APPLE ? 'Redo (⇧⌘Z)' : 'Redo (Ctrl+Y)'}\n type=\"button\"\n className=\"toolbar-item\"\n aria-label=\"Redo\">\n <i className=\"format redo\" />\n </button>\n <Divider />\n {toolbarState.blockType in blockTypeToBlockName &&\n activeEditor === editor && (\n <>\n <BlockFormatDropDown\n disabled={!isEditable}\n blockType={toolbarState.blockType}\n rootType={toolbarState.rootType}\n editor={activeEditor}\n />\n <Divider />\n </>\n )}\n {toolbarState.blockType === 'code' && isCodeHighlighted ? (\n <>\n {!isCodeShiki && (\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_LANGUAGE_OPTIONS_PRISM.find(\n (opt) =>\n opt[0] ===\n normalizeCodeLanguagePrism(toolbarState.codeLanguage),\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select language\">\n {CODE_LANGUAGE_OPTIONS_PRISM.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeLanguage,\n )}`}\n onClick={() => onCodeLanguageSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n )}\n {isCodeShiki && (\n <>\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_LANGUAGE_OPTIONS_SHIKI.find(\n (opt) =>\n opt[0] ===\n normalizeCodeLanguageShiki(toolbarState.codeLanguage),\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select language\">\n {CODE_LANGUAGE_OPTIONS_SHIKI.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeLanguage,\n )}`}\n onClick={() => onCodeLanguageSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_THEME_OPTIONS_SHIKI.find(\n (opt) => opt[0] === toolbarState.codeTheme,\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select theme\">\n {CODE_THEME_OPTIONS_SHIKI.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeTheme,\n )}`}\n onClick={() => onCodeThemeSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n </>\n )}\n </>\n ) : (\n <>\n <FontDropDown\n disabled={!isEditable}\n style={'font-family'}\n value={toolbarState.fontFamily}\n editor={activeEditor}\n />\n <Divider />\n <FontSize\n selectionFontSize={parseFontSizeForToolbar(\n toolbarState.fontSize,\n ).slice(0, -2)}\n editor={activeEditor}\n disabled={!isEditable}\n />\n <Divider />\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('bold', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isBold ? 'active' : '')\n }\n title={`Bold (${SHORTCUTS.BOLD})`}\n type=\"button\"\n aria-label={`Format text as bold. Shortcut: ${SHORTCUTS.BOLD}`}>\n <i className=\"format bold\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('italic', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isItalic ? 'active' : '')\n }\n title={`Italic (${SHORTCUTS.ITALIC})`}\n type=\"button\"\n aria-label={`Format text as italics. Shortcut: ${SHORTCUTS.ITALIC}`}>\n <i className=\"format italic\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('underline', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' +\n (toolbarState.isUnderline ? 'active' : '')\n }\n title={`Underline (${SHORTCUTS.UNDERLINE})`}\n type=\"button\"\n aria-label={`Format text to underlined. Shortcut: ${SHORTCUTS.UNDERLINE}`}>\n <i className=\"format underline\" />\n </button>\n {canViewerSeeInsertCodeButton && (\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('code', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isCode ? 'active' : '')\n }\n title={`Insert code block (${SHORTCUTS.INSERT_CODE_BLOCK})`}\n type=\"button\"\n aria-label=\"Insert code block\">\n <i className=\"format code\" />\n </button>\n )}\n <button\n disabled={!isEditable}\n onClick={insertLink}\n className={\n 'toolbar-item spaced ' + (toolbarState.isLink ? 'active' : '')\n }\n aria-label=\"Insert link\"\n title={`Insert link (${SHORTCUTS.INSERT_LINK})`}\n type=\"button\">\n <i className=\"format link\" />\n </button>\n <DropdownColorPicker\n disabled={!isEditable}\n buttonClassName=\"toolbar-item color-picker\"\n buttonAriaLabel=\"Formatting text color\"\n buttonIconClassName=\"icon font-color\"\n color={toolbarState.fontColor}\n onChange={onFontColorSelect}\n title=\"text color\"\n />\n <DropdownColorPicker\n disabled={!isEditable}\n buttonClassName=\"toolbar-item color-picker\"\n buttonAriaLabel=\"Formatting background color\"\n buttonIconClassName=\"icon bg-color\"\n color={toolbarState.bgColor}\n onChange={onBgColorSelect}\n title=\"bg color\"\n />\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item spaced\"\n buttonLabel=\"\"\n buttonAriaLabel=\"Formatting options for additional text styles\"\n buttonIconClassName=\"icon dropdown-more\">\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('lowercase', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isLowercase)\n }\n title=\"Lowercase\"\n aria-label=\"Format text to lowercase\">\n <div className=\"icon-text-container\">\n <i className=\"icon lowercase\" />\n <span className=\"text\">Lowercase</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.LOWERCASE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('uppercase', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isUppercase)\n }\n title=\"Uppercase\"\n aria-label=\"Format text to uppercase\">\n <div className=\"icon-text-container\">\n <i className=\"icon uppercase\" />\n <span className=\"text\">Uppercase</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.UPPERCASE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('capitalize', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isCapitalize)\n }\n title=\"Capitalize\"\n aria-label=\"Format text to capitalize\">\n <div className=\"icon-text-container\">\n <i className=\"icon capitalize\" />\n <span className=\"text\">Capitalize</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CAPITALIZE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('strikethrough', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isStrikethrough)\n }\n title=\"Strikethrough\"\n aria-label=\"Format text with a strikethrough\">\n <div className=\"icon-text-container\">\n <i className=\"icon strikethrough\" />\n <span className=\"text\">Strikethrough</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.STRIKETHROUGH}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('subscript', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isSubscript)\n }\n title=\"Subscript\"\n aria-label=\"Format text with a subscript\">\n <div className=\"icon-text-container\">\n <i className=\"icon subscript\" />\n <span className=\"text\">Subscript</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.SUBSCRIPT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('superscript', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isSuperscript)\n }\n title=\"Superscript\"\n aria-label=\"Format text with a superscript\">\n <div className=\"icon-text-container\">\n <i className=\"icon superscript\" />\n <span className=\"text\">Superscript</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.SUPERSCRIPT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('highlight', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isHighlight)\n }\n title=\"Highlight\"\n aria-label=\"Format text with a highlight\">\n <div className=\"icon-text-container\">\n <i className=\"icon highlight\" />\n <span className=\"text\">Highlight</span>\n </div>\n </DropDownItem>\n <DropDownItem\n onClick={(e) => clearFormatting(activeEditor, isKeyboardInput(e))}\n className=\"item wide\"\n title=\"Clear text formatting\"\n aria-label=\"Clear all text formatting\">\n <div className=\"icon-text-container\">\n <i className=\"icon clear\" />\n <span className=\"text\">Clear Formatting</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CLEAR_FORMATTING}</span>\n </DropDownItem>\n </DropDown>\n {canViewerSeeInsertDropdown && (\n <>\n <Divider />\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item spaced\"\n buttonLabel=\"Insert\"\n buttonAriaLabel=\"Insert specialized editor node\"\n buttonIconClassName=\"icon plus\">\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_HORIZONTAL_RULE_COMMAND)\n }\n className=\"item\">\n <i className=\"icon horizontal-rule\" />\n <span className=\"text\">Horizontal Rule</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => dispatchToolbarCommand(INSERT_PAGE_BREAK)}\n className=\"item\">\n <i className=\"icon page-break\" />\n <span className=\"text\">Page Break</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Image', (onClose) => (\n <InsertImageDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon image\" />\n <span className=\"text\">Image</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert GIF', (onClose) => (\n <InsertImageDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon gif\" />\n <span className=\"text\">GIF</span>\n </DropDownItem>\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_EXCALIDRAW_COMMAND)\n }\n className=\"item\">\n <i className=\"icon diagram-2\" />\n <span className=\"text\">Excalidraw</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Table', (onClose) => (\n <InsertTableDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon table\" />\n <span className=\"text\">Table</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Poll', (onClose) => (\n <InsertPollDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon poll\" />\n <span className=\"text\">Poll</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Columns Layout', (onClose) => (\n <InsertLayoutDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon columns\" />\n <span className=\"text\">Columns Layout</span>\n </DropDownItem>\n\n <DropDownItem\n onClick={() => {\n showModal('Insert Equation', (onClose) => (\n <InsertEquationDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon equation\" />\n <span className=\"text\">Equation</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n const root = $getRoot();\n const stickyNode = $createStickyNode(0, 0);\n root.append(stickyNode);\n });\n }}\n className=\"item\">\n <i className=\"icon sticky\" />\n <span className=\"text\">Sticky Note</span>\n </DropDownItem>\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_COLLAPSIBLE_COMMAND)\n }\n className=\"item\">\n <i className=\"icon caret-right\" />\n <span className=\"text\">Collapsible container</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n const dateTime = new Date();\n dateTime.setHours(0, 0, 0, 0);\n dispatchToolbarCommand(INSERT_DATETIME_COMMAND, {dateTime});\n }}\n className=\"item\">\n <i className=\"icon calendar\" />\n <span className=\"text\">Date</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Terminology', (onClose) => (\n <InsertTerminologyDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon quote\" />\n <span className=\"text\">Terminology</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Notes', (onClose) => (\n <InsertNotesDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon paragraph\" />\n <span className=\"text\">Notes</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Revision Points', (onClose) => (\n <InsertRevisionDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon check-list\" />\n <span className=\"text\">Revision Points</span>\n </DropDownItem>\n {EmbedConfigs.map((embedConfig) => (\n <DropDownItem\n key={embedConfig.type}\n onClick={() =>\n dispatchToolbarCommand(\n INSERT_EMBED_COMMAND,\n embedConfig.type,\n )\n }\n className=\"item\">\n {embedConfig.icon}\n <span className=\"text\">{embedConfig.contentName}</span>\n </DropDownItem>\n ))}\n </DropDown>\n </>\n )}\n </>\n )}\n <Divider />\n <ElementFormatDropdown\n disabled={!isEditable}\n value={toolbarState.elementFormat}\n editor={activeEditor}\n isRTL={toolbarState.isRTL}\n />\n\n {modal}\n </div>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\n\r\nimport ColorPicker from './ColorPicker';\r\nimport DropDown from './DropDown';\r\n\r\ntype Props = {\r\n disabled?: boolean;\r\n buttonAriaLabel?: string;\r\n buttonClassName: string;\r\n buttonIconClassName?: string;\r\n buttonLabel?: string;\r\n title?: string;\r\n stopCloseOnClickSelf?: boolean;\r\n color: string;\r\n onChange?: (\r\n color: string,\r\n skipHistoryStack: boolean,\r\n skipRefocus: boolean,\r\n ) => void;\r\n};\r\n\r\nexport default function DropdownColorPicker({\r\n disabled = false,\r\n stopCloseOnClickSelf = true,\r\n color,\r\n onChange,\r\n ...rest\r\n}: Props) {\r\n return (\r\n <DropDown\r\n {...rest}\r\n disabled={disabled}\r\n stopCloseOnClickSelf={stopCloseOnClickSelf}>\r\n <ColorPicker color={color} onChange={onChange} />\r\n </DropDown>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './fontSize.css';\r\n\r\nimport {LexicalEditor} from 'lexical';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n MAX_ALLOWED_FONT_SIZE,\r\n MIN_ALLOWED_FONT_SIZE,\r\n} from '../../context/ToolbarContext';\r\nimport {isKeyboardInput} from '../../utils/focusUtils';\r\nimport {SHORTCUTS} from '../ShortcutsPlugin/shortcuts';\r\nimport {\r\n updateFontSize,\r\n updateFontSizeInSelection,\r\n UpdateFontSizeType,\r\n} from './utils';\r\n\r\nfunction parseFontSize(input: string): [number, string] | null {\r\n const match = input.match(/^(\\d+(?:\\.\\d+)?)(px|pt)$/);\r\n return match ? [Number(match[1]), match[2]] : null;\r\n}\r\n\r\nfunction normalizeToPx(fontSize: number, unit: string): number {\r\n return unit === 'pt' ? Math.round((fontSize * 4) / 3) : fontSize;\r\n}\r\n\r\nfunction isValidFontSize(fontSizePx: number): boolean {\r\n return (\r\n fontSizePx >= MIN_ALLOWED_FONT_SIZE && fontSizePx <= MAX_ALLOWED_FONT_SIZE\r\n );\r\n}\r\n\r\nexport function parseFontSizeForToolbar(input: string): string {\r\n const parsed = parseFontSize(input);\r\n if (!parsed) {\r\n return '';\r\n }\r\n\r\n const [fontSize, unit] = parsed;\r\n const fontSizePx = normalizeToPx(fontSize, unit);\r\n return `${fontSizePx}px`;\r\n}\r\n\r\nexport function parseAllowedFontSize(input: string): string {\r\n const parsed = parseFontSize(input);\r\n if (!parsed) {\r\n return '';\r\n }\r\n\r\n const [fontSize, unit] = parsed;\r\n const fontSizePx = normalizeToPx(fontSize, unit);\r\n return isValidFontSize(fontSizePx) ? input : '';\r\n}\r\n\r\nexport default function FontSize({\r\n selectionFontSize,\r\n disabled,\r\n editor,\r\n}: {\r\n selectionFontSize: string;\r\n disabled: boolean;\r\n editor: LexicalEditor;\r\n}) {\r\n const [inputValue, setInputValue] = React.useState<string>(selectionFontSize);\r\n const [inputChangeFlag, setInputChangeFlag] = React.useState<boolean>(false);\r\n const [isMouseMode, setIsMouseMode] = React.useState(false);\r\n\r\n const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n const inputValueNumber = Number(inputValue);\r\n\r\n if (e.key === 'Tab') {\r\n return;\r\n }\r\n if (['e', 'E', '+', '-'].includes(e.key) || isNaN(inputValueNumber)) {\r\n e.preventDefault();\r\n setInputValue('');\r\n return;\r\n }\r\n setInputChangeFlag(true);\r\n if (e.key === 'Enter' || e.key === 'Escape') {\r\n e.preventDefault();\r\n\r\n updateFontSizeByInputValue(inputValueNumber, !isMouseMode);\r\n }\r\n };\r\n\r\n const handleInputBlur = () => {\r\n setIsMouseMode(false);\r\n\r\n if (inputValue !== '' && inputChangeFlag) {\r\n const inputValueNumber = Number(inputValue);\r\n updateFontSizeByInputValue(inputValueNumber);\r\n }\r\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n setIsMouseMode(true);\r\n };\r\n\r\n const updateFontSizeByInputValue = (\r\n inputValueNumber: number,\r\n skipRefocus: boolean = false,\r\n ) => {\r\n let updatedFontSize = inputValueNumber;\r\n if (inputValueNumber > MAX_ALLOWED_FONT_SIZE) {\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n } else if (inputValueNumber < MIN_ALLOWED_FONT_SIZE) {\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n }\r\n\r\n setInputValue(String(updatedFontSize));\r\n updateFontSizeInSelection(\r\n editor,\r\n String(updatedFontSize) + 'px',\r\n null,\r\n skipRefocus,\r\n );\r\n setInputChangeFlag(false);\r\n };\r\n\r\n React.useEffect(() => {\r\n setInputValue(selectionFontSize);\r\n }, [selectionFontSize]);\r\n\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n disabled={\r\n disabled ||\r\n (selectionFontSize !== '' &&\r\n Number(inputValue) <= MIN_ALLOWED_FONT_SIZE)\r\n }\r\n onClick={(e) => {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.decrement,\r\n inputValue,\r\n isKeyboardInput(e),\r\n );\r\n }}\r\n className=\"toolbar-item font-decrement\"\r\n aria-label=\"Decrease font size\"\r\n title={`Decrease font size (${SHORTCUTS.DECREASE_FONT_SIZE})`}>\r\n <i className=\"format minus-icon\" />\r\n </button>\r\n\r\n <input\r\n type=\"number\"\r\n title=\"Font size\"\r\n value={inputValue}\r\n disabled={disabled}\r\n className=\"toolbar-item font-size-input\"\r\n min={MIN_ALLOWED_FONT_SIZE}\r\n max={MAX_ALLOWED_FONT_SIZE}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyPress}\r\n onBlur={handleInputBlur}\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n disabled={\r\n disabled ||\r\n (selectionFontSize !== '' &&\r\n Number(inputValue) >= MAX_ALLOWED_FONT_SIZE)\r\n }\r\n onClick={(e) => {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.increment,\r\n inputValue,\r\n isKeyboardInput(e),\r\n );\r\n }}\r\n className=\"toolbar-item font-increment\"\r\n aria-label=\"Increase font size\"\r\n title={`Increase font size (${SHORTCUTS.INCREASE_FONT_SIZE})`}>\r\n <i className=\"format add-icon\" />\r\n </button>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nimport {StickyNode} from '../../nodes/StickyNode';\r\n\r\nexport default function StickyPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([StickyNode])) {\r\n throw new Error('StickyPlugin: StickyNode not registered on editor');\r\n }\r\n }, [editor]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {Klass, LexicalNode} from 'lexical';\r\n\r\nimport {CodeHighlightNode, CodeNode} from '@lexical/code';\r\nimport {HashtagNode} from '@lexical/hashtag';\r\nimport {AutoLinkNode, LinkNode} from '@lexical/link';\r\nimport {ListItemNode, ListNode} from '@lexical/list';\r\nimport {MarkNode} from '@lexical/mark';\r\nimport {OverflowNode} from '@lexical/overflow';\r\nimport {HorizontalRuleNode} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {HeadingNode, QuoteNode} from '@lexical/rich-text';\r\nimport {TableCellNode, TableNode, TableRowNode} from '@lexical/table';\r\n\r\nimport {CollapsibleContainerNode} from '../plugins/CollapsiblePlugin/CollapsibleContainerNode';\r\nimport {CollapsibleContentNode} from '../plugins/CollapsiblePlugin/CollapsibleContentNode';\r\nimport {CollapsibleTitleNode} from '../plugins/CollapsiblePlugin/CollapsibleTitleNode';\r\nimport {AutocompleteNode} from './AutocompleteNode';\r\nimport {DateTimeNode} from './DateTimeNode/DateTimeNode';\r\nimport {EmojiNode} from './EmojiNode';\r\nimport {EquationNode} from './EquationNode';\r\nimport {ExcalidrawNode} from './ExcalidrawNode';\r\nimport {FigmaNode} from './FigmaNode';\r\nimport {HtmlBlockNode} from './HtmlBlockNode';\r\nimport {NotesNode} from './NotesNode';\r\nimport {RevisionNode} from './RevisionNode';\r\nimport {TerminologyNode} from './TerminologyNode';\r\nimport {ImageNode} from './ImageNode';\r\nimport {KeywordNode} from './KeywordNode';\r\nimport {LayoutContainerNode} from './LayoutContainerNode';\r\nimport {LayoutItemNode} from './LayoutItemNode';\r\nimport {MentionNode} from './MentionNode';\r\nimport {PageBreakNode} from './PageBreakNode';\r\nimport {PollNode} from './PollNode';\r\nimport {SpecialTextNode} from './SpecialTextNode';\r\nimport {StickyNode} from './StickyNode';\r\nimport {TweetNode} from './TweetNode';\r\nimport {YouTubeNode} from './YouTubeNode';\r\n\r\nconst PlaygroundNodes: Array<Klass<LexicalNode>> = [\r\n HeadingNode,\r\n ListNode,\r\n ListItemNode,\r\n QuoteNode,\r\n CodeNode,\r\n TableNode,\r\n TableCellNode,\r\n TableRowNode,\r\n HashtagNode,\r\n CodeHighlightNode,\r\n AutoLinkNode,\r\n LinkNode,\r\n OverflowNode,\r\n PollNode,\r\n StickyNode,\r\n ImageNode,\r\n MentionNode,\r\n EmojiNode,\r\n ExcalidrawNode,\r\n EquationNode,\r\n AutocompleteNode,\r\n KeywordNode,\r\n HorizontalRuleNode,\r\n TweetNode,\r\n YouTubeNode,\r\n FigmaNode,\r\n MarkNode,\r\n CollapsibleContainerNode,\r\n CollapsibleContentNode,\r\n CollapsibleTitleNode,\r\n PageBreakNode,\r\n LayoutContainerNode,\r\n LayoutItemNode,\r\n SpecialTextNode,\r\n DateTimeNode,\r\n HtmlBlockNode,\r\n TerminologyNode,\r\n NotesNode,\r\n RevisionNode,\r\n];\r\n\r\nexport default PlaygroundNodes;\r\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useRef, useState} from 'react';\n\ntype HtmlBlockComponentProps = Readonly<{\n className: Readonly<{\n base: string;\n focus: string;\n }>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction HtmlBlockComponent({\n className,\n format,\n nodeKey,\n html,\n}: HtmlBlockComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const openEditor = useCallback(() => {\n setEditValue(html);\n setIsEditing(true);\n // Focus textarea after render\n setTimeout(() => textareaRef.current?.focus(), 50);\n }, [html]);\n\n const saveHtml = useCallback(() => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isHtmlBlockNode(node)) {\n node.setHtml(editValue);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, editValue]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n return (\n <BlockWithAlignableContents\n className={className}\n format={format}\n nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n zIndex: 10,\n background: 'rgba(0,0,0,0.6)',\n color: '#fff',\n border: 'none',\n borderRadius: 4,\n padding: '2px 8px',\n fontSize: 12,\n cursor: 'pointer',\n opacity: 0,\n transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit HTML\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6}}>\n <span style={{fontSize: 12, fontWeight: 600, color: '#333'}}>Edit HTML Source</span>\n <div style={{display: 'flex', gap: 4}}>\n <button\n type=\"button\"\n onClick={cancelEdit}\n style={{\n padding: '2px 10px',\n fontSize: 12,\n border: '1px solid #ccc',\n borderRadius: 4,\n background: '#fff',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={saveHtml}\n style={{\n padding: '2px 10px',\n fontSize: 12,\n border: 'none',\n borderRadius: 4,\n background: '#2563eb',\n color: '#fff',\n cursor: 'pointer',\n }}\n >\n Save\n </button>\n </div>\n </div>\n <textarea\n ref={textareaRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n style={{\n width: '100%',\n minHeight: 150,\n fontFamily: 'monospace',\n fontSize: 12,\n padding: 8,\n border: '1px solid #ddd',\n borderRadius: 4,\n resize: 'vertical',\n }}\n />\n <div\n style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}\n >\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: editValue}} />\n </div>\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\nexport type SerializedHtmlBlockNode = Spread<\n {\n html: string;\n },\n SerializedDecoratorBlockNode\n>;\n\nconst DATA_ATTR = 'data-lexical-html-block';\n\nexport class HtmlBlockNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'html-block';\n }\n\n static clone(node: HtmlBlockNode): HtmlBlockNode {\n return new HtmlBlockNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedHtmlBlockNode): HtmlBlockNode {\n return $createHtmlBlockNode(serializedNode.html).updateFromJSON(\n serializedNode,\n );\n }\n\n exportJSON(): SerializedHtmlBlockNode {\n return {\n ...super.exportJSON(),\n html: this.__html,\n };\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) {\n return null;\n }\n return {\n conversion: convertHtmlBlockElement,\n priority: 2,\n };\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const className = {\n base: embedBlockTheme.base || '',\n focus: embedBlockTheme.focus || '',\n };\n return (\n <HtmlBlockComponent\n className={className}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertHtmlBlockElement(\n domNode: HTMLElement,\n): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) {\n return {node: $createHtmlBlockNode(html)};\n }\n return null;\n}\n\nexport function $createHtmlBlockNode(html: string): HtmlBlockNode {\n return new HtmlBlockNode(html);\n}\n\nexport function $isHtmlBlockNode(\n node: LexicalNode | null | undefined,\n): node is HtmlBlockNode {\n return node instanceof HtmlBlockNode;\n}\n"],"mappings":"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AAAA,MAClC,GAAG,KAAK,OAAO;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EA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","names":["useCallback","useEffect","useMemo","useRef","useState","LexicalComposer","OnChangePlugin","useLexicalComposerContext","$getRoot","$insertNodes","$setSelection","ClearEditorPlugin","useLexicalComposerContext","LexicalErrorBoundary","HistoryPlugin","PlainTextPlugin","useLexicalEditable","useEffect","useState","$convertFromMarkdownString","$convertToMarkdownString","useLexicalComposerContext","$createTextNode","$isParagraphNode","useCallback","useEffect","useState","useCallback","useState","jsx","table","rows","previousSibling","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useRef","useEffect","jsx","jsxs","useLexicalComposerContext","useState","useEffect","$isParagraphNode","useCallback","$convertFromMarkdownString","$convertToMarkdownString","$createTextNode","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isRangeSelection","$isTextNode","useCallback","useEffect","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","createContext","useState","useCallback","useEffect","useMemo","jsx","useContext","uuid","$isRangeSelection","$isTextNode","useCallback","useLexicalComposerContext","useEffect","$getSelection","$createTextNode","mergeRegister","useLexicalComposerContext","useMemo","useState","jsx","useLexicalComposerContext","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","BlockWithAlignableContents","DecoratorBlockNode","jsx","createCommand","useLexicalComposerContext","useEffect","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","BlockWithAlignableContents","DecoratorBlockNode","jsx","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","Fragment","jsx","jsxs","useState","useLexicalComposerContext","useMemo","$isCodeNode","jsx","$isCodeNode","useLexicalComposerContext","$getNearestNodeFromDOMNode","useEffect","useRef","useState","createPortal","$isCodeNode","$getSelection","$setSelection","useState","debounce","useMemo","useRef","jsx","useState","$isCodeNode","$getSelection","$setSelection","$isCodeNode","$getNearestNodeFromDOMNode","useState","jsx","jsxs","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useRef","$getNearestNodeFromDOMNode","$isCodeNode","useEffect","createPortal","useLexicalComposerContext","useEffect","useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","$createParagraphNode","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_RIGHT_COMMAND","useEffect","isHTMLElement","isHTMLElement","IS_CHROME","ElementNode","ElementNode","IS_CHROME","IS_CHROME","$isElementNode","ElementNode","ElementNode","IS_CHROME","$isElementNode","createCommand","useLexicalComposerContext","useEffect","$getSelection","$isRangeSelection","$createParagraphNode","mergeRegister","COMMAND_PRIORITY_LOW","KEY_ARROW_RIGHT_COMMAND","$insertNodeToNearestRoot","useLexicalComposerContext","mergeRegister","$getNodeByKey","$getSelection","$isRangeSelection","$isTextNode","CLEAR_EDITOR_COMMAND","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useRef","useState","createPortal","COMMAND_PRIORITY_LOW","useEffect","useState","offset","Fragment","jsx","jsxs","createCommand","useRef","useCallback","useEffect","useLexicalComposerContext","useState","useMemo","$getSelection","$isRangeSelection","elements","CLEAR_EDITOR_COMMAND","$getNodeByKey","mergeRegister","$isTextNode","COMMAND_PRIORITY_EDITOR","createPortal","$createCodeNode","useLexicalComposerContext","INSERT_TABLE_COMMAND","$createParagraphNode","$getSelection","$isRangeSelection","useCallback","useMemo","useState","ReactDOM","useLexicalComposerContext","mergeRegister","$createParagraphNode","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","createCommand","useLexicalComposerContext","useEffect","mergeRegister","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useLexicalComposerContext","useCallback","useState","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useCallback","jsx","createCommand","useCallback","useLexicalComposerContext","useEffect","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useState","jsx","createCommand","useLexicalComposerContext","useState","useEffect","COMMAND_PRIORITY_EDITOR","elements","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","useLexicalComposerContext","$findMatchingParent","$wrapNodeInElement","mergeRegister","$createParagraphNode","$getSelection","$insertNodes","$isRootOrShadowRoot","$setSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","isHTMLElement","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","createCommand","useState","useRef","useEffect","useLexicalComposerContext","mergeRegister","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","$findMatchingParent","$setSelection","$getSelection","isHTMLElement","useState","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","Fragment","jsx","jsxs","useRef","useEffect","useState","useCallback","useMemo","createPortal","useLexicalComposerContext","$findMatchingParent","$insertNodeToNearestRoot","mergeRegister","$createParagraphNode","$getNodeByKey","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_LEFT_COMMAND","KEY_ARROW_RIGHT_COMMAND","KEY_ARROW_UP_COMMAND","useEffect","ElementNode","addClassNamesToElement","$isParagraphNode","ElementNode","createCommand","useLexicalComposerContext","useEffect","$getSelection","$isRangeSelection","$findMatchingParent","$createParagraphNode","mergeRegister","KEY_ARROW_DOWN_COMMAND","COMMAND_PRIORITY_LOW","KEY_ARROW_RIGHT_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ARROW_LEFT_COMMAND","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","$getNodeByKey","Fragment","jsx","jsxs","useState","useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useLexicalComposerContext","mergeRegister","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","useEffect","jsx","createCommand","useLexicalComposerContext","useEffect","mergeRegister","$getSelection","$isRangeSelection","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useState","Fragment","jsx","jsxs","createCommand","useState","useLexicalComposerContext","useEffect","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DATA_ATTR","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DATA_ATTR","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","TableCellNode","TableNode","TableRowNode","createContext","useContext","useEffect","useMemo","useState","Fragment","jsx","jsxs","createContext","useState","useEffect","jsxs","Fragment","jsx","Fragment","jsx","jsxs","INSERT_TABLE_COMMAND","$getSelection","$isRangeSelection","$createParagraphNode","$createCodeNode","useLexicalComposerContext","useState","useMemo","useCallback","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","$getSelection","$isNodeSelection","$isRangeSelection","useMemo","jsx","useLexicalComposerContext","COMMAND_PRIORITY_LOW","useEffect","useLexicalComposerContext","useEffect","COMMAND_PRIORITY_LOW","useLexicalComposerContext","$createParagraphNode","$createTextNode","$getNearestNodeFromDOMNode","$getNodeByKey","$isParagraphNode","$isTextNode","useCallback","useEffect","useMemo","useRef","useState","ReactDOM","Fragment","jsx","jsxs","useLexicalComposerContext","useRef","useState","useMemo","useEffect","useCallback","$getNodeByKey","$createParagraphNode","$createTextNode","$isParagraphNode","$isTextNode","$getNearestNodeFromDOMNode","useLexicalComposerContext","LexicalTypeaheadMenuPlugin","MenuOption","useBasicTypeaheadTriggerMatch","$createTextNode","$getSelection","$isRangeSelection","useCallback","useEffect","useMemo","useState","ReactDOM","jsx","jsxs","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","$findMatchingParent","mergeRegister","$getSelection","$isNodeSelection","$isRangeSelection","CLICK_COMMAND","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","$isAtNodeEnd","Fragment","jsx","jsxs","useRef","useState","useCallback","$getSelection","$isRangeSelection","$findMatchingParent","$isLinkNode","$isNodeSelection","getDOMSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","$isAutoLinkNode","CLICK_COMMAND","createPortal","useLexicalComposerContext","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","mergeRegister","$getSelection","$isParagraphNode","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","getDOMSelection","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","VERTICAL_GAP","HORIZONTAL_OFFSET","Fragment","jsx","jsxs","isUppercase","isLowercase","isCapitalize","isSubscript","isSuperscript","useRef","useCallback","TOGGLE_LINK_COMMAND","useEffect","$getSelection","getDOMSelection","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","useState","$isRangeSelection","$isLinkNode","$isTextNode","$isParagraphNode","createPortal","useLexicalComposerContext","jsx","useLexicalComposerContext","$getSelection","$isRangeSelection","useEffect","TOGGLE_LINK_COMMAND","COMMAND_PRIORITY_NORMAL","FORMAT_ELEMENT_COMMAND","FORMAT_TEXT_COMMAND","isModifierMatch","useEffect","$createCodeNode","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","$createHeadingNode","$createQuoteNode","$setBlocksType","$addUpdateTag","$createParagraphNode","$createRangeSelection","$getSelection","$isElementNode","$isLineBreakNode","$isParagraphNode","$isRangeSelection","$isTextNode","$setSelection","$addUpdateTag","$getSelection","$setBlocksType","$createParagraphNode","$createHeadingNode","INSERT_UNORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","$createQuoteNode","$isParagraphNode","$isLineBreakNode","$createRangeSelection","$setSelection","$isElementNode","$isRangeSelection","$createCodeNode","$isTextNode","useEffect","isModifierMatch","FORMAT_TEXT_COMMAND","FORMAT_ELEMENT_COMMAND","TOGGLE_LINK_COMMAND","COMMAND_PRIORITY_NORMAL","useLexicalComposerContext","TextNode","useEffect","addClassNamesToElement","TextNode","useEffect","TextNode","useLexicalComposerContext","useLexicalComposerContext","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","useEffect","useLexicalComposerContext","useLexicalEditable","$isTableCellNode","$isTableSelection","TableCellHeaderStates","TableCellNode","mergeRegister","$getSelection","$isElementNode","$isRangeSelection","$isTextNode","$setSelection","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","calculateZoomLevel","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useMemo","jsxs","jsx","calculateZoomLevel","Fragment","jsx","jsxs","$getSelection","$isRangeSelection","$isTableSelection","$isTextNode","$isElementNode","$isTableCellNode","useLexicalComposerContext","useRef","useState","useEffect","TableCellNode","isDOMNode","useCallback","$setSelection","TableCellHeaderStates","createPortal","getDOMSelection","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","useLexicalEditable","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","useCallback","useEffect","useMemo","useRef","useState","createPortal","Fragment","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableNode","$isTableRowNode","$getNearestNodeFromDOMNode","$getSiblingCaret","isHTMLElement","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","isHTMLElement","useLexicalComposerContext","useLexicalEditable","useState","useRef","useEffect","$getNearestNodeFromDOMNode","$isTableNode","$isTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableRowNode","$computeTableMapSkipCellCheck","$getSiblingCaret","createPortal","useLexicalComposerContext","useEffect","useRef","useState","jsx","jsxs","useLexicalComposerContext","useEffect","wrappers","$isCodeNode","$isLinkNode","TOGGLE_LINK_COMMAND","INSERT_EMBED_COMMAND","INSERT_HORIZONTAL_RULE_COMMAND","$isHeadingNode","$patchStyleText","$isTableNode","$isTableSelection","$findMatchingParent","IS_APPLE","mergeRegister","$addUpdateTag","$getNodeByKey","$getRoot","$getSelection","$isElementNode","$isNodeSelection","$isRangeSelection","$isRootOrShadowRoot","COMMAND_PRIORITY_CRITICAL","FORMAT_ELEMENT_COMMAND","FORMAT_TEXT_COMMAND","HISTORIC_TAG","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","REDO_COMMAND","SELECTION_CHANGE_COMMAND","SKIP_DOM_SELECTION_TAG","SKIP_SELECTION_FOCUS_TAG","UNDO_COMMAND","useCallback","useEffect","useState","jsx","React","Fragment","jsx","jsxs","jsxs","Fragment","jsx","Fragment","jsx","jsxs","jsxs","jsx","useCallback","$addUpdateTag","SKIP_SELECTION_FOCUS_TAG","$getSelection","$patchStyleText","FORMAT_ELEMENT_COMMAND","OUTDENT_CONTENT_COMMAND","INDENT_CONTENT_COMMAND","$findMatchingParent","$isRootOrShadowRoot","useState","SKIP_DOM_SELECTION_TAG","FORMAT_TEXT_COMMAND","$isHeadingNode","$isCodeNode","theme","$isRangeSelection","$isLinkNode","$isTableNode","$isElementNode","$isTableSelection","$isNodeSelection","useEffect","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","mergeRegister","HISTORIC_TAG","TOGGLE_LINK_COMMAND","$getNodeByKey","UNDO_COMMAND","IS_APPLE","REDO_COMMAND","Fragment","INSERT_HORIZONTAL_RULE_COMMAND","$getRoot","INSERT_EMBED_COMMAND","useLexicalComposerContext","useEffect","useLexicalComposerContext","useEffect","Fragment","jsx","jsxs","useLexicalEditable","useState","useLexicalComposerContext","useEffect","ClearEditorPlugin","HistoryPlugin","LexicalErrorBoundary","PlainTextPlugin","CodeNode","LinkNode","ListNode","MarkNode","HorizontalRuleNode","TableCellNode","TableNode","TableRowNode","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useRef","useState","jsx","jsxs","DATA_ATTR","ListNode","CodeNode","TableNode","TableCellNode","TableRowNode","LinkNode","HorizontalRuleNode","MarkNode","jsx","jsxs","useLexicalComposerContext","useRef","useEffect","$setSelection","$getRoot","$insertNodes","useCallback","OnChangePlugin","LexicalEditor","useState","useMemo","LexicalComposer"]}
1
+ {"version":3,"sources":["../src/LexicalEditor.tsx","../src/Editor.tsx","../src/plugins/ActionsPlugin/index.tsx","../src/hooks/useModal.tsx","../src/context/FullscreenContext.tsx","../src/plugins/MarkdownTransformers/index.ts","../src/nodes/TweetNode.tsx","../src/plugins/SpeechToTextPlugin/index.ts","../src/hooks/useReport.ts","../src/plugins/AutocompletePlugin/index.tsx","../src/context/ToolbarContext.tsx","../src/nodes/AutocompleteNode.tsx","../src/utils/swipe.ts","../src/plugins/AutoEmbedPlugin/index.tsx","../src/ui/Dialog.tsx","../src/plugins/FigmaPlugin/index.tsx","../src/nodes/FigmaNode.tsx","../src/plugins/TwitterPlugin/index.ts","../src/plugins/YouTubePlugin/index.ts","../src/nodes/YouTubeNode.tsx","../src/plugins/AutoLinkPlugin/index.tsx","../src/plugins/CodeActionMenuPlugin/index.tsx","../src/plugins/CodeActionMenuPlugin/components/CopyButton/index.tsx","../src/plugins/CodeActionMenuPlugin/utils.ts","../src/plugins/CodeActionMenuPlugin/components/PrettierButton/index.tsx","../src/plugins/CodeHighlightPrismPlugin/index.ts","../src/plugins/CollapsiblePlugin/index.ts","../src/plugins/CollapsiblePlugin/CollapsibleContainerNode.ts","../src/plugins/CollapsiblePlugin/CollapsibleUtils.ts","../src/plugins/CollapsiblePlugin/CollapsibleContentNode.ts","../src/plugins/CollapsiblePlugin/CollapsibleTitleNode.ts","../src/plugins/CommentPlugin/index.tsx","../src/commenting/index.ts","../src/themes/CommentEditorTheme.ts","../src/plugins/ComponentPickerPlugin/index.tsx","../src/plugins/DateTimePlugin/index.tsx","../src/plugins/EquationsPlugin/index.tsx","../src/ui/KatexEquationAlterer.tsx","../src/plugins/ExcalidrawPlugin/index.tsx","../src/plugins/ImagesPlugin/index.tsx","../src/ui/FileInput.tsx","../src/ui/TextInput.tsx","../src/utils/baasixUpload.ts","../src/plugins/LayoutPlugin/InsertLayoutDialog.tsx","../src/ui/DropDown.tsx","../src/utils/focusUtils.ts","../src/plugins/LayoutPlugin/LayoutPlugin.tsx","../src/nodes/LayoutContainerNode.ts","../src/nodes/LayoutItemNode.ts","../src/plugins/PageBreakPlugin/index.tsx","../src/nodes/PageBreakNode/index.tsx","../src/plugins/NotesPlugin/index.tsx","../src/nodes/NotesNode.tsx","../src/utils/tnr-formatters.ts","../src/plugins/PollPlugin/index.tsx","../src/plugins/RevisionPlugin/index.tsx","../src/nodes/RevisionNode.tsx","../src/plugins/TerminologyPlugin/index.tsx","../src/nodes/TerminologyNode.tsx","../src/plugins/TablePlugin.tsx","../src/plugins/ContextMenuPlugin/index.tsx","../src/plugins/DragDropPastePlugin/index.ts","../src/plugins/DraggableBlockPlugin/index.tsx","../src/plugins/EmojiPickerPlugin/index.tsx","../src/plugins/FloatingLinkEditorPlugin/index.tsx","../src/utils/getSelectedNode.ts","../src/utils/setFloatingElemPositionForLinkEditor.ts","../src/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/utils/getDOMRangeRect.ts","../src/utils/setFloatingElemPosition.ts","../src/plugins/MarkdownShortcutPlugin/index.tsx","../src/plugins/MaxLengthPlugin/index.tsx","../src/plugins/ShortcutsPlugin/index.tsx","../src/plugins/ToolbarPlugin/utils.ts","../src/plugins/ShortcutsPlugin/shortcuts.ts","../src/plugins/SpecialTextPlugin/index.ts","../src/nodes/SpecialTextNode.tsx","../src/plugins/TabFocusPlugin/index.tsx","../src/plugins/TableActionMenuPlugin/index.tsx","../src/ui/ColorPicker.tsx","../src/plugins/TableCellResizer/index.tsx","../src/plugins/TableHoverActionsV2Plugin/index.tsx","../src/utils/getThemeSelector.ts","../src/plugins/TableOfContentsPlugin/index.tsx","../src/plugins/TableScrollShadowPlugin/index.tsx","../src/plugins/ToolbarPlugin/index.tsx","../src/ui/DropdownColorPicker.tsx","../src/plugins/ToolbarPlugin/fontSize.tsx","../src/plugins/StickyPlugin/index.ts","../src/nodes/PlaygroundNodes.ts","../src/nodes/HtmlBlockNode.tsx"],"sourcesContent":["\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from \"@lexical/html\";\nimport { $createParagraphNode, $getRoot, $insertNodes, $setSelection, COMMAND_PRIORITY_LOW, EditorState, FOCUS_COMMAND } from \"lexical\";\nimport type { LexicalEditor as LexicalEditorType } from \"lexical\";\nimport type { Baasix } from '@baasix/sdk';\n\nimport Editor from \"./Editor\";\nimport PlaygroundNodes from \"./nodes/PlaygroundNodes\";\n\nimport PlaygroundEditorTheme from \"./themes/PlaygroundEditorTheme\";\nimport { SharedHistoryContext } from \"./context/SharedHistoryContext\";\nimport { SettingsContext } from \"./context/SettingsContext\";\nimport { ToolbarContext } from \"./context/ToolbarContext\";\nimport { CollaborationContext } from \"@lexical/react/LexicalCollaborationContext\";\nimport { EditorConfigProvider } from \"./context/EditorConfigContext\";\nimport { FullscreenContext } from './context/FullscreenContext';\n\n// ---------------------------------------------------------------------------\n// HtmlPlugin – bridges external HTML value ↔ Lexical editor state\n// ---------------------------------------------------------------------------\n\nfunction HtmlPlugin({\n value,\n onChange,\n debounceMs = 300,\n}: {\n value: string;\n onChange: (html: string) => void;\n debounceMs?: number;\n}) {\n const [editor] = useLexicalComposerContext();\n\n // The last value we pushed into the editor OR received from onChange.\n // Used to detect whether an incoming `value` prop is genuinely new content\n // or just the echo of our own onChange call.\n // Initialised to a sentinel so the first useEffect run always loads content.\n const lastSyncedValue = useRef<string | null>(null);\n // Track whether the user has actually interacted with the editor.\n // Prevents the mount/parse cycle from firing onChange with regenerated HTML.\n const hasUserEdited = useRef(false);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // When the editor is initialised with $setSelection(null) (to avoid stealing\n // focus on mount), Lexical has no internal selection. Without an internal\n // selection, a click into the contentEditable focuses it but Lexical never\n // reconciles a native DOM selection — so the caret never appears and typing\n // doesn't work. We listen to FOCUS_COMMAND and defer the check to a\n // microtask so the browser's native click-based selection resolves first.\n // This avoids hijacking clicks on table cells or other nested elements.\n useEffect(() => {\n return editor.registerCommand(\n FOCUS_COMMAND,\n () => {\n if (editor.getEditorState()._selection === null) {\n // Defer to let the browser resolve the native selection from the\n // click before we intervene. If Lexical still has no selection\n // after the click chain, fall back to the first child.\n Promise.resolve().then(() => {\n if (editor.getEditorState()._selection === null) {\n editor.update(() => {\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n if (firstChild) {\n firstChild.selectStart();\n }\n });\n }\n });\n }\n return false;\n },\n COMMAND_PRIORITY_LOW,\n );\n }, [editor]);\n\n // Sync value changes from the outside world → Lexical editor state.\n useEffect(() => {\n // Skip if this value is what we last sent via onChange (echo).\n if (value === lastSyncedValue.current) {\n return;\n }\n\n lastSyncedValue.current = value;\n // New external content (e.g. switching items) — reset the dirty flag.\n hasUserEdited.current = false;\n\n editor.update(\n () => {\n const root = $getRoot();\n\n // If value is empty / blank, reset to a single empty paragraph.\n // Using root.clear() alone leaves the contentEditable with zero\n // DOM children, which prevents the browser from placing a valid\n // selection and therefore blocks native beforeinput events —\n // making the editor unresponsive to keyboard input.\n if (!value || value === \"<p></p>\" || value === \"<p><br></p>\") {\n root.clear();\n root.append($createParagraphNode());\n // Leave selection null — Lexical will set it when the user\n // clicks into the editor. Setting it here would steal DOM\n // focus from other form fields on mount.\n $setSelection(null);\n return;\n }\n\n // Null out the selection before clearing the tree to prevent\n // stale selection offsets causing IndexSizeError during reconciliation.\n $setSelection(null);\n\n const parser = new DOMParser();\n const dom = parser.parseFromString(value, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n\n root.clear();\n $insertNodes(nodes);\n },\n // Prevent scroll-to-top when loading content inside a Sheet\n { tag: \"historic\" }\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, value]);\n\n // Lexical state changed → generate HTML and call onChange (debounced).\n const handleChange = useCallback(\n (_editorState: EditorState, _editor: LexicalEditorType, tags: Set<string>) => {\n // Our external sync uses the \"historic\" tag. Don't treat it as a user edit.\n if (!tags.has('historic')) {\n hasUserEdited.current = true;\n }\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n debounceTimer.current = setTimeout(() => {\n editor.update(() => {\n const html = $generateHtmlFromNodes(editor);\n\n // Avoid triggering onChange when the HTML hasn't actually changed.\n if (html === lastSyncedValue.current) {\n return;\n }\n\n // Don't fire onChange until the user has actually interacted with\n // the editor. This prevents the mount/parse cycle from overwriting\n // the form value with regenerated HTML that may differ from the original.\n if (!hasUserEdited.current) {\n return;\n }\n\n lastSyncedValue.current = html;\n onChange(html);\n });\n }, debounceMs);\n },\n [editor, onChange, debounceMs],\n );\n\n // Cleanup timer on unmount.\n useEffect(() => {\n return () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n };\n }, []);\n\n return <OnChangePlugin onChange={handleChange} ignoreSelectionChange />;\n}\n\n// ---------------------------------------------------------------------------\n// ReadOnlyController – syncs the readOnly prop to editor editable state\n// ---------------------------------------------------------------------------\n\nfunction ReadOnlyController({ readOnly }: { readOnly?: boolean }) {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n editor.setEditable(!readOnly);\n }, [editor, readOnly]);\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// LexicalEditor – public API\n// ---------------------------------------------------------------------------\n\nexport interface LexicalEditorProps {\n baasixClient: Baasix;\n value: string;\n onChange: (html: string) => void;\n folder?: string;\n height?: number | string;\n debounceMs?: number;\n placeholder?: string;\n readOnly?: boolean;\n maxLength?: number;\n}\n\nexport default function LexicalEditor({\n baasixClient,\n value,\n onChange,\n folder,\n height = 500,\n debounceMs = 300,\n placeholder,\n readOnly,\n maxLength,\n}: LexicalEditorProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const initialConfig = {\n namespace: \"LexicalEditor\",\n nodes: [...PlaygroundNodes],\n theme: PlaygroundEditorTheme,\n onError: (error: Error) => {\n console.error(\"[LexicalEditor]\", error);\n },\n };\n\n const style: React.CSSProperties = isFullscreen\n ? {\n position: \"fixed\" as const,\n inset: 0,\n zIndex: 9999,\n height: \"100vh\",\n overflow: \"auto\",\n background: \"#fff\",\n }\n : {\n height: typeof height === \"number\" ? `${height}px` : height,\n position: \"relative\" as const,\n overflow: \"auto\",\n };\n\n // Escape key exits fullscreen\n useEffect(() => {\n if (!isFullscreen) return;\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsFullscreen(false);\n };\n document.addEventListener(\"keydown\", handleEsc);\n return () => document.removeEventListener(\"keydown\", handleEsc);\n }, [isFullscreen]);\n\n const toggleFullscreen = useCallback(\n () => setIsFullscreen((f) => !f),\n [],\n );\n\n const fullscreenValue = useMemo(\n () => ({ isFullscreen, toggleFullscreen }),\n [isFullscreen, toggleFullscreen],\n );\n\n const collabContextValue = useMemo(\n () => ({\n color: \"#000\",\n isCollabActive: false,\n name: \"User\",\n yjsDocMap: new Map(),\n }),\n []\n );\n\n return (\n <FullscreenContext.Provider value={fullscreenValue}>\n <EditorConfigProvider baasixClient={baasixClient} folder={folder}>\n <SettingsContext>\n <SharedHistoryContext>\n <LexicalComposer initialConfig={initialConfig}>\n <CollaborationContext.Provider value={collabContextValue}>\n <ToolbarContext>\n <div className=\"editor-shell\" style={style}>\n <Editor placeholder={placeholder} maxLength={maxLength} />\n <HtmlPlugin\n value={value}\n onChange={onChange}\n debounceMs={debounceMs}\n />\n <ReadOnlyController readOnly={readOnly} />\n </div>\n </ToolbarContext>\n </CollaborationContext.Provider>\n </LexicalComposer>\n </SharedHistoryContext>\n </SettingsContext>\n </EditorConfigProvider>\n </FullscreenContext.Provider>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {CharacterLimitPlugin} from '@lexical/react/LexicalCharacterLimitPlugin';\r\nimport {CheckListPlugin} from '@lexical/react/LexicalCheckListPlugin';\r\nimport {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';\r\nimport {ClickableLinkPlugin} from '@lexical/react/LexicalClickableLinkPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {LexicalErrorBoundary} from '@lexical/react/LexicalErrorBoundary';\r\nimport {HashtagPlugin} from '@lexical/react/LexicalHashtagPlugin';\r\nimport {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';\r\nimport {HorizontalRulePlugin} from '@lexical/react/LexicalHorizontalRulePlugin';\r\nimport {ListPlugin} from '@lexical/react/LexicalListPlugin';\r\nimport {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {SelectionAlwaysOnDisplay} from '@lexical/react/LexicalSelectionAlwaysOnDisplay';\r\nimport {TabIndentationPlugin} from '@lexical/react/LexicalTabIndentationPlugin';\r\nimport {TablePlugin} from '@lexical/react/LexicalTablePlugin';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {CAN_USE_DOM} from '@lexical/utils';\r\nimport {useEffect, useState} from 'react';\r\n\r\nimport {useSettings} from './context/SettingsContext';\r\nimport {useSharedHistoryContext} from './context/SharedHistoryContext';\r\nimport ActionsPlugin from './plugins/ActionsPlugin';\r\nimport AutocompletePlugin from './plugins/AutocompletePlugin';\r\nimport AutoEmbedPlugin from './plugins/AutoEmbedPlugin';\r\nimport AutoLinkPlugin from './plugins/AutoLinkPlugin';\r\nimport CodeActionMenuPlugin from './plugins/CodeActionMenuPlugin';\r\nimport CodeHighlightPrismPlugin from './plugins/CodeHighlightPrismPlugin';\r\nimport CollapsiblePlugin from './plugins/CollapsiblePlugin';\r\nimport CommentPlugin from './plugins/CommentPlugin';\r\nimport ComponentPickerPlugin from './plugins/ComponentPickerPlugin';\r\nimport ContextMenuPlugin from './plugins/ContextMenuPlugin';\r\nimport DateTimePlugin from './plugins/DateTimePlugin';\r\nimport DragDropPaste from './plugins/DragDropPastePlugin';\r\nimport DraggableBlockPlugin from './plugins/DraggableBlockPlugin';\r\nimport EmojiPickerPlugin from './plugins/EmojiPickerPlugin';\r\nimport EmojisPlugin from './plugins/EmojisPlugin';\r\nimport EquationsPlugin from './plugins/EquationsPlugin';\r\nimport ExcalidrawPlugin from './plugins/ExcalidrawPlugin';\r\nimport FigmaPlugin from './plugins/FigmaPlugin';\r\nimport FloatingLinkEditorPlugin from './plugins/FloatingLinkEditorPlugin';\r\nimport FloatingTextFormatToolbarPlugin from './plugins/FloatingTextFormatToolbarPlugin';\r\nimport ImagesPlugin from './plugins/ImagesPlugin';\r\nimport KeywordsPlugin from './plugins/KeywordsPlugin';\r\nimport {LayoutPlugin} from './plugins/LayoutPlugin/LayoutPlugin';\r\nimport LinkPlugin from './plugins/LinkPlugin';\r\nimport MarkdownShortcutPlugin from './plugins/MarkdownShortcutPlugin';\r\nimport {MaxLengthPlugin} from './plugins/MaxLengthPlugin';\r\nimport MentionsPlugin from './plugins/MentionsPlugin';\r\nimport PageBreakPlugin from './plugins/PageBreakPlugin';\r\nimport PollPlugin from './plugins/PollPlugin';\r\nimport ShortcutsPlugin from './plugins/ShortcutsPlugin';\r\nimport SpecialTextPlugin from './plugins/SpecialTextPlugin';\r\nimport SpeechToTextPlugin from './plugins/SpeechToTextPlugin';\r\nimport TabFocusPlugin from './plugins/TabFocusPlugin';\r\nimport TableCellActionMenuPlugin from './plugins/TableActionMenuPlugin';\r\nimport TableCellResizer from './plugins/TableCellResizer';\r\nimport TableHoverActionsV2Plugin from './plugins/TableHoverActionsV2Plugin';\r\nimport TableOfContentsPlugin from './plugins/TableOfContentsPlugin';\r\nimport TableScrollShadowPlugin from './plugins/TableScrollShadowPlugin';\r\nimport ToolbarPlugin from './plugins/ToolbarPlugin';\r\nimport TreeViewPlugin from './plugins/TreeViewPlugin';\r\nimport TwitterPlugin from './plugins/TwitterPlugin';\r\nimport StickyPlugin from './plugins/StickyPlugin';\r\nimport TerminologyPlugin from './plugins/TerminologyPlugin';\r\nimport NotesPlugin from './plugins/NotesPlugin';\r\nimport RevisionPlugin from './plugins/RevisionPlugin';\r\nimport YouTubePlugin from './plugins/YouTubePlugin';\r\nimport ContentEditable from './ui/ContentEditable';\r\n\r\ninterface EditorProps {\r\n placeholder?: string;\r\n maxLength?: number;\r\n}\r\n\r\nexport default function Editor({ placeholder: placeholderProp, maxLength }: EditorProps): JSX.Element {\r\n const {historyState} = useSharedHistoryContext();\r\n const {\r\n settings: {\r\n isCodeHighlighted,\r\n isAutocomplete,\r\n isMaxLength,\r\n isCharLimit,\r\n hasLinkAttributes,\r\n hasNestedTables,\r\n hasFitNestedTables,\r\n isCharLimitUtf8,\r\n isRichText,\r\n showTreeView,\r\n showTableOfContents,\r\n shouldUseLexicalContextMenu,\r\n shouldPreserveNewLinesInMarkdown,\r\n tableCellMerge,\r\n tableCellBackgroundColor,\r\n tableHorizontalScroll,\r\n shouldAllowHighlightingWithBrackets,\r\n selectionAlwaysOnDisplay,\r\n listStrictIndent,\r\n shouldDisableFocusOnClickChecklist,\r\n },\r\n } = useSettings();\r\n const isEditable = useLexicalEditable();\r\n const placeholder = placeholderProp ?? (isRichText\r\n ? 'Enter some rich text...'\r\n : 'Enter some plain text...');\r\n const [floatingAnchorElem, setFloatingAnchorElem] =\r\n useState<HTMLDivElement | null>(null);\r\n const [isSmallWidthViewport, setIsSmallWidthViewport] =\r\n useState<boolean>(false);\r\n const [editor] = useLexicalComposerContext();\r\n const [activeEditor, setActiveEditor] = useState(editor);\r\n const [isLinkEditMode, setIsLinkEditMode] = useState<boolean>(false);\r\n\r\n const onRef = (_floatingAnchorElem: HTMLDivElement) => {\r\n if (_floatingAnchorElem !== null) {\r\n setFloatingAnchorElem(_floatingAnchorElem);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const updateViewPortWidth = () => {\r\n const isNextSmallWidthViewport =\r\n CAN_USE_DOM && window.matchMedia('(max-width: 1025px)').matches;\r\n\r\n if (isNextSmallWidthViewport !== isSmallWidthViewport) {\r\n setIsSmallWidthViewport(isNextSmallWidthViewport);\r\n }\r\n };\r\n updateViewPortWidth();\r\n window.addEventListener('resize', updateViewPortWidth);\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateViewPortWidth);\r\n };\r\n }, [isSmallWidthViewport]);\r\n\r\n return (\r\n <>\r\n {isRichText && (\r\n <ToolbarPlugin\r\n editor={editor}\r\n activeEditor={activeEditor}\r\n setActiveEditor={setActiveEditor}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n {isRichText && (\r\n <ShortcutsPlugin\r\n editor={activeEditor}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n <div\r\n className={`editor-container ${showTreeView ? 'tree-view' : ''} ${\r\n !isRichText ? 'plain-text' : ''\r\n }`}>\r\n {(maxLength != null || isMaxLength) && <MaxLengthPlugin maxLength={maxLength ?? 30} />}\r\n <DragDropPaste />\r\n {selectionAlwaysOnDisplay && <SelectionAlwaysOnDisplay />}\r\n <ClearEditorPlugin />\r\n <ComponentPickerPlugin />\r\n <EmojiPickerPlugin />\r\n <AutoEmbedPlugin />\r\n <MentionsPlugin />\r\n <EmojisPlugin />\r\n <HashtagPlugin />\r\n <KeywordsPlugin />\r\n <SpeechToTextPlugin />\r\n <AutoLinkPlugin />\r\n <DateTimePlugin />\r\n <CommentPlugin />\r\n {isRichText ? (\r\n <>\r\n <HistoryPlugin externalHistoryState={historyState} />\r\n <RichTextPlugin\r\n contentEditable={\r\n <div className=\"editor-scroller\">\r\n <div className=\"editor\" ref={onRef}>\r\n <ContentEditable placeholder={placeholder} />\r\n </div>\r\n </div>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <MarkdownShortcutPlugin />\r\n {isCodeHighlighted && <CodeHighlightPrismPlugin />}\r\n <ListPlugin\r\n hasStrictIndent={listStrictIndent}\r\n shouldPreserveNumbering={false}\r\n />\r\n <CheckListPlugin\r\n disableTakeFocusOnClick={shouldDisableFocusOnClickChecklist}\r\n />\r\n <TablePlugin\r\n hasCellMerge={tableCellMerge}\r\n hasCellBackgroundColor={tableCellBackgroundColor}\r\n hasHorizontalScroll={tableHorizontalScroll}\r\n hasFitNestedTables={hasFitNestedTables}\r\n hasNestedTables={hasNestedTables}\r\n />\r\n <TableCellResizer />\r\n <TableScrollShadowPlugin />\r\n <ImagesPlugin />\r\n <LinkPlugin hasLinkAttributes={hasLinkAttributes} />\r\n <PollPlugin />\r\n <TwitterPlugin />\r\n <YouTubePlugin />\r\n <FigmaPlugin />\r\n <ClickableLinkPlugin disabled={isEditable} />\r\n <HorizontalRulePlugin />\r\n <EquationsPlugin />\r\n <ExcalidrawPlugin />\r\n <TabFocusPlugin />\r\n <TabIndentationPlugin maxIndent={7} />\r\n <CollapsiblePlugin />\r\n <PageBreakPlugin />\r\n <LayoutPlugin />\r\n <StickyPlugin />\r\n <TerminologyPlugin />\r\n <NotesPlugin />\r\n <RevisionPlugin />\r\n {floatingAnchorElem && (\r\n <>\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n <TableCellActionMenuPlugin\r\n anchorElem={floatingAnchorElem}\r\n cellMerge={true}\r\n />\r\n </>\r\n )}\r\n {floatingAnchorElem && !isSmallWidthViewport && (\r\n <>\r\n <DraggableBlockPlugin anchorElem={floatingAnchorElem} />\r\n <CodeActionMenuPlugin anchorElem={floatingAnchorElem} />\r\n <TableHoverActionsV2Plugin anchorElem={floatingAnchorElem} />\r\n <FloatingTextFormatToolbarPlugin\r\n anchorElem={floatingAnchorElem}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n </>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <PlainTextPlugin\r\n contentEditable={<ContentEditable placeholder={placeholder} />}\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <HistoryPlugin externalHistoryState={historyState} />\r\n </>\r\n )}\r\n {(isCharLimit || isCharLimitUtf8) && (\r\n <CharacterLimitPlugin\r\n charset={isCharLimit ? 'UTF-16' : 'UTF-8'}\r\n maxLength={5}\r\n />\r\n )}\r\n {isAutocomplete && <AutocompletePlugin />}\r\n <div>{showTableOfContents && <TableOfContentsPlugin />}</div>\r\n {shouldUseLexicalContextMenu && <ContextMenuPlugin />}\r\n {shouldAllowHighlightingWithBrackets && <SpecialTextPlugin />}\r\n <ActionsPlugin\r\n shouldPreserveNewLinesInMarkdown={shouldPreserveNewLinesInMarkdown}\r\n />\r\n </div>\r\n {showTreeView && <TreeViewPlugin />}\r\n </>\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {LexicalEditor} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {$createCodeNode, $isCodeNode} from '@lexical/code';\nimport {\n $convertFromMarkdownString,\n $convertToMarkdownString,\n} from '@lexical/markdown';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {mergeRegister} from '@lexical/utils';\nimport {\n $createTextNode,\n $getRoot,\n $isParagraphNode,\n CLEAR_EDITOR_COMMAND,\n COMMAND_PRIORITY_EDITOR,\n HISTORIC_TAG,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical';\nimport {useCallback, useEffect, useState} from 'react';\n\nimport {INITIAL_SETTINGS} from '../../context/SettingsContext';\nimport useModal from '../../hooks/useModal';\nimport {useFullscreen} from '../../context/FullscreenContext';\nimport Button from '../../ui/Button';\nimport {PLAYGROUND_TRANSFORMERS} from '../MarkdownTransformers';\nimport {\n SPEECH_TO_TEXT_COMMAND,\n SUPPORT_SPEECH_RECOGNITION,\n} from '../SpeechToTextPlugin';\n\nasync function sendEditorState(editor: LexicalEditor): Promise<void> {\n const stringifiedEditorState = JSON.stringify(editor.getEditorState());\n try {\n await fetch('http://localhost:1235/setEditorState', {\n body: stringifiedEditorState,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n },\n method: 'POST',\n });\n } catch {\n // NO-OP\n }\n}\n\nasync function validateEditorState(editor: LexicalEditor): Promise<void> {\n const stringifiedEditorState = JSON.stringify(editor.getEditorState());\n let response = null;\n try {\n response = await fetch('http://localhost:1235/validateEditorState', {\n body: stringifiedEditorState,\n headers: {\n Accept: 'application/json',\n 'Content-type': 'application/json',\n },\n method: 'POST',\n });\n } catch {\n // NO-OP\n }\n if (response !== null && response.status === 403) {\n throw new Error(\n 'Editor state validation failed! Server did not accept changes.',\n );\n }\n}\n\nexport default function ActionsPlugin({\n shouldPreserveNewLinesInMarkdown,\n}: {\n shouldPreserveNewLinesInMarkdown: boolean;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\n const [isSpeechToText, setIsSpeechToText] = useState(false);\n const [isEditorEmpty, setIsEditorEmpty] = useState(true);\n const [isConverting, setIsConverting] = useState(false);\n const [isMarkdown, setIsMarkdown] = useState(false);\n const [modal, showModal] = useModal();\n const {isFullscreen, toggleFullscreen} = useFullscreen();\n\n useEffect(() => {\n return mergeRegister(\n editor.registerEditableListener((editable) => {\n setIsEditable(editable);\n }),\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerUpdateListener(\n ({dirtyElements, tags}) => {\n if (\n !isEditable &&\n dirtyElements.size > 0 &&\n !tags.has(HISTORIC_TAG)\n ) {\n validateEditorState(editor);\n }\n editor.getEditorState().read(() => {\n const root = $getRoot();\n const children = root.getChildren();\n const firstChild = children[0];\n\n // Track whether editor is in markdown (source) mode\n setIsMarkdown(\n children.length === 1 &&\n $isCodeNode(firstChild) &&\n firstChild.getLanguage() === 'markdown',\n );\n\n if (children.length > 1) {\n setIsEditorEmpty(false);\n } else {\n if ($isParagraphNode(firstChild)) {\n const paragraphChildren = firstChild.getChildren();\n setIsEditorEmpty(paragraphChildren.length === 0);\n } else {\n setIsEditorEmpty(false);\n }\n }\n });\n },\n );\n }, [editor, isEditable]);\n\n const handleMarkdownToggle = useCallback(() => {\n if (isConverting) return;\n\n // Check if editor is currently in markdown (code block) mode\n const currentlyMarkdown = editor.getEditorState().read(() => {\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n return $isCodeNode(firstChild) && firstChild.getLanguage() === 'markdown';\n });\n\n if (currentlyMarkdown) {\n // ── Markdown → Rich text ──\n setIsConverting(true);\n\n // Double rAF guarantees the browser has painted the spinner\n // before the synchronous conversion blocks the main thread.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n // Read the markdown text from the code block first\n const markdownText = editor.getEditorState().read(() => {\n const root = $getRoot();\n const firstChild = root.getFirstChild();\n return $isCodeNode(firstChild) ? firstChild.getTextContent() : '';\n });\n\n editor.update(\n () => {\n const root = $getRoot();\n root.clear();\n $convertFromMarkdownString(\n markdownText,\n PLAYGROUND_TRANSFORMERS,\n undefined, // operate on $getRoot()\n shouldPreserveNewLinesInMarkdown,\n );\n // Ensure a valid selection exists on the newly-created content\n $getRoot().selectEnd();\n },\n { tag: 'historic' },\n );\n // Force the ToolbarPlugin to re-read the new editor state\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n } finally {\n setIsConverting(false);\n }\n });\n });\n } else {\n // ── Rich text → Markdown ──\n setIsConverting(true);\n\n // Double rAF guarantees the browser has painted the spinner\n // before the synchronous serialization blocks the main thread.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n // Heavy work: serialize the entire editor tree to markdown\n const markdown = editor.getEditorState().read(() =>\n $convertToMarkdownString(\n PLAYGROUND_TRANSFORMERS,\n undefined,\n shouldPreserveNewLinesInMarkdown,\n ),\n );\n\n // Lightweight: swap the tree for a single code block\n editor.update(\n () => {\n const root = $getRoot();\n const codeNode = $createCodeNode('markdown');\n codeNode.append($createTextNode(markdown));\n root.clear().append(codeNode);\n codeNode.select();\n },\n { tag: 'historic' },\n );\n // Force the ToolbarPlugin to re-read the new editor state\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n } finally {\n setIsConverting(false);\n }\n });\n });\n }\n }, [editor, shouldPreserveNewLinesInMarkdown, isConverting]);\n\n return (\n <div className=\"actions\">\n <button type=\"button\"\n className={`action-button ${isFullscreen ? 'active' : ''}`}\n onClick={toggleFullscreen}\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}>\n <i className={isFullscreen ? 'fullscreen-exit' : 'fullscreen'} />\n </button>\n {SUPPORT_SPEECH_RECOGNITION && (\n <button type=\"button\"\n onClick={() => {\n editor.dispatchCommand(SPEECH_TO_TEXT_COMMAND, !isSpeechToText);\n setIsSpeechToText(!isSpeechToText);\n }}\n className={\n 'action-button action-button-mic ' +\n (isSpeechToText ? 'active' : '')\n }\n title=\"Speech To Text\"\n aria-label={`${\n isSpeechToText ? 'Enable' : 'Disable'\n } speech to text`}>\n <i className=\"mic\" />\n </button>\n )}\n <button type=\"button\"\n className=\"action-button clear\"\n disabled={isEditorEmpty}\n onClick={() => {\n showModal('Clear editor', (onClose) => (\n <ShowClearDialog editor={editor} onClose={onClose} />\n ));\n }}\n title=\"Clear\"\n aria-label=\"Clear editor contents\">\n <i className=\"clear\" />\n </button>\n <button type=\"button\"\n className={`action-button ${!isEditable ? 'unlock' : 'lock'}`}\n onClick={() => {\n if (isEditable) {\n sendEditorState(editor);\n }\n editor.setEditable(!editor.isEditable());\n }}\n title=\"Read-Only Mode\"\n aria-label={`${!isEditable ? 'Unlock' : 'Lock'} read-only mode`}>\n <i className={!isEditable ? 'unlock' : 'lock'} />\n </button>\n <button type=\"button\"\n className={`action-button ${isMarkdown ? 'active' : ''}`}\n onClick={handleMarkdownToggle}\n title={isMarkdown ? 'Convert to Rich Text' : 'Convert to Markdown'}\n aria-label={isMarkdown ? 'Convert to rich text' : 'Convert to markdown'}>\n {isConverting ? (\n <span className=\"action-button-spinner\" />\n ) : (\n <i className=\"markdown\" />\n )}\n </button>\n {modal}\n </div>\n );\n}\n\nfunction ShowClearDialog({\n editor,\n onClose,\n}: {\n editor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n return (\n <>\n Are you sure you want to clear the editor?\n <div className=\"Modal__content\">\n <Button\n onClick={() => {\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined);\n editor.focus();\n onClose();\n }}>\n Clear\n </Button>{' '}\n <Button\n onClick={() => {\n editor.focus();\n onClose();\n }}>\n Cancel\n </Button>\n </div>\n </>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useCallback, useMemo, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport Modal from '../ui/Modal';\r\n\r\nexport default function useModal(): [\r\n JSX.Element | null,\r\n (title: string, showModal: (onClose: () => void) => JSX.Element) => void,\r\n] {\r\n const [modalContent, setModalContent] = useState<null | {\r\n closeOnClickOutside: boolean;\r\n content: JSX.Element;\r\n title: string;\r\n }>(null);\r\n\r\n const onClose = useCallback(() => {\r\n setModalContent(null);\r\n }, []);\r\n\r\n const modal = useMemo(() => {\r\n if (modalContent === null) {\r\n return null;\r\n }\r\n const {title, content, closeOnClickOutside} = modalContent;\r\n return (\r\n <Modal\r\n onClose={onClose}\r\n title={title}\r\n closeOnClickOutside={closeOnClickOutside}>\r\n {content}\r\n </Modal>\r\n );\r\n }, [modalContent, onClose]);\r\n\r\n const showModal = useCallback(\r\n (\r\n title: string,\r\n // eslint-disable-next-line no-shadow\r\n getContent: (onClose: () => void) => JSX.Element,\r\n closeOnClickOutside = false,\r\n ) => {\r\n setModalContent({\r\n closeOnClickOutside,\r\n content: getContent(onClose),\r\n title,\r\n });\r\n },\r\n [onClose],\r\n );\r\n\r\n return [modal, showModal];\r\n}\r\n","import { createContext, useContext } from 'react';\n\nexport type FullscreenContextType = {\n isFullscreen: boolean;\n toggleFullscreen: () => void;\n};\n\nexport const FullscreenContext = createContext<FullscreenContextType>({\n isFullscreen: false,\n toggleFullscreen: () => {},\n});\n\nexport function useFullscreen() {\n return useContext(FullscreenContext);\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {\r\n $convertFromMarkdownString,\r\n $convertToMarkdownString,\r\n CHECK_LIST,\r\n ELEMENT_TRANSFORMERS,\r\n ElementTransformer,\r\n MULTILINE_ELEMENT_TRANSFORMERS,\r\n TEXT_FORMAT_TRANSFORMERS,\r\n TEXT_MATCH_TRANSFORMERS,\r\n TextMatchTransformer,\r\n Transformer,\r\n} from '@lexical/markdown';\r\nimport {\r\n $createHorizontalRuleNode,\r\n $isHorizontalRuleNode,\r\n HorizontalRuleNode,\r\n} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {\r\n $createTableCellNode,\r\n $createTableNode,\r\n $createTableRowNode,\r\n $isTableCellNode,\r\n $isTableNode,\r\n $isTableRowNode,\r\n TableCellHeaderStates,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from '@lexical/table';\r\nimport {\r\n $createTextNode,\r\n $isParagraphNode,\r\n $isTextNode,\r\n LexicalNode,\r\n} from 'lexical';\r\n\r\nimport {\r\n $createEquationNode,\r\n $isEquationNode,\r\n EquationNode,\r\n} from '../../nodes/EquationNode';\r\nimport {$createImageNode, $isImageNode, ImageNode} from '../../nodes/ImageNode';\r\nimport {$createTweetNode, $isTweetNode, TweetNode} from '../../nodes/TweetNode';\r\nimport emojiList from '../../utils/emoji-list';\r\n\r\nexport const HR: ElementTransformer = {\r\n dependencies: [HorizontalRuleNode],\r\n export: (node: LexicalNode) => {\r\n return $isHorizontalRuleNode(node) ? '***' : null;\r\n },\r\n regExp: /^(---|\\*\\*\\*|___)\\s?$/,\r\n replace: (parentNode, _1, _2, isImport) => {\r\n const line = $createHorizontalRuleNode();\r\n\r\n // TODO: Get rid of isImport flag\r\n if (isImport || parentNode.getNextSibling() != null) {\r\n parentNode.replace(line);\r\n } else {\r\n parentNode.insertBefore(line);\r\n }\r\n\r\n line.selectNext();\r\n },\r\n type: 'element',\r\n};\r\n\r\nexport const IMAGE: TextMatchTransformer = {\r\n dependencies: [ImageNode],\r\n export: (node) => {\r\n if (!$isImageNode(node)) {\r\n return null;\r\n }\r\n\r\n return `![${node.getAltText()}](${node.getSrc()})`;\r\n },\r\n importRegExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))/,\r\n regExp: /!(?:\\[([^[]*)\\])(?:\\(([^(]+)\\))$/,\r\n replace: (textNode, match) => {\r\n const [, altText, src] = match;\r\n const imageNode = $createImageNode({\r\n altText,\r\n maxWidth: 800,\r\n src,\r\n });\r\n textNode.replace(imageNode);\r\n },\r\n trigger: ')',\r\n type: 'text-match',\r\n};\r\n\r\nexport const EMOJI: TextMatchTransformer = {\r\n dependencies: [],\r\n export: () => null,\r\n importRegExp: /:([a-z0-9_]+):/,\r\n regExp: /:([a-z0-9_]+):$/,\r\n replace: (textNode, [, name]) => {\r\n const emoji = emojiList.find((e) => e.aliases.includes(name))?.emoji;\r\n if (emoji) {\r\n textNode.replace($createTextNode(emoji));\r\n }\r\n },\r\n trigger: ':',\r\n type: 'text-match',\r\n};\r\n\r\nexport const EQUATION: TextMatchTransformer = {\r\n dependencies: [EquationNode],\r\n export: (node) => {\r\n if (!$isEquationNode(node)) {\r\n return null;\r\n }\r\n\r\n return `$${node.getEquation()}$`;\r\n },\r\n importRegExp: /\\$([^$]+?)\\$/,\r\n regExp: /\\$([^$]+?)\\$$/,\r\n replace: (textNode, match) => {\r\n const [, equation] = match;\r\n const equationNode = $createEquationNode(equation, true);\r\n textNode.replace(equationNode);\r\n },\r\n trigger: '$',\r\n type: 'text-match',\r\n};\r\n\r\nexport const TWEET: ElementTransformer = {\r\n dependencies: [TweetNode],\r\n export: (node) => {\r\n if (!$isTweetNode(node)) {\r\n return null;\r\n }\r\n\r\n return `<tweet id=\"${node.getId()}\" />`;\r\n },\r\n regExp: /<tweet id=\"([^\"]+?)\"\\s?\\/>\\s?$/,\r\n replace: (textNode, _1, match) => {\r\n const [, id] = match;\r\n const tweetNode = $createTweetNode(id);\r\n textNode.replace(tweetNode);\r\n },\r\n type: 'element',\r\n};\r\n\r\n// Very primitive table setup\r\nconst TABLE_ROW_REG_EXP = /^(?:\\|)(.+)(?:\\|)\\s?$/;\r\nconst TABLE_ROW_DIVIDER_REG_EXP = /^(\\| ?:?-*:? ?)+\\|\\s?$/;\r\n\r\nexport const TABLE: ElementTransformer = {\r\n dependencies: [TableNode, TableRowNode, TableCellNode],\r\n export: (node: LexicalNode) => {\r\n if (!$isTableNode(node)) {\r\n return null;\r\n }\r\n\r\n const output: string[] = [];\r\n\r\n for (const row of node.getChildren()) {\r\n const rowOutput = [];\r\n if (!$isTableRowNode(row)) {\r\n continue;\r\n }\r\n\r\n let isHeaderRow = false;\r\n for (const cell of row.getChildren()) {\r\n // It's TableCellNode so it's just to make flow happy\r\n if ($isTableCellNode(cell)) {\r\n rowOutput.push(\r\n $convertToMarkdownString(PLAYGROUND_TRANSFORMERS, cell)\r\n .replace(/\\n/g, '\\\\n')\r\n .trim(),\r\n );\r\n if (cell.__headerState === TableCellHeaderStates.ROW) {\r\n isHeaderRow = true;\r\n }\r\n }\r\n }\r\n\r\n output.push(`| ${rowOutput.join(' | ')} |`);\r\n if (isHeaderRow) {\r\n output.push(`| ${rowOutput.map((_) => '---').join(' | ')} |`);\r\n }\r\n }\r\n\r\n return output.join('\\n');\r\n },\r\n regExp: TABLE_ROW_REG_EXP,\r\n replace: (parentNode, _1, match) => {\r\n // Header row\r\n if (TABLE_ROW_DIVIDER_REG_EXP.test(match[0])) {\r\n const table = parentNode.getPreviousSibling();\r\n if (!table || !$isTableNode(table)) {\r\n return;\r\n }\r\n\r\n const rows = table.getChildren();\r\n const lastRow = rows[rows.length - 1];\r\n if (!lastRow || !$isTableRowNode(lastRow)) {\r\n return;\r\n }\r\n\r\n // Add header state to row cells\r\n lastRow.getChildren().forEach((cell) => {\r\n if (!$isTableCellNode(cell)) {\r\n return;\r\n }\r\n cell.setHeaderStyles(\r\n TableCellHeaderStates.ROW,\r\n TableCellHeaderStates.ROW,\r\n );\r\n });\r\n\r\n // Remove line\r\n parentNode.remove();\r\n return;\r\n }\r\n\r\n const matchCells = mapToTableCells(match[0]);\r\n\r\n if (matchCells == null) {\r\n return;\r\n }\r\n\r\n const rows = [matchCells];\r\n let sibling = parentNode.getPreviousSibling();\r\n let maxCells = matchCells.length;\r\n\r\n while (sibling) {\r\n if (!$isParagraphNode(sibling)) {\r\n break;\r\n }\r\n\r\n if (sibling.getChildrenSize() !== 1) {\r\n break;\r\n }\r\n\r\n const firstChild = sibling.getFirstChild();\r\n\r\n if (!$isTextNode(firstChild)) {\r\n break;\r\n }\r\n\r\n const cells = mapToTableCells(firstChild.getTextContent());\r\n\r\n if (cells == null) {\r\n break;\r\n }\r\n\r\n maxCells = Math.max(maxCells, cells.length);\r\n rows.unshift(cells);\r\n const previousSibling = sibling.getPreviousSibling();\r\n sibling.remove();\r\n sibling = previousSibling;\r\n }\r\n\r\n const table = $createTableNode();\r\n\r\n for (const cells of rows) {\r\n const tableRow = $createTableRowNode();\r\n table.append(tableRow);\r\n\r\n for (let i = 0; i < maxCells; i++) {\r\n tableRow.append(i < cells.length ? cells[i] : $createTableCell(''));\r\n }\r\n }\r\n\r\n const previousSibling = parentNode.getPreviousSibling();\r\n if (\r\n $isTableNode(previousSibling) &&\r\n getTableColumnsSize(previousSibling) === maxCells\r\n ) {\r\n previousSibling.append(...table.getChildren());\r\n parentNode.remove();\r\n } else {\r\n parentNode.replace(table);\r\n }\r\n\r\n table.selectEnd();\r\n },\r\n type: 'element',\r\n};\r\n\r\nfunction getTableColumnsSize(table: TableNode) {\r\n const row = table.getFirstChild();\r\n return $isTableRowNode(row) ? row.getChildrenSize() : 0;\r\n}\r\n\r\nconst $createTableCell = (textContent: string): TableCellNode => {\r\n textContent = textContent.replace(/\\\\n/g, '\\n');\r\n const cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS);\r\n $convertFromMarkdownString(textContent, PLAYGROUND_TRANSFORMERS, cell);\r\n return cell;\r\n};\r\n\r\nconst mapToTableCells = (textContent: string): Array<TableCellNode> | null => {\r\n const match = textContent.match(TABLE_ROW_REG_EXP);\r\n if (!match || !match[1]) {\r\n return null;\r\n }\r\n return match[1].split('|').map((text) => $createTableCell(text));\r\n};\r\n\r\nexport const PLAYGROUND_TRANSFORMERS: Array<Transformer> = [\r\n TABLE,\r\n HR,\r\n IMAGE,\r\n EMOJI,\r\n EQUATION,\r\n TWEET,\r\n CHECK_LIST,\r\n ...ELEMENT_TRANSFORMERS,\r\n ...MULTILINE_ELEMENT_TRANSFORMERS,\r\n ...TEXT_FORMAT_TRANSFORMERS,\r\n ...TEXT_MATCH_TRANSFORMERS,\r\n];\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nconst WIDGET_SCRIPT_URL = 'https://platform.twitter.com/widgets.js';\r\n\r\ntype TweetComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n loadingComponent?: JSX.Element | string;\r\n nodeKey: NodeKey;\r\n onError?: (error: string) => void;\r\n onLoad?: () => void;\r\n tweetID: string;\r\n}>;\r\n\r\nfunction $convertTweetElement(\r\n domNode: HTMLDivElement,\r\n): DOMConversionOutput | null {\r\n const id = domNode.getAttribute('data-lexical-tweet-id');\r\n if (id) {\r\n const node = $createTweetNode(id);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nlet isTwitterScriptLoading = true;\r\n\r\nfunction TweetComponent({\r\n className,\r\n format,\r\n loadingComponent,\r\n nodeKey,\r\n onError,\r\n onLoad,\r\n tweetID,\r\n}: TweetComponentProps) {\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const previousTweetIDRef = useRef<string>('');\r\n const [isTweetLoading, setIsTweetLoading] = useState(false);\r\n\r\n const createTweet = useCallback(async () => {\r\n try {\r\n // @ts-expect-error Twitter is attached to the window.\r\n await window.twttr.widgets.createTweet(tweetID, containerRef.current);\r\n\r\n setIsTweetLoading(false);\r\n isTwitterScriptLoading = false;\r\n\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n } catch (error) {\r\n if (onError) {\r\n onError(String(error));\r\n }\r\n }\r\n }, [onError, onLoad, tweetID]);\r\n\r\n useEffect(() => {\r\n if (tweetID !== previousTweetIDRef.current) {\r\n setIsTweetLoading(true);\r\n\r\n if (isTwitterScriptLoading) {\r\n const script = document.createElement('script');\r\n script.src = WIDGET_SCRIPT_URL;\r\n script.async = true;\r\n document.body?.appendChild(script);\r\n script.onload = createTweet;\r\n if (onError) {\r\n script.onerror = onError as OnErrorEventHandler;\r\n }\r\n } else {\r\n createTweet();\r\n }\r\n\r\n if (previousTweetIDRef) {\r\n previousTweetIDRef.current = tweetID;\r\n }\r\n }\r\n }, [createTweet, onError, tweetID]);\r\n\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n {isTweetLoading ? loadingComponent : null}\r\n <div\r\n style={{display: 'inline-block', width: '550px'}}\r\n ref={containerRef}\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedTweetNode = Spread<\r\n {\r\n id: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nexport class TweetNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'tweet';\r\n }\r\n\r\n static clone(node: TweetNode): TweetNode {\r\n return new TweetNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedTweetNode): TweetNode {\r\n return $createTweetNode(serializedNode.id).updateFromJSON(serializedNode);\r\n }\r\n\r\n exportJSON(): SerializedTweetNode {\r\n return {\r\n ...super.exportJSON(),\r\n id: this.getId(),\r\n };\r\n }\r\n\r\n static importDOM(): DOMConversionMap<HTMLDivElement> | null {\r\n return {\r\n div: (domNode: HTMLDivElement) => {\r\n if (!domNode.hasAttribute('data-lexical-tweet-id')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertTweetElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.setAttribute('data-lexical-tweet-id', this.__id);\r\n const text = document.createTextNode(this.getTextContent());\r\n element.append(text);\r\n return {element};\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://x.com/i/web/status/${this.__id}`;\r\n }\r\n\r\n decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <TweetComponent\r\n className={className}\r\n format={this.__format}\r\n loadingComponent=\"Loading...\"\r\n nodeKey={this.getKey()}\r\n tweetID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createTweetNode(tweetID: string): TweetNode {\r\n return new TweetNode(tweetID);\r\n}\r\n\r\nexport function $isTweetNode(\r\n node: TweetNode | LexicalNode | null | undefined,\r\n): node is TweetNode {\r\n return node instanceof TweetNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalCommand, LexicalEditor, RangeSelection} from 'lexical';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n REDO_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\n\r\nimport useReport from '../../hooks/useReport';\r\n\r\nexport const SPEECH_TO_TEXT_COMMAND: LexicalCommand<boolean> = createCommand(\r\n 'SPEECH_TO_TEXT_COMMAND',\r\n);\r\n\r\nconst VOICE_COMMANDS: Readonly<\r\n Record<\r\n string,\r\n (arg0: {editor: LexicalEditor; selection: RangeSelection}) => void\r\n >\r\n> = {\r\n '\\n': ({selection}) => {\r\n selection.insertParagraph();\r\n },\r\n redo: ({editor}) => {\r\n editor.dispatchCommand(REDO_COMMAND, undefined);\r\n },\r\n undo: ({editor}) => {\r\n editor.dispatchCommand(UNDO_COMMAND, undefined);\r\n },\r\n};\r\n\r\nexport const SUPPORT_SPEECH_RECOGNITION: boolean =\r\n 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window;\r\n\r\nfunction SpeechToTextPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n const [isEnabled, setIsEnabled] = useState<boolean>(false);\r\n const SpeechRecognition =\r\n // @ts-expect-error missing type\r\n window.SpeechRecognition || window.webkitSpeechRecognition;\r\n const recognition = useRef<typeof SpeechRecognition | null>(null);\r\n const report = useReport();\r\n\r\n useEffect(() => {\r\n if (isEnabled && recognition.current === null) {\r\n recognition.current = new SpeechRecognition();\r\n recognition.current.continuous = true;\r\n recognition.current.interimResults = true;\r\n recognition.current.addEventListener(\r\n 'result',\r\n (event: typeof SpeechRecognition) => {\r\n const resultItem = event.results.item(event.resultIndex);\r\n const {transcript} = resultItem.item(0);\r\n report(transcript);\r\n\r\n if (!resultItem.isFinal) {\r\n return;\r\n }\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n const command = VOICE_COMMANDS[transcript.toLowerCase().trim()];\r\n\r\n if (command) {\r\n command({\r\n editor,\r\n selection,\r\n });\r\n } else if (transcript.match(/\\s*\\n\\s*/)) {\r\n selection.insertParagraph();\r\n } else {\r\n selection.insertText(transcript);\r\n }\r\n }\r\n });\r\n },\r\n );\r\n }\r\n\r\n if (recognition.current) {\r\n if (isEnabled) {\r\n recognition.current.start();\r\n } else {\r\n recognition.current.stop();\r\n }\r\n }\r\n\r\n return () => {\r\n if (recognition.current !== null) {\r\n recognition.current.stop();\r\n }\r\n };\r\n }, [SpeechRecognition, editor, isEnabled, report]);\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n SPEECH_TO_TEXT_COMMAND,\r\n (_isEnabled: boolean) => {\r\n setIsEnabled(_isEnabled);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n\r\nexport default (SUPPORT_SPEECH_RECOGNITION\r\n ? SpeechToTextPlugin\r\n : () => null) as () => null;\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useCallback, useEffect, useRef} from 'react';\r\n\r\nconst getElement = (): HTMLElement => {\r\n let element = document.getElementById('report-container');\r\n\r\n if (element === null) {\r\n element = document.createElement('div');\r\n element.id = 'report-container';\r\n element.style.position = 'fixed';\r\n element.style.top = '50%';\r\n element.style.left = '50%';\r\n element.style.fontSize = '32px';\r\n element.style.transform = 'translate(-50%, -50px)';\r\n element.style.padding = '20px';\r\n element.style.background = 'rgba(240, 240, 240, 0.4)';\r\n element.style.borderRadius = '20px';\r\n\r\n if (document.body) {\r\n document.body.appendChild(element);\r\n }\r\n }\r\n\r\n return element;\r\n};\r\n\r\nexport default function useReport(): (\r\n arg0: string,\r\n) => ReturnType<typeof setTimeout> {\r\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const cleanup = useCallback(() => {\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current);\r\n timer.current = null;\r\n }\r\n\r\n if (document.body) {\r\n document.body.removeChild(getElement());\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n return cleanup;\r\n }, [cleanup]);\r\n\r\n return useCallback(\r\n (content) => {\r\n // eslint-disable-next-line no-console\r\n console.log(content);\r\n const element = getElement();\r\n if (timer.current !== null) {\r\n clearTimeout(timer.current);\r\n }\r\n element.innerHTML = content;\r\n timer.current = setTimeout(cleanup, 1000);\r\n return timer.current;\r\n },\r\n [cleanup],\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {BaseSelection, NodeKey, TextNode} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$isAtNodeEnd} from '@lexical/selection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $addUpdateTag,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_LOW,\r\n HISTORY_MERGE_TAG,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_TAB_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect} from 'react';\r\n\r\nimport {useToolbarState} from '../../context/ToolbarContext';\r\nimport {\r\n $createAutocompleteNode,\r\n AutocompleteNode,\r\n} from '../../nodes/AutocompleteNode';\r\nimport {addSwipeRightListener} from '../../utils/swipe';\r\n\r\nconst HISTORY_MERGE = {tag: HISTORY_MERGE_TAG};\r\n\r\ndeclare global {\r\n interface Navigator {\r\n userAgentData?: {\r\n mobile: boolean;\r\n };\r\n }\r\n}\r\n\r\ntype SearchPromise = {\r\n dismiss: () => void;\r\n promise: Promise<null | string>;\r\n};\r\n\r\nexport const uuid = Math.random()\r\n .toString(36)\r\n .replace(/[^a-z]+/g, '')\r\n .substring(0, 5);\r\n\r\n// TODO lookup should be custom\r\nfunction $search(selection: null | BaseSelection): [boolean, string] {\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\r\n return [false, ''];\r\n }\r\n const node = selection.getNodes()[0];\r\n const anchor = selection.anchor;\r\n // Check siblings?\r\n if (!$isTextNode(node) || !node.isSimpleText() || !$isAtNodeEnd(anchor)) {\r\n return [false, ''];\r\n }\r\n const word = [];\r\n const text = node.getTextContent();\r\n let i = node.getTextContentSize();\r\n let c;\r\n while (i-- && i >= 0 && (c = text[i]) !== ' ') {\r\n word.push(c);\r\n }\r\n if (word.length === 0) {\r\n return [false, ''];\r\n }\r\n return [true, word.reverse().join('')];\r\n}\r\n\r\n// TODO query should be custom\r\nfunction useQuery(): (searchText: string) => SearchPromise {\r\n return useCallback((searchText: string) => {\r\n const server = new AutocompleteServer();\r\n console.time('query');\r\n const response = server.query(searchText);\r\n console.timeEnd('query');\r\n return response;\r\n }, []);\r\n}\r\n\r\nfunction formatSuggestionText(suggestion: string): string {\r\n const userAgentData = window.navigator.userAgentData;\r\n const isMobile =\r\n userAgentData !== undefined\r\n ? userAgentData.mobile\r\n : window.innerWidth <= 800 && window.innerHeight <= 600;\r\n\r\n return `${suggestion} ${isMobile ? '(SWIPE \\u2B95)' : '(TAB)'}`;\r\n}\r\n\r\nexport default function AutocompletePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const query = useQuery();\r\n const {toolbarState} = useToolbarState();\r\n\r\n useEffect(() => {\r\n let autocompleteNodeKey: null | NodeKey = null;\r\n let lastMatch: null | string = null;\r\n let lastSuggestion: null | string = null;\r\n let searchPromise: null | SearchPromise = null;\r\n let prevNodeFormat: number = 0;\r\n function $clearSuggestion() {\r\n const autocompleteNode =\r\n autocompleteNodeKey !== null\r\n ? $getNodeByKey(autocompleteNodeKey)\r\n : null;\r\n if (autocompleteNode !== null && autocompleteNode.isAttached()) {\r\n autocompleteNode.remove();\r\n autocompleteNodeKey = null;\r\n }\r\n if (searchPromise !== null) {\r\n searchPromise.dismiss();\r\n searchPromise = null;\r\n }\r\n lastMatch = null;\r\n lastSuggestion = null;\r\n prevNodeFormat = 0;\r\n }\r\n function updateAsyncSuggestion(\r\n refSearchPromise: SearchPromise,\r\n newSuggestion: null | string,\r\n ) {\r\n if (searchPromise !== refSearchPromise || newSuggestion === null) {\r\n // Outdated or no suggestion\r\n return;\r\n }\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n const [hasMatch, match] = $search(selection);\r\n if (!hasMatch || match !== lastMatch || !$isRangeSelection(selection)) {\r\n // Outdated\r\n return;\r\n }\r\n const selectionCopy = selection.clone();\r\n const prevNode = selection.getNodes()[0] as TextNode;\r\n prevNodeFormat = prevNode.getFormat();\r\n const node = $createAutocompleteNode(\r\n formatSuggestionText(newSuggestion),\r\n uuid,\r\n )\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${toolbarState.fontSize}`);\r\n autocompleteNodeKey = node.getKey();\r\n selection.insertNodes([node]);\r\n $setSelection(selectionCopy);\r\n lastSuggestion = newSuggestion;\r\n }, HISTORY_MERGE);\r\n }\r\n\r\n function $handleAutocompleteNodeTransform(node: AutocompleteNode) {\r\n const key = node.getKey();\r\n if (node.__uuid === uuid && key !== autocompleteNodeKey) {\r\n // Max one Autocomplete node per session\r\n $clearSuggestion();\r\n }\r\n }\r\n function handleUpdate() {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n const [hasMatch, match] = $search(selection);\r\n if (!hasMatch) {\r\n $clearSuggestion();\r\n return;\r\n }\r\n if (match === lastMatch) {\r\n return;\r\n }\r\n $clearSuggestion();\r\n searchPromise = query(match);\r\n searchPromise.promise\r\n .then((newSuggestion) => {\r\n if (searchPromise !== null) {\r\n updateAsyncSuggestion(searchPromise, newSuggestion);\r\n }\r\n })\r\n .catch((e) => {\r\n if (e !== 'Dismissed') {\r\n console.error(e);\r\n }\r\n });\r\n lastMatch = match;\r\n }, HISTORY_MERGE);\r\n }\r\n function $handleAutocompleteIntent(): boolean {\r\n if (lastSuggestion === null || autocompleteNodeKey === null) {\r\n return false;\r\n }\r\n const autocompleteNode = $getNodeByKey(autocompleteNodeKey);\r\n if (autocompleteNode === null) {\r\n return false;\r\n }\r\n const textNode = $createTextNode(lastSuggestion)\r\n .setFormat(prevNodeFormat)\r\n .setStyle(`font-size: ${toolbarState.fontSize}`);\r\n autocompleteNode.replace(textNode);\r\n textNode.selectNext();\r\n $clearSuggestion();\r\n return true;\r\n }\r\n function $handleKeypressCommand(e: Event) {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n }\r\n function handleSwipeRight(_force: number, e: TouchEvent) {\r\n editor.update(() => {\r\n if ($handleAutocompleteIntent()) {\r\n e.preventDefault();\r\n } else {\r\n $addUpdateTag(HISTORY_MERGE.tag);\r\n }\r\n });\r\n }\r\n function unmountSuggestion() {\r\n editor.update(() => {\r\n $clearSuggestion();\r\n }, HISTORY_MERGE);\r\n }\r\n\r\n const rootElem = editor.getRootElement();\r\n\r\n return mergeRegister(\r\n editor.registerNodeTransform(\r\n AutocompleteNode,\r\n $handleAutocompleteNodeTransform,\r\n ),\r\n editor.registerUpdateListener(handleUpdate),\r\n editor.registerCommand(\r\n KEY_TAB_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n $handleKeypressCommand,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n ...(rootElem !== null\r\n ? [addSwipeRightListener(rootElem, handleSwipeRight)]\r\n : []),\r\n unmountSuggestion,\r\n );\r\n }, [editor, query, toolbarState.fontSize]);\r\n\r\n return null;\r\n}\r\n\r\n/*\r\n * Simulate an asynchronous autocomplete server (typical in more common use cases like GMail where\r\n * the data is not static).\r\n */\r\nclass AutocompleteServer {\r\n DATABASE = DICTIONARY;\r\n LATENCY = 200;\r\n\r\n query = (searchText: string): SearchPromise => {\r\n let isDismissed = false;\r\n\r\n const dismiss = () => {\r\n isDismissed = true;\r\n };\r\n const promise: Promise<null | string> = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n if (isDismissed) {\r\n // TODO cache result\r\n return reject('Dismissed');\r\n }\r\n const searchTextLength = searchText.length;\r\n if (searchText === '' || searchTextLength < 4) {\r\n return resolve(null);\r\n }\r\n const char0 = searchText.charCodeAt(0);\r\n const isCapitalized = char0 >= 65 && char0 <= 90;\r\n const caseInsensitiveSearchText = isCapitalized\r\n ? String.fromCharCode(char0 + 32) + searchText.substring(1)\r\n : searchText;\r\n const match = this.DATABASE.find(\r\n (dictionaryWord) =>\r\n dictionaryWord.startsWith(caseInsensitiveSearchText) ?? null,\r\n );\r\n if (match === undefined) {\r\n return resolve(null);\r\n }\r\n const matchCapitalized = isCapitalized\r\n ? String.fromCharCode(match.charCodeAt(0) - 32) + match.substring(1)\r\n : match;\r\n const autocompleteChunk = matchCapitalized.substring(searchTextLength);\r\n if (autocompleteChunk === '') {\r\n return resolve(null);\r\n }\r\n return resolve(autocompleteChunk);\r\n }, this.LATENCY);\r\n });\r\n\r\n return {\r\n dismiss,\r\n promise,\r\n };\r\n };\r\n}\r\n\r\n// https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-usa-no-swears-long.txt\r\nconst DICTIONARY = [\r\n 'information',\r\n 'available',\r\n 'copyright',\r\n 'university',\r\n 'management',\r\n 'international',\r\n 'development',\r\n 'education',\r\n 'community',\r\n 'technology',\r\n 'following',\r\n 'resources',\r\n 'including',\r\n 'directory',\r\n 'government',\r\n 'department',\r\n 'description',\r\n 'insurance',\r\n 'different',\r\n 'categories',\r\n 'conditions',\r\n 'accessories',\r\n 'september',\r\n 'questions',\r\n 'application',\r\n 'financial',\r\n 'equipment',\r\n 'performance',\r\n 'experience',\r\n 'important',\r\n 'activities',\r\n 'additional',\r\n 'something',\r\n 'professional',\r\n 'committee',\r\n 'washington',\r\n 'california',\r\n 'reference',\r\n 'companies',\r\n 'computers',\r\n 'president',\r\n 'australia',\r\n 'discussion',\r\n 'entertainment',\r\n 'agreement',\r\n 'marketing',\r\n 'association',\r\n 'collection',\r\n 'solutions',\r\n 'electronics',\r\n 'technical',\r\n 'microsoft',\r\n 'conference',\r\n 'environment',\r\n 'statement',\r\n 'downloads',\r\n 'applications',\r\n 'requirements',\r\n 'individual',\r\n 'subscribe',\r\n 'everything',\r\n 'production',\r\n 'commercial',\r\n 'advertising',\r\n 'treatment',\r\n 'newsletter',\r\n 'knowledge',\r\n 'currently',\r\n 'construction',\r\n 'registered',\r\n 'protection',\r\n 'engineering',\r\n 'published',\r\n 'corporate',\r\n 'customers',\r\n 'materials',\r\n 'countries',\r\n 'standards',\r\n 'political',\r\n 'advertise',\r\n 'environmental',\r\n 'availability',\r\n 'employment',\r\n 'commission',\r\n 'administration',\r\n 'institute',\r\n 'sponsored',\r\n 'electronic',\r\n 'condition',\r\n 'effective',\r\n 'organization',\r\n 'selection',\r\n 'corporation',\r\n 'executive',\r\n 'necessary',\r\n 'according',\r\n 'particular',\r\n 'facilities',\r\n 'opportunities',\r\n 'appropriate',\r\n 'statistics',\r\n 'investment',\r\n 'christmas',\r\n 'registration',\r\n 'furniture',\r\n 'wednesday',\r\n 'structure',\r\n 'distribution',\r\n 'industrial',\r\n 'potential',\r\n 'responsible',\r\n 'communications',\r\n 'associated',\r\n 'foundation',\r\n 'documents',\r\n 'communication',\r\n 'independent',\r\n 'operating',\r\n 'developed',\r\n 'telephone',\r\n 'population',\r\n 'navigation',\r\n 'operations',\r\n 'therefore',\r\n 'christian',\r\n 'understand',\r\n 'publications',\r\n 'worldwide',\r\n 'connection',\r\n 'publisher',\r\n 'introduction',\r\n 'properties',\r\n 'accommodation',\r\n 'excellent',\r\n 'opportunity',\r\n 'assessment',\r\n 'especially',\r\n 'interface',\r\n 'operation',\r\n 'restaurants',\r\n 'beautiful',\r\n 'locations',\r\n 'significant',\r\n 'technologies',\r\n 'manufacturer',\r\n 'providing',\r\n 'authority',\r\n 'considered',\r\n 'programme',\r\n 'enterprise',\r\n 'educational',\r\n 'employees',\r\n 'alternative',\r\n 'processing',\r\n 'responsibility',\r\n 'resolution',\r\n 'publication',\r\n 'relations',\r\n 'photography',\r\n 'components',\r\n 'assistance',\r\n 'completed',\r\n 'organizations',\r\n 'otherwise',\r\n 'transportation',\r\n 'disclaimer',\r\n 'membership',\r\n 'recommended',\r\n 'background',\r\n 'character',\r\n 'maintenance',\r\n 'functions',\r\n 'trademarks',\r\n 'phentermine',\r\n 'submitted',\r\n 'television',\r\n 'interested',\r\n 'throughout',\r\n 'established',\r\n 'programming',\r\n 'regarding',\r\n 'instructions',\r\n 'increased',\r\n 'understanding',\r\n 'beginning',\r\n 'associates',\r\n 'instruments',\r\n 'businesses',\r\n 'specified',\r\n 'restaurant',\r\n 'procedures',\r\n 'relationship',\r\n 'traditional',\r\n 'sometimes',\r\n 'themselves',\r\n 'transport',\r\n 'interesting',\r\n 'evaluation',\r\n 'implementation',\r\n 'galleries',\r\n 'references',\r\n 'presented',\r\n 'literature',\r\n 'respective',\r\n 'definition',\r\n 'secretary',\r\n 'networking',\r\n 'australian',\r\n 'magazines',\r\n 'francisco',\r\n 'individuals',\r\n 'guidelines',\r\n 'installation',\r\n 'described',\r\n 'attention',\r\n 'difference',\r\n 'regulations',\r\n 'certificate',\r\n 'directions',\r\n 'documentation',\r\n 'automotive',\r\n 'successful',\r\n 'communities',\r\n 'situation',\r\n 'publishing',\r\n 'emergency',\r\n 'developing',\r\n 'determine',\r\n 'temperature',\r\n 'announcements',\r\n 'historical',\r\n 'ringtones',\r\n 'difficult',\r\n 'scientific',\r\n 'satellite',\r\n 'particularly',\r\n 'functional',\r\n 'monitoring',\r\n 'architecture',\r\n 'recommend',\r\n 'dictionary',\r\n 'accounting',\r\n 'manufacturing',\r\n 'professor',\r\n 'generally',\r\n 'continued',\r\n 'techniques',\r\n 'permission',\r\n 'generation',\r\n 'component',\r\n 'guarantee',\r\n 'processes',\r\n 'interests',\r\n 'paperback',\r\n 'classifieds',\r\n 'supported',\r\n 'competition',\r\n 'providers',\r\n 'characters',\r\n 'thousands',\r\n 'apartments',\r\n 'generated',\r\n 'administrative',\r\n 'practices',\r\n 'reporting',\r\n 'essential',\r\n 'affiliate',\r\n 'immediately',\r\n 'designated',\r\n 'integrated',\r\n 'configuration',\r\n 'comprehensive',\r\n 'universal',\r\n 'presentation',\r\n 'languages',\r\n 'compliance',\r\n 'improvement',\r\n 'pennsylvania',\r\n 'challenge',\r\n 'acceptance',\r\n 'strategies',\r\n 'affiliates',\r\n 'multimedia',\r\n 'certified',\r\n 'computing',\r\n 'interactive',\r\n 'procedure',\r\n 'leadership',\r\n 'religious',\r\n 'breakfast',\r\n 'developer',\r\n 'approximately',\r\n 'recommendations',\r\n 'comparison',\r\n 'automatically',\r\n 'minnesota',\r\n 'adventure',\r\n 'institutions',\r\n 'assistant',\r\n 'advertisement',\r\n 'headlines',\r\n 'yesterday',\r\n 'determined',\r\n 'wholesale',\r\n 'extension',\r\n 'statements',\r\n 'completely',\r\n 'electrical',\r\n 'applicable',\r\n 'manufacturers',\r\n 'classical',\r\n 'dedicated',\r\n 'direction',\r\n 'basketball',\r\n 'wisconsin',\r\n 'personnel',\r\n 'identified',\r\n 'professionals',\r\n 'advantage',\r\n 'newsletters',\r\n 'estimated',\r\n 'anonymous',\r\n 'miscellaneous',\r\n 'integration',\r\n 'interview',\r\n 'framework',\r\n 'installed',\r\n 'massachusetts',\r\n 'associate',\r\n 'frequently',\r\n 'discussions',\r\n 'laboratory',\r\n 'destination',\r\n 'intelligence',\r\n 'specifications',\r\n 'tripadvisor',\r\n 'residential',\r\n 'decisions',\r\n 'industries',\r\n 'partnership',\r\n 'editorial',\r\n 'expression',\r\n 'provisions',\r\n 'principles',\r\n 'suggestions',\r\n 'replacement',\r\n 'strategic',\r\n 'economics',\r\n 'compatible',\r\n 'apartment',\r\n 'netherlands',\r\n 'consulting',\r\n 'recreation',\r\n 'participants',\r\n 'favorites',\r\n 'translation',\r\n 'estimates',\r\n 'protected',\r\n 'philadelphia',\r\n 'officials',\r\n 'contained',\r\n 'legislation',\r\n 'parameters',\r\n 'relationships',\r\n 'tennessee',\r\n 'representative',\r\n 'frequency',\r\n 'introduced',\r\n 'departments',\r\n 'residents',\r\n 'displayed',\r\n 'performed',\r\n 'administrator',\r\n 'addresses',\r\n 'permanent',\r\n 'agriculture',\r\n 'constitutes',\r\n 'portfolio',\r\n 'practical',\r\n 'delivered',\r\n 'collectibles',\r\n 'infrastructure',\r\n 'exclusive',\r\n 'originally',\r\n 'utilities',\r\n 'philosophy',\r\n 'regulation',\r\n 'reduction',\r\n 'nutrition',\r\n 'recording',\r\n 'secondary',\r\n 'wonderful',\r\n 'announced',\r\n 'prevention',\r\n 'mentioned',\r\n 'automatic',\r\n 'healthcare',\r\n 'maintained',\r\n 'increasing',\r\n 'connected',\r\n 'directors',\r\n 'participation',\r\n 'containing',\r\n 'combination',\r\n 'amendment',\r\n 'guaranteed',\r\n 'libraries',\r\n 'distributed',\r\n 'singapore',\r\n 'enterprises',\r\n 'convention',\r\n 'principal',\r\n 'certification',\r\n 'previously',\r\n 'buildings',\r\n 'household',\r\n 'batteries',\r\n 'positions',\r\n 'subscription',\r\n 'contemporary',\r\n 'panasonic',\r\n 'permalink',\r\n 'signature',\r\n 'provision',\r\n 'certainly',\r\n 'newspaper',\r\n 'liability',\r\n 'trademark',\r\n 'trackback',\r\n 'americans',\r\n 'promotion',\r\n 'conversion',\r\n 'reasonable',\r\n 'broadband',\r\n 'influence',\r\n 'importance',\r\n 'webmaster',\r\n 'prescription',\r\n 'specifically',\r\n 'represent',\r\n 'conservation',\r\n 'louisiana',\r\n 'javascript',\r\n 'marketplace',\r\n 'evolution',\r\n 'certificates',\r\n 'objectives',\r\n 'suggested',\r\n 'concerned',\r\n 'structures',\r\n 'encyclopedia',\r\n 'continuing',\r\n 'interracial',\r\n 'competitive',\r\n 'suppliers',\r\n 'preparation',\r\n 'receiving',\r\n 'accordance',\r\n 'discussed',\r\n 'elizabeth',\r\n 'reservations',\r\n 'playstation',\r\n 'instruction',\r\n 'annotation',\r\n 'differences',\r\n 'establish',\r\n 'expressed',\r\n 'paragraph',\r\n 'mathematics',\r\n 'compensation',\r\n 'conducted',\r\n 'percentage',\r\n 'mississippi',\r\n 'requested',\r\n 'connecticut',\r\n 'personals',\r\n 'immediate',\r\n 'agricultural',\r\n 'supporting',\r\n 'collections',\r\n 'participate',\r\n 'specialist',\r\n 'experienced',\r\n 'investigation',\r\n 'institution',\r\n 'searching',\r\n 'proceedings',\r\n 'transmission',\r\n 'characteristics',\r\n 'experiences',\r\n 'extremely',\r\n 'verzeichnis',\r\n 'contracts',\r\n 'concerning',\r\n 'developers',\r\n 'equivalent',\r\n 'chemistry',\r\n 'neighborhood',\r\n 'variables',\r\n 'continues',\r\n 'curriculum',\r\n 'psychology',\r\n 'responses',\r\n 'circumstances',\r\n 'identification',\r\n 'appliances',\r\n 'elementary',\r\n 'unlimited',\r\n 'printable',\r\n 'enforcement',\r\n 'hardcover',\r\n 'celebrity',\r\n 'chocolate',\r\n 'hampshire',\r\n 'bluetooth',\r\n 'controlled',\r\n 'requirement',\r\n 'authorities',\r\n 'representatives',\r\n 'pregnancy',\r\n 'biography',\r\n 'attractions',\r\n 'transactions',\r\n 'authorized',\r\n 'retirement',\r\n 'financing',\r\n 'efficiency',\r\n 'efficient',\r\n 'commitment',\r\n 'specialty',\r\n 'interviews',\r\n 'qualified',\r\n 'discovery',\r\n 'classified',\r\n 'confidence',\r\n 'lifestyle',\r\n 'consistent',\r\n 'clearance',\r\n 'connections',\r\n 'inventory',\r\n 'converter',\r\n 'organisation',\r\n 'objective',\r\n 'indicated',\r\n 'securities',\r\n 'volunteer',\r\n 'democratic',\r\n 'switzerland',\r\n 'parameter',\r\n 'processor',\r\n 'dimensions',\r\n 'contribute',\r\n 'challenges',\r\n 'recognition',\r\n 'submission',\r\n 'encourage',\r\n 'regulatory',\r\n 'inspection',\r\n 'consumers',\r\n 'territory',\r\n 'transaction',\r\n 'manchester',\r\n 'contributions',\r\n 'continuous',\r\n 'resulting',\r\n 'cambridge',\r\n 'initiative',\r\n 'execution',\r\n 'disability',\r\n 'increases',\r\n 'contractor',\r\n 'examination',\r\n 'indicates',\r\n 'committed',\r\n 'extensive',\r\n 'affordable',\r\n 'candidate',\r\n 'databases',\r\n 'outstanding',\r\n 'perspective',\r\n 'messenger',\r\n 'tournament',\r\n 'consideration',\r\n 'discounts',\r\n 'catalogue',\r\n 'publishers',\r\n 'caribbean',\r\n 'reservation',\r\n 'remaining',\r\n 'depending',\r\n 'expansion',\r\n 'purchased',\r\n 'performing',\r\n 'collected',\r\n 'absolutely',\r\n 'featuring',\r\n 'implement',\r\n 'scheduled',\r\n 'calculator',\r\n 'significantly',\r\n 'temporary',\r\n 'sufficient',\r\n 'awareness',\r\n 'vancouver',\r\n 'contribution',\r\n 'measurement',\r\n 'constitution',\r\n 'packaging',\r\n 'consultation',\r\n 'northwest',\r\n 'classroom',\r\n 'democracy',\r\n 'wallpaper',\r\n 'merchandise',\r\n 'resistance',\r\n 'baltimore',\r\n 'candidates',\r\n 'charlotte',\r\n 'biological',\r\n 'transition',\r\n 'preferences',\r\n 'instrument',\r\n 'classification',\r\n 'physician',\r\n 'hollywood',\r\n 'wikipedia',\r\n 'spiritual',\r\n 'photographs',\r\n 'relatively',\r\n 'satisfaction',\r\n 'represents',\r\n 'pittsburgh',\r\n 'preferred',\r\n 'intellectual',\r\n 'comfortable',\r\n 'interaction',\r\n 'listening',\r\n 'effectively',\r\n 'experimental',\r\n 'revolution',\r\n 'consolidation',\r\n 'landscape',\r\n 'dependent',\r\n 'mechanical',\r\n 'consultants',\r\n 'applicant',\r\n 'cooperation',\r\n 'acquisition',\r\n 'implemented',\r\n 'directories',\r\n 'recognized',\r\n 'notification',\r\n 'licensing',\r\n 'textbooks',\r\n 'diversity',\r\n 'cleveland',\r\n 'investments',\r\n 'accessibility',\r\n 'sensitive',\r\n 'templates',\r\n 'completion',\r\n 'universities',\r\n 'technique',\r\n 'contractors',\r\n 'subscriptions',\r\n 'calculate',\r\n 'alexander',\r\n 'broadcast',\r\n 'converted',\r\n 'anniversary',\r\n 'improvements',\r\n 'specification',\r\n 'accessible',\r\n 'accessory',\r\n 'typically',\r\n 'representation',\r\n 'arrangements',\r\n 'conferences',\r\n 'uniprotkb',\r\n 'consumption',\r\n 'birmingham',\r\n 'afternoon',\r\n 'consultant',\r\n 'controller',\r\n 'ownership',\r\n 'committees',\r\n 'legislative',\r\n 'researchers',\r\n 'unsubscribe',\r\n 'molecular',\r\n 'residence',\r\n 'attorneys',\r\n 'operators',\r\n 'sustainable',\r\n 'philippines',\r\n 'statistical',\r\n 'innovation',\r\n 'employers',\r\n 'definitions',\r\n 'elections',\r\n 'stainless',\r\n 'newspapers',\r\n 'hospitals',\r\n 'exception',\r\n 'successfully',\r\n 'indonesia',\r\n 'primarily',\r\n 'capabilities',\r\n 'recommendation',\r\n 'recruitment',\r\n 'organized',\r\n 'improving',\r\n 'expensive',\r\n 'organisations',\r\n 'explained',\r\n 'programmes',\r\n 'expertise',\r\n 'mechanism',\r\n 'jewellery',\r\n 'eventually',\r\n 'agreements',\r\n 'considering',\r\n 'innovative',\r\n 'conclusion',\r\n 'disorders',\r\n 'collaboration',\r\n 'detection',\r\n 'formation',\r\n 'engineers',\r\n 'proposals',\r\n 'moderator',\r\n 'tutorials',\r\n 'settlement',\r\n 'collectables',\r\n 'fantastic',\r\n 'governments',\r\n 'purchasing',\r\n 'appointed',\r\n 'operational',\r\n 'corresponding',\r\n 'descriptions',\r\n 'determination',\r\n 'animation',\r\n 'productions',\r\n 'telecommunications',\r\n 'instructor',\r\n 'approaches',\r\n 'highlights',\r\n 'designers',\r\n 'melbourne',\r\n 'scientists',\r\n 'blackjack',\r\n 'argentina',\r\n 'possibility',\r\n 'commissioner',\r\n 'dangerous',\r\n 'reliability',\r\n 'unfortunately',\r\n 'respectively',\r\n 'volunteers',\r\n 'attachment',\r\n 'appointment',\r\n 'workshops',\r\n 'hurricane',\r\n 'represented',\r\n 'mortgages',\r\n 'responsibilities',\r\n 'carefully',\r\n 'productivity',\r\n 'investors',\r\n 'underground',\r\n 'diagnosis',\r\n 'principle',\r\n 'vacations',\r\n 'calculated',\r\n 'appearance',\r\n 'incorporated',\r\n 'notebooks',\r\n 'algorithm',\r\n 'valentine',\r\n 'involving',\r\n 'investing',\r\n 'christopher',\r\n 'admission',\r\n 'terrorism',\r\n 'parliament',\r\n 'situations',\r\n 'allocated',\r\n 'corrections',\r\n 'structural',\r\n 'municipal',\r\n 'describes',\r\n 'disabilities',\r\n 'substance',\r\n 'prohibited',\r\n 'addressed',\r\n 'simulation',\r\n 'initiatives',\r\n 'concentration',\r\n 'interpretation',\r\n 'bankruptcy',\r\n 'optimization',\r\n 'substances',\r\n 'discovered',\r\n 'restrictions',\r\n 'participating',\r\n 'exhibition',\r\n 'composition',\r\n 'nationwide',\r\n 'definitely',\r\n 'existence',\r\n 'commentary',\r\n 'limousines',\r\n 'developments',\r\n 'immigration',\r\n 'destinations',\r\n 'necessarily',\r\n 'attribute',\r\n 'apparently',\r\n 'surrounding',\r\n 'mountains',\r\n 'popularity',\r\n 'postposted',\r\n 'coordinator',\r\n 'obviously',\r\n 'fundamental',\r\n 'substantial',\r\n 'progressive',\r\n 'championship',\r\n 'sacramento',\r\n 'impossible',\r\n 'depression',\r\n 'testimonials',\r\n 'memorabilia',\r\n 'cartridge',\r\n 'explanation',\r\n 'cincinnati',\r\n 'subsection',\r\n 'electricity',\r\n 'permitted',\r\n 'workplace',\r\n 'confirmed',\r\n 'wallpapers',\r\n 'infection',\r\n 'eligibility',\r\n 'involvement',\r\n 'placement',\r\n 'observations',\r\n 'vbulletin',\r\n 'subsequent',\r\n 'motorcycle',\r\n 'disclosure',\r\n 'establishment',\r\n 'presentations',\r\n 'undergraduate',\r\n 'occupation',\r\n 'donations',\r\n 'associations',\r\n 'citysearch',\r\n 'radiation',\r\n 'seriously',\r\n 'elsewhere',\r\n 'pollution',\r\n 'conservative',\r\n 'guestbook',\r\n 'effectiveness',\r\n 'demonstrate',\r\n 'atmosphere',\r\n 'experiment',\r\n 'purchases',\r\n 'federation',\r\n 'assignment',\r\n 'chemicals',\r\n 'everybody',\r\n 'nashville',\r\n 'counseling',\r\n 'acceptable',\r\n 'satisfied',\r\n 'measurements',\r\n 'milwaukee',\r\n 'medication',\r\n 'warehouse',\r\n 'shareware',\r\n 'violation',\r\n 'configure',\r\n 'stability',\r\n 'southwest',\r\n 'institutional',\r\n 'expectations',\r\n 'independence',\r\n 'metabolism',\r\n 'personally',\r\n 'excellence',\r\n 'somewhere',\r\n 'attributes',\r\n 'recognize',\r\n 'screening',\r\n 'thumbnail',\r\n 'forgotten',\r\n 'intelligent',\r\n 'edinburgh',\r\n 'obligation',\r\n 'regardless',\r\n 'restricted',\r\n 'republican',\r\n 'merchants',\r\n 'attendance',\r\n 'arguments',\r\n 'amsterdam',\r\n 'adventures',\r\n 'announcement',\r\n 'appreciate',\r\n 'regularly',\r\n 'mechanisms',\r\n 'customize',\r\n 'tradition',\r\n 'indicators',\r\n 'emissions',\r\n 'physicians',\r\n 'complaint',\r\n 'experiments',\r\n 'afghanistan',\r\n 'scholarship',\r\n 'governance',\r\n 'supplements',\r\n 'camcorder',\r\n 'implementing',\r\n 'ourselves',\r\n 'conversation',\r\n 'capability',\r\n 'producing',\r\n 'precision',\r\n 'contributed',\r\n 'reproduction',\r\n 'ingredients',\r\n 'franchise',\r\n 'complaints',\r\n 'promotions',\r\n 'rehabilitation',\r\n 'maintaining',\r\n 'environments',\r\n 'reception',\r\n 'correctly',\r\n 'consequences',\r\n 'geography',\r\n 'appearing',\r\n 'integrity',\r\n 'discrimination',\r\n 'processed',\r\n 'implications',\r\n 'functionality',\r\n 'intermediate',\r\n 'emotional',\r\n 'platforms',\r\n 'overnight',\r\n 'geographic',\r\n 'preliminary',\r\n 'districts',\r\n 'introduce',\r\n 'promotional',\r\n 'chevrolet',\r\n 'specialists',\r\n 'generator',\r\n 'suspension',\r\n 'correction',\r\n 'authentication',\r\n 'communicate',\r\n 'supplement',\r\n 'showtimes',\r\n 'promoting',\r\n 'machinery',\r\n 'bandwidth',\r\n 'probability',\r\n 'dimension',\r\n 'schedules',\r\n 'admissions',\r\n 'quarterly',\r\n 'illustrated',\r\n 'continental',\r\n 'alternate',\r\n 'achievement',\r\n 'limitations',\r\n 'automated',\r\n 'passenger',\r\n 'convenient',\r\n 'orientation',\r\n 'childhood',\r\n 'flexibility',\r\n 'jurisdiction',\r\n 'displaying',\r\n 'encouraged',\r\n 'cartridges',\r\n 'declaration',\r\n 'automation',\r\n 'advantages',\r\n 'preparing',\r\n 'recipient',\r\n 'extensions',\r\n 'athletics',\r\n 'southeast',\r\n 'alternatives',\r\n 'determining',\r\n 'personalized',\r\n 'conditioning',\r\n 'partnerships',\r\n 'destruction',\r\n 'increasingly',\r\n 'migration',\r\n 'basically',\r\n 'conventional',\r\n 'applicants',\r\n 'occupational',\r\n 'adjustment',\r\n 'treatments',\r\n 'camcorders',\r\n 'difficulty',\r\n 'collective',\r\n 'coalition',\r\n 'enrollment',\r\n 'producers',\r\n 'collector',\r\n 'interfaces',\r\n 'advertisers',\r\n 'representing',\r\n 'observation',\r\n 'restoration',\r\n 'convenience',\r\n 'returning',\r\n 'opposition',\r\n 'container',\r\n 'defendant',\r\n 'confirmation',\r\n 'supervisor',\r\n 'peripherals',\r\n 'bestsellers',\r\n 'departure',\r\n 'minneapolis',\r\n 'interactions',\r\n 'intervention',\r\n 'attraction',\r\n 'modification',\r\n 'customized',\r\n 'understood',\r\n 'assurance',\r\n 'happening',\r\n 'amendments',\r\n 'metropolitan',\r\n 'compilation',\r\n 'verification',\r\n 'attractive',\r\n 'recordings',\r\n 'jefferson',\r\n 'gardening',\r\n 'obligations',\r\n 'orchestra',\r\n 'polyphonic',\r\n 'outsourcing',\r\n 'adjustable',\r\n 'allocation',\r\n 'discipline',\r\n 'demonstrated',\r\n 'identifying',\r\n 'alphabetical',\r\n 'dispatched',\r\n 'installing',\r\n 'voluntary',\r\n 'photographer',\r\n 'messaging',\r\n 'constructed',\r\n 'additions',\r\n 'requiring',\r\n 'engagement',\r\n 'refinance',\r\n 'calendars',\r\n 'arrangement',\r\n 'conclusions',\r\n 'bibliography',\r\n 'compatibility',\r\n 'furthermore',\r\n 'cooperative',\r\n 'measuring',\r\n 'jacksonville',\r\n 'headquarters',\r\n 'transfers',\r\n 'transformation',\r\n 'attachments',\r\n 'administrators',\r\n 'personality',\r\n 'facilitate',\r\n 'subscriber',\r\n 'priorities',\r\n 'bookstore',\r\n 'parenting',\r\n 'incredible',\r\n 'commonwealth',\r\n 'pharmaceutical',\r\n 'manhattan',\r\n 'workforce',\r\n 'organizational',\r\n 'portuguese',\r\n 'everywhere',\r\n 'discharge',\r\n 'halloween',\r\n 'hazardous',\r\n 'methodology',\r\n 'housewares',\r\n 'reputation',\r\n 'resistant',\r\n 'democrats',\r\n 'recycling',\r\n 'qualifications',\r\n 'slideshow',\r\n 'variation',\r\n 'transferred',\r\n 'photograph',\r\n 'distributor',\r\n 'underlying',\r\n 'wrestling',\r\n 'photoshop',\r\n 'gathering',\r\n 'projection',\r\n 'mathematical',\r\n 'specialized',\r\n 'diagnostic',\r\n 'indianapolis',\r\n 'corporations',\r\n 'criticism',\r\n 'automobile',\r\n 'confidential',\r\n 'statutory',\r\n 'accommodations',\r\n 'northeast',\r\n 'downloaded',\r\n 'paintings',\r\n 'injection',\r\n 'yorkshire',\r\n 'populations',\r\n 'protective',\r\n 'initially',\r\n 'indicator',\r\n 'eliminate',\r\n 'sunglasses',\r\n 'preference',\r\n 'threshold',\r\n 'venezuela',\r\n 'exploration',\r\n 'sequences',\r\n 'astronomy',\r\n 'translate',\r\n 'announces',\r\n 'compression',\r\n 'establishing',\r\n 'constitutional',\r\n 'perfectly',\r\n 'instantly',\r\n 'litigation',\r\n 'submissions',\r\n 'broadcasting',\r\n 'horizontal',\r\n 'terrorist',\r\n 'informational',\r\n 'ecommerce',\r\n 'suffering',\r\n 'prospective',\r\n 'ultimately',\r\n 'artificial',\r\n 'spectacular',\r\n 'coordination',\r\n 'connector',\r\n 'affiliated',\r\n 'activation',\r\n 'naturally',\r\n 'subscribers',\r\n 'mitsubishi',\r\n 'underwear',\r\n 'potentially',\r\n 'constraints',\r\n 'inclusive',\r\n 'dimensional',\r\n 'considerable',\r\n 'selecting',\r\n 'processors',\r\n 'pantyhose',\r\n 'difficulties',\r\n 'complexity',\r\n 'constantly',\r\n 'barcelona',\r\n 'presidential',\r\n 'documentary',\r\n 'territories',\r\n 'palestinian',\r\n 'legislature',\r\n 'hospitality',\r\n 'procurement',\r\n 'theoretical',\r\n 'exercises',\r\n 'surveillance',\r\n 'protocols',\r\n 'highlight',\r\n 'substitute',\r\n 'inclusion',\r\n 'hopefully',\r\n 'brilliant',\r\n 'evaluated',\r\n 'assignments',\r\n 'termination',\r\n 'households',\r\n 'authentic',\r\n 'montgomery',\r\n 'architectural',\r\n 'louisville',\r\n 'macintosh',\r\n 'movements',\r\n 'amenities',\r\n 'virtually',\r\n 'authorization',\r\n 'projector',\r\n 'comparative',\r\n 'psychological',\r\n 'surprised',\r\n 'genealogy',\r\n 'expenditure',\r\n 'liverpool',\r\n 'connectivity',\r\n 'algorithms',\r\n 'similarly',\r\n 'collaborative',\r\n 'excluding',\r\n 'commander',\r\n 'suggestion',\r\n 'spotlight',\r\n 'investigate',\r\n 'connecting',\r\n 'logistics',\r\n 'proportion',\r\n 'significance',\r\n 'symposium',\r\n 'essentials',\r\n 'protecting',\r\n 'transmitted',\r\n 'screenshots',\r\n 'intensive',\r\n 'switching',\r\n 'correspondence',\r\n 'supervision',\r\n 'expenditures',\r\n 'separation',\r\n 'testimony',\r\n 'celebrities',\r\n 'mandatory',\r\n 'boundaries',\r\n 'syndication',\r\n 'celebration',\r\n 'filtering',\r\n 'luxembourg',\r\n 'offensive',\r\n 'deployment',\r\n 'colleagues',\r\n 'separated',\r\n 'directive',\r\n 'governing',\r\n 'retailers',\r\n 'occasionally',\r\n 'attending',\r\n 'recruiting',\r\n 'instructional',\r\n 'traveling',\r\n 'permissions',\r\n 'biotechnology',\r\n 'prescribed',\r\n 'catherine',\r\n 'reproduced',\r\n 'calculation',\r\n 'consolidated',\r\n 'occasions',\r\n 'equations',\r\n 'exceptional',\r\n 'respondents',\r\n 'considerations',\r\n 'queensland',\r\n 'musicians',\r\n 'composite',\r\n 'unavailable',\r\n 'essentially',\r\n 'designing',\r\n 'assessments',\r\n 'brunswick',\r\n 'sensitivity',\r\n 'preservation',\r\n 'streaming',\r\n 'intensity',\r\n 'technological',\r\n 'syndicate',\r\n 'antivirus',\r\n 'addressing',\r\n 'discounted',\r\n 'bangladesh',\r\n 'constitute',\r\n 'concluded',\r\n 'desperate',\r\n 'demonstration',\r\n 'governmental',\r\n 'manufactured',\r\n 'graduation',\r\n 'variations',\r\n 'addiction',\r\n 'springfield',\r\n 'synthesis',\r\n 'undefined',\r\n 'unemployment',\r\n 'enhancement',\r\n 'newcastle',\r\n 'performances',\r\n 'societies',\r\n 'brazilian',\r\n 'identical',\r\n 'petroleum',\r\n 'norwegian',\r\n 'retention',\r\n 'exchanges',\r\n 'soundtrack',\r\n 'wondering',\r\n 'profession',\r\n 'separately',\r\n 'physiology',\r\n 'collecting',\r\n 'participant',\r\n 'scholarships',\r\n 'recreational',\r\n 'dominican',\r\n 'friendship',\r\n 'expanding',\r\n 'provincial',\r\n 'investigations',\r\n 'medications',\r\n 'rochester',\r\n 'advertiser',\r\n 'encryption',\r\n 'downloadable',\r\n 'sophisticated',\r\n 'possession',\r\n 'laboratories',\r\n 'vegetables',\r\n 'thumbnails',\r\n 'stockings',\r\n 'respondent',\r\n 'destroyed',\r\n 'manufacture',\r\n 'wordpress',\r\n 'vulnerability',\r\n 'accountability',\r\n 'celebrate',\r\n 'accredited',\r\n 'appliance',\r\n 'compressed',\r\n 'scheduling',\r\n 'perspectives',\r\n 'mortality',\r\n 'christians',\r\n 'therapeutic',\r\n 'impressive',\r\n 'accordingly',\r\n 'architect',\r\n 'challenging',\r\n 'microwave',\r\n 'accidents',\r\n 'relocation',\r\n 'contributors',\r\n 'violations',\r\n 'temperatures',\r\n 'competitions',\r\n 'discretion',\r\n 'cosmetics',\r\n 'repository',\r\n 'concentrations',\r\n 'christianity',\r\n 'negotiations',\r\n 'realistic',\r\n 'generating',\r\n 'christina',\r\n 'congressional',\r\n 'photographic',\r\n 'modifications',\r\n 'millennium',\r\n 'achieving',\r\n 'fisheries',\r\n 'exceptions',\r\n 'reactions',\r\n 'macromedia',\r\n 'companion',\r\n 'divisions',\r\n 'additionally',\r\n 'fellowship',\r\n 'victorian',\r\n 'copyrights',\r\n 'lithuania',\r\n 'mastercard',\r\n 'chronicles',\r\n 'obtaining',\r\n 'distribute',\r\n 'decorative',\r\n 'enlargement',\r\n 'campaigns',\r\n 'conjunction',\r\n 'instances',\r\n 'indigenous',\r\n 'validation',\r\n 'corruption',\r\n 'incentives',\r\n 'cholesterol',\r\n 'differential',\r\n 'scientist',\r\n 'starsmerchant',\r\n 'arthritis',\r\n 'nevertheless',\r\n 'practitioners',\r\n 'transcript',\r\n 'inflation',\r\n 'compounds',\r\n 'contracting',\r\n 'structured',\r\n 'reasonably',\r\n 'graduates',\r\n 'recommends',\r\n 'controlling',\r\n 'distributors',\r\n 'arlington',\r\n 'particles',\r\n 'extraordinary',\r\n 'indicating',\r\n 'coordinate',\r\n 'exclusively',\r\n 'limitation',\r\n 'widescreen',\r\n 'illustration',\r\n 'construct',\r\n 'inquiries',\r\n 'inspiration',\r\n 'affecting',\r\n 'downloading',\r\n 'aggregate',\r\n 'forecasts',\r\n 'complicated',\r\n 'shopzilla',\r\n 'decorating',\r\n 'expressions',\r\n 'shakespeare',\r\n 'connectors',\r\n 'conflicts',\r\n 'travelers',\r\n 'offerings',\r\n 'incorrect',\r\n 'furnishings',\r\n 'guatemala',\r\n 'perception',\r\n 'renaissance',\r\n 'pathology',\r\n 'ordinance',\r\n 'photographers',\r\n 'infections',\r\n 'configured',\r\n 'festivals',\r\n 'possibilities',\r\n 'contributing',\r\n 'analytical',\r\n 'circulation',\r\n 'assumption',\r\n 'jerusalem',\r\n 'transexuales',\r\n 'invention',\r\n 'technician',\r\n 'executives',\r\n 'enquiries',\r\n 'cognitive',\r\n 'exploring',\r\n 'registrar',\r\n 'supporters',\r\n 'withdrawal',\r\n 'predicted',\r\n 'saskatchewan',\r\n 'cancellation',\r\n 'ministers',\r\n 'veterinary',\r\n 'prostores',\r\n 'relevance',\r\n 'incentive',\r\n 'butterfly',\r\n 'mechanics',\r\n 'numerical',\r\n 'reflection',\r\n 'accompanied',\r\n 'invitation',\r\n 'princeton',\r\n 'spirituality',\r\n 'meanwhile',\r\n 'proprietary',\r\n 'childrens',\r\n 'thumbzilla',\r\n 'porcelain',\r\n 'pichunter',\r\n 'translated',\r\n 'columnists',\r\n 'consensus',\r\n 'delivering',\r\n 'journalism',\r\n 'intention',\r\n 'undertaken',\r\n 'statewide',\r\n 'semiconductor',\r\n 'illustrations',\r\n 'happiness',\r\n 'substantially',\r\n 'identifier',\r\n 'calculations',\r\n 'conducting',\r\n 'accomplished',\r\n 'calculators',\r\n 'impression',\r\n 'correlation',\r\n 'fragrance',\r\n 'neighbors',\r\n 'transparent',\r\n 'charleston',\r\n 'champions',\r\n 'selections',\r\n 'projectors',\r\n 'inappropriate',\r\n 'comparing',\r\n 'vocational',\r\n 'pharmacies',\r\n 'introducing',\r\n 'appreciated',\r\n 'albuquerque',\r\n 'distinguished',\r\n 'projected',\r\n 'assumptions',\r\n 'shareholders',\r\n 'developmental',\r\n 'regulated',\r\n 'anticipated',\r\n 'completing',\r\n 'comparable',\r\n 'confusion',\r\n 'copyrighted',\r\n 'warranties',\r\n 'documented',\r\n 'paperbacks',\r\n 'keyboards',\r\n 'vulnerable',\r\n 'reflected',\r\n 'respiratory',\r\n 'notifications',\r\n 'transexual',\r\n 'mainstream',\r\n 'evaluating',\r\n 'subcommittee',\r\n 'maternity',\r\n 'journalists',\r\n 'foundations',\r\n 'volleyball',\r\n 'liabilities',\r\n 'decreased',\r\n 'tolerance',\r\n 'creativity',\r\n 'describing',\r\n 'lightning',\r\n 'quotations',\r\n 'inspector',\r\n 'bookmarks',\r\n 'behavioral',\r\n 'riverside',\r\n 'bathrooms',\r\n 'abilities',\r\n 'initiated',\r\n 'nonprofit',\r\n 'lancaster',\r\n 'suspended',\r\n 'containers',\r\n 'attitudes',\r\n 'simultaneously',\r\n 'integrate',\r\n 'sociology',\r\n 'screenshot',\r\n 'exhibitions',\r\n 'confident',\r\n 'retrieved',\r\n 'officially',\r\n 'consortium',\r\n 'recipients',\r\n 'delicious',\r\n 'traditions',\r\n 'periodically',\r\n 'hungarian',\r\n 'referring',\r\n 'transform',\r\n 'educators',\r\n 'vegetable',\r\n 'humanities',\r\n 'independently',\r\n 'alignment',\r\n 'henderson',\r\n 'britannica',\r\n 'competitors',\r\n 'visibility',\r\n 'consciousness',\r\n 'encounter',\r\n 'resolutions',\r\n 'accessing',\r\n 'attempted',\r\n 'witnesses',\r\n 'administered',\r\n 'strengthen',\r\n 'frederick',\r\n 'aggressive',\r\n 'advertisements',\r\n 'sublimedirectory',\r\n 'disturbed',\r\n 'determines',\r\n 'sculpture',\r\n 'motivation',\r\n 'pharmacology',\r\n 'passengers',\r\n 'quantities',\r\n 'petersburg',\r\n 'consistently',\r\n 'powerpoint',\r\n 'obituaries',\r\n 'punishment',\r\n 'appreciation',\r\n 'subsequently',\r\n 'providence',\r\n 'restriction',\r\n 'incorporate',\r\n 'backgrounds',\r\n 'treasurer',\r\n 'lightweight',\r\n 'transcription',\r\n 'complications',\r\n 'scripting',\r\n 'remembered',\r\n 'synthetic',\r\n 'testament',\r\n 'specifics',\r\n 'partially',\r\n 'wilderness',\r\n 'generations',\r\n 'tournaments',\r\n 'sponsorship',\r\n 'headphones',\r\n 'proceeding',\r\n 'volkswagen',\r\n 'uncertainty',\r\n 'breakdown',\r\n 'reconstruction',\r\n 'subsidiary',\r\n 'strengths',\r\n 'encouraging',\r\n 'furnished',\r\n 'terrorists',\r\n 'comparisons',\r\n 'beneficial',\r\n 'distributions',\r\n 'viewpicture',\r\n 'threatened',\r\n 'republicans',\r\n 'discusses',\r\n 'responded',\r\n 'abstracts',\r\n 'prediction',\r\n 'pharmaceuticals',\r\n 'thesaurus',\r\n 'individually',\r\n 'battlefield',\r\n 'literally',\r\n 'ecological',\r\n 'appraisal',\r\n 'consisting',\r\n 'submitting',\r\n 'citations',\r\n 'geographical',\r\n 'mozambique',\r\n 'disclaimers',\r\n 'championships',\r\n 'sheffield',\r\n 'finishing',\r\n 'wellington',\r\n 'prospects',\r\n 'bulgarian',\r\n 'aboriginal',\r\n 'remarkable',\r\n 'preventing',\r\n 'productive',\r\n 'boulevard',\r\n 'compliant',\r\n 'penalties',\r\n 'imagination',\r\n 'refurbished',\r\n 'activated',\r\n 'conferencing',\r\n 'armstrong',\r\n 'politicians',\r\n 'trackbacks',\r\n 'accommodate',\r\n 'christine',\r\n 'accepting',\r\n 'precipitation',\r\n 'isolation',\r\n 'sustained',\r\n 'approximate',\r\n 'programmer',\r\n 'greetings',\r\n 'inherited',\r\n 'incomplete',\r\n 'chronicle',\r\n 'legitimate',\r\n 'biographies',\r\n 'investigator',\r\n 'plaintiff',\r\n 'prisoners',\r\n 'mediterranean',\r\n 'nightlife',\r\n 'architects',\r\n 'entrepreneur',\r\n 'freelance',\r\n 'excessive',\r\n 'screensaver',\r\n 'valuation',\r\n 'unexpected',\r\n 'cigarette',\r\n 'characteristic',\r\n 'metallica',\r\n 'consequently',\r\n 'appointments',\r\n 'narrative',\r\n 'academics',\r\n 'quantitative',\r\n 'screensavers',\r\n 'subdivision',\r\n 'distinction',\r\n 'livestock',\r\n 'exemption',\r\n 'sustainability',\r\n 'formatting',\r\n 'nutritional',\r\n 'nicaragua',\r\n 'affiliation',\r\n 'relatives',\r\n 'satisfactory',\r\n 'revolutionary',\r\n 'bracelets',\r\n 'telephony',\r\n 'breathing',\r\n 'thickness',\r\n 'adjustments',\r\n 'graphical',\r\n 'discussing',\r\n 'aerospace',\r\n 'meaningful',\r\n 'maintains',\r\n 'shortcuts',\r\n 'voyeurweb',\r\n 'extending',\r\n 'specifies',\r\n 'accreditation',\r\n 'blackberry',\r\n 'meditation',\r\n 'microphone',\r\n 'macedonia',\r\n 'combining',\r\n 'instrumental',\r\n 'organizing',\r\n 'moderators',\r\n 'kazakhstan',\r\n 'standings',\r\n 'partition',\r\n 'invisible',\r\n 'translations',\r\n 'commodity',\r\n 'kilometers',\r\n 'thanksgiving',\r\n 'guarantees',\r\n 'indication',\r\n 'congratulations',\r\n 'cigarettes',\r\n 'controllers',\r\n 'consultancy',\r\n 'conventions',\r\n 'coordinates',\r\n 'responding',\r\n 'physically',\r\n 'stakeholders',\r\n 'hydrocodone',\r\n 'consecutive',\r\n 'attempting',\r\n 'representations',\r\n 'competing',\r\n 'peninsula',\r\n 'accurately',\r\n 'considers',\r\n 'ministries',\r\n 'vacancies',\r\n 'parliamentary',\r\n 'acknowledge',\r\n 'thoroughly',\r\n 'nottingham',\r\n 'identifies',\r\n 'questionnaire',\r\n 'qualification',\r\n 'modelling',\r\n 'miniature',\r\n 'interstate',\r\n 'consequence',\r\n 'systematic',\r\n 'perceived',\r\n 'madagascar',\r\n 'presenting',\r\n 'troubleshooting',\r\n 'uzbekistan',\r\n 'centuries',\r\n 'magnitude',\r\n 'richardson',\r\n 'fragrances',\r\n 'vocabulary',\r\n 'earthquake',\r\n 'fundraising',\r\n 'geological',\r\n 'assessing',\r\n 'introduces',\r\n 'webmasters',\r\n 'computational',\r\n 'acdbentity',\r\n 'participated',\r\n 'handhelds',\r\n 'answering',\r\n 'impressed',\r\n 'conspiracy',\r\n 'organizer',\r\n 'combinations',\r\n 'preceding',\r\n 'cumulative',\r\n 'amplifier',\r\n 'arbitrary',\r\n 'prominent',\r\n 'lexington',\r\n 'contacted',\r\n 'recorders',\r\n 'occasional',\r\n 'innovations',\r\n 'postcards',\r\n 'reviewing',\r\n 'explicitly',\r\n 'transsexual',\r\n 'citizenship',\r\n 'informative',\r\n 'girlfriend',\r\n 'bloomberg',\r\n 'hierarchy',\r\n 'influenced',\r\n 'abandoned',\r\n 'complement',\r\n 'mauritius',\r\n 'checklist',\r\n 'requesting',\r\n 'lauderdale',\r\n 'scenarios',\r\n 'extraction',\r\n 'elevation',\r\n 'utilization',\r\n 'beverages',\r\n 'calibration',\r\n 'efficiently',\r\n 'entertaining',\r\n 'prerequisite',\r\n 'hypothesis',\r\n 'medicines',\r\n 'regression',\r\n 'enhancements',\r\n 'renewable',\r\n 'intersection',\r\n 'passwords',\r\n 'consistency',\r\n 'collectors',\r\n 'azerbaijan',\r\n 'astrology',\r\n 'occurring',\r\n 'supplemental',\r\n 'travelling',\r\n 'induction',\r\n 'precisely',\r\n 'spreading',\r\n 'provinces',\r\n 'widespread',\r\n 'incidence',\r\n 'incidents',\r\n 'enhancing',\r\n 'interference',\r\n 'palestine',\r\n 'listprice',\r\n 'atmospheric',\r\n 'knowledgestorm',\r\n 'referenced',\r\n 'publicity',\r\n 'proposition',\r\n 'allowance',\r\n 'designation',\r\n 'duplicate',\r\n 'criterion',\r\n 'civilization',\r\n 'vietnamese',\r\n 'tremendous',\r\n 'corrected',\r\n 'encountered',\r\n 'internationally',\r\n 'surrounded',\r\n 'creatures',\r\n 'commented',\r\n 'accomplish',\r\n 'vegetarian',\r\n 'newfoundland',\r\n 'investigated',\r\n 'ambassador',\r\n 'stephanie',\r\n 'contacting',\r\n 'vegetation',\r\n 'findarticles',\r\n 'specially',\r\n 'infectious',\r\n 'continuity',\r\n 'phenomenon',\r\n 'conscious',\r\n 'referrals',\r\n 'differently',\r\n 'integrating',\r\n 'revisions',\r\n 'reasoning',\r\n 'charitable',\r\n 'annotated',\r\n 'convinced',\r\n 'burlington',\r\n 'replacing',\r\n 'researcher',\r\n 'watershed',\r\n 'occupations',\r\n 'acknowledged',\r\n 'equilibrium',\r\n 'characterized',\r\n 'privilege',\r\n 'qualifying',\r\n 'estimation',\r\n 'pediatric',\r\n 'techrepublic',\r\n 'institutes',\r\n 'brochures',\r\n 'traveller',\r\n 'appropriations',\r\n 'suspected',\r\n 'benchmark',\r\n 'beginners',\r\n 'instructors',\r\n 'highlighted',\r\n 'stationery',\r\n 'unauthorized',\r\n 'competent',\r\n 'contributor',\r\n 'demonstrates',\r\n 'gradually',\r\n 'desirable',\r\n 'journalist',\r\n 'afterwards',\r\n 'religions',\r\n 'explosion',\r\n 'signatures',\r\n 'disciplines',\r\n 'daughters',\r\n 'conversations',\r\n 'simplified',\r\n 'motherboard',\r\n 'bibliographic',\r\n 'champagne',\r\n 'deviation',\r\n 'superintendent',\r\n 'housewives',\r\n 'influences',\r\n 'inspections',\r\n 'irrigation',\r\n 'hydraulic',\r\n 'robertson',\r\n 'penetration',\r\n 'conviction',\r\n 'omissions',\r\n 'retrieval',\r\n 'qualities',\r\n 'prototype',\r\n 'importantly',\r\n 'apparatus',\r\n 'explaining',\r\n 'nomination',\r\n 'empirical',\r\n 'dependence',\r\n 'sexuality',\r\n 'polyester',\r\n 'commitments',\r\n 'suggesting',\r\n 'remainder',\r\n 'privileges',\r\n 'televisions',\r\n 'specializing',\r\n 'commodities',\r\n 'motorcycles',\r\n 'concentrate',\r\n 'reproductive',\r\n 'molecules',\r\n 'refrigerator',\r\n 'intervals',\r\n 'sentences',\r\n 'exclusion',\r\n 'workstation',\r\n 'holocaust',\r\n 'receivers',\r\n 'disposition',\r\n 'navigator',\r\n 'investigators',\r\n 'marijuana',\r\n 'cathedral',\r\n 'fairfield',\r\n 'fascinating',\r\n 'landscapes',\r\n 'lafayette',\r\n 'computation',\r\n 'cardiovascular',\r\n 'salvation',\r\n 'predictions',\r\n 'accompanying',\r\n 'selective',\r\n 'arbitration',\r\n 'configuring',\r\n 'editorials',\r\n 'sacrifice',\r\n 'removable',\r\n 'convergence',\r\n 'gibraltar',\r\n 'anthropology',\r\n 'malpractice',\r\n 'reporters',\r\n 'necessity',\r\n 'rendering',\r\n 'hepatitis',\r\n 'nationally',\r\n 'waterproof',\r\n 'specialties',\r\n 'humanitarian',\r\n 'invitations',\r\n 'functioning',\r\n 'economies',\r\n 'alexandria',\r\n 'bacterial',\r\n 'undertake',\r\n 'continuously',\r\n 'achievements',\r\n 'convertible',\r\n 'secretariat',\r\n 'paragraphs',\r\n 'adolescent',\r\n 'nominations',\r\n 'cancelled',\r\n 'introductory',\r\n 'reservoir',\r\n 'occurrence',\r\n 'worcester',\r\n 'demographic',\r\n 'disciplinary',\r\n 'respected',\r\n 'portraits',\r\n 'interpreted',\r\n 'evaluations',\r\n 'elimination',\r\n 'hypothetical',\r\n 'immigrants',\r\n 'complimentary',\r\n 'helicopter',\r\n 'performer',\r\n 'commissions',\r\n 'powerseller',\r\n 'graduated',\r\n 'surprising',\r\n 'unnecessary',\r\n 'dramatically',\r\n 'yugoslavia',\r\n 'characterization',\r\n 'likelihood',\r\n 'fundamentals',\r\n 'contamination',\r\n 'endangered',\r\n 'compromise',\r\n 'expiration',\r\n 'namespace',\r\n 'peripheral',\r\n 'negotiation',\r\n 'opponents',\r\n 'nominated',\r\n 'confidentiality',\r\n 'electoral',\r\n 'changelog',\r\n 'alternatively',\r\n 'greensboro',\r\n 'controversial',\r\n 'recovered',\r\n 'upgrading',\r\n 'frontpage',\r\n 'demanding',\r\n 'defensive',\r\n 'forbidden',\r\n 'programmers',\r\n 'monitored',\r\n 'installations',\r\n 'deutschland',\r\n 'practitioner',\r\n 'motivated',\r\n 'smithsonian',\r\n 'examining',\r\n 'revelation',\r\n 'delegation',\r\n 'dictionaries',\r\n 'greenhouse',\r\n 'transparency',\r\n 'currencies',\r\n 'survivors',\r\n 'positioning',\r\n 'descending',\r\n 'temporarily',\r\n 'frequencies',\r\n 'reflections',\r\n 'municipality',\r\n 'detective',\r\n 'experiencing',\r\n 'fireplace',\r\n 'endorsement',\r\n 'psychiatry',\r\n 'persistent',\r\n 'summaries',\r\n 'looksmart',\r\n 'magnificent',\r\n 'colleague',\r\n 'adaptation',\r\n 'paintball',\r\n 'enclosure',\r\n 'supervisors',\r\n 'westminster',\r\n 'distances',\r\n 'absorption',\r\n 'treasures',\r\n 'transcripts',\r\n 'disappointed',\r\n 'continually',\r\n 'communist',\r\n 'collectible',\r\n 'entrepreneurs',\r\n 'creations',\r\n 'acquisitions',\r\n 'biodiversity',\r\n 'excitement',\r\n 'presently',\r\n 'mysterious',\r\n 'librarian',\r\n 'subsidiaries',\r\n 'stockholm',\r\n 'indonesian',\r\n 'therapist',\r\n 'promising',\r\n 'relaxation',\r\n 'thereafter',\r\n 'commissioners',\r\n 'forwarding',\r\n 'nightmare',\r\n 'reductions',\r\n 'southampton',\r\n 'organisms',\r\n 'telescope',\r\n 'portsmouth',\r\n 'advancement',\r\n 'harassment',\r\n 'generators',\r\n 'generates',\r\n 'replication',\r\n 'inexpensive',\r\n 'receptors',\r\n 'interventions',\r\n 'huntington',\r\n 'internship',\r\n 'aluminium',\r\n 'snowboard',\r\n 'beastality',\r\n 'evanescence',\r\n 'coordinated',\r\n 'shipments',\r\n 'antarctica',\r\n 'chancellor',\r\n 'controversy',\r\n 'legendary',\r\n 'beautifully',\r\n 'antibodies',\r\n 'examinations',\r\n 'immunology',\r\n 'departmental',\r\n 'terminology',\r\n 'gentleman',\r\n 'reproduce',\r\n 'convicted',\r\n 'roommates',\r\n 'threatening',\r\n 'spokesman',\r\n 'activists',\r\n 'frankfurt',\r\n 'encourages',\r\n 'assembled',\r\n 'restructuring',\r\n 'terminals',\r\n 'simulations',\r\n 'sufficiently',\r\n 'conditional',\r\n 'crossword',\r\n 'conceptual',\r\n 'liechtenstein',\r\n 'translator',\r\n 'automobiles',\r\n 'continent',\r\n 'longitude',\r\n 'challenged',\r\n 'telecharger',\r\n 'insertion',\r\n 'instrumentation',\r\n 'constraint',\r\n 'groundwater',\r\n 'strengthening',\r\n 'insulation',\r\n 'infringement',\r\n 'subjective',\r\n 'swaziland',\r\n 'varieties',\r\n 'mediawiki',\r\n 'configurations',\r\n];\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {ElementFormatType} from 'lexical';\r\nimport React, {\r\n createContext,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\n\r\nexport const MIN_ALLOWED_FONT_SIZE = 8;\r\nexport const MAX_ALLOWED_FONT_SIZE = 72;\r\nexport const DEFAULT_FONT_SIZE = 15;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst rootTypeToRootName = {\r\n root: 'Root',\r\n table: 'Table',\r\n};\r\n\r\nexport const blockTypeToBlockName = {\r\n bullet: 'Bulleted List',\r\n check: 'Check List',\r\n code: 'Code Block',\r\n h1: 'Heading 1',\r\n h2: 'Heading 2',\r\n h3: 'Heading 3',\r\n h4: 'Heading 4',\r\n h5: 'Heading 5',\r\n h6: 'Heading 6',\r\n number: 'Numbered List',\r\n paragraph: 'Normal',\r\n quote: 'Quote',\r\n};\r\n\r\n//disable eslint sorting rule for quick reference to toolbar state\r\n/* eslint-disable */\r\nconst INITIAL_TOOLBAR_STATE = {\r\n bgColor: '#fff',\r\n blockType: 'paragraph' as keyof typeof blockTypeToBlockName,\r\n canRedo: false,\r\n canUndo: false,\r\n codeLanguage: '',\r\n codeTheme: '',\r\n elementFormat: 'left' as ElementFormatType,\r\n fontColor: '#000',\r\n fontFamily: 'Arial',\r\n // Current font size in px\r\n fontSize: `${DEFAULT_FONT_SIZE}px`,\r\n // Font size input value - for controlled input\r\n fontSizeInputValue: `${DEFAULT_FONT_SIZE}`,\r\n isBold: false,\r\n isCode: false,\r\n isHighlight: false,\r\n isImageCaption: false,\r\n isItalic: false,\r\n isLink: false,\r\n isRTL: false,\r\n isStrikethrough: false,\r\n isSubscript: false,\r\n isSuperscript: false,\r\n isUnderline: false,\r\n isLowercase: false,\r\n isUppercase: false,\r\n isCapitalize: false,\r\n rootType: 'root' as keyof typeof rootTypeToRootName,\r\n listStartNumber: null as number | null,\r\n};\r\n\r\ntype ToolbarState = typeof INITIAL_TOOLBAR_STATE;\r\n\r\n// Utility type to get keys and infer value types\r\ntype ToolbarStateKey = keyof ToolbarState;\r\ntype ToolbarStateValue<Key extends ToolbarStateKey> = ToolbarState[Key];\r\n\r\ntype ContextShape = {\r\n toolbarState: ToolbarState;\r\n updateToolbarState<Key extends ToolbarStateKey>(\r\n key: Key,\r\n value: ToolbarStateValue<Key>,\r\n ): void;\r\n};\r\n\r\nconst Context = createContext<ContextShape | undefined>(undefined);\r\n\r\nexport const ToolbarContext = ({\r\n children,\r\n}: {\r\n children: ReactNode;\r\n}): JSX.Element => {\r\n const [toolbarState, setToolbarState] = useState(INITIAL_TOOLBAR_STATE);\r\n const selectionFontSize = toolbarState.fontSize;\r\n\r\n const updateToolbarState = useCallback(\r\n <Key extends ToolbarStateKey>(key: Key, value: ToolbarStateValue<Key>) => {\r\n setToolbarState((prev) => ({\r\n ...prev,\r\n [key]: value,\r\n }));\r\n },\r\n [],\r\n );\r\n\r\n useEffect(() => {\r\n updateToolbarState('fontSizeInputValue', selectionFontSize.slice(0, -2));\r\n }, [selectionFontSize, updateToolbarState]);\r\n\r\n const contextValue = useMemo(() => {\r\n return {\r\n toolbarState,\r\n updateToolbarState,\r\n };\r\n }, [toolbarState, updateToolbarState]);\r\n\r\n return <Context.Provider value={contextValue}>{children}</Context.Provider>;\r\n};\r\n\r\nexport const useToolbarState = () => {\r\n const context = useContext(Context);\r\n\r\n if (context === undefined) {\r\n throw new Error('useToolbarState must be used within a ToolbarProvider');\r\n }\r\n\r\n return context;\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {TextNode} from 'lexical';\r\n\r\nimport {uuid as UUID} from '../plugins/AutocompletePlugin';\r\n\r\nexport type SerializedAutocompleteNode = Spread<\r\n {\r\n uuid: string;\r\n },\r\n SerializedTextNode\r\n>;\r\n\r\nexport class AutocompleteNode extends TextNode {\r\n /**\r\n * A unique uuid is generated for each session and assigned to the instance.\r\n * This helps to:\r\n * - Ensures max one Autocomplete node per session.\r\n * - Ensure that when collaboration is enabled, this node is not shown in\r\n * other sessions.\r\n * See https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/AutocompletePlugin/index.tsx\r\n */\r\n __uuid: string;\r\n\r\n static clone(node: AutocompleteNode): AutocompleteNode {\r\n return new AutocompleteNode(node.__text, node.__uuid, node.__key);\r\n }\r\n\r\n static getType(): 'autocomplete' {\r\n return 'autocomplete';\r\n }\r\n\r\n static importDOM() {\r\n // Never import from DOM\r\n return null;\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedAutocompleteNode,\r\n ): AutocompleteNode {\r\n return $createAutocompleteNode(\r\n serializedNode.text,\r\n serializedNode.uuid,\r\n ).updateFromJSON(serializedNode);\r\n }\r\n\r\n exportJSON(): SerializedAutocompleteNode {\r\n return {\r\n ...super.exportJSON(),\r\n uuid: this.__uuid,\r\n };\r\n }\r\n\r\n constructor(text: string, uuid: string, key?: NodeKey) {\r\n super(text, key);\r\n this.__uuid = uuid;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n return false;\r\n }\r\n\r\n exportDOM(_: LexicalEditor): DOMExportOutput {\r\n return {element: null};\r\n }\r\n\r\n excludeFromCopy() {\r\n return true;\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config);\r\n dom.classList.add(config.theme.autocomplete);\r\n if (this.__uuid !== UUID) {\r\n dom.style.display = 'none';\r\n }\r\n return dom;\r\n }\r\n}\r\n\r\nexport function $createAutocompleteNode(\r\n text: string,\r\n uuid: string,\r\n): AutocompleteNode {\r\n return new AutocompleteNode(text, uuid).setMode('token');\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\ntype Force = [number, number];\r\ntype Listener = (force: Force, e: TouchEvent) => void;\r\ntype ElementValues = {\r\n start: null | Force;\r\n listeners: Set<Listener>;\r\n handleTouchstart: (e: TouchEvent) => void;\r\n handleTouchend: (e: TouchEvent) => void;\r\n};\r\n\r\nconst elements = new WeakMap<HTMLElement, ElementValues>();\r\n\r\nfunction readTouch(e: TouchEvent): [number, number] | null {\r\n const touch = e.changedTouches[0];\r\n if (touch === undefined) {\r\n return null;\r\n }\r\n return [touch.clientX, touch.clientY];\r\n}\r\n\r\nfunction addListener(element: HTMLElement, cb: Listener): () => void {\r\n let elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n const listeners = new Set<Listener>();\r\n const handleTouchstart = (e: TouchEvent) => {\r\n if (elementValues !== undefined) {\r\n elementValues.start = readTouch(e);\r\n }\r\n };\r\n const handleTouchend = (e: TouchEvent) => {\r\n if (elementValues === undefined) {\r\n return;\r\n }\r\n const start = elementValues.start;\r\n if (start === null) {\r\n return;\r\n }\r\n const end = readTouch(e);\r\n for (const listener of listeners) {\r\n if (end !== null) {\r\n listener([end[0] - start[0], end[1] - start[1]], e);\r\n }\r\n }\r\n };\r\n element.addEventListener('touchstart', handleTouchstart);\r\n element.addEventListener('touchend', handleTouchend);\r\n\r\n elementValues = {\r\n handleTouchend,\r\n handleTouchstart,\r\n listeners,\r\n start: null,\r\n };\r\n elements.set(element, elementValues);\r\n }\r\n elementValues.listeners.add(cb);\r\n return () => deleteListener(element, cb);\r\n}\r\n\r\nfunction deleteListener(element: HTMLElement, cb: Listener): void {\r\n const elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n return;\r\n }\r\n const listeners = elementValues.listeners;\r\n listeners.delete(cb);\r\n if (listeners.size === 0) {\r\n elements.delete(element);\r\n element.removeEventListener('touchstart', elementValues.handleTouchstart);\r\n element.removeEventListener('touchend', elementValues.handleTouchend);\r\n }\r\n}\r\n\r\nexport function addSwipeLeftListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (x < 0 && -x > Math.abs(y)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeRightListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (x > 0 && x > Math.abs(y)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeUpListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (y < 0 && -y > Math.abs(x)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n\r\nexport function addSwipeDownListener(\r\n element: HTMLElement,\r\n cb: (_force: number, e: TouchEvent) => void,\r\n) {\r\n return addListener(element, (force, e) => {\r\n const [x, y] = force;\r\n if (y > 0 && y > Math.abs(x)) {\r\n cb(x, e);\r\n }\r\n });\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {\r\n AutoEmbedOption,\r\n EmbedConfig,\r\n EmbedMatchResult,\r\n LexicalAutoEmbedPlugin,\r\n URL_MATCHER,\r\n} from '@lexical/react/LexicalAutoEmbedPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useMemo, useState} from 'react';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions} from '../../ui/Dialog';\r\nimport {INSERT_FIGMA_COMMAND} from '../FigmaPlugin';\r\nimport {INSERT_TWEET_COMMAND} from '../TwitterPlugin';\r\nimport {INSERT_YOUTUBE_COMMAND} from '../YouTubePlugin';\r\n\r\ninterface PlaygroundEmbedConfig extends EmbedConfig {\r\n // Human readable name of the embedded content e.g. Tweet or Google Map.\r\n contentName: string;\r\n\r\n // Icon for display.\r\n icon?: JSX.Element;\r\n\r\n // An example of a matching url https://twitter.com/jack/status/20\r\n exampleUrl: string;\r\n\r\n // For extra searching.\r\n keywords: Array<string>;\r\n\r\n // Embed a Figma Project.\r\n description?: string;\r\n}\r\n\r\nexport const YoutubeEmbedConfig: PlaygroundEmbedConfig = {\r\n contentName: 'Youtube Video',\r\n\r\n exampleUrl: 'https://www.youtube.com/watch?v=jNQXAC9IVRw',\r\n\r\n // Icon for display.\r\n icon: <i className=\"icon youtube\" />,\r\n\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_YOUTUBE_COMMAND, result.id);\r\n },\r\n\r\n keywords: ['youtube', 'video'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: async (url: string) => {\r\n const match =\r\n /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/.exec(url);\r\n\r\n const id = match ? (match?.[2].length === 11 ? match[2] : null) : null;\r\n\r\n if (id != null) {\r\n return {\r\n id,\r\n url,\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'youtube-video',\r\n};\r\n\r\nexport const TwitterEmbedConfig: PlaygroundEmbedConfig = {\r\n // e.g. Tweet or Google Map.\r\n contentName: 'X(Tweet)',\r\n\r\n exampleUrl: 'https://x.com/jack/status/20',\r\n\r\n // Icon for display.\r\n icon: <i className=\"icon x\" />,\r\n\r\n // Create the Lexical embed node from the url data.\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_TWEET_COMMAND, result.id);\r\n },\r\n\r\n // For extra searching.\r\n keywords: ['tweet', 'twitter', 'x'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: (text: string) => {\r\n const match =\r\n /^https:\\/\\/(twitter|x)\\.com\\/(#!\\/)?(\\w+)\\/status(es)*\\/(\\d+)/.exec(\r\n text,\r\n );\r\n\r\n if (match != null) {\r\n return {\r\n id: match[5],\r\n url: match[1],\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'tweet',\r\n};\r\n\r\nexport const FigmaEmbedConfig: PlaygroundEmbedConfig = {\r\n contentName: 'Figma Document',\r\n\r\n exampleUrl: 'https://www.figma.com/file/LKQ4FJ4bTnCSjedbRpk931/Sample-File',\r\n\r\n icon: <i className=\"icon figma\" />,\r\n\r\n insertNode: (editor: LexicalEditor, result: EmbedMatchResult) => {\r\n editor.dispatchCommand(INSERT_FIGMA_COMMAND, result.id);\r\n },\r\n\r\n keywords: ['figma', 'figma.com', 'mock-up'],\r\n\r\n // Determine if a given URL is a match and return url data.\r\n parseUrl: (text: string) => {\r\n const match =\r\n /https:\\/\\/([\\w.-]+\\.)?figma.com\\/(file|proto)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?$/.exec(\r\n text,\r\n );\r\n\r\n if (match != null) {\r\n return {\r\n id: match[3],\r\n url: match[0],\r\n };\r\n }\r\n\r\n return null;\r\n },\r\n\r\n type: 'figma',\r\n};\r\n\r\nexport const EmbedConfigs = [\r\n TwitterEmbedConfig,\r\n YoutubeEmbedConfig,\r\n FigmaEmbedConfig,\r\n];\r\n\r\nfunction AutoEmbedMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: AutoEmbedOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n <span className=\"text\">{option.title}</span>\r\n </li>\r\n );\r\n}\r\n\r\nfunction AutoEmbedMenu({\r\n options,\r\n selectedItemIndex,\r\n onOptionClick,\r\n onOptionMouseEnter,\r\n}: {\r\n selectedItemIndex: number | null;\r\n onOptionClick: (option: AutoEmbedOption, index: number) => void;\r\n onOptionMouseEnter: (index: number) => void;\r\n options: Array<AutoEmbedOption>;\r\n}) {\r\n return (\r\n <div className=\"typeahead-popover\">\r\n <ul>\r\n {options.map((option: AutoEmbedOption, i: number) => (\r\n <AutoEmbedMenuItem\r\n index={i}\r\n isSelected={selectedItemIndex === i}\r\n onClick={() => onOptionClick(option, i)}\r\n onMouseEnter={() => onOptionMouseEnter(i)}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\nconst debounce = (callback: (text: string) => void, delay: number) => {\r\n let timeoutId: number;\r\n return (text: string) => {\r\n window.clearTimeout(timeoutId);\r\n timeoutId = window.setTimeout(() => {\r\n callback(text);\r\n }, delay);\r\n };\r\n};\r\n\r\nexport function AutoEmbedDialog({\r\n embedConfig,\r\n onClose,\r\n}: {\r\n embedConfig: PlaygroundEmbedConfig;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [text, setText] = useState('');\r\n const [editor] = useLexicalComposerContext();\r\n const [embedResult, setEmbedResult] = useState<EmbedMatchResult | null>(null);\r\n\r\n const validateText = useMemo(\r\n () =>\r\n debounce((inputText: string) => {\r\n const urlMatch = URL_MATCHER.exec(inputText);\r\n if (embedConfig != null && inputText != null && urlMatch != null) {\r\n Promise.resolve(embedConfig.parseUrl(inputText)).then(\r\n (parseResult) => {\r\n setEmbedResult(parseResult);\r\n },\r\n );\r\n } else if (embedResult != null) {\r\n setEmbedResult(null);\r\n }\r\n }, 200),\r\n [embedConfig, embedResult],\r\n );\r\n\r\n const onClick = () => {\r\n if (embedResult != null) {\r\n embedConfig.insertNode(editor, embedResult);\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <div style={{width: '600px'}}>\r\n <div className=\"Input__wrapper\">\r\n <input\r\n type=\"text\"\r\n className=\"Input__input\"\r\n placeholder={embedConfig.exampleUrl}\r\n value={text}\r\n data-test-id={`${embedConfig.type}-embed-modal-url`}\r\n onChange={(e) => {\r\n const {value} = e.target;\r\n setText(value);\r\n validateText(value);\r\n }}\r\n />\r\n </div>\r\n <DialogActions>\r\n <Button\r\n disabled={!embedResult}\r\n onClick={onClick}\r\n data-test-id={`${embedConfig.type}-embed-modal-submit-btn`}>\r\n Embed\r\n </Button>\r\n </DialogActions>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function AutoEmbedPlugin(): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n\r\n const openEmbedModal = (embedConfig: PlaygroundEmbedConfig) => {\r\n showModal(`Embed ${embedConfig.contentName}`, (onClose) => (\r\n <AutoEmbedDialog embedConfig={embedConfig} onClose={onClose} />\r\n ));\r\n };\r\n\r\n const getMenuOptions = (\r\n activeEmbedConfig: PlaygroundEmbedConfig,\r\n embedFn: () => void,\r\n dismissFn: () => void,\r\n ) => {\r\n return [\r\n new AutoEmbedOption('Dismiss', {\r\n onSelect: dismissFn,\r\n }),\r\n new AutoEmbedOption(`Embed ${activeEmbedConfig.contentName}`, {\r\n onSelect: embedFn,\r\n }),\r\n ];\r\n };\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalAutoEmbedPlugin<PlaygroundEmbedConfig>\r\n embedConfigs={EmbedConfigs}\r\n onOpenEmbedModalForConfig={openEmbedModal}\r\n getMenuOptions={getMenuOptions}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, options, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) =>\r\n anchorElementRef.current\r\n ? ReactDOM.createPortal(\r\n <div\r\n className=\"typeahead-popover auto-embed-menu\"\r\n style={{\r\n marginLeft: `${Math.max(\r\n parseFloat(anchorElementRef.current.style.width) - 200,\r\n 0,\r\n )}px`,\r\n width: 200,\r\n }}>\r\n <AutoEmbedMenu\r\n options={options}\r\n selectedItemIndex={selectedIndex}\r\n onOptionClick={(option: AutoEmbedOption, index: number) => {\r\n setHighlightedIndex(index);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onOptionMouseEnter={(index: number) => {\r\n setHighlightedIndex(index);\r\n }}\r\n />\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null\r\n }\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Dialog.css';\r\n\r\nimport * as React from 'react';\r\nimport {ReactNode} from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n children: ReactNode;\r\n}>;\r\n\r\nexport function DialogButtonsList({children}: Props): JSX.Element {\r\n return <div className=\"DialogButtonsList\">{children}</div>;\r\n}\r\n\r\nexport function DialogActions({\r\n 'data-test-id': dataTestId,\r\n children,\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"DialogActions\" data-test-id={dataTestId}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createFigmaNode, FigmaNode} from '../../nodes/FigmaNode';\r\n\r\nexport const INSERT_FIGMA_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_FIGMA_COMMAND',\r\n);\r\n\r\nexport default function FigmaPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([FigmaNode])) {\r\n throw new Error('FigmaPlugin: FigmaNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_FIGMA_COMMAND,\r\n (payload) => {\r\n const figmaNode = $createFigmaNode(payload);\r\n $insertNodeToNearestRoot(figmaNode);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\n\r\ntype FigmaComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n documentID: string;\r\n}>;\r\n\r\nfunction FigmaComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n documentID,\r\n}: FigmaComponentProps) {\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n <iframe\r\n width=\"560\"\r\n height=\"315\"\r\n src={`https://www.figma.com/embed?embed_host=lexical&url=\\\r\n https://www.figma.com/file/${documentID}`}\r\n allowFullScreen={true}\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedFigmaNode = Spread<\r\n {\r\n documentID: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nexport class FigmaNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'figma';\r\n }\r\n\r\n static clone(node: FigmaNode): FigmaNode {\r\n return new FigmaNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedFigmaNode): FigmaNode {\r\n return $createFigmaNode(serializedNode.documentID).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportJSON(): SerializedFigmaNode {\r\n return {\r\n ...super.exportJSON(),\r\n documentID: this.__id,\r\n };\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://www.figma.com/file/${this.__id}`;\r\n }\r\n\r\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <FigmaComponent\r\n className={className}\r\n format={this.__format}\r\n nodeKey={this.getKey()}\r\n documentID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createFigmaNode(documentID: string): FigmaNode {\r\n return new FigmaNode(documentID);\r\n}\r\n\r\nexport function $isFigmaNode(\r\n node: FigmaNode | LexicalNode | null | undefined,\r\n): node is FigmaNode {\r\n return node instanceof FigmaNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createTweetNode, TweetNode} from '../../nodes/TweetNode';\r\n\r\nexport const INSERT_TWEET_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_TWEET_COMMAND',\r\n);\r\n\r\nexport default function TwitterPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([TweetNode])) {\r\n throw new Error('TwitterPlugin: TweetNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_TWEET_COMMAND,\r\n (payload) => {\r\n const tweetNode = $createTweetNode(payload);\r\n $insertNodeToNearestRoot(tweetNode);\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createYouTubeNode, YouTubeNode} from '../../nodes/YouTubeNode';\r\n\r\nexport const INSERT_YOUTUBE_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_YOUTUBE_COMMAND',\r\n);\r\n\r\nexport default function YouTubePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([YouTubeNode])) {\r\n throw new Error('YouTubePlugin: YouTubeNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_YOUTUBE_COMMAND,\r\n (payload) => {\r\n const youTubeNode = $createYouTubeNode(payload);\r\n $insertNodeToNearestRoot(youTubeNode);\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementFormatType,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport * as React from 'react';\r\n\r\ntype YouTubeComponentProps = Readonly<{\r\n className: Readonly<{\r\n base: string;\r\n focus: string;\r\n }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n videoID: string;\r\n}>;\r\n\r\nfunction YouTubeComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n videoID,\r\n}: YouTubeComponentProps) {\r\n return (\r\n <BlockWithAlignableContents\r\n className={className}\r\n format={format}\r\n nodeKey={nodeKey}>\r\n <iframe\r\n width=\"560\"\r\n height=\"315\"\r\n src={`https://www.youtube-nocookie.com/embed/${videoID}`}\r\n frameBorder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen={true}\r\n title=\"YouTube video\"\r\n />\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\nexport type SerializedYouTubeNode = Spread<\r\n {\r\n videoID: string;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\nfunction $convertYoutubeElement(\r\n domNode: HTMLElement,\r\n): null | DOMConversionOutput {\r\n const videoID = domNode.getAttribute('data-lexical-youtube');\r\n if (videoID) {\r\n const node = $createYouTubeNode(videoID);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport class YouTubeNode extends DecoratorBlockNode {\r\n __id: string;\r\n\r\n static getType(): string {\r\n return 'youtube';\r\n }\r\n\r\n static clone(node: YouTubeNode): YouTubeNode {\r\n return new YouTubeNode(node.__id, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\r\n return $createYouTubeNode(serializedNode.videoID).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportJSON(): SerializedYouTubeNode {\r\n return {\r\n ...super.exportJSON(),\r\n videoID: this.__id,\r\n };\r\n }\r\n\r\n constructor(id: string, format?: ElementFormatType, key?: NodeKey) {\r\n super(format, key);\r\n this.__id = id;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('iframe');\r\n element.setAttribute('data-lexical-youtube', this.__id);\r\n element.setAttribute('width', '560');\r\n element.setAttribute('height', '315');\r\n element.setAttribute(\r\n 'src',\r\n `https://www.youtube-nocookie.com/embed/${this.__id}`,\r\n );\r\n element.setAttribute('frameborder', '0');\r\n element.setAttribute(\r\n 'allow',\r\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\r\n );\r\n element.setAttribute('allowfullscreen', 'true');\r\n element.setAttribute('title', 'YouTube video');\r\n return {element};\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n iframe: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-youtube')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertYoutubeElement,\r\n priority: 1,\r\n };\r\n },\r\n };\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getId(): string {\r\n return this.__id;\r\n }\r\n\r\n getTextContent(\r\n _includeInert?: boolean | undefined,\r\n _includeDirectionless?: false | undefined,\r\n ): string {\r\n return `https://www.youtube.com/watch?v=${this.__id}`;\r\n }\r\n\r\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\r\n const embedBlockTheme = config.theme.embedBlock || {};\r\n const className = {\r\n base: embedBlockTheme.base || '',\r\n focus: embedBlockTheme.focus || '',\r\n };\r\n return (\r\n <YouTubeComponent\r\n className={className}\r\n format={this.__format}\r\n nodeKey={this.getKey()}\r\n videoID={this.__id}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport function $createYouTubeNode(videoID: string): YouTubeNode {\r\n return new YouTubeNode(videoID);\r\n}\r\n\r\nexport function $isYouTubeNode(\r\n node: YouTubeNode | LexicalNode | null | undefined,\r\n): node is YouTubeNode {\r\n return node instanceof YouTubeNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$isCodeNode} from '@lexical/code';\r\nimport {\r\n AutoLinkPlugin,\r\n createLinkMatcherWithRegExp,\r\n} from '@lexical/react/LexicalAutoLinkPlugin';\r\nimport * as React from 'react';\r\n\r\nconst URL_REGEX =\r\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?<![-.+():%])/;\r\n\r\nconst EMAIL_REGEX =\r\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/;\r\n\r\nconst MATCHERS = [\r\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\r\n return text.startsWith('http') ? text : `https://${text}`;\r\n }),\r\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\r\n return `mailto:${text}`;\r\n }),\r\n];\r\n\r\nconst EXCLUDE_PARENTS = [$isCodeNode];\r\n\r\nexport default function LexicalAutoLinkPlugin(): JSX.Element {\r\n return (\r\n <AutoLinkPlugin matchers={MATCHERS} excludeParents={EXCLUDE_PARENTS} />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {\r\n $isCodeNode,\r\n CodeNode,\r\n getLanguageFriendlyName,\r\n normalizeCodeLang,\r\n} from '@lexical/code';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$getNearestNodeFromDOMNode, isHTMLElement} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {CopyButton} from './components/CopyButton';\r\nimport {canBePrettier, PrettierButton} from './components/PrettierButton';\r\nimport {useDebounce} from './utils';\r\n\r\nconst CODE_PADDING = 8;\r\n\r\ninterface Position {\r\n top: string;\r\n right: string;\r\n}\r\n\r\nfunction CodeActionMenuContainer({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const [lang, setLang] = useState('');\r\n const [isShown, setShown] = useState<boolean>(false);\r\n const [shouldListenMouseMove, setShouldListenMouseMove] =\r\n useState<boolean>(false);\r\n const [position, setPosition] = useState<Position>({\r\n right: '0',\r\n top: '0',\r\n });\r\n const codeSetRef = useRef<Set<string>>(new Set());\r\n const codeDOMNodeRef = useRef<HTMLElement | null>(null);\r\n\r\n function getCodeDOMNode(): HTMLElement | null {\r\n return codeDOMNodeRef.current;\r\n }\r\n\r\n const debouncedOnMouseMove = useDebounce(\r\n (event: MouseEvent) => {\r\n const {codeDOMNode, isOutside} = getMouseInfo(event);\r\n if (isOutside) {\r\n setShown(false);\r\n return;\r\n }\r\n\r\n if (!codeDOMNode) {\r\n return;\r\n }\r\n\r\n codeDOMNodeRef.current = codeDOMNode;\r\n\r\n let codeNode: CodeNode | null = null;\r\n let _lang = '';\r\n\r\n editor.update(() => {\r\n const maybeCodeNode = $getNearestNodeFromDOMNode(codeDOMNode);\r\n\r\n if ($isCodeNode(maybeCodeNode)) {\r\n codeNode = maybeCodeNode;\r\n _lang = codeNode.getLanguage() || '';\r\n }\r\n });\r\n\r\n if (codeNode) {\r\n const {y: editorElemY, right: editorElemRight} =\r\n anchorElem.getBoundingClientRect();\r\n const {y, right} = codeDOMNode.getBoundingClientRect();\r\n setLang(_lang);\r\n setShown(true);\r\n setPosition({\r\n right: `${editorElemRight - right + CODE_PADDING}px`,\r\n top: `${y - editorElemY}px`,\r\n });\r\n }\r\n },\r\n 50,\r\n 1000,\r\n );\r\n\r\n useEffect(() => {\r\n if (!shouldListenMouseMove) {\r\n return;\r\n }\r\n\r\n document.addEventListener('mousemove', debouncedOnMouseMove);\r\n\r\n return () => {\r\n setShown(false);\r\n debouncedOnMouseMove.cancel();\r\n document.removeEventListener('mousemove', debouncedOnMouseMove);\r\n };\r\n }, [shouldListenMouseMove, debouncedOnMouseMove]);\r\n\r\n useEffect(() => {\r\n return editor.registerMutationListener(\r\n CodeNode,\r\n (mutations) => {\r\n editor.getEditorState().read(() => {\r\n for (const [key, type] of mutations) {\r\n switch (type) {\r\n case 'created':\r\n codeSetRef.current.add(key);\r\n break;\r\n\r\n case 'destroyed':\r\n codeSetRef.current.delete(key);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n });\r\n setShouldListenMouseMove(codeSetRef.current.size > 0);\r\n },\r\n {skipInitialization: false},\r\n );\r\n }, [editor]);\r\n\r\n const normalizedLang = normalizeCodeLang(lang);\r\n const codeFriendlyName = getLanguageFriendlyName(lang);\r\n\r\n return (\r\n <>\r\n {isShown ? (\r\n <div className=\"code-action-menu-container\" style={{...position}}>\r\n <div className=\"code-highlight-language\">{codeFriendlyName}</div>\r\n <CopyButton editor={editor} getCodeDOMNode={getCodeDOMNode} />\r\n {canBePrettier(normalizedLang) ? (\r\n <PrettierButton\r\n editor={editor}\r\n getCodeDOMNode={getCodeDOMNode}\r\n lang={normalizedLang}\r\n />\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\nfunction getMouseInfo(event: MouseEvent): {\r\n codeDOMNode: HTMLElement | null;\r\n isOutside: boolean;\r\n} {\r\n const target = event.target;\r\n\r\n if (isHTMLElement(target)) {\r\n const codeDOMNode = target.closest<HTMLElement>(\r\n 'code.PlaygroundEditorTheme__code',\r\n );\r\n const isOutside = !(\r\n codeDOMNode ||\r\n target.closest<HTMLElement>('div.code-action-menu-container')\r\n );\r\n\r\n return {codeDOMNode, isOutside};\r\n } else {\r\n return {codeDOMNode: null, isOutside: true};\r\n }\r\n}\r\n\r\nexport default function CodeActionMenuPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): React.ReactPortal | null {\r\n return createPortal(\r\n <CodeActionMenuContainer anchorElem={anchorElem} />,\r\n anchorElem,\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport {$isCodeNode} from '@lexical/code';\nimport {\n $getNearestNodeFromDOMNode,\n $getSelection,\n $setSelection,\n LexicalEditor,\n} from 'lexical';\nimport * as React from 'react';\nimport {useState} from 'react';\n\nimport {useDebounce} from '../../utils';\n\ninterface Props {\n editor: LexicalEditor;\n getCodeDOMNode: () => HTMLElement | null;\n}\n\nexport function CopyButton({editor, getCodeDOMNode}: Props) {\n const [isCopyCompleted, setCopyCompleted] = useState<boolean>(false);\n\n const removeSuccessIcon = useDebounce(() => {\n setCopyCompleted(false);\n }, 1000);\n\n async function handleClick(): Promise<void> {\n const codeDOMNode = getCodeDOMNode();\n\n if (!codeDOMNode) {\n return;\n }\n\n let content = '';\n\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n\n if ($isCodeNode(codeNode)) {\n content = codeNode.getTextContent();\n }\n\n const selection = $getSelection();\n $setSelection(selection);\n });\n\n try {\n await navigator.clipboard.writeText(content);\n setCopyCompleted(true);\n removeSuccessIcon();\n } catch (err) {\n console.error('Failed to copy: ', err);\n }\n }\n\n return (\n <button type=\"button\" className=\"menu-item\" onClick={handleClick} aria-label=\"copy\">\n {isCopyCompleted ? (\n <i className=\"format success\" />\n ) : (\n <i className=\"format copy\" />\n )}\n </button>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {debounce} from 'lodash-es';\r\nimport {useMemo, useRef} from 'react';\r\n\r\nexport function useDebounce<T extends (...args: never[]) => void>(\r\n fn: T,\r\n ms: number,\r\n maxWait?: number,\r\n) {\r\n const funcRef = useRef<T | null>(null);\r\n funcRef.current = fn;\r\n\r\n return useMemo(\r\n () =>\r\n debounce(\r\n (...args: Parameters<T>) => {\r\n if (funcRef.current) {\r\n funcRef.current(...args);\r\n }\r\n },\r\n ms,\r\n {maxWait},\r\n ),\r\n [ms, maxWait],\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport './index.css';\n\nimport {$isCodeNode} from '@lexical/code';\nimport {$getNearestNodeFromDOMNode, LexicalEditor} from 'lexical';\nimport {Options} from 'prettier';\nimport {useState} from 'react';\n\ninterface Props {\n lang: string;\n editor: LexicalEditor;\n getCodeDOMNode: () => HTMLElement | null;\n}\n\nconst PRETTIER_PARSER_MODULES = {\n css: [() => import('prettier/parser-postcss')],\n html: [() => import('prettier/parser-html')],\n js: [\n () => import('prettier/parser-babel'),\n () => import('prettier/plugins/estree'),\n ],\n markdown: [() => import('prettier/parser-markdown')],\n typescript: [\n () => import('prettier/parser-typescript'),\n () => import('prettier/plugins/estree'),\n ],\n} as const;\n\ntype LanguagesType = keyof typeof PRETTIER_PARSER_MODULES;\n\nasync function loadPrettierParserByLang(lang: string) {\n const dynamicImports = PRETTIER_PARSER_MODULES[lang as LanguagesType];\n const modules = await Promise.all(\n dynamicImports.map((dynamicImport) => dynamicImport()),\n );\n return modules;\n}\n\nasync function loadPrettierFormat() {\n const {format} = await import('prettier/standalone');\n return format;\n}\n\nconst PRETTIER_OPTIONS_BY_LANG: Record<string, Options> = {\n css: {parser: 'css'},\n html: {parser: 'html'},\n js: {parser: 'babel'},\n markdown: {parser: 'markdown'},\n typescript: {parser: 'typescript'},\n};\n\nconst LANG_CAN_BE_PRETTIER = Object.keys(PRETTIER_OPTIONS_BY_LANG);\n\nexport function canBePrettier(lang: string): boolean {\n return LANG_CAN_BE_PRETTIER.includes(lang);\n}\n\nfunction getPrettierOptions(lang: string): Options {\n const options = PRETTIER_OPTIONS_BY_LANG[lang];\n if (!options) {\n throw new Error(\n `CodeActionMenuPlugin: Prettier does not support this language: ${lang}`,\n );\n }\n\n return options;\n}\n\nexport function PrettierButton({lang, editor, getCodeDOMNode}: Props) {\n const [syntaxError, setSyntaxError] = useState<string>('');\n const [tipsVisible, setTipsVisible] = useState<boolean>(false);\n\n async function handleClick(): Promise<void> {\n const codeDOMNode = getCodeDOMNode();\n if (!codeDOMNode) {\n return;\n }\n\n let content = '';\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n if ($isCodeNode(codeNode)) {\n content = codeNode.getTextContent();\n }\n });\n if (content === '') {\n return;\n }\n\n try {\n const format = await loadPrettierFormat();\n const options = getPrettierOptions(lang);\n const prettierParsers = await loadPrettierParserByLang(lang);\n options.plugins = prettierParsers.map(\n (parser) => parser.default || parser,\n );\n const formattedCode = await format(content, options);\n\n editor.update(() => {\n const codeNode = $getNearestNodeFromDOMNode(codeDOMNode);\n if ($isCodeNode(codeNode)) {\n const selection = codeNode.select(0);\n selection.insertText(formattedCode);\n setSyntaxError('');\n setTipsVisible(false);\n }\n });\n } catch (error: unknown) {\n setError(error);\n }\n }\n\n function setError(error: unknown) {\n if (error instanceof Error) {\n setSyntaxError(error.message);\n setTipsVisible(true);\n } else {\n console.error('Unexpected error: ', error);\n }\n }\n\n function handleMouseEnter() {\n if (syntaxError !== '') {\n setTipsVisible(true);\n }\n }\n\n function handleMouseLeave() {\n if (syntaxError !== '') {\n setTipsVisible(false);\n }\n }\n\n return (\n <div className=\"prettier-wrapper\">\n <button type=\"button\"\n className=\"menu-item\"\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n aria-label=\"prettier\">\n {syntaxError ? (\n <i className=\"format prettier-error\" />\n ) : (\n <i className=\"format prettier\" />\n )}\n </button>\n {tipsVisible ? (\n <pre className=\"code-error-tips\">{syntaxError}</pre>\n ) : null}\n </div>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {registerCodeHighlighting} from '@lexical/code';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nexport default function CodeHighlightPrismPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n return registerCodeHighlighting(editor);\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Collapsible.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $insertNodeToNearestRoot,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n INSERT_PARAGRAPH_COMMAND,\r\n KEY_ARROW_DOWN_COMMAND,\r\n KEY_ARROW_LEFT_COMMAND,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_ARROW_UP_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createCollapsibleContainerNode,\r\n $isCollapsibleContainerNode,\r\n CollapsibleContainerNode,\r\n} from './CollapsibleContainerNode';\r\nimport {\r\n $createCollapsibleContentNode,\r\n $isCollapsibleContentNode,\r\n CollapsibleContentNode,\r\n} from './CollapsibleContentNode';\r\nimport {\r\n $createCollapsibleTitleNode,\r\n $isCollapsibleTitleNode,\r\n CollapsibleTitleNode,\r\n} from './CollapsibleTitleNode';\r\n\r\nexport const INSERT_COLLAPSIBLE_COMMAND = createCommand<void>(\r\n 'INSERT_COLLAPSIBLE_COMMAND',\r\n);\r\n\r\nexport default function CollapsiblePlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (\r\n !editor.hasNodes([\r\n CollapsibleContainerNode,\r\n CollapsibleTitleNode,\r\n CollapsibleContentNode,\r\n ])\r\n ) {\r\n throw new Error(\r\n 'CollapsiblePlugin: CollapsibleContainerNode, CollapsibleTitleNode, or CollapsibleContentNode not registered on editor',\r\n );\r\n }\r\n\r\n const $onEscapeUp = () => {\r\n const selection = $getSelection();\r\n if (\r\n $isRangeSelection(selection) &&\r\n selection.isCollapsed() &&\r\n selection.anchor.offset === 0\r\n ) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isCollapsibleContainerNode,\r\n );\r\n\r\n if ($isCollapsibleContainerNode(container)) {\r\n const parent = container.getParent();\r\n if (\r\n parent !== null &&\r\n parent.getFirstChild() === container &&\r\n selection.anchor.key === container.getFirstDescendant()?.getKey()\r\n ) {\r\n container.insertBefore($createParagraphNode());\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const $onEscapeDown = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) && selection.isCollapsed()) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isCollapsibleContainerNode,\r\n );\r\n\r\n if ($isCollapsibleContainerNode(container)) {\r\n const parent = container.getParent();\r\n if (parent !== null && parent.getLastChild() === container) {\r\n const titleParagraph = container.getFirstDescendant();\r\n const contentParagraph = container.getLastDescendant();\r\n\r\n if (\r\n (contentParagraph !== null &&\r\n selection.anchor.key === contentParagraph.getKey() &&\r\n selection.anchor.offset ===\r\n contentParagraph.getTextContentSize()) ||\r\n (titleParagraph !== null &&\r\n selection.anchor.key === titleParagraph.getKey() &&\r\n selection.anchor.offset === titleParagraph.getTextContentSize())\r\n ) {\r\n container.insertAfter($createParagraphNode());\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n return mergeRegister(\r\n // Structure enforcing transformers for each node type. In case nesting structure is not\r\n // \"Container > Title + Content\" it'll unwrap nodes and convert it back\r\n // to regular content.\r\n editor.registerNodeTransform(CollapsibleContentNode, (node) => {\r\n const parent = node.getParent();\r\n if (!$isCollapsibleContainerNode(parent)) {\r\n const children = node.getChildren();\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(CollapsibleTitleNode, (node) => {\r\n const parent = node.getParent();\r\n if (!$isCollapsibleContainerNode(parent)) {\r\n node.replace($createParagraphNode().append(...node.getChildren()));\r\n return;\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(CollapsibleContainerNode, (node) => {\r\n const children = node.getChildren();\r\n if (\r\n children.length !== 2 ||\r\n !$isCollapsibleTitleNode(children[0]) ||\r\n !$isCollapsibleContentNode(children[1])\r\n ) {\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n\r\n // When collapsible is the last child pressing down/right arrow will insert paragraph\r\n // below it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if trailing paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_DOWN_COMMAND,\r\n $onEscapeDown,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n $onEscapeDown,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n // When collapsible is the first child pressing up/left arrow will insert paragraph\r\n // above it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if leading paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_UP_COMMAND,\r\n $onEscapeUp,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n editor.registerCommand(\r\n KEY_ARROW_LEFT_COMMAND,\r\n $onEscapeUp,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n\r\n // Enter goes from Title to Content rather than a new line inside Title\r\n editor.registerCommand(\r\n INSERT_PARAGRAPH_COMMAND,\r\n () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const titleNode = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n (node) => $isCollapsibleTitleNode(node),\r\n );\r\n\r\n if ($isCollapsibleTitleNode(titleNode)) {\r\n const container = titleNode.getParent();\r\n if (container && $isCollapsibleContainerNode(container)) {\r\n if (!container.getOpen()) {\r\n container.toggleOpen();\r\n }\r\n titleNode.getNextSibling()?.selectEnd();\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n INSERT_COLLAPSIBLE_COMMAND,\r\n () => {\r\n editor.update(() => {\r\n const title = $createCollapsibleTitleNode();\r\n const paragraph = $createParagraphNode();\r\n $insertNodeToNearestRoot(\r\n $createCollapsibleContainerNode(true).append(\r\n title.append(paragraph),\r\n $createCollapsibleContentNode().append($createParagraphNode()),\r\n ),\r\n );\r\n paragraph.select();\r\n });\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n $getSiblingCaret,\r\n $isElementNode,\r\n $rewindSiblingCaret,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementNode,\r\n isHTMLElement,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n RangeSelection,\r\n SerializedElementNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {setDomHiddenUntilFound} from './CollapsibleUtils';\r\n\r\ntype SerializedCollapsibleContainerNode = Spread<\r\n {\r\n open: boolean;\r\n },\r\n SerializedElementNode\r\n>;\r\n\r\nexport function $convertDetailsElement(\r\n domNode: HTMLDetailsElement,\r\n): DOMConversionOutput | null {\r\n const isOpen = domNode.open !== undefined ? domNode.open : true;\r\n const node = $createCollapsibleContainerNode(isOpen);\r\n return {\r\n node,\r\n };\r\n}\r\n\r\nexport class CollapsibleContainerNode extends ElementNode {\r\n __open: boolean;\r\n\r\n constructor(open: boolean, key?: NodeKey) {\r\n super(key);\r\n this.__open = open;\r\n }\r\n\r\n static getType(): string {\r\n return 'collapsible-container';\r\n }\r\n\r\n static clone(node: CollapsibleContainerNode): CollapsibleContainerNode {\r\n return new CollapsibleContainerNode(node.__open, node.__key);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n\r\n collapseAtStart(selection: RangeSelection): boolean {\r\n // Unwrap the CollapsibleContainerNode by replacing it with the children\r\n // of its children (CollapsibleTitleNode, CollapsibleContentNode)\r\n const nodesToInsert: LexicalNode[] = [];\r\n for (const child of this.getChildren()) {\r\n if ($isElementNode(child)) {\r\n nodesToInsert.push(...child.getChildren());\r\n }\r\n }\r\n const caret = $rewindSiblingCaret($getSiblingCaret(this, 'previous'));\r\n caret.splice(1, nodesToInsert);\r\n // Merge the first child of the CollapsibleTitleNode with the\r\n // previous sibling of the CollapsibleContainerNode\r\n const [firstChild] = nodesToInsert;\r\n if (firstChild) {\r\n firstChild.selectStart().deleteCharacter(true);\r\n }\r\n return true;\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n // details is not well supported in Chrome #5582\r\n let dom: HTMLElement;\r\n if (IS_CHROME) {\r\n dom = document.createElement('div');\r\n dom.setAttribute('open', '');\r\n } else {\r\n const detailsDom = document.createElement('details');\r\n detailsDom.open = this.__open;\r\n detailsDom.addEventListener('toggle', () => {\r\n const open = editor.getEditorState().read(() => this.getOpen());\r\n if (open !== detailsDom.open) {\r\n editor.update(() => this.toggleOpen());\r\n }\r\n });\r\n dom = detailsDom;\r\n }\r\n dom.classList.add('Collapsible__container');\r\n\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLDetailsElement): boolean {\r\n const currentOpen = this.__open;\r\n if (prevNode.__open !== currentOpen) {\r\n // details is not well supported in Chrome #5582\r\n if (IS_CHROME) {\r\n const contentDom = dom.children[1];\r\n if (!isHTMLElement(contentDom)) {\r\n throw new Error('Expected contentDom to be an HTMLElement');\r\n }\r\n if (currentOpen) {\r\n dom.setAttribute('open', '');\r\n contentDom.hidden = false;\r\n } else {\r\n dom.removeAttribute('open');\r\n setDomHiddenUntilFound(contentDom);\r\n }\r\n } else {\r\n dom.open = this.__open;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap<HTMLDetailsElement> | null {\r\n return {\r\n details: (domNode: HTMLDetailsElement) => {\r\n return {\r\n conversion: $convertDetailsElement,\r\n priority: 1,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedCollapsibleContainerNode,\r\n ): CollapsibleContainerNode {\r\n return $createCollapsibleContainerNode(serializedNode.open).updateFromJSON(\r\n serializedNode,\r\n );\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('details');\r\n element.classList.add('Collapsible__container');\r\n element.setAttribute('open', this.__open.toString());\r\n return {element};\r\n }\r\n\r\n exportJSON(): SerializedCollapsibleContainerNode {\r\n return {\r\n ...super.exportJSON(),\r\n open: this.__open,\r\n };\r\n }\r\n\r\n setOpen(open: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__open = open;\r\n }\r\n\r\n getOpen(): boolean {\r\n return this.getLatest().__open;\r\n }\r\n\r\n toggleOpen(): void {\r\n this.setOpen(!this.getOpen());\r\n }\r\n}\r\n\r\nexport function $createCollapsibleContainerNode(\r\n isOpen: boolean,\r\n): CollapsibleContainerNode {\r\n return new CollapsibleContainerNode(isOpen);\r\n}\r\n\r\nexport function $isCollapsibleContainerNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleContainerNode {\r\n return node instanceof CollapsibleContainerNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nexport function setDomHiddenUntilFound(dom: HTMLElement): void {\r\n // @ts-expect-error — 'until-found' is valid for HTMLElement.hidden but not yet in TS types\r\n dom.hidden = 'until-found';\r\n}\r\n\r\nexport function domOnBeforeMatch(dom: HTMLElement, callback: () => void): void {\r\n dom.onbeforematch = callback;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nimport {$isCollapsibleContainerNode} from './CollapsibleContainerNode';\r\nimport {domOnBeforeMatch, setDomHiddenUntilFound} from './CollapsibleUtils';\r\n\r\ntype SerializedCollapsibleContentNode = SerializedElementNode;\r\n\r\nexport function $convertCollapsibleContentElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const node = $createCollapsibleContentNode();\r\n return {\r\n node,\r\n };\r\n}\r\n\r\nexport class CollapsibleContentNode extends ElementNode {\r\n static getType(): string {\r\n return 'collapsible-content';\r\n }\r\n\r\n static clone(node: CollapsibleContentNode): CollapsibleContentNode {\r\n return new CollapsibleContentNode(node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.classList.add('Collapsible__content');\r\n if (IS_CHROME) {\r\n editor.getEditorState().read(() => {\r\n const containerNode = this.getParentOrThrow();\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n if (!containerNode.__open) {\r\n setDomHiddenUntilFound(dom);\r\n }\r\n });\r\n domOnBeforeMatch(dom, () => {\r\n editor.update(() => {\r\n const containerNode = this.getParentOrThrow().getLatest();\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n if (!containerNode.__open) {\r\n containerNode.toggleOpen();\r\n }\r\n });\r\n });\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-collapsible-content')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertCollapsibleContentElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.classList.add('Collapsible__content');\r\n element.setAttribute('data-lexical-collapsible-content', 'true');\r\n return {element};\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedCollapsibleContentNode,\r\n ): CollapsibleContentNode {\r\n return $createCollapsibleContentNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport function $createCollapsibleContentNode(): CollapsibleContentNode {\r\n return new CollapsibleContentNode();\r\n}\r\n\r\nexport function $isCollapsibleContentNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleContentNode {\r\n return node instanceof CollapsibleContentNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_CHROME} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $isElementNode,\r\n buildImportMap,\r\n DOMConversionOutput,\r\n EditorConfig,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n} from 'lexical';\r\n\r\nimport {$isCollapsibleContainerNode} from './CollapsibleContainerNode';\r\nimport {$isCollapsibleContentNode} from './CollapsibleContentNode';\r\n\r\nexport function $convertSummaryElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const node = $createCollapsibleTitleNode();\r\n return {\r\n node,\r\n };\r\n}\r\n\r\n/** @noInheritDoc */\r\nexport class CollapsibleTitleNode extends ElementNode {\r\n /** @internal */\r\n $config() {\r\n return this.config('collapsible-title', {\r\n $transform(node: CollapsibleTitleNode) {\r\n if (node.isEmpty()) {\r\n node.remove();\r\n }\r\n },\r\n extends: ElementNode,\r\n importDOM: buildImportMap({\r\n summary: () => ({\r\n conversion: $convertSummaryElement,\r\n priority: 1,\r\n }),\r\n }),\r\n });\r\n }\r\n\r\n createDOM(config: EditorConfig, editor: LexicalEditor): HTMLElement {\r\n const dom = document.createElement('summary');\r\n dom.classList.add('Collapsible__title');\r\n if (IS_CHROME) {\r\n dom.addEventListener('click', () => {\r\n editor.update(() => {\r\n const collapsibleContainer = this.getLatest().getParentOrThrow();\r\n if (!$isCollapsibleContainerNode(collapsibleContainer)) {\r\n throw new Error(\r\n 'Expected parent node to be a CollapsibleContainerNode',\r\n );\r\n }\r\n collapsibleContainer.toggleOpen();\r\n });\r\n });\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n return false;\r\n }\r\n\r\n insertNewAfter(_: RangeSelection, restoreSelection = true): ElementNode {\r\n const containerNode = this.getParentOrThrow();\r\n\r\n if (!$isCollapsibleContainerNode(containerNode)) {\r\n throw new Error(\r\n 'CollapsibleTitleNode expects to be child of CollapsibleContainerNode',\r\n );\r\n }\r\n\r\n if (containerNode.getOpen()) {\r\n const contentNode = this.getNextSibling();\r\n if (!$isCollapsibleContentNode(contentNode)) {\r\n throw new Error(\r\n 'CollapsibleTitleNode expects to have CollapsibleContentNode sibling',\r\n );\r\n }\r\n\r\n const firstChild = contentNode.getFirstChild();\r\n if ($isElementNode(firstChild)) {\r\n return firstChild;\r\n } else {\r\n const paragraph = $createParagraphNode();\r\n contentNode.append(paragraph);\r\n return paragraph;\r\n }\r\n } else {\r\n const paragraph = $createParagraphNode();\r\n containerNode.insertAfter(paragraph, restoreSelection);\r\n return paragraph;\r\n }\r\n }\r\n}\r\n\r\nexport function $createCollapsibleTitleNode(): CollapsibleTitleNode {\r\n return new CollapsibleTitleNode();\r\n}\r\n\r\nexport function $isCollapsibleTitleNode(\r\n node: LexicalNode | null | undefined,\r\n): node is CollapsibleTitleNode {\r\n return node instanceof CollapsibleTitleNode;\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {Provider} from '@lexical/yjs';\nimport type {\n EditorState,\n LexicalCommand,\n LexicalEditor,\n NodeKey,\n RangeSelection,\n} from 'lexical';\nimport type {JSX} from 'react';\nimport type {Doc} from 'yjs';\n\nimport './index.css';\n\nimport {\n $createMarkNode,\n $getMarkIDs,\n $isMarkNode,\n $unwrapMarkNode,\n $wrapSelectionInMarkNode,\n MarkNode,\n} from '@lexical/mark';\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\nimport {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\nimport {LexicalComposer} from '@lexical/react/LexicalComposer';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {EditorRefPlugin} from '@lexical/react/LexicalEditorRefPlugin';\nimport {LexicalErrorBoundary} from '@lexical/react/LexicalErrorBoundary';\nimport {HistoryPlugin} from '@lexical/react/LexicalHistoryPlugin';\nimport {OnChangePlugin} from '@lexical/react/LexicalOnChangePlugin';\nimport {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin';\nimport {createDOMRange, createRectsFromDOMRange} from '@lexical/selection';\nimport {$isRootTextContentEmpty, $rootTextContent} from '@lexical/text';\nimport {mergeRegister, registerNestedElementResolver} from '@lexical/utils';\nimport {\n $getNodeByKey,\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n CLEAR_EDITOR_COMMAND,\n COLLABORATION_TAG,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n} from 'lexical';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as React from 'react';\nimport {createPortal} from 'react-dom';\n\nimport {\n Comment,\n Comments,\n CommentStore,\n createComment,\n createThread,\n Thread,\n useCommentStore,\n} from '../../commenting';\nimport useModal from '../../hooks/useModal';\nimport CommentEditorTheme from '../../themes/CommentEditorTheme';\nimport Button from '../../ui/Button';\nimport ContentEditable from '../../ui/ContentEditable';\n\nexport const INSERT_INLINE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_INLINE_COMMAND',\n);\n\nfunction AddCommentBox({\n anchorKey,\n editor,\n onAddComment,\n}: {\n anchorKey: NodeKey;\n editor: LexicalEditor;\n onAddComment: () => void;\n}): JSX.Element {\n const boxRef = useRef<HTMLDivElement>(null);\n\n const updatePosition = useCallback(() => {\n const boxElem = boxRef.current;\n const rootElement = editor.getRootElement();\n const anchorElement = editor.getElementByKey(anchorKey);\n\n if (boxElem !== null && rootElement !== null && anchorElement !== null) {\n const {right} = rootElement.getBoundingClientRect();\n const {top} = anchorElement.getBoundingClientRect();\n boxElem.style.left = `${right - 20}px`;\n boxElem.style.top = `${top - 30}px`;\n }\n }, [anchorKey, editor]);\n\n useEffect(() => {\n window.addEventListener('resize', updatePosition);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n };\n }, [editor, updatePosition]);\n\n useLayoutEffect(() => {\n updatePosition();\n }, [anchorKey, editor, updatePosition]);\n\n return (\n <div className=\"CommentPlugin_AddCommentBox\" ref={boxRef}>\n <button type=\"button\"\n className=\"CommentPlugin_AddCommentBox_button\"\n onClick={onAddComment}>\n <i className=\"icon add-comment\" />\n </button>\n </div>\n );\n}\n\nfunction EscapeHandlerPlugin({\n onEscape,\n}: {\n onEscape: (e: KeyboardEvent) => boolean;\n}): null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n (event: KeyboardEvent) => {\n return onEscape(event);\n },\n COMMAND_PRIORITY_NORMAL,\n );\n }, [editor, onEscape]);\n\n return null;\n}\n\nfunction PlainTextEditor({\n className,\n autoFocus,\n onEscape,\n onChange,\n editorRef,\n placeholder = 'Type a comment...',\n}: {\n autoFocus?: boolean;\n className?: string;\n editorRef?: {current: null | LexicalEditor};\n onChange: (editorState: EditorState, editor: LexicalEditor) => void;\n onEscape: (e: KeyboardEvent) => boolean;\n placeholder?: string;\n}) {\n const initialConfig = {\n namespace: 'Commenting',\n nodes: [],\n onError: (error: Error) => {\n throw error;\n },\n theme: CommentEditorTheme,\n };\n\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <div className=\"CommentPlugin_CommentInputBox_EditorContainer\">\n <PlainTextPlugin\n contentEditable={\n <ContentEditable placeholder={placeholder} className={className} />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n <OnChangePlugin onChange={onChange} />\n <HistoryPlugin />\n {autoFocus !== false && <AutoFocusPlugin />}\n <EscapeHandlerPlugin onEscape={onEscape} />\n <ClearEditorPlugin />\n {editorRef !== undefined && <EditorRefPlugin editorRef={editorRef} />}\n </div>\n </LexicalComposer>\n );\n}\n\nfunction useOnChange(\n setContent: (text: string) => void,\n setCanSubmit: (canSubmit: boolean) => void,\n) {\n return useCallback(\n (editorState: EditorState, _editor: LexicalEditor) => {\n editorState.read(() => {\n setContent($rootTextContent());\n setCanSubmit(!$isRootTextContentEmpty(_editor.isComposing(), true));\n });\n },\n [setCanSubmit, setContent],\n );\n}\n\nfunction CommentInputBox({\n editor,\n cancelAddComment,\n submitAddComment,\n}: {\n cancelAddComment: () => void;\n editor: LexicalEditor;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n selection?: RangeSelection | null,\n ) => void;\n}) {\n const [content, setContent] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n const boxRef = useRef<HTMLDivElement>(null);\n const selectionState = useMemo(\n () => ({\n container: document.createElement('div'),\n elements: [],\n }),\n [],\n );\n const selectionRef = useRef<RangeSelection | null>(null);\n const author = useCollabAuthorName();\n\n const updateLocation = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n selectionRef.current = selection.clone();\n const anchor = selection.anchor;\n const focus = selection.focus;\n const range = createDOMRange(\n editor,\n anchor.getNode(),\n anchor.offset,\n focus.getNode(),\n focus.offset,\n );\n const boxElem = boxRef.current;\n if (range !== null && boxElem !== null) {\n const {left, bottom, width} = range.getBoundingClientRect();\n const selectionRects = createRectsFromDOMRange(editor, range);\n let correctedLeft =\n selectionRects.length === 1 ? left + width / 2 - 125 : left - 125;\n if (correctedLeft < 10) {\n correctedLeft = 10;\n }\n boxElem.style.left = `${correctedLeft}px`;\n boxElem.style.top = `${\n bottom +\n 20 +\n (window.pageYOffset || document.documentElement.scrollTop)\n }px`;\n const selectionRectsLength = selectionRects.length;\n const {container} = selectionState;\n const elements: Array<HTMLSpanElement> = selectionState.elements;\n const elementsLength = elements.length;\n\n for (let i = 0; i < selectionRectsLength; i++) {\n const selectionRect = selectionRects[i];\n let elem: HTMLSpanElement = elements[i];\n if (elem === undefined) {\n elem = document.createElement('span');\n elements[i] = elem;\n container.appendChild(elem);\n }\n const color = '255, 212, 0';\n const style = `position:absolute;top:${\n selectionRect.top +\n (window.pageYOffset || document.documentElement.scrollTop)\n }px;left:${selectionRect.left}px;height:${\n selectionRect.height\n }px;width:${\n selectionRect.width\n }px;background-color:rgba(${color}, 0.3);pointer-events:none;z-index:5;`;\n elem.style.cssText = style;\n }\n for (let i = elementsLength - 1; i >= selectionRectsLength; i--) {\n const elem = elements[i];\n container.removeChild(elem);\n elements.pop();\n }\n }\n }\n });\n }, [editor, selectionState]);\n\n useLayoutEffect(() => {\n updateLocation();\n const container = selectionState.container;\n const body = document.body;\n if (body !== null) {\n body.appendChild(container);\n return () => {\n body.removeChild(container);\n };\n }\n }, [selectionState.container, updateLocation]);\n\n useEffect(() => {\n window.addEventListener('resize', updateLocation);\n\n return () => {\n window.removeEventListener('resize', updateLocation);\n };\n }, [updateLocation]);\n\n const onEscape = (event: KeyboardEvent): boolean => {\n event.preventDefault();\n cancelAddComment();\n return true;\n };\n\n const submitComment = () => {\n if (canSubmit) {\n let quote = editor.getEditorState().read(() => {\n const selection = selectionRef.current;\n return selection ? selection.getTextContent() : '';\n });\n if (quote.length > 100) {\n quote = quote.slice(0, 99) + '…';\n }\n submitAddComment(\n createThread(quote, [createComment(content, author)]),\n true,\n undefined,\n selectionRef.current,\n );\n selectionRef.current = null;\n }\n };\n\n const onChange = useOnChange(setContent, setCanSubmit);\n\n return (\n <div className=\"CommentPlugin_CommentInputBox\" ref={boxRef}>\n <PlainTextEditor\n className=\"CommentPlugin_CommentInputBox_Editor\"\n onEscape={onEscape}\n onChange={onChange}\n />\n <div className=\"CommentPlugin_CommentInputBox_Buttons\">\n <Button\n onClick={cancelAddComment}\n className=\"CommentPlugin_CommentInputBox_Button\">\n Cancel\n </Button>\n <Button\n onClick={submitComment}\n disabled={!canSubmit}\n className=\"CommentPlugin_CommentInputBox_Button primary\">\n Comment\n </Button>\n </div>\n </div>\n );\n}\n\nfunction CommentsComposer({\n submitAddComment,\n thread,\n placeholder,\n}: {\n placeholder?: string;\n submitAddComment: (\n commentOrThread: Comment,\n isInlineComment: boolean,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n thread?: Thread;\n}) {\n const [content, setContent] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n const editorRef = useRef<LexicalEditor>(null);\n const author = useCollabAuthorName();\n\n const onChange = useOnChange(setContent, setCanSubmit);\n\n const submitComment = () => {\n if (canSubmit) {\n submitAddComment(createComment(content, author), false, thread);\n const editor = editorRef.current;\n if (editor !== null) {\n editor.dispatchCommand(CLEAR_EDITOR_COMMAND, undefined);\n }\n }\n };\n\n return (\n <>\n <PlainTextEditor\n className=\"CommentPlugin_CommentsPanel_Editor\"\n autoFocus={false}\n onEscape={() => {\n return true;\n }}\n onChange={onChange}\n editorRef={editorRef}\n placeholder={placeholder}\n />\n <Button\n className=\"CommentPlugin_CommentsPanel_SendButton\"\n onClick={submitComment}\n disabled={!canSubmit}>\n <i className=\"send\" />\n </Button>\n </>\n );\n}\n\nfunction ShowDeleteCommentOrThreadDialog({\n commentOrThread,\n deleteCommentOrThread,\n onClose,\n thread = undefined,\n}: {\n commentOrThread: Comment | Thread;\n\n deleteCommentOrThread: (\n comment: Comment | Thread,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n onClose: () => void;\n thread?: Thread;\n}): JSX.Element {\n return (\n <>\n Are you sure you want to delete this {commentOrThread.type}?\n <div className=\"Modal__content\">\n <Button\n onClick={() => {\n deleteCommentOrThread(commentOrThread, thread);\n onClose();\n }}>\n Delete\n </Button>{' '}\n <Button\n onClick={() => {\n onClose();\n }}>\n Cancel\n </Button>\n </div>\n </>\n );\n}\n\nfunction CommentsPanelListComment({\n comment,\n deleteComment,\n thread,\n rtf,\n}: {\n comment: Comment;\n deleteComment: (\n commentOrThread: Comment | Thread,\n // eslint-disable-next-line no-shadow\n thread?: Thread,\n ) => void;\n rtf: Intl.RelativeTimeFormat;\n thread?: Thread;\n}): JSX.Element {\n const seconds = Math.round(\n (comment.timeStamp - (performance.timeOrigin + performance.now())) / 1000,\n );\n const minutes = Math.round(seconds / 60);\n const [modal, showModal] = useModal();\n\n return (\n <li className=\"CommentPlugin_CommentsPanel_List_Comment\">\n <div className=\"CommentPlugin_CommentsPanel_List_Details\">\n <span className=\"CommentPlugin_CommentsPanel_List_Comment_Author\">\n {comment.author}\n </span>\n <span className=\"CommentPlugin_CommentsPanel_List_Comment_Time\">\n · {seconds > -10 ? 'Just now' : rtf.format(minutes, 'minute')}\n </span>\n </div>\n <p\n className={\n comment.deleted ? 'CommentPlugin_CommentsPanel_DeletedComment' : ''\n }>\n {comment.content}\n </p>\n {!comment.deleted && (\n <>\n <Button\n onClick={() => {\n showModal('Delete Comment', (onClose) => (\n <ShowDeleteCommentOrThreadDialog\n commentOrThread={comment}\n deleteCommentOrThread={deleteComment}\n thread={thread}\n onClose={onClose}\n />\n ));\n }}\n className=\"CommentPlugin_CommentsPanel_List_DeleteButton\">\n <i className=\"delete\" />\n </Button>\n {modal}\n </>\n )}\n </li>\n );\n}\n\nfunction CommentsPanelList({\n activeIDs,\n comments,\n deleteCommentOrThread,\n listRef,\n submitAddComment,\n markNodeMap,\n}: {\n activeIDs: Array<string>;\n comments: Comments;\n deleteCommentOrThread: (\n commentOrThread: Comment | Thread,\n thread?: Thread,\n ) => void;\n listRef: {current: null | HTMLUListElement};\n markNodeMap: Map<string, Set<NodeKey>>;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n ) => void;\n}): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const [counter, setCounter] = useState(0);\n const [modal, showModal] = useModal();\n const rtf = useMemo(\n () =>\n new Intl.RelativeTimeFormat('en', {\n localeMatcher: 'best fit',\n numeric: 'auto',\n style: 'short',\n }),\n [],\n );\n\n useEffect(() => {\n // Used to keep the time stamp up to date\n const id = setTimeout(() => {\n setCounter(counter + 1);\n }, 10000);\n\n return () => {\n clearTimeout(id);\n };\n }, [counter]);\n\n return (\n <ul className=\"CommentPlugin_CommentsPanel_List\" ref={listRef}>\n {comments.map((commentOrThread) => {\n const id = commentOrThread.id;\n if (commentOrThread.type === 'thread') {\n const handleClickThread = () => {\n const markNodeKeys = markNodeMap.get(id);\n if (\n markNodeKeys !== undefined &&\n (activeIDs === null || activeIDs.indexOf(id) === -1)\n ) {\n const activeElement = document.activeElement;\n // Move selection to the start of the mark, so that we\n // update the UI with the selected thread.\n editor.update(\n () => {\n const markNodeKey = Array.from(markNodeKeys)[0];\n const markNode = $getNodeByKey<MarkNode>(markNodeKey);\n if ($isMarkNode(markNode)) {\n markNode.selectStart();\n }\n },\n {\n onUpdate() {\n // Restore selection to the previous element\n if (activeElement !== null) {\n (activeElement as HTMLElement).focus();\n }\n },\n },\n );\n }\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <li\n key={id}\n onClick={handleClickThread}\n className={`CommentPlugin_CommentsPanel_List_Thread ${\n markNodeMap.has(id) ? 'interactive' : ''\n } ${activeIDs.indexOf(id) === -1 ? '' : 'active'}`}>\n <div className=\"CommentPlugin_CommentsPanel_List_Thread_QuoteBox\">\n <blockquote className=\"CommentPlugin_CommentsPanel_List_Thread_Quote\">\n {'> '}\n <span>{commentOrThread.quote}</span>\n </blockquote>\n {/* INTRODUCE DELETE THREAD HERE*/}\n <Button\n onClick={() => {\n showModal('Delete Thread', (onClose) => (\n <ShowDeleteCommentOrThreadDialog\n commentOrThread={commentOrThread}\n deleteCommentOrThread={deleteCommentOrThread}\n onClose={onClose}\n />\n ));\n }}\n className=\"CommentPlugin_CommentsPanel_List_DeleteButton\">\n <i className=\"delete\" />\n </Button>\n {modal}\n </div>\n <ul className=\"CommentPlugin_CommentsPanel_List_Thread_Comments\">\n {commentOrThread.comments.map((comment) => (\n <CommentsPanelListComment\n key={comment.id}\n comment={comment}\n deleteComment={deleteCommentOrThread}\n thread={commentOrThread}\n rtf={rtf}\n />\n ))}\n </ul>\n <div className=\"CommentPlugin_CommentsPanel_List_Thread_Editor\">\n <CommentsComposer\n submitAddComment={submitAddComment}\n thread={commentOrThread}\n placeholder=\"Reply to comment...\"\n />\n </div>\n </li>\n );\n }\n return (\n <CommentsPanelListComment\n key={id}\n comment={commentOrThread}\n deleteComment={deleteCommentOrThread}\n rtf={rtf}\n />\n );\n })}\n </ul>\n );\n}\n\nfunction CommentsPanel({\n activeIDs,\n deleteCommentOrThread,\n comments,\n submitAddComment,\n markNodeMap,\n}: {\n activeIDs: Array<string>;\n comments: Comments;\n deleteCommentOrThread: (\n commentOrThread: Comment | Thread,\n thread?: Thread,\n ) => void;\n markNodeMap: Map<string, Set<NodeKey>>;\n submitAddComment: (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n ) => void;\n}): JSX.Element {\n const listRef = useRef<HTMLUListElement>(null);\n const isEmpty = comments.length === 0;\n\n return (\n <div className=\"CommentPlugin_CommentsPanel\">\n <h2 className=\"CommentPlugin_CommentsPanel_Heading\">Comments</h2>\n {isEmpty ? (\n <div className=\"CommentPlugin_CommentsPanel_Empty\">No Comments</div>\n ) : (\n <CommentsPanelList\n activeIDs={activeIDs}\n comments={comments}\n deleteCommentOrThread={deleteCommentOrThread}\n listRef={listRef}\n submitAddComment={submitAddComment}\n markNodeMap={markNodeMap}\n />\n )}\n </div>\n );\n}\n\nfunction useCollabAuthorName(): string {\n const collabContext = useCollaborationContext();\n const {yjsDocMap, name} = collabContext;\n return yjsDocMap.has('comments') ? name : 'Playground User';\n}\n\nexport default function CommentPlugin({\n providerFactory,\n}: {\n providerFactory?: (id: string, yjsDocMap: Map<string, Doc>) => Provider;\n}): JSX.Element {\n const collabContext = useCollaborationContext();\n const [editor] = useLexicalComposerContext();\n const commentStore = useMemo(() => new CommentStore(editor), [editor]);\n const comments = useCommentStore(commentStore);\n const markNodeMap = useMemo<Map<string, Set<NodeKey>>>(() => {\n return new Map();\n }, []);\n const [activeAnchorKey, setActiveAnchorKey] = useState<NodeKey | null>();\n const [activeIDs, setActiveIDs] = useState<Array<string>>([]);\n const [showCommentInput, setShowCommentInput] = useState(false);\n const [showComments, setShowComments] = useState(false);\n const {yjsDocMap} = collabContext;\n\n useEffect(() => {\n if (providerFactory) {\n const provider = providerFactory('comments', yjsDocMap);\n return commentStore.registerCollaboration(provider);\n }\n }, [commentStore, providerFactory, yjsDocMap]);\n\n const cancelAddComment = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n // Restore selection\n if (selection !== null) {\n selection.dirty = true;\n }\n });\n setShowCommentInput(false);\n }, [editor]);\n\n const deleteCommentOrThread = useCallback(\n (comment: Comment | Thread, thread?: Thread) => {\n if (comment.type === 'comment') {\n const deletionInfo = commentStore.deleteCommentOrThread(\n comment,\n thread,\n );\n if (!deletionInfo) {\n return;\n }\n const {markedComment, index} = deletionInfo;\n commentStore.addComment(markedComment, thread, index);\n } else {\n commentStore.deleteCommentOrThread(comment);\n // Remove ids from associated marks\n const id = thread !== undefined ? thread.id : comment.id;\n const markNodeKeys = markNodeMap.get(id);\n if (markNodeKeys !== undefined) {\n // Do async to avoid causing a React infinite loop\n setTimeout(() => {\n editor.update(() => {\n for (const key of markNodeKeys) {\n const node: null | MarkNode = $getNodeByKey(key);\n if ($isMarkNode(node)) {\n node.deleteID(id);\n if (node.getIDs().length === 0) {\n $unwrapMarkNode(node);\n }\n }\n }\n });\n });\n }\n }\n },\n [commentStore, editor, markNodeMap],\n );\n\n const submitAddComment = useCallback(\n (\n commentOrThread: Comment | Thread,\n isInlineComment: boolean,\n thread?: Thread,\n selection?: RangeSelection | null,\n ) => {\n commentStore.addComment(commentOrThread, thread);\n if (isInlineComment) {\n editor.update(() => {\n if ($isRangeSelection(selection)) {\n const isBackward = selection.isBackward();\n const id = commentOrThread.id;\n\n // Wrap content in a MarkNode\n $wrapSelectionInMarkNode(selection, isBackward, id);\n }\n });\n setShowCommentInput(false);\n }\n },\n [commentStore, editor],\n );\n\n useEffect(() => {\n const changedElems: Array<HTMLElement> = [];\n for (let i = 0; i < activeIDs.length; i++) {\n const id = activeIDs[i];\n const keys = markNodeMap.get(id);\n if (keys !== undefined) {\n for (const key of keys) {\n const elem = editor.getElementByKey(key);\n if (elem !== null) {\n elem.classList.add('selected');\n changedElems.push(elem);\n setShowComments(true);\n }\n }\n }\n }\n return () => {\n for (let i = 0; i < changedElems.length; i++) {\n const changedElem = changedElems[i];\n changedElem.classList.remove('selected');\n }\n };\n }, [activeIDs, editor, markNodeMap]);\n\n useEffect(() => {\n const markNodeKeysToIDs: Map<NodeKey, Array<string>> = new Map();\n\n return mergeRegister(\n registerNestedElementResolver<MarkNode>(\n editor,\n MarkNode,\n (from: MarkNode) => {\n return $createMarkNode(from.getIDs());\n },\n (from: MarkNode, to: MarkNode) => {\n // Merge the IDs\n const ids = from.getIDs();\n ids.forEach((id) => {\n to.addID(id);\n });\n },\n ),\n editor.registerMutationListener(\n MarkNode,\n (mutations) => {\n editor.getEditorState().read(() => {\n for (const [key, mutation] of mutations) {\n const node: null | MarkNode = $getNodeByKey(key);\n let ids: NodeKey[] = [];\n\n if (mutation === 'destroyed') {\n ids = markNodeKeysToIDs.get(key) || [];\n } else if ($isMarkNode(node)) {\n ids = node.getIDs();\n }\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n let markNodeKeys = markNodeMap.get(id);\n markNodeKeysToIDs.set(key, ids);\n\n if (mutation === 'destroyed') {\n if (markNodeKeys !== undefined) {\n markNodeKeys.delete(key);\n if (markNodeKeys.size === 0) {\n markNodeMap.delete(id);\n }\n }\n } else {\n if (markNodeKeys === undefined) {\n markNodeKeys = new Set();\n markNodeMap.set(id, markNodeKeys);\n }\n if (!markNodeKeys.has(key)) {\n markNodeKeys.add(key);\n }\n }\n }\n }\n });\n },\n {skipInitialization: false},\n ),\n editor.registerUpdateListener(({editorState, tags}) => {\n editorState.read(() => {\n const selection = $getSelection();\n let hasActiveIds = false;\n let hasAnchorKey = false;\n\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n\n if ($isTextNode(anchorNode)) {\n const commentIDs = $getMarkIDs(\n anchorNode,\n selection.anchor.offset,\n );\n if (commentIDs !== null) {\n setActiveIDs(commentIDs);\n hasActiveIds = true;\n }\n if (!selection.isCollapsed()) {\n setActiveAnchorKey(anchorNode.getKey());\n hasAnchorKey = true;\n }\n }\n }\n if (!hasActiveIds) {\n setActiveIDs((_activeIds) =>\n _activeIds.length === 0 ? _activeIds : [],\n );\n }\n if (!hasAnchorKey) {\n setActiveAnchorKey(null);\n }\n if (!tags.has(COLLABORATION_TAG) && $isRangeSelection(selection)) {\n setShowCommentInput(false);\n }\n });\n }),\n editor.registerCommand(\n INSERT_INLINE_COMMAND,\n () => {\n const domSelection = getDOMSelection(editor._window);\n if (domSelection !== null) {\n domSelection.removeAllRanges();\n }\n setShowCommentInput(true);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n );\n }, [editor, markNodeMap]);\n\n const onAddComment = () => {\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\n };\n\n return (\n <>\n {showCommentInput &&\n createPortal(\n <CommentInputBox\n editor={editor}\n cancelAddComment={cancelAddComment}\n submitAddComment={submitAddComment}\n />,\n document.body,\n )}\n {activeAnchorKey !== null &&\n activeAnchorKey !== undefined &&\n !showCommentInput &&\n createPortal(\n <AddCommentBox\n anchorKey={activeAnchorKey}\n editor={editor}\n onAddComment={onAddComment}\n />,\n document.body,\n )}\n {createPortal(\n <Button\n className={`CommentPlugin_ShowCommentsButton ${\n showComments ? 'active' : ''\n }`}\n onClick={() => setShowComments(!showComments)}\n title={showComments ? 'Hide Comments' : 'Show Comments'}>\n <i className=\"comments\" />\n </Button>,\n document.body,\n )}\n {showComments &&\n createPortal(\n <CommentsPanel\n comments={comments}\n submitAddComment={submitAddComment}\n deleteCommentOrThread={deleteCommentOrThread}\n activeIDs={activeIDs}\n markNodeMap={markNodeMap}\n />,\n document.body,\n )}\n </>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {LexicalEditor} from 'lexical';\r\n\r\nimport {Provider, TOGGLE_CONNECT_COMMAND} from '@lexical/yjs';\r\nimport {COMMAND_PRIORITY_LOW} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\nimport {\r\n Array as YArray,\r\n Map as YMap,\r\n Transaction,\r\n YArrayEvent,\r\n YEvent,\r\n} from 'yjs';\r\n\r\nexport type Comment = {\r\n author: string;\r\n content: string;\r\n deleted: boolean;\r\n id: string;\r\n timeStamp: number;\r\n type: 'comment';\r\n};\r\n\r\nexport type Thread = {\r\n comments: Array<Comment>;\r\n id: string;\r\n quote: string;\r\n type: 'thread';\r\n};\r\n\r\nexport type Comments = Array<Thread | Comment>;\r\n\r\nfunction createUID(): string {\r\n return Math.random()\r\n .toString(36)\r\n .replace(/[^a-z]+/g, '')\r\n .substring(0, 5);\r\n}\r\n\r\nexport function createComment(\r\n content: string,\r\n author: string,\r\n id?: string,\r\n timeStamp?: number,\r\n deleted?: boolean,\r\n): Comment {\r\n return {\r\n author,\r\n content,\r\n deleted: deleted === undefined ? false : deleted,\r\n id: id === undefined ? createUID() : id,\r\n timeStamp:\r\n timeStamp === undefined\r\n ? performance.timeOrigin + performance.now()\r\n : timeStamp,\r\n type: 'comment',\r\n };\r\n}\r\n\r\nexport function createThread(\r\n quote: string,\r\n comments: Array<Comment>,\r\n id?: string,\r\n): Thread {\r\n return {\r\n comments,\r\n id: id === undefined ? createUID() : id,\r\n quote,\r\n type: 'thread',\r\n };\r\n}\r\n\r\nfunction cloneThread(thread: Thread): Thread {\r\n return {\r\n comments: Array.from(thread.comments),\r\n id: thread.id,\r\n quote: thread.quote,\r\n type: 'thread',\r\n };\r\n}\r\n\r\nfunction markDeleted(comment: Comment): Comment {\r\n return {\r\n author: comment.author,\r\n content: '[Deleted Comment]',\r\n deleted: true,\r\n id: comment.id,\r\n timeStamp: comment.timeStamp,\r\n type: 'comment',\r\n };\r\n}\r\n\r\nfunction triggerOnChange(commentStore: CommentStore): void {\r\n const listeners = commentStore._changeListeners;\r\n for (const listener of listeners) {\r\n listener();\r\n }\r\n}\r\n\r\nexport class CommentStore {\r\n _editor: LexicalEditor;\r\n _comments: Comments;\r\n _changeListeners: Set<() => void>;\r\n _collabProvider: null | Provider;\r\n\r\n constructor(editor: LexicalEditor) {\r\n this._comments = [];\r\n this._editor = editor;\r\n this._collabProvider = null;\r\n this._changeListeners = new Set();\r\n }\r\n\r\n isCollaborative(): boolean {\r\n return this._collabProvider !== null;\r\n }\r\n\r\n getComments(): Comments {\r\n return this._comments;\r\n }\r\n\r\n addComment(\r\n commentOrThread: Comment | Thread,\r\n thread?: Thread,\r\n offset?: number,\r\n ): void {\r\n const nextComments = Array.from(this._comments);\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sharedCommentsArray: YArray<any> | null = this._getCollabComments();\r\n\r\n if (thread !== undefined && commentOrThread.type === 'comment') {\r\n for (let i = 0; i < nextComments.length; i++) {\r\n const comment = nextComments[i];\r\n if (comment.type === 'thread' && comment.id === thread.id) {\r\n const newThread = cloneThread(comment);\r\n nextComments.splice(i, 1, newThread);\r\n const insertOffset =\r\n offset !== undefined ? offset : newThread.comments.length;\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n const parentSharedArray = sharedCommentsArray\r\n .get(i)\r\n .get('comments');\r\n this._withRemoteTransaction(() => {\r\n const sharedMap = this._createCollabSharedMap(commentOrThread);\r\n parentSharedArray.insert(insertOffset, [sharedMap]);\r\n });\r\n }\r\n newThread.comments.splice(insertOffset, 0, commentOrThread);\r\n break;\r\n }\r\n }\r\n } else {\r\n const insertOffset = offset !== undefined ? offset : nextComments.length;\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n this._withRemoteTransaction(() => {\r\n const sharedMap = this._createCollabSharedMap(commentOrThread);\r\n sharedCommentsArray.insert(insertOffset, [sharedMap]);\r\n });\r\n }\r\n nextComments.splice(insertOffset, 0, commentOrThread);\r\n }\r\n this._comments = nextComments;\r\n triggerOnChange(this);\r\n }\r\n\r\n deleteCommentOrThread(\r\n commentOrThread: Comment | Thread,\r\n thread?: Thread,\r\n ): {markedComment: Comment; index: number} | null {\r\n const nextComments = Array.from(this._comments);\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const sharedCommentsArray: YArray<any> | null = this._getCollabComments();\r\n let commentIndex: number | null = null;\r\n\r\n if (thread !== undefined) {\r\n for (let i = 0; i < nextComments.length; i++) {\r\n const nextComment = nextComments[i];\r\n if (nextComment.type === 'thread' && nextComment.id === thread.id) {\r\n const newThread = cloneThread(nextComment);\r\n nextComments.splice(i, 1, newThread);\r\n const threadComments = newThread.comments;\r\n commentIndex = threadComments.indexOf(commentOrThread as Comment);\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n const parentSharedArray = sharedCommentsArray\r\n .get(i)\r\n .get('comments');\r\n this._withRemoteTransaction(() => {\r\n parentSharedArray.delete(commentIndex);\r\n });\r\n }\r\n threadComments.splice(commentIndex, 1);\r\n break;\r\n }\r\n }\r\n } else {\r\n commentIndex = nextComments.indexOf(commentOrThread);\r\n if (this.isCollaborative() && sharedCommentsArray !== null) {\r\n this._withRemoteTransaction(() => {\r\n sharedCommentsArray.delete(commentIndex as number);\r\n });\r\n }\r\n nextComments.splice(commentIndex, 1);\r\n }\r\n this._comments = nextComments;\r\n triggerOnChange(this);\r\n\r\n if (commentOrThread.type === 'comment') {\r\n return {\r\n index: commentIndex as number,\r\n markedComment: markDeleted(commentOrThread),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n registerOnChange(onChange: () => void): () => void {\r\n const changeListeners = this._changeListeners;\r\n changeListeners.add(onChange);\r\n return () => {\r\n changeListeners.delete(onChange);\r\n };\r\n }\r\n\r\n _withRemoteTransaction(fn: () => void): void {\r\n const provider = this._collabProvider;\r\n if (provider !== null) {\r\n // @ts-expect-error doc does exist\r\n const doc = provider.doc;\r\n doc.transact(fn, this);\r\n }\r\n }\r\n\r\n _withLocalTransaction(fn: () => void): void {\r\n const collabProvider = this._collabProvider;\r\n try {\r\n this._collabProvider = null;\r\n fn();\r\n } finally {\r\n this._collabProvider = collabProvider;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n _getCollabComments(): null | YArray<any> {\r\n const provider = this._collabProvider;\r\n if (provider !== null) {\r\n // @ts-expect-error doc does exist\r\n const doc = provider.doc;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return doc.get('comments', YArray) as YArray<any>;\r\n }\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n _createCollabSharedMap(commentOrThread: Comment | Thread): YMap<any> {\r\n const sharedMap = new YMap();\r\n const type = commentOrThread.type;\r\n const id = commentOrThread.id;\r\n sharedMap.set('type', type);\r\n sharedMap.set('id', id);\r\n if (type === 'comment') {\r\n sharedMap.set('author', commentOrThread.author);\r\n sharedMap.set('content', commentOrThread.content);\r\n sharedMap.set('deleted', commentOrThread.deleted);\r\n sharedMap.set('timeStamp', commentOrThread.timeStamp);\r\n } else {\r\n sharedMap.set('quote', commentOrThread.quote);\r\n const commentsArray = new YArray();\r\n commentOrThread.comments.forEach((comment, i) => {\r\n const sharedChildComment = this._createCollabSharedMap(comment);\r\n commentsArray.insert(i, [sharedChildComment]);\r\n });\r\n sharedMap.set('comments', commentsArray);\r\n }\r\n return sharedMap;\r\n }\r\n\r\n registerCollaboration(provider: Provider): () => void {\r\n this._collabProvider = provider;\r\n const sharedCommentsArray = this._getCollabComments();\r\n\r\n const connect = () => {\r\n provider.connect();\r\n };\r\n\r\n const disconnect = () => {\r\n try {\r\n provider.disconnect();\r\n } catch (_e) {\r\n // Do nothing\r\n }\r\n };\r\n\r\n const unsubscribe = this._editor.registerCommand(\r\n TOGGLE_CONNECT_COMMAND,\r\n (payload) => {\r\n if (connect !== undefined && disconnect !== undefined) {\r\n const shouldConnect = payload;\r\n\r\n if (shouldConnect) {\r\n // eslint-disable-next-line no-console\r\n console.log('Comments connected!');\r\n connect();\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.log('Comments disconnected!');\r\n disconnect();\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n\r\n const onSharedCommentChanges = (\r\n // The YJS types explicitly use `any` as well.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n events: Array<YEvent<any>>,\r\n transaction: Transaction,\r\n ) => {\r\n if (transaction.origin !== this) {\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i];\r\n\r\n if (event instanceof YArrayEvent) {\r\n const target = event.target;\r\n const deltas = event.delta;\r\n let offset = 0;\r\n\r\n for (let s = 0; s < deltas.length; s++) {\r\n const delta = deltas[s];\r\n const insert = delta.insert;\r\n const retain = delta.retain;\r\n const del = delta.delete;\r\n const parent = target.parent;\r\n const parentThread =\r\n target === sharedCommentsArray\r\n ? undefined\r\n : parent instanceof YMap &&\r\n (this._comments.find((t) => t.id === parent.get('id')) as\r\n | Thread\r\n | undefined);\r\n\r\n if (Array.isArray(insert)) {\r\n insert\r\n .slice()\r\n .reverse()\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .forEach((map: YMap<any>) => {\r\n const id = map.get('id');\r\n const type = map.get('type');\r\n\r\n const commentOrThread =\r\n type === 'thread'\r\n ? createThread(\r\n map.get('quote'),\r\n map\r\n .get('comments')\r\n .toArray()\r\n .map(\r\n (\r\n innerComment: Map<\r\n string,\r\n string | number | boolean\r\n >,\r\n ) =>\r\n createComment(\r\n innerComment.get('content') as string,\r\n innerComment.get('author') as string,\r\n innerComment.get('id') as string,\r\n innerComment.get('timeStamp') as number,\r\n innerComment.get('deleted') as boolean,\r\n ),\r\n ),\r\n id,\r\n )\r\n : createComment(\r\n map.get('content'),\r\n map.get('author'),\r\n id,\r\n map.get('timeStamp'),\r\n map.get('deleted'),\r\n );\r\n this._withLocalTransaction(() => {\r\n this.addComment(\r\n commentOrThread,\r\n parentThread as Thread,\r\n offset,\r\n );\r\n });\r\n });\r\n } else if (typeof retain === 'number') {\r\n offset += retain;\r\n } else if (typeof del === 'number') {\r\n for (let d = 0; d < del; d++) {\r\n const commentOrThread =\r\n parentThread === undefined || parentThread === false\r\n ? this._comments[offset]\r\n : parentThread.comments[offset];\r\n this._withLocalTransaction(() => {\r\n this.deleteCommentOrThread(\r\n commentOrThread,\r\n parentThread as Thread,\r\n );\r\n });\r\n offset++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (sharedCommentsArray === null) {\r\n return () => null;\r\n }\r\n\r\n sharedCommentsArray.observeDeep(onSharedCommentChanges);\r\n\r\n connect();\r\n\r\n return () => {\r\n sharedCommentsArray.unobserveDeep(onSharedCommentChanges);\r\n unsubscribe();\r\n this._collabProvider = null;\r\n };\r\n }\r\n}\r\n\r\nexport function useCommentStore(commentStore: CommentStore): Comments {\r\n const [comments, setComments] = useState<Comments>(\r\n commentStore.getComments(),\r\n );\r\n\r\n useEffect(() => {\r\n return commentStore.registerOnChange(() => {\r\n setComments(commentStore.getComments());\r\n });\r\n }, [commentStore]);\r\n\r\n return comments;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {EditorThemeClasses} from 'lexical';\r\n\r\nimport './CommentEditorTheme.css';\r\n\r\nimport baseTheme from './PlaygroundEditorTheme';\r\n\r\nconst theme: EditorThemeClasses = {\r\n ...baseTheme,\r\n paragraph: 'CommentEditorTheme__paragraph',\r\n};\r\n\r\nexport default theme;\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$createCodeNode} from '@lexical/code';\r\nimport {\r\n INSERT_CHECK_LIST_COMMAND,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport {INSERT_EMBED_COMMAND} from '@lexical/react/LexicalAutoEmbedPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {INSERT_HORIZONTAL_RULE_COMMAND} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {\r\n LexicalTypeaheadMenuPlugin,\r\n MenuOption,\r\n useBasicTypeaheadTriggerMatch,\r\n} from '@lexical/react/LexicalTypeaheadMenuPlugin';\r\nimport {$createHeadingNode, $createQuoteNode} from '@lexical/rich-text';\r\nimport {$setBlocksType} from '@lexical/selection';\r\nimport {INSERT_TABLE_COMMAND} from '@lexical/table';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n LexicalEditor,\r\n TextNode,\r\n} from 'lexical';\r\nimport {useCallback, useMemo, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport {EmbedConfigs} from '../AutoEmbedPlugin';\r\nimport {INSERT_COLLAPSIBLE_COMMAND} from '../CollapsiblePlugin';\r\nimport {INSERT_DATETIME_COMMAND} from '../DateTimePlugin';\r\nimport {InsertEquationDialog} from '../EquationsPlugin';\r\nimport {INSERT_EXCALIDRAW_COMMAND} from '../ExcalidrawPlugin';\r\nimport {InsertImageDialog} from '../ImagesPlugin';\r\nimport InsertLayoutDialog from '../LayoutPlugin/InsertLayoutDialog';\r\nimport {INSERT_PAGE_BREAK} from '../PageBreakPlugin';\r\nimport {InsertNotesDialog} from '../NotesPlugin';\r\nimport {InsertPollDialog} from '../PollPlugin';\r\nimport {InsertRevisionDialog} from '../RevisionPlugin';\r\nimport {InsertTerminologyDialog} from '../TerminologyPlugin';\r\nimport {InsertTableDialog} from '../TablePlugin';\r\n\r\nexport class ComponentPickerOption extends MenuOption {\r\n // What shows up in the editor\r\n title: string;\r\n // Icon for display\r\n icon?: JSX.Element;\r\n // For extra searching.\r\n keywords: Array<string>;\r\n // TBD\r\n keyboardShortcut?: string;\r\n // What happens when you select this option?\r\n onSelect: (queryString: string) => void;\r\n\r\n constructor(\r\n title: string,\r\n options: {\r\n icon?: JSX.Element;\r\n keywords?: Array<string>;\r\n keyboardShortcut?: string;\r\n onSelect: (queryString: string) => void;\r\n },\r\n ) {\r\n super(title);\r\n this.title = title;\r\n this.keywords = options.keywords || [];\r\n this.icon = options.icon;\r\n this.keyboardShortcut = options.keyboardShortcut;\r\n this.onSelect = options.onSelect.bind(this);\r\n }\r\n}\r\n\r\nexport function ComponentPickerMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: ComponentPickerOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n {option.icon}\r\n <span className=\"text\">{option.title}</span>\r\n </li>\r\n );\r\n}\r\n\r\nexport function getDynamicOptions(editor: LexicalEditor, queryString: string) {\r\n const options: Array<ComponentPickerOption> = [];\r\n\r\n if (queryString == null) {\r\n return options;\r\n }\r\n\r\n const tableMatch = queryString.match(/^([1-9]\\d?)(?:x([1-9]\\d?)?)?$/);\r\n\r\n if (tableMatch !== null) {\r\n const rows = tableMatch[1];\r\n const colOptions = tableMatch[2]\r\n ? [tableMatch[2]]\r\n : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(String);\r\n\r\n options.push(\r\n ...colOptions.map(\r\n (columns) =>\r\n new ComponentPickerOption(`${rows}x${columns} Table`, {\r\n icon: <i className=\"icon table\" />,\r\n keywords: ['table'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {columns, rows}),\r\n }),\r\n ),\r\n );\r\n }\r\n\r\n return options;\r\n}\r\n\r\nexport type ShowModal = ReturnType<typeof useModal>[1];\r\n\r\nexport function getBaseOptions(editor: LexicalEditor, showModal: ShowModal) {\r\n return [\r\n new ComponentPickerOption('Paragraph', {\r\n icon: <i className=\"icon paragraph\" />,\r\n keywords: ['normal', 'paragraph', 'p', 'text'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n }\r\n }),\r\n }),\r\n ...([1, 2, 3] as const).map(\r\n (n) =>\r\n new ComponentPickerOption(`Heading ${n}`, {\r\n icon: <i className={`icon h${n}`} />,\r\n keywords: ['heading', 'header', `h${n}`],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(`h${n}`));\r\n }\r\n }),\r\n }),\r\n ),\r\n new ComponentPickerOption('Table', {\r\n icon: <i className=\"icon table\" />,\r\n keywords: ['table', 'grid', 'spreadsheet', 'rows', 'columns'],\r\n onSelect: () =>\r\n showModal('Insert Table', (onClose) => (\r\n <InsertTableDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Numbered List', {\r\n icon: <i className=\"icon number\" />,\r\n keywords: ['numbered list', 'ordered list', 'ol'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Bulleted List', {\r\n icon: <i className=\"icon bullet\" />,\r\n keywords: ['bulleted list', 'unordered list', 'ul'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Check List', {\r\n icon: <i className=\"icon check\" />,\r\n keywords: ['check list', 'todo list'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Quote', {\r\n icon: <i className=\"icon quote\" />,\r\n keywords: ['block quote'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n }),\r\n }),\r\n new ComponentPickerOption('Code', {\r\n icon: <i className=\"icon code\" />,\r\n keywords: ['javascript', 'python', 'js', 'codeblock'],\r\n onSelect: () =>\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n if (selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n } else {\r\n // Will this ever happen?\r\n const textContent = selection.getTextContent();\r\n const codeNode = $createCodeNode();\r\n selection.insertNodes([codeNode]);\r\n selection.insertRawText(textContent);\r\n }\r\n }\r\n }),\r\n }),\r\n new ComponentPickerOption('Divider', {\r\n icon: <i className=\"icon horizontal-rule\" />,\r\n keywords: ['horizontal rule', 'divider', 'hr'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Page Break', {\r\n icon: <i className=\"icon page-break\" />,\r\n keywords: ['page break', 'divider'],\r\n onSelect: () => editor.dispatchCommand(INSERT_PAGE_BREAK, undefined),\r\n }),\r\n new ComponentPickerOption('Excalidraw', {\r\n icon: <i className=\"icon diagram-2\" />,\r\n keywords: ['excalidraw', 'diagram', 'drawing'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_EXCALIDRAW_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Poll', {\r\n icon: <i className=\"icon poll\" />,\r\n keywords: ['poll', 'vote'],\r\n onSelect: () =>\r\n showModal('Insert Poll', (onClose) => (\r\n <InsertPollDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n ...EmbedConfigs.map(\r\n (embedConfig) =>\r\n new ComponentPickerOption(`Embed ${embedConfig.contentName}`, {\r\n icon: embedConfig.icon,\r\n keywords: [...embedConfig.keywords, 'embed'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_EMBED_COMMAND, embedConfig.type),\r\n }),\r\n ),\r\n new ComponentPickerOption('Date', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Today', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'today'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Tomorrow', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'tomorrow'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setDate(dateTime.getDate() + 1);\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Yesterday', {\r\n icon: <i className=\"icon calendar\" />,\r\n keywords: ['date', 'calendar', 'time', 'yesterday'],\r\n onSelect: () => {\r\n const dateTime = new Date();\r\n dateTime.setDate(dateTime.getDate() - 1);\r\n dateTime.setHours(0, 0, 0, 0); // Set time to midnight\r\n editor.dispatchCommand(INSERT_DATETIME_COMMAND, {dateTime});\r\n },\r\n }),\r\n new ComponentPickerOption('Equation', {\r\n icon: <i className=\"icon equation\" />,\r\n keywords: ['equation', 'latex', 'math'],\r\n onSelect: () =>\r\n showModal('Insert Equation', (onClose) => (\r\n <InsertEquationDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('GIF', {\r\n icon: <i className=\"icon gif\" />,\r\n keywords: ['gif', 'animate', 'image', 'file'],\r\n onSelect: () =>\r\n showModal('Insert GIF', (onClose) => (\r\n <InsertImageDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Image', {\r\n icon: <i className=\"icon image\" />,\r\n keywords: ['image', 'photo', 'picture', 'file'],\r\n onSelect: () =>\r\n showModal('Insert Image', (onClose) => (\r\n <InsertImageDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Collapsible', {\r\n icon: <i className=\"icon caret-right\" />,\r\n keywords: ['collapse', 'collapsible', 'toggle'],\r\n onSelect: () =>\r\n editor.dispatchCommand(INSERT_COLLAPSIBLE_COMMAND, undefined),\r\n }),\r\n new ComponentPickerOption('Columns Layout', {\r\n icon: <i className=\"icon columns\" />,\r\n keywords: ['columns', 'layout', 'grid'],\r\n onSelect: () =>\r\n showModal('Insert Columns Layout', (onClose) => (\r\n <InsertLayoutDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Terminology', {\r\n icon: <i className=\"icon quote\" />,\r\n keywords: ['terminology', 'terms', 'definitions', 'glossary', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Terminology', (onClose) => (\r\n <InsertTerminologyDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Notes', {\r\n icon: <i className=\"icon paragraph\" />,\r\n keywords: ['notes', 'formatted', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Notes', (onClose) => (\r\n <InsertNotesDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n new ComponentPickerOption('Revision Points', {\r\n icon: <i className=\"icon check-list\" />,\r\n keywords: ['revision', 'review', 'checklist', 'tnr'],\r\n onSelect: () =>\r\n showModal('Insert Revision Points', (onClose) => (\r\n <InsertRevisionDialog activeEditor={editor} onClose={onClose} />\r\n )),\r\n }),\r\n ...(['left', 'center', 'right', 'justify'] as const).map(\r\n (alignment) =>\r\n new ComponentPickerOption(`Align ${alignment}`, {\r\n icon: <i className={`icon ${alignment}-align`} />,\r\n keywords: ['align', 'justify', alignment],\r\n onSelect: () =>\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment),\r\n }),\r\n ),\r\n ];\r\n}\r\n\r\nexport default function ComponentPickerMenuPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [modal, showModal] = useModal();\r\n const [queryString, setQueryString] = useState<string | null>(null);\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch('/', {\r\n allowWhitespace: true,\r\n minLength: 0,\r\n });\r\n\r\n const options = useMemo(() => {\r\n const baseOptions = getBaseOptions(editor, showModal);\r\n\r\n if (!queryString) {\r\n return baseOptions;\r\n }\r\n\r\n const regex = new RegExp(queryString, 'i');\r\n\r\n return [\r\n ...getDynamicOptions(editor, queryString),\r\n ...baseOptions.filter(\r\n (option) =>\r\n regex.test(option.title) ||\r\n option.keywords.some((keyword) => regex.test(keyword)),\r\n ),\r\n ];\r\n }, [editor, queryString, showModal]);\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: ComponentPickerOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void,\r\n matchingString: string,\r\n ) => {\r\n editor.update(() => {\r\n nodeToRemove?.remove();\r\n selectedOption.onSelect(matchingString);\r\n closeMenu();\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n return (\r\n <>\r\n {modal}\r\n <LexicalTypeaheadMenuPlugin<ComponentPickerOption>\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForTriggerMatch}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) =>\r\n anchorElementRef.current && options.length\r\n ? ReactDOM.createPortal(\r\n <div className=\"typeahead-popover component-picker-menu\">\r\n <ul>\r\n {options.map((option, i: number) => (\r\n <ComponentPickerMenuItem\r\n index={i}\r\n isSelected={selectedIndex === i}\r\n onClick={() => {\r\n setHighlightedIndex(i);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onMouseEnter={() => {\r\n setHighlightedIndex(i);\r\n }}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null\r\n }\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createDateTimeNode,\r\n DateTimeNode,\r\n} from '../../nodes/DateTimeNode/DateTimeNode';\r\n\r\ntype CommandPayload = {\r\n dateTime: Date;\r\n};\r\n\r\nexport const INSERT_DATETIME_COMMAND: LexicalCommand<CommandPayload> =\r\n createCommand('INSERT_DATETIME_COMMAND');\r\n\r\nexport default function DateTimePlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([DateTimeNode])) {\r\n throw new Error('DateTimePlugin: DateTimeNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<CommandPayload>(\r\n INSERT_DATETIME_COMMAND,\r\n (payload) => {\r\n const {dateTime} = payload;\r\n const dateTimeNode = $createDateTimeNode(dateTime);\r\n\r\n $insertNodes([dateTimeNode]);\r\n if ($isRootOrShadowRoot(dateTimeNode.getParentOrThrow())) {\r\n $wrapNodeInElement(dateTimeNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useCallback, useEffect} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {$createEquationNode, EquationNode} from '../../nodes/EquationNode';\r\nimport KatexEquationAlterer from '../../ui/KatexEquationAlterer';\r\n\r\ntype CommandPayload = {\r\n equation: string;\r\n inline: boolean;\r\n};\r\n\r\nexport const INSERT_EQUATION_COMMAND: LexicalCommand<CommandPayload> =\r\n createCommand('INSERT_EQUATION_COMMAND');\r\n\r\nexport function InsertEquationDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const onEquationConfirm = useCallback(\r\n (equation: string, inline: boolean) => {\r\n activeEditor.dispatchCommand(INSERT_EQUATION_COMMAND, {equation, inline});\r\n onClose();\r\n },\r\n [activeEditor, onClose],\r\n );\r\n\r\n return <KatexEquationAlterer onConfirm={onEquationConfirm} />;\r\n}\r\n\r\nexport default function EquationsPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([EquationNode])) {\r\n throw new Error(\r\n 'EquationsPlugins: EquationsNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerCommand<CommandPayload>(\r\n INSERT_EQUATION_COMMAND,\r\n (payload) => {\r\n const {equation, inline} = payload;\r\n const equationNode = $createEquationNode(equation, inline);\r\n\r\n $insertNodes([equationNode]);\r\n if ($isRootOrShadowRoot(equationNode.getParentOrThrow())) {\r\n $wrapNodeInElement(equationNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './KatexEquationAlterer.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport * as React from 'react';\r\nimport {useCallback, useState} from 'react';\r\nimport {ErrorBoundary} from 'react-error-boundary';\r\n\r\nimport Button from '../ui/Button';\r\nimport KatexRenderer from './KatexRenderer';\r\n\r\ntype Props = {\r\n initialEquation?: string;\r\n onConfirm: (equation: string, inline: boolean) => void;\r\n};\r\n\r\nexport default function KatexEquationAlterer({\r\n onConfirm,\r\n initialEquation = '',\r\n}: Props): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [equation, setEquation] = useState<string>(initialEquation);\r\n const [inline, setInline] = useState<boolean>(true);\r\n\r\n const onClick = useCallback(() => {\r\n onConfirm(equation, inline);\r\n }, [onConfirm, equation, inline]);\r\n\r\n const onCheckboxChange = useCallback(() => {\r\n setInline(!inline);\r\n }, [setInline, inline]);\r\n\r\n return (\r\n <>\r\n <div className=\"KatexEquationAlterer_defaultRow\">\r\n Inline\r\n <input type=\"checkbox\" checked={inline} onChange={onCheckboxChange} />\r\n </div>\r\n <div className=\"KatexEquationAlterer_defaultRow\">Equation </div>\r\n <div className=\"KatexEquationAlterer_centerRow\">\r\n {inline ? (\r\n <input\r\n onChange={(event) => {\r\n setEquation(event.target.value);\r\n }}\r\n value={equation}\r\n className=\"KatexEquationAlterer_textArea\"\r\n />\r\n ) : (\r\n <textarea\r\n onChange={(event) => {\r\n setEquation(event.target.value);\r\n }}\r\n value={equation}\r\n className=\"KatexEquationAlterer_textArea\"\r\n />\r\n )}\r\n </div>\r\n <div className=\"KatexEquationAlterer_defaultRow\">Visualization </div>\r\n <div className=\"KatexEquationAlterer_centerRow\">\r\n <ErrorBoundary onError={(e: unknown) => editor._onError(e instanceof Error ? e : new Error(String(e)))} fallback={null}>\r\n <KatexRenderer\r\n equation={equation}\r\n inline={false}\r\n onDoubleClick={() => null}\r\n />\r\n </ErrorBoundary>\r\n </div>\r\n <div className=\"KatexEquationAlterer_dialogActions\">\r\n <Button onClick={onClick}>Confirm</Button>\r\n </div>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {ExcalidrawInitialElements} from '../../ui/ExcalidrawModal';\r\nimport type {AppState, BinaryFiles} from '@excalidraw/excalidraw/types';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\n\r\nimport {\r\n $createExcalidrawNode,\r\n ExcalidrawNode,\r\n} from '../../nodes/ExcalidrawNode';\r\nimport ExcalidrawModal from '../../ui/ExcalidrawModal';\r\n\r\nexport const INSERT_EXCALIDRAW_COMMAND: LexicalCommand<void> = createCommand(\r\n 'INSERT_EXCALIDRAW_COMMAND',\r\n);\r\n\r\nexport default function ExcalidrawPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const [isModalOpen, setModalOpen] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([ExcalidrawNode])) {\r\n throw new Error(\r\n 'ExcalidrawPlugin: ExcalidrawNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerCommand(\r\n INSERT_EXCALIDRAW_COMMAND,\r\n () => {\r\n setModalOpen(true);\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n\r\n const onClose = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const onDelete = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const onSave = (\r\n elements: ExcalidrawInitialElements,\r\n appState: Partial<AppState>,\r\n files: BinaryFiles,\r\n ) => {\r\n editor.update(() => {\r\n const excalidrawNode = $createExcalidrawNode();\r\n excalidrawNode.setData(\r\n JSON.stringify({\r\n appState,\r\n elements,\r\n files,\r\n }),\r\n );\r\n $insertNodes([excalidrawNode]);\r\n if ($isRootOrShadowRoot(excalidrawNode.getParentOrThrow())) {\r\n $wrapNodeInElement(excalidrawNode, $createParagraphNode).selectEnd();\r\n }\r\n });\r\n setModalOpen(false);\r\n };\r\n\r\n return isModalOpen ? (\r\n <ExcalidrawModal\r\n initialElements={[]}\r\n initialAppState={{} as AppState}\r\n initialFiles={{}}\r\n isShown={isModalOpen}\r\n onDelete={onDelete}\r\n onClose={onClose}\r\n onSave={onSave}\r\n closeOnClickOutside={false}\r\n />\r\n ) : null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n LinkNode,\r\n TOGGLE_LINK_COMMAND,\r\n} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $wrapNodeInElement,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $createRangeSelection,\r\n $getSelection,\r\n $insertNodes,\r\n $isNodeSelection,\r\n $isRootOrShadowRoot,\r\n $setSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGOVER_COMMAND,\r\n DRAGSTART_COMMAND,\r\n DROP_COMMAND,\r\n getDOMSelectionFromTarget,\r\n isHTMLElement,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {useEditorConfig} from '../../context/EditorConfigContext';\r\nimport landscapeImageImport from '../../images/landscape.jpg';\r\nimport yellowFlowerImageImport from '../../images/yellow-flower.jpg';\r\nimport {\r\n $createImageNode,\r\n $isImageNode,\r\n ImageNode,\r\n ImagePayload,\r\n} from '../../nodes/ImageNode';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions, DialogButtonsList} from '../../ui/Dialog';\r\nimport FileInput from '../../ui/FileInput';\r\nimport TextInput from '../../ui/TextInput';\r\nimport {uploadImageToBaasix} from '../../utils/baasixUpload';\r\n\r\nconst landscapeImage = (typeof landscapeImageImport === 'string' ? landscapeImageImport : (landscapeImageImport as {src: string}).src) as string;\r\nconst yellowFlowerImage = (typeof yellowFlowerImageImport === 'string' ? yellowFlowerImageImport : (yellowFlowerImageImport as {src: string}).src) as string;\r\n\r\nexport type InsertImagePayload = Readonly<ImagePayload>;\r\n\r\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<InsertImagePayload> =\r\n createCommand('INSERT_IMAGE_COMMAND');\r\n\r\nexport function InsertImageUriDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void;\r\n}) {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n\r\n const isDisabled = src === '';\r\n\r\n return (\r\n <>\r\n <TextInput\r\n label=\"Image URL\"\r\n placeholder=\"i.e. https://source.unsplash.com/random\"\r\n onChange={setSrc}\r\n value={src}\r\n data-test-id=\"image-modal-url-input\"\r\n />\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Random unsplash image\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-confirm-btn\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({altText, src})}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function InsertImageUploadedDialogBody({\r\n onClick,\r\n}: {\r\n onClick: (payload: InsertImagePayload) => void;\r\n}) {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n const [isUploading, setIsUploading] = useState(false);\r\n const {baasixClient, folder} = useEditorConfig();\r\n\r\n const isDisabled = src === '' || isUploading;\r\n\r\n const loadImage = (files: FileList | null) => {\r\n if (files === null || files.length === 0) {\r\n return;\r\n }\r\n const file = files[0];\r\n setIsUploading(true);\r\n uploadImageToBaasix(baasixClient, file, folder)\r\n .then((url) => {\r\n setSrc(url);\r\n if (!altText) {\r\n setAltText(file.name);\r\n }\r\n })\r\n .catch(() => {\r\n // Fall back to data URL if upload fails\r\n const reader = new FileReader();\r\n reader.onload = function () {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n })\r\n .finally(() => {\r\n setIsUploading(false);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n <FileInput\r\n label=\"Image Upload\"\r\n onChange={loadImage}\r\n accept=\"image/*\"\r\n data-test-id=\"image-modal-file-upload\"\r\n />\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n disabled={isDisabled}\r\n onClick={() => onClick({altText, src})}>\r\n {isUploading ? 'Uploading...' : 'Confirm'}\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function InsertImageDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [mode, setMode] = useState<null | 'url' | 'file'>(null);\r\n const hasModifier = useRef(false);\r\n\r\n useEffect(() => {\r\n hasModifier.current = false;\r\n const handler = (e: KeyboardEvent) => {\r\n hasModifier.current = e.altKey;\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => {\r\n document.removeEventListener('keydown', handler);\r\n };\r\n }, [activeEditor]);\r\n\r\n const onClick = (payload: InsertImagePayload) => {\r\n activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n {!mode && (\r\n <DialogButtonsList>\r\n <Button\r\n data-test-id=\"image-modal-option-sample\"\r\n onClick={() =>\r\n onClick(\r\n hasModifier.current\r\n ? {\r\n altText:\r\n 'Daylight fir trees forest glacier green high ice landscape',\r\n src: landscapeImage,\r\n }\r\n : {\r\n altText: 'Yellow flower in tilt shift lens',\r\n src: yellowFlowerImage,\r\n },\r\n )\r\n }>\r\n Sample\r\n </Button>\r\n <Button\r\n data-test-id=\"image-modal-option-url\"\r\n onClick={() => setMode('url')}>\r\n URL\r\n </Button>\r\n <Button\r\n data-test-id=\"image-modal-option-file\"\r\n onClick={() => setMode('file')}>\r\n File\r\n </Button>\r\n </DialogButtonsList>\r\n )}\r\n {mode === 'url' && <InsertImageUriDialogBody onClick={onClick} />}\r\n {mode === 'file' && <InsertImageUploadedDialogBody onClick={onClick} />}\r\n </>\r\n );\r\n}\r\n\r\nexport default function ImagesPlugin({\r\n captionsEnabled,\r\n}: {\r\n captionsEnabled?: boolean;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([ImageNode])) {\r\n throw new Error('ImagesPlugin: ImageNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<InsertImagePayload>(\r\n INSERT_IMAGE_COMMAND,\r\n (payload) => {\r\n const imageNode = $createImageNode(payload);\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n return $onDragStart(event);\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => {\r\n return $onDragover(event);\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => {\r\n return $onDrop(event, editor);\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n );\r\n }, [captionsEnabled, editor]);\r\n\r\n return null;\r\n}\r\n\r\nconst TRANSPARENT_IMAGE =\r\n 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\r\nconst img = document.createElement('img');\r\nimg.src = TRANSPARENT_IMAGE;\r\n\r\nfunction $onDragStart(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) {\r\n return false;\r\n }\r\n dataTransfer.setData('text/plain', '_');\r\n dataTransfer.setDragImage(img, 0, 0);\r\n dataTransfer.setData(\r\n 'application/x-lexical-drag',\r\n JSON.stringify({\r\n data: {\r\n altText: node.__altText,\r\n caption: node.__caption,\r\n height: node.__height,\r\n key: node.getKey(),\r\n maxWidth: node.__maxWidth,\r\n showCaption: node.__showCaption,\r\n src: node.__src,\r\n width: node.__width,\r\n },\r\n type: 'image',\r\n }),\r\n );\r\n\r\n return true;\r\n}\r\n\r\nfunction $onDragover(event: DragEvent): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return false;\r\n}\r\n\r\nfunction $onDrop(event: DragEvent, editor: LexicalEditor): boolean {\r\n const node = $getImageNodeInSelection();\r\n if (!node) {\r\n return false;\r\n }\r\n const data = getDragImageData(event);\r\n if (!data) {\r\n return false;\r\n }\r\n const existingLink = $findMatchingParent(\r\n node,\r\n (parent): parent is LinkNode =>\r\n !$isAutoLinkNode(parent) && $isLinkNode(parent),\r\n );\r\n event.preventDefault();\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n const rangeSelection = $createRangeSelection();\r\n if (range !== null && range !== undefined) {\r\n rangeSelection.applyDOMRange(range);\r\n }\r\n $setSelection(rangeSelection);\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, data);\r\n if (existingLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, existingLink.getURL());\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction $getImageNodeInSelection(): ImageNode | null {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) {\r\n return null;\r\n }\r\n const nodes = selection.getNodes();\r\n const node = nodes[0];\r\n return $isImageNode(node) ? node : null;\r\n}\r\n\r\nfunction getDragImageData(event: DragEvent): null | InsertImagePayload {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) {\r\n return null;\r\n }\r\n const {type, data} = JSON.parse(dragData);\r\n if (type !== 'image') {\r\n return null;\r\n }\r\n\r\n return data;\r\n}\r\n\r\ndeclare global {\r\n interface DragEvent {\r\n rangeOffset?: number;\r\n rangeParent?: Node;\r\n }\r\n}\r\n\r\nfunction canDropImage(event: DragEvent): boolean {\r\n const target = event.target;\r\n return !!(\r\n isHTMLElement(target) &&\r\n !target.closest('code, span.editor-image') &&\r\n isHTMLElement(target.parentElement) &&\r\n target.parentElement.closest('div.ContentEditable__root')\r\n );\r\n}\r\n\r\nfunction getDragSelection(event: DragEvent): Range | null | undefined {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if (event.rangeParent && domSelection !== null) {\r\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0);\r\n range = domSelection.getRangeAt(0);\r\n } else {\r\n throw Error(`Cannot get the selection when dragging`);\r\n }\r\n\r\n return range;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Input.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n accept?: string;\r\n label: string;\r\n onChange: (files: FileList | null) => void;\r\n}>;\r\n\r\nexport default function FileInput({\r\n accept,\r\n label,\r\n onChange,\r\n 'data-test-id': dataTestId,\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label className=\"Input__label\">{label}</label>\r\n <input\r\n type=\"file\"\r\n accept={accept}\r\n className=\"Input__input\"\r\n onChange={(e) => onChange(e.target.files)}\r\n data-test-id={dataTestId}\r\n />\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './Input.css';\r\n\r\nimport * as React from 'react';\r\nimport {HTMLInputTypeAttribute} from 'react';\r\n\r\ntype Props = Readonly<{\r\n 'data-test-id'?: string;\r\n label: string;\r\n onChange: (val: string) => void;\r\n placeholder?: string;\r\n value: string;\r\n type?: HTMLInputTypeAttribute;\r\n}>;\r\n\r\nexport default function TextInput({\r\n label,\r\n value,\r\n onChange,\r\n placeholder = '',\r\n 'data-test-id': dataTestId,\r\n type = 'text',\r\n}: Props): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label className=\"Input__label\">{label}</label>\r\n <input\r\n type={type}\r\n className=\"Input__input\"\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(e) => {\r\n onChange(e.target.value);\r\n }}\r\n data-test-id={dataTestId}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { Baasix } from '@baasix/sdk';\n\nexport async function uploadImageToBaasix(\n client: Baasix,\n file: File,\n folder?: string,\n): Promise<string> {\n const result: any = await client.files.upload(file, {\n folder: folder || undefined,\n });\n const id =\n result?.id ||\n result?.data?.id ||\n (typeof result?.data === 'string' ? result.data : undefined) ||\n (typeof result === 'string' ? result : undefined);\n return client.files.getAssetUrl(id);\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {LexicalEditor} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useState} from 'react';\r\n\r\nimport Button from '../../ui/Button';\r\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\r\nimport {INSERT_LAYOUT_COMMAND} from './LayoutPlugin';\r\n\r\nconst LAYOUTS = [\r\n {label: '2 columns (equal width)', value: '1fr 1fr'},\r\n {label: '2 columns (25% - 75%)', value: '1fr 3fr'},\r\n {label: '3 columns (equal width)', value: '1fr 1fr 1fr'},\r\n {label: '3 columns (25% - 50% - 25%)', value: '1fr 2fr 1fr'},\r\n {label: '4 columns (equal width)', value: '1fr 1fr 1fr 1fr'},\r\n];\r\n\r\nexport default function InsertLayoutDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [layout, setLayout] = useState(LAYOUTS[0].value);\r\n const buttonLabel = LAYOUTS.find((item) => item.value === layout)?.label;\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_LAYOUT_COMMAND, layout);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <DropDown\r\n buttonClassName=\"toolbar-item dialog-dropdown\"\r\n buttonLabel={buttonLabel}>\r\n {LAYOUTS.map(({label, value}) => (\r\n <DropDownItem\r\n key={value}\r\n className=\"item\"\r\n onClick={() => setLayout(value)}>\r\n <span className=\"text\">{label}</span>\r\n </DropDownItem>\r\n ))}\r\n </DropDown>\r\n <Button onClick={onClick}>Insert</Button>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {calculateZoomLevel} from '@lexical/utils';\r\nimport {isDOMNode} from 'lexical';\r\nimport * as React from 'react';\r\nimport {\r\n ReactNode,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {focusNearestDescendant, isKeyboardInput} from '../utils/focusUtils';\r\n\r\ntype DropDownContextType = {\r\n registerItem: (ref: React.RefObject<null | HTMLButtonElement>) => void;\r\n};\r\n\r\nconst DropDownContext = React.createContext<DropDownContextType | null>(null);\r\n\r\nconst dropDownPadding = 4;\r\n\r\nexport function DropDownItem({\r\n children,\r\n className,\r\n onClick,\r\n title,\r\n}: {\r\n children: React.ReactNode;\r\n className: string;\r\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\r\n title?: string;\r\n}) {\r\n const ref = useRef<null | HTMLButtonElement>(null);\r\n\r\n const dropDownContext = React.useContext(DropDownContext);\r\n\r\n if (dropDownContext === null) {\r\n throw new Error('DropDownItem must be used within a DropDown');\r\n }\r\n\r\n const {registerItem} = dropDownContext;\r\n\r\n useEffect(() => {\r\n if (ref && ref.current) {\r\n registerItem(ref);\r\n }\r\n }, [ref, registerItem]);\r\n\r\n return (\r\n <button\r\n className={className}\r\n onClick={onClick}\r\n ref={ref}\r\n title={title}\r\n type=\"button\">\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nfunction DropDownItems({\r\n children,\r\n dropDownRef,\r\n onClose,\r\n autofocus,\r\n}: {\r\n children: React.ReactNode;\r\n dropDownRef: React.RefObject<HTMLDivElement | null>;\r\n onClose: () => void;\r\n autofocus: boolean;\r\n}) {\r\n const [items, setItems] =\r\n useState<React.RefObject<null | HTMLButtonElement>[]>();\r\n const [highlightedItem, setHighlightedItem] =\r\n useState<React.RefObject<null | HTMLButtonElement>>();\r\n\r\n const registerItem = useCallback(\r\n (itemRef: React.RefObject<null | HTMLButtonElement>) => {\r\n setItems((prev) => (prev ? [...prev, itemRef] : [itemRef]));\r\n },\r\n [setItems],\r\n );\r\n\r\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n const key = event.key;\r\n if (key === 'Escape') {\r\n onClose();\r\n }\r\n if (!items) {\r\n return;\r\n }\r\n\r\n if (['Escape', 'ArrowUp', 'ArrowDown', 'Tab'].includes(key)) {\r\n event.preventDefault();\r\n }\r\n\r\n if (key === 'Escape' || key === 'Tab') {\r\n onClose();\r\n } else if (key === 'ArrowUp') {\r\n setHighlightedItem((prev) => {\r\n if (!prev) {\r\n return items[0];\r\n }\r\n const index = items.indexOf(prev) - 1;\r\n return items[index === -1 ? items.length - 1 : index];\r\n });\r\n } else if (key === 'ArrowDown') {\r\n setHighlightedItem((prev) => {\r\n if (!prev) {\r\n return items[0];\r\n }\r\n return items[items.indexOf(prev) + 1];\r\n });\r\n }\r\n };\r\n\r\n const contextValue = useMemo(\r\n () => ({\r\n registerItem,\r\n }),\r\n [registerItem],\r\n );\r\n\r\n useEffect(() => {\r\n if (items && !highlightedItem) {\r\n setHighlightedItem(items[0]);\r\n }\r\n\r\n if (highlightedItem && highlightedItem.current) {\r\n highlightedItem.current.focus();\r\n }\r\n }, [items, highlightedItem]);\r\n\r\n useEffect(() => {\r\n if (autofocus && dropDownRef.current) {\r\n focusNearestDescendant(dropDownRef.current);\r\n }\r\n }, [autofocus, dropDownRef]);\r\n\r\n return (\r\n <DropDownContext.Provider value={contextValue}>\r\n <div className=\"dropdown\" ref={dropDownRef as React.RefObject<HTMLDivElement>} onKeyDown={handleKeyDown}>\r\n {children}\r\n </div>\r\n </DropDownContext.Provider>\r\n );\r\n}\r\n\r\nexport default function DropDown({\r\n disabled = false,\r\n buttonLabel,\r\n buttonAriaLabel,\r\n buttonClassName,\r\n buttonIconClassName,\r\n children,\r\n stopCloseOnClickSelf,\r\n hideChevron,\r\n}: {\r\n disabled?: boolean;\r\n buttonAriaLabel?: string;\r\n buttonClassName: string;\r\n buttonIconClassName?: string;\r\n buttonLabel?: string;\r\n children: ReactNode;\r\n stopCloseOnClickSelf?: boolean;\r\n hideChevron?: boolean;\r\n}): JSX.Element {\r\n const dropDownRef = useRef<HTMLDivElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const [showDropDown, setShowDropDown] = useState(false);\r\n const [shouldAutofocus, setShouldAutofocus] = useState(false);\r\n\r\n const handleClose = () => {\r\n setShowDropDown(false);\r\n if (buttonRef && buttonRef.current) {\r\n buttonRef.current.focus();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const button = buttonRef.current;\r\n const dropDown = dropDownRef.current;\r\n const zoom = calculateZoomLevel(dropDown, true);\r\n if (showDropDown && button !== null && dropDown !== null) {\r\n const {top, left} = button.getBoundingClientRect();\r\n dropDown.style.top = `${top / zoom + button.offsetHeight + dropDownPadding}px`;\r\n dropDown.style.left = `${\r\n Math.min(left, window.innerWidth - dropDown.offsetWidth - 20) / zoom\r\n }px`;\r\n }\r\n }, [dropDownRef, buttonRef, showDropDown]);\r\n\r\n useEffect(() => {\r\n const button = buttonRef.current;\r\n\r\n if (button !== null && showDropDown) {\r\n const handle = (event: PointerEvent) => {\r\n const target = event.target;\r\n if (!isDOMNode(target)) {\r\n return;\r\n }\r\n\r\n const targetIsDropDownItem =\r\n dropDownRef.current && dropDownRef.current.contains(target);\r\n if (stopCloseOnClickSelf && targetIsDropDownItem) {\r\n return;\r\n }\r\n\r\n if (!button.contains(target)) {\r\n setShowDropDown(false);\r\n\r\n if (targetIsDropDownItem && isKeyboardInput(event)) {\r\n button.focus();\r\n }\r\n }\r\n };\r\n document.addEventListener('click', handle);\r\n\r\n return () => {\r\n document.removeEventListener('click', handle);\r\n };\r\n }\r\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);\r\n\r\n useEffect(() => {\r\n const handleButtonPositionUpdate = () => {\r\n if (showDropDown) {\r\n const button = buttonRef.current;\r\n const dropDown = dropDownRef.current;\r\n const zoom = calculateZoomLevel(dropDown, true);\r\n if (button !== null && dropDown !== null) {\r\n const {top, left} = button.getBoundingClientRect();\r\n const newTop = top / zoom + button.offsetHeight + dropDownPadding;\r\n if (newTop !== dropDown.getBoundingClientRect().top / zoom) {\r\n dropDown.style.top = `${newTop}px`;\r\n }\r\n const newLeft = Math.min(left, window.innerWidth - dropDown.offsetWidth - 20) / zoom;\r\n dropDown.style.left = `${newLeft}px`;\r\n }\r\n }\r\n };\r\n\r\n // Collect ancestor scrollable containers (e.g. Sheet/Dialog overlay)\r\n const scrollableAncestors: (HTMLElement | Document)[] = [document];\r\n if (buttonRef.current) {\r\n let parent = buttonRef.current.parentElement;\r\n while (parent) {\r\n const style = window.getComputedStyle(parent);\r\n const overflow = style.overflow + style.overflowY;\r\n if (/auto|scroll/.test(overflow)) {\r\n scrollableAncestors.push(parent);\r\n }\r\n parent = parent.parentElement;\r\n }\r\n }\r\n\r\n for (const el of scrollableAncestors) {\r\n el.addEventListener('scroll', handleButtonPositionUpdate);\r\n }\r\n\r\n return () => {\r\n for (const el of scrollableAncestors) {\r\n el.removeEventListener('scroll', handleButtonPositionUpdate);\r\n }\r\n };\r\n }, [buttonRef, dropDownRef, showDropDown]);\r\n\r\n const handleOnClick = (e: React.MouseEvent) => {\r\n setShowDropDown(!showDropDown);\r\n setShouldAutofocus(isKeyboardInput(e));\r\n };\r\n\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-label={buttonAriaLabel || buttonLabel}\r\n className={buttonClassName}\r\n onClick={handleOnClick}\r\n ref={buttonRef}>\r\n {buttonIconClassName && <span className={buttonIconClassName} />}\r\n {buttonLabel && (\r\n <span className=\"text dropdown-button-text\">{buttonLabel}</span>\r\n )}\r\n {!hideChevron && <i className=\"chevron-down\" />}\r\n </button>\r\n\r\n {showDropDown &&\r\n createPortal(\r\n <DropDownItems\r\n dropDownRef={dropDownRef}\r\n onClose={handleClose}\r\n autofocus={shouldAutofocus}>\r\n {children}\r\n </DropDownItems>,\r\n document.body,\r\n )}\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nexport const findFirstFocusableDescendant = (\r\n startElement: HTMLElement,\r\n): HTMLElement | null => {\r\n const focusableSelector =\r\n 'button, a[href], input, select, textarea, details, summary [tabindex], [contenteditable]';\r\n\r\n const focusableDescendants = startElement.querySelector(\r\n focusableSelector,\r\n ) as HTMLElement;\r\n\r\n return focusableDescendants;\r\n};\r\n\r\nexport const focusNearestDescendant = (\r\n startElement: HTMLElement,\r\n): HTMLElement | null => {\r\n const el = findFirstFocusableDescendant(startElement);\r\n el?.focus();\r\n return el;\r\n};\r\n\r\nexport const isKeyboardInput = (\r\n event: MouseEvent | PointerEvent | React.MouseEvent,\r\n): boolean => {\r\n if ('pointerId' in event && 'pointerType' in event) {\r\n return event.pointerId === -1 && event.pointerType === '';\r\n }\r\n\r\n return event?.detail === 0;\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {ElementNode, LexicalCommand, LexicalNode, NodeKey} from 'lexical';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $findMatchingParent,\r\n $insertNodeToNearestRoot,\r\n mergeRegister,\r\n} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n KEY_ARROW_DOWN_COMMAND,\r\n KEY_ARROW_LEFT_COMMAND,\r\n KEY_ARROW_RIGHT_COMMAND,\r\n KEY_ARROW_UP_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createLayoutContainerNode,\r\n $isLayoutContainerNode,\r\n LayoutContainerNode,\r\n} from '../../nodes/LayoutContainerNode';\r\nimport {\r\n $createLayoutItemNode,\r\n $isLayoutItemNode,\r\n LayoutItemNode,\r\n} from '../../nodes/LayoutItemNode';\r\n\r\nexport const INSERT_LAYOUT_COMMAND: LexicalCommand<string> =\r\n createCommand<string>();\r\n\r\nexport const UPDATE_LAYOUT_COMMAND: LexicalCommand<{\r\n template: string;\r\n nodeKey: NodeKey;\r\n}> = createCommand<{template: string; nodeKey: NodeKey}>();\r\n\r\nexport function LayoutPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([LayoutContainerNode, LayoutItemNode])) {\r\n throw new Error(\r\n 'LayoutPlugin: LayoutContainerNode, or LayoutItemNode not registered on editor',\r\n );\r\n }\r\n\r\n const $onEscape = (before: boolean) => {\r\n const selection = $getSelection();\r\n if (\r\n $isRangeSelection(selection) &&\r\n selection.isCollapsed() &&\r\n selection.anchor.offset === 0\r\n ) {\r\n const container = $findMatchingParent(\r\n selection.anchor.getNode(),\r\n $isLayoutContainerNode,\r\n );\r\n\r\n if ($isLayoutContainerNode(container)) {\r\n const parent = container.getParent<ElementNode>();\r\n const child =\r\n parent &&\r\n (before\r\n ? parent.getFirstChild<LexicalNode>()\r\n : parent?.getLastChild<LexicalNode>());\r\n const descendant = before\r\n ? container.getFirstDescendant<LexicalNode>()?.getKey()\r\n : container.getLastDescendant<LexicalNode>()?.getKey();\r\n\r\n if (\r\n parent !== null &&\r\n child === container &&\r\n selection.anchor.key === descendant\r\n ) {\r\n if (before) {\r\n container.insertBefore($createParagraphNode());\r\n } else {\r\n container.insertAfter($createParagraphNode());\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const $fillLayoutItemIfEmpty = (node: LayoutItemNode) => {\r\n if (node.isEmpty()) {\r\n node.append($createParagraphNode());\r\n }\r\n };\r\n\r\n const $removeIsolatedLayoutItem = (node: LayoutItemNode): boolean => {\r\n const parent = node.getParent<ElementNode>();\r\n if (!$isLayoutContainerNode(parent)) {\r\n const children = node.getChildren<LexicalNode>();\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n return mergeRegister(\r\n // When layout is the last child pressing down/right arrow will insert paragraph\r\n // below it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if trailing paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_DOWN_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_RIGHT_COMMAND,\r\n () => $onEscape(false),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n // When layout is the first child pressing up/left arrow will insert paragraph\r\n // above it to allow adding more content. It's similar what $insertBlockNode\r\n // (mainly for decorators), except it'll always be possible to continue adding\r\n // new content even if leading paragraph is accidentally deleted\r\n editor.registerCommand(\r\n KEY_ARROW_UP_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ARROW_LEFT_COMMAND,\r\n () => $onEscape(true),\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n INSERT_LAYOUT_COMMAND,\r\n (template) => {\r\n editor.update(() => {\r\n const container = $createLayoutContainerNode(template);\r\n const itemsCount = getItemsCountFromTemplate(template);\r\n\r\n for (let i = 0; i < itemsCount; i++) {\r\n container.append(\r\n $createLayoutItemNode().append($createParagraphNode()),\r\n );\r\n }\r\n\r\n $insertNodeToNearestRoot(container);\r\n container.selectStart();\r\n });\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n editor.registerCommand(\r\n UPDATE_LAYOUT_COMMAND,\r\n ({template, nodeKey}) => {\r\n editor.update(() => {\r\n const container = $getNodeByKey<LexicalNode>(nodeKey);\r\n\r\n if (!$isLayoutContainerNode(container)) {\r\n return;\r\n }\r\n\r\n const itemsCount = getItemsCountFromTemplate(template);\r\n const prevItemsCount = getItemsCountFromTemplate(\r\n container.getTemplateColumns(),\r\n );\r\n\r\n // Add or remove extra columns if new template does not match existing one\r\n if (itemsCount > prevItemsCount) {\r\n for (let i = prevItemsCount; i < itemsCount; i++) {\r\n container.append(\r\n $createLayoutItemNode().append($createParagraphNode()),\r\n );\r\n }\r\n } else if (itemsCount < prevItemsCount) {\r\n for (let i = prevItemsCount - 1; i >= itemsCount; i--) {\r\n const layoutItem = container.getChildAtIndex<LexicalNode>(i);\r\n\r\n if ($isLayoutItemNode(layoutItem)) {\r\n layoutItem.remove();\r\n }\r\n }\r\n }\r\n\r\n container.setTemplateColumns(template);\r\n });\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n\r\n editor.registerNodeTransform(LayoutItemNode, (node) => {\r\n // Structure enforcing transformers for each node type. In case nesting structure is not\r\n // \"Container > Item\" it'll unwrap nodes and convert it back\r\n // to regular content.\r\n const isRemoved = $removeIsolatedLayoutItem(node);\r\n\r\n if (!isRemoved) {\r\n // Layout item should always have a child. this function will listen\r\n // for any empty layout item and fill it with a paragraph node\r\n $fillLayoutItemIfEmpty(node);\r\n }\r\n }),\r\n editor.registerNodeTransform(LayoutContainerNode, (node) => {\r\n const children = node.getChildren<LexicalNode>();\r\n if (!children.every($isLayoutItemNode)) {\r\n for (const child of children) {\r\n node.insertBefore(child);\r\n }\r\n node.remove();\r\n }\r\n }),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n\r\nfunction getItemsCountFromTemplate(template: string): number {\r\n return template.trim().split(/\\s+/).length;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedElementNode,\r\n Spread,\r\n} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {ElementNode} from 'lexical';\r\n\r\nexport type SerializedLayoutContainerNode = Spread<\r\n {\r\n templateColumns: string;\r\n },\r\n SerializedElementNode\r\n>;\r\n\r\nfunction $convertLayoutContainerElement(\r\n domNode: HTMLElement,\r\n): DOMConversionOutput | null {\r\n const styleAttributes = window.getComputedStyle(domNode);\r\n const templateColumns = styleAttributes.getPropertyValue(\r\n 'grid-template-columns',\r\n );\r\n if (templateColumns) {\r\n const node = $createLayoutContainerNode(templateColumns);\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport class LayoutContainerNode extends ElementNode {\r\n __templateColumns: string;\r\n\r\n constructor(templateColumns: string, key?: NodeKey) {\r\n super(key);\r\n this.__templateColumns = templateColumns;\r\n }\r\n\r\n static getType(): string {\r\n return 'layout-container';\r\n }\r\n\r\n static clone(node: LayoutContainerNode): LayoutContainerNode {\r\n return new LayoutContainerNode(node.__templateColumns, node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.style.gridTemplateColumns = this.__templateColumns;\r\n if (typeof config.theme.layoutContainer === 'string') {\r\n addClassNamesToElement(dom, config.theme.layoutContainer);\r\n }\r\n return dom;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('div');\r\n element.style.gridTemplateColumns = this.__templateColumns;\r\n element.setAttribute('data-lexical-layout-container', 'true');\r\n return {element};\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement): boolean {\r\n if (prevNode.__templateColumns !== this.__templateColumns) {\r\n dom.style.gridTemplateColumns = this.__templateColumns;\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-layout-container')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertLayoutContainerElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(json: SerializedLayoutContainerNode): LayoutContainerNode {\r\n return $createLayoutContainerNode().updateFromJSON(json);\r\n }\r\n\r\n updateFromJSON(\r\n serializedNode: LexicalUpdateJSON<SerializedLayoutContainerNode>,\r\n ): this {\r\n return super\r\n .updateFromJSON(serializedNode)\r\n .setTemplateColumns(serializedNode.templateColumns);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n\r\n canBeEmpty(): boolean {\r\n return false;\r\n }\r\n\r\n exportJSON(): SerializedLayoutContainerNode {\r\n return {\r\n ...super.exportJSON(),\r\n templateColumns: this.__templateColumns,\r\n };\r\n }\r\n\r\n getTemplateColumns(): string {\r\n return this.getLatest().__templateColumns;\r\n }\r\n\r\n setTemplateColumns(templateColumns: string): this {\r\n const self = this.getWritable();\r\n self.__templateColumns = templateColumns;\r\n return self;\r\n }\r\n}\r\n\r\nexport function $createLayoutContainerNode(\r\n templateColumns: string = '',\r\n): LayoutContainerNode {\r\n return new LayoutContainerNode(templateColumns);\r\n}\r\n\r\nexport function $isLayoutContainerNode(\r\n node: LexicalNode | null | undefined,\r\n): node is LayoutContainerNode {\r\n return node instanceof LayoutContainerNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {$isParagraphNode, ElementNode} from 'lexical';\r\n\r\nexport type SerializedLayoutItemNode = SerializedElementNode;\r\n\r\nfunction $convertLayoutItemElement(): DOMConversionOutput | null {\r\n return {node: $createLayoutItemNode()};\r\n}\r\n\r\nexport function $isEmptyLayoutItemNode(node: LexicalNode): boolean {\r\n if (!$isLayoutItemNode(node) || node.getChildrenSize() !== 1) {\r\n return false;\r\n }\r\n const firstChild = node.getFirstChild();\r\n return $isParagraphNode(firstChild) && firstChild.isEmpty();\r\n}\r\n\r\nexport class LayoutItemNode extends ElementNode {\r\n static getType(): string {\r\n return 'layout-item';\r\n }\r\n\r\n static clone(node: LayoutItemNode): LayoutItemNode {\r\n return new LayoutItemNode(node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('div');\r\n dom.setAttribute('data-lexical-layout-item', 'true');\r\n if (typeof config.theme.layoutItem === 'string') {\r\n addClassNamesToElement(dom, config.theme.layoutItem);\r\n }\r\n return dom;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n collapseAtStart(): boolean {\r\n const parent = this.getParentOrThrow();\r\n if (\r\n this.is(parent.getFirstChild()) &&\r\n parent.getChildren().every($isEmptyLayoutItemNode)\r\n ) {\r\n parent.remove();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: HTMLElement) => {\r\n if (!domNode.hasAttribute('data-lexical-layout-item')) {\r\n return null;\r\n }\r\n return {\r\n conversion: $convertLayoutItemElement,\r\n priority: 2,\r\n };\r\n },\r\n };\r\n }\r\n\r\n static importJSON(serializedNode: SerializedLayoutItemNode): LayoutItemNode {\r\n return $createLayoutItemNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isShadowRoot(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport function $createLayoutItemNode(): LayoutItemNode {\r\n return new LayoutItemNode();\r\n}\r\n\r\nexport function $isLayoutItemNode(\r\n node: LexicalNode | null | undefined,\r\n): node is LayoutItemNode {\r\n return node instanceof LayoutItemNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$insertNodeToNearestRoot, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {$createPageBreakNode, PageBreakNode} from '../../nodes/PageBreakNode';\r\n\r\nexport const INSERT_PAGE_BREAK: LexicalCommand<undefined> = createCommand();\r\n\r\nexport default function PageBreakPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([PageBreakNode])) {\r\n throw new Error(\r\n 'PageBreakPlugin: PageBreakNode is not registered on editor',\r\n );\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand(\r\n INSERT_PAGE_BREAK,\r\n () => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return false;\r\n }\r\n\r\n const focusNode = selection.focus.getNode();\r\n if (focusNode !== null) {\r\n const pgBreak = $createPageBreakNode();\r\n $insertNodeToNearestRoot(pgBreak);\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n DecoratorNode,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedLexicalNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useEffect} from 'react';\r\n\r\nexport type SerializedPageBreakNode = SerializedLexicalNode;\r\n\r\nfunction PageBreakComponent({nodeKey}: {nodeKey: NodeKey}) {\r\n const [editor] = useLexicalComposerContext();\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (event: MouseEvent) => {\r\n const pbElem = editor.getElementByKey(nodeKey);\r\n\r\n if (event.target === pbElem) {\r\n if (!event.shiftKey) {\r\n clearSelection();\r\n }\r\n setSelected(!isSelected);\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, setSelected]);\r\n\r\n useEffect(() => {\r\n const pbElem = editor.getElementByKey(nodeKey);\r\n if (pbElem !== null) {\r\n pbElem.className = isSelected ? 'selected' : '';\r\n }\r\n }, [editor, isSelected, nodeKey]);\r\n\r\n return null;\r\n}\r\n\r\nexport class PageBreakNode extends DecoratorNode<JSX.Element> {\r\n static getType(): string {\r\n return 'page-break';\r\n }\r\n\r\n static clone(node: PageBreakNode): PageBreakNode {\r\n return new PageBreakNode(node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedPageBreakNode): PageBreakNode {\r\n return $createPageBreakNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n figure: (domNode: HTMLElement) => {\r\n const tp = domNode.getAttribute('type');\r\n if (tp !== this.getType()) {\r\n return null;\r\n }\r\n\r\n return {\r\n conversion: $convertPageBreakElement,\r\n priority: COMMAND_PRIORITY_HIGH,\r\n };\r\n },\r\n };\r\n }\r\n\r\n createDOM(): HTMLElement {\r\n const el = document.createElement('figure');\r\n el.style.pageBreakAfter = 'always';\r\n el.setAttribute('type', this.getType());\r\n return el;\r\n }\r\n\r\n getTextContent(): string {\r\n return '\\n';\r\n }\r\n\r\n isInline(): false {\r\n return false;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return <PageBreakComponent nodeKey={this.__key} />;\r\n }\r\n}\r\n\r\nfunction $convertPageBreakElement(): DOMConversionOutput {\r\n return {node: $createPageBreakNode()};\r\n}\r\n\r\nexport function $createPageBreakNode(): PageBreakNode {\r\n return new PageBreakNode();\r\n}\r\n\r\nexport function $isPageBreakNode(\r\n node: LexicalNode | null | undefined,\r\n): node is PageBreakNode {\r\n return node instanceof PageBreakNode;\r\n}\r\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createNotesNode, NotesNode} from '../../nodes/NotesNode';\nimport {convertNotes} from '../../utils/tnr-formatters';\n\nexport const INSERT_NOTES_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_NOTES_COMMAND',\n);\n\nexport default function NotesPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([NotesNode])) {\n throw new Error('NotesPlugin: NotesNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_NOTES_COMMAND,\n (payload) => {\n const node = $createNotesNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertNotesDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertNotes(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_NOTES_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste notes here...\\nExample:\\nSuperficial Fascia\\nThe superficial fascia is a layer of loose...\\n\\nFunctions\\n- Passageway for vessels\\n- Insulation'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertNotes,\n parseNotesHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype NotesComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction NotesComponent({\n className,\n format,\n nodeKey,\n html,\n}: NotesComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [editText, setEditText] = useState('');\n\n const openEditor = useCallback(() => {\n setEditText(parseNotesHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n return editText.trim() ? convertNotes(editText) : '';\n }, [isEditing, editText]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isNotesNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: CARD_STYLES.notes.headingColor,\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Notes\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: CARD_STYLES.notes.headingColor}}>\n Edit Notes\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n <textarea\n value={editText}\n onChange={(e) => setEditText(e.target.value)}\n style={{\n width: '100%', minHeight: 150, fontFamily: 'monospace', fontSize: 12,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n }}\n />\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedNotesNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-notes';\n\nexport class NotesNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'notes-block';\n }\n\n static clone(node: NotesNode): NotesNode {\n return new NotesNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedNotesNode): NotesNode {\n return $createNotesNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedNotesNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertNotesElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <NotesComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertNotesElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createNotesNode(html)};\n return null;\n}\n\nexport function $createNotesNode(html: string): NotesNode {\n return new NotesNode(html);\n}\n\nexport function $isNotesNode(node: LexicalNode | null | undefined): node is NotesNode {\n return node instanceof NotesNode;\n}\n","// ===================================================================\n// Card style constants (from TNR_Tool.html)\n// ===================================================================\n\nexport const CARD_STYLES = {\n terminology: {\n light: \"rgba(191, 236, 233, 0.5)\",\n border: \"rgba(191, 236, 233, 1)\",\n keyColor: \"#2a8a85\",\n },\n revision: {\n light: \"rgba(251, 224, 203, 0.6)\",\n border: \"rgba(251, 224, 203, 1)\",\n },\n notes: {\n headingBorder: \"rgba(254, 158, 159, 0.6)\",\n headingColor: \"#6b5b95\",\n },\n};\n\n// ===================================================================\n// Utilities\n// ===================================================================\n\n/** Strip whitespace-only text nodes between HTML tags */\nexport function compactHtml(html: string): string {\n return html.replace(/>\\s+</g, \"><\");\n}\n\n// ===================================================================\n// Forward converters (plain text → styled HTML)\n// ===================================================================\n\nexport function convertTerminology(input: string): string {\n if (!input.trim()) return \"\";\n\n const style = CARD_STYLES.terminology;\n let html = '<div class=\"term-wrapper\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n const listItems = doc.querySelectorAll(\"li\");\n\n listItems.forEach((li) => {\n let term = \"\";\n let definition = \"\";\n let foundStrong = false;\n\n Array.from(li.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim() || \"\";\n if (text && foundStrong) {\n definition += text + \" \";\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const tagName = el.tagName;\n\n if (tagName === \"STRONG\" || tagName === \"B\") {\n term = (el.textContent?.trim() || \"\").replace(/:$/, \"\");\n foundStrong = true;\n } else if (tagName === \"SPAN\") {\n const innerStrong = el.querySelector(\"strong, b\");\n if (innerStrong) {\n term = (innerStrong.textContent?.trim() || \"\").replace(/:$/, \"\");\n foundStrong = true;\n } else {\n const text = el.textContent?.trim() || \"\";\n if (text) definition += text + \" \";\n }\n } else {\n const text = el.textContent?.trim() || \"\";\n if (text) definition += text + \" \";\n }\n }\n });\n\n definition = definition.trim().replace(/^:\\s*/, \"\");\n\n if (term) {\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${term}:</strong> ${definition}\n </div>\\n`;\n } else if (definition) {\n html += ` <div style=\"background: rgba(0,0,0,0.03); padding: 12px; margin-bottom: 10px; border-radius: 4px; font-family: sans-serif;\">${definition}</div>\\n`;\n }\n });\n\n if (listItems.length === 0) {\n const paragraphs = doc.querySelectorAll(\"p\");\n paragraphs.forEach((p) => {\n const text = p.textContent?.trim() || \"\";\n const colonIndex = text.indexOf(\":\");\n if (colonIndex > -1) {\n const t = text.substring(0, colonIndex).trim();\n const def = text.substring(colonIndex + 1).trim();\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${t}:</strong> ${def}\n </div>\\n`;\n }\n });\n }\n } else {\n const lines = input.split(\"\\n\").filter((l) => l.trim());\n lines.forEach((line) => {\n line = line.trim();\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > -1) {\n const term = line.substring(0, colonIndex).trim();\n const def = line.substring(colonIndex + 1).trim();\n html += ` <div style=\"background: ${style.light}; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${style.border}; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); font-family: sans-serif;\">\n <strong style=\"color: ${style.keyColor}; display: inline-block; margin-right: 5px;\">${term}:</strong> ${def}\n </div>\\n`;\n } else {\n html += ` <div style=\"background: rgba(0,0,0,0.03); padding: 12px; margin-bottom: 10px; border-radius: 4px; font-family: sans-serif;\">${line}</div>\\n`;\n }\n });\n }\n\n html += \"</div>\";\n return compactHtml(html);\n}\n\nexport function processNode(node: ChildNode): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\";\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return \"\";\n\n const el = node as Element;\n const tagName = el.tagName;\n\n if (tagName === \"IMG\") {\n return `<div style=\"margin: 20px 0; text-align: center;\">\n <img src=\"${(el as HTMLImageElement).src}\" style=\"max-width: 100%; height: auto; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);\">\n </div>`;\n }\n\n const childrenHtml = Array.from(el.childNodes).map(processNode).join(\"\");\n\n if (tagName === \"UL\" || tagName === \"OL\") {\n let listType = el.getAttribute(\"type\");\n if (!listType) {\n listType = tagName === \"UL\" ? \"disc\" : \"decimal\";\n }\n return `<${tagName.toLowerCase()} style=\"margin-left: 20px; padding-left: 20px; margin-bottom: 25px; margin-top: 10px; list-style-type: ${listType};\">${childrenHtml}</${tagName.toLowerCase()}>`;\n }\n\n if (tagName === \"LI\") {\n return `<li style=\"margin-bottom: 8px; padding-left: 5px;\">${childrenHtml}</li>`;\n }\n\n if (/^H[1-6]$/.test(tagName) || tagName === \"P\") {\n const text = (el.textContent || \"\").trim();\n if (childrenHtml.includes('<div style=\"margin: 20px')) {\n return childrenHtml;\n }\n if (!text && !el.querySelector(\"img\")) return \"\";\n\n const strong = el.querySelector(\"strong\") || el.querySelector(\"b\");\n const isBold = strong && text === (strong.textContent || \"\").trim();\n const isShort = text.length < 150;\n\n if (/^H[1-6]$/.test(tagName) || (tagName === \"P\" && isBold && isShort)) {\n const cleanContent = childrenHtml.replace(/<\\/?strong>/g, \"\").replace(/<\\/?b>/g, \"\");\n const style = CARD_STYLES.notes;\n return `<h3 style=\"color: ${style.headingColor}; border-bottom: 2px solid ${style.headingBorder}; padding-bottom: 5px; margin-top: 25px; margin-bottom: 15px;\">${cleanContent}</h3>`;\n }\n\n return `<p style=\"margin-bottom: 15px;\">${childrenHtml}</p>`;\n }\n\n if ([\"STRONG\", \"B\", \"EM\", \"I\", \"U\", \"SUB\", \"SUP\", \"A\"].includes(tagName)) {\n let attrs = \"\";\n if (tagName === \"A\" && (el as HTMLAnchorElement).href) {\n attrs = ` href=\"${(el as HTMLAnchorElement).href}\" target=\"_blank\" style=\"color: inherit; text-decoration: underline;\"`;\n }\n return `<${tagName.toLowerCase()}${attrs}>${childrenHtml}</${tagName.toLowerCase()}>`;\n }\n\n if ([\"SPAN\", \"FONT\", \"DIV\", \"CENTER\", \"SECTION\", \"ARTICLE\"].includes(tagName)) {\n return childrenHtml;\n }\n\n if (tagName === \"BR\") return \"<br>\";\n\n return childrenHtml;\n}\n\nexport function convertNotes(input: string): string {\n if (!input.trim()) return \"\";\n\n let html = '<div style=\"font-family: sans-serif; line-height: 1.6; color: inherit;\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n html += Array.from(doc.body.childNodes).map(processNode).join(\"\");\n } else {\n const paragraphs = input.split(/\\n\\s*\\n/);\n const style = CARD_STYLES.notes;\n\n paragraphs.forEach((p) => {\n p = p.trim();\n if (!p) return;\n\n if (p.match(/^[-•*]/) || p.match(/^\\d+\\./)) {\n const items = p\n .split(/\\n/)\n .map((l) => l.trim())\n .filter((l) => l);\n const isOrdered = p.match(/^\\d+\\./);\n const tag = isOrdered ? \"ol\" : \"ul\";\n\n html += ` <${tag} style=\"margin-left: 20px; padding-left: 20px; margin-bottom: 15px;\">\\n`;\n items.forEach((item) => {\n const cleanItem = item.replace(/^([-•*]|\\d+\\.)\\s*/, \"\");\n if (cleanItem) {\n html += ` <li style=\"margin-bottom: 5px;\">${cleanItem}</li>\\n`;\n }\n });\n html += ` </${tag}>\\n`;\n } else if (p.length < 100 && !p.endsWith(\".\")) {\n html += ` <h3 style=\"color: ${style.headingColor}; border-bottom: 2px solid ${style.headingBorder}; padding-bottom: 5px; margin-top: 25px; margin-bottom: 15px;\">${p}</h3>\\n`;\n } else {\n html += ` <p style=\"margin-bottom: 15px;\">${p}</p>\\n`;\n }\n });\n }\n\n html += \"</div>\";\n return compactHtml(html);\n}\n\nexport function convertRevision(input: string): string {\n if (!input.trim()) return \"\";\n\n const style = CARD_STYLES.revision;\n let html = `<div style=\"background: ${style.light}; padding: 20px; border-radius: 8px; border: 1px solid ${style.border}; font-family: sans-serif;\">\\n`;\n html += ' <ul style=\"list-style-type: none; padding: 0; margin: 0;\">\\n';\n\n if (/<[a-z][\\s\\S]*>/i.test(input)) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(input, \"text/html\");\n const listItems = doc.querySelectorAll(\"li\");\n\n const extractContent = (el: Element): string => {\n let result = \"\";\n Array.from(el.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n result += node.textContent || \"\";\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const child = node as Element;\n const tag = child.tagName;\n if (tag === \"STRONG\" || tag === \"B\") {\n result += `<strong>${extractContent(child)}</strong>`;\n } else if (tag === \"EM\" || tag === \"I\") {\n result += `<em>${extractContent(child)}</em>`;\n } else {\n result += extractContent(child);\n }\n }\n });\n return result;\n };\n\n listItems.forEach((li) => {\n const content = extractContent(li).trim();\n if (content) {\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${content}\n </li>\\n`;\n }\n });\n\n if (listItems.length === 0) {\n const paragraphs = doc.querySelectorAll(\"p\");\n paragraphs.forEach((p) => {\n const text = (p.textContent || \"\").trim();\n if (text) {\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${text}\n </li>\\n`;\n }\n });\n }\n } else {\n const lines = input.split(\"\\n\").filter((l) => l.trim());\n lines.forEach((line) => {\n const clean = line\n .replace(/^[-•*]\\s*/, \"\")\n .replace(/^\\d+\\.\\s*/, \"\")\n .trim();\n html += ` <li style=\"position: relative; padding-left: 30px; margin-bottom: 12px; line-height: 1.5;\">\n <span style=\"position: absolute; left: 0; top: 0;\">&#x2705;</span>${clean}\n </li>\\n`;\n });\n }\n\n html += \" </ul>\\n</div>\";\n return compactHtml(html);\n}\n\n// ===================================================================\n// Reverse parsers (styled HTML → editable data)\n// ===================================================================\n\nexport function parseTerminologyHtml(html: string): Array<{term: string; definition: string}> {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const items: Array<{term: string; definition: string}> = [];\n\n const cards = doc.querySelectorAll('div[style*=\"border-left\"]');\n cards.forEach((card) => {\n const strong = card.querySelector('strong');\n if (strong) {\n const term = (strong.textContent || '').replace(/:$/, '').trim();\n const clone = card.cloneNode(true) as Element;\n const strongClone = clone.querySelector('strong');\n if (strongClone) strongClone.remove();\n const definition = (clone.textContent || '').trim();\n items.push({term, definition});\n } else {\n const text = (card.textContent || '').trim();\n if (text) items.push({term: '', definition: text});\n }\n });\n\n return items;\n}\n\nexport function parseNotesHtml(html: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const lines: string[] = [];\n\n const children = doc.body.firstElementChild?.children || doc.body.children;\n Array.from(children).forEach((el) => {\n const tag = el.tagName;\n if (tag === 'H3' || tag === 'H2' || tag === 'H1') {\n if (lines.length > 0) lines.push('');\n lines.push((el.textContent || '').trim());\n } else if (tag === 'P') {\n lines.push((el.textContent || '').trim());\n } else if (tag === 'UL' || tag === 'OL') {\n const items = el.querySelectorAll('li');\n items.forEach((li) => {\n lines.push(`- ${(li.textContent || '').trim()}`);\n });\n }\n });\n\n return lines.join('\\n');\n}\n\nexport function parseRevisionHtml(html: string): string[] {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const items: string[] = [];\n\n const listItems = doc.querySelectorAll('li');\n listItems.forEach((li) => {\n const clone = li.cloneNode(true) as Element;\n const spans = clone.querySelectorAll('span');\n spans.forEach((span) => span.remove());\n const text = (clone.textContent || '').trim();\n if (text) items.push(text);\n });\n\n return items;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$wrapNodeInElement} from '@lexical/utils';\r\nimport {\r\n $createParagraphNode,\r\n $insertNodes,\r\n $isRootOrShadowRoot,\r\n COMMAND_PRIORITY_EDITOR,\r\n createCommand,\r\n LexicalCommand,\r\n LexicalEditor,\r\n} from 'lexical';\r\nimport {useEffect, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n $createPollNode,\r\n createPollOption,\r\n PollNode,\r\n} from '../../nodes/PollNode';\r\nimport Button from '../../ui/Button';\r\nimport {DialogActions} from '../../ui/Dialog';\r\nimport TextInput from '../../ui/TextInput';\r\n\r\nexport const INSERT_POLL_COMMAND: LexicalCommand<string> = createCommand(\r\n 'INSERT_POLL_COMMAND',\r\n);\r\n\r\nexport function InsertPollDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [question, setQuestion] = useState('');\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_POLL_COMMAND, question);\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <TextInput label=\"Question\" onChange={setQuestion} value={question} />\r\n <DialogActions>\r\n <Button disabled={question.trim() === ''} onClick={onClick}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function PollPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([PollNode])) {\r\n throw new Error('PollPlugin: PollNode not registered on editor');\r\n }\r\n\r\n return editor.registerCommand<string>(\r\n INSERT_POLL_COMMAND,\r\n (payload) => {\r\n const pollNode = $createPollNode(payload, [\r\n createPollOption(),\r\n createPollOption(),\r\n ]);\r\n $insertNodes([pollNode]);\r\n if ($isRootOrShadowRoot(pollNode.getParentOrThrow())) {\r\n $wrapNodeInElement(pollNode, $createParagraphNode).selectEnd();\r\n }\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR,\r\n );\r\n }, [editor]);\r\n return null;\r\n}\r\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createRevisionNode, RevisionNode} from '../../nodes/RevisionNode';\nimport {convertRevision} from '../../utils/tnr-formatters';\n\nexport const INSERT_REVISION_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_REVISION_COMMAND',\n);\n\nexport default function RevisionPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([RevisionNode])) {\n throw new Error('RevisionPlugin: RevisionNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_REVISION_COMMAND,\n (payload) => {\n const node = $createRevisionNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertRevisionDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertRevision(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_REVISION_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste revision points here...\\nExample:\\n- The superficial fascia is a subcutaneous layer.\\n- It connects the dermis to deep fascia.'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertRevision,\n parseRevisionHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype RevisionComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction RevisionComponent({\n className,\n format,\n nodeKey,\n html,\n}: RevisionComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [items, setItems] = useState<string[]>([]);\n\n const openEditor = useCallback(() => {\n setItems(parseRevisionHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n const filtered = items.filter((i) => i.trim());\n return filtered.length > 0 ? convertRevision(filtered.join('\\n')) : '';\n }, [isEditing, items]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isRevisionNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n const updateItem = useCallback((index: number, value: string) => {\n setItems((prev) => prev.map((item, i) => (i === index ? value : item)));\n }, []);\n\n const addItem = useCallback(() => {\n setItems((prev) => [...prev, '']);\n }, []);\n\n const removeItem = useCallback((index: number) => {\n setItems((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: '#c2703a',\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Revision\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: '#c2703a'}}>\n Edit Revision Points\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n {items.map((item, index) => (\n <div key={index} style={{display: 'flex', gap: 4, marginBottom: 4, alignItems: 'center'}}>\n <input\n type=\"text\" placeholder=\"Revision point\" value={item}\n onChange={(e) => updateItem(index, e.target.value)}\n style={{flex: 1, padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <button type=\"button\" onClick={() => removeItem(index)}\n style={{padding: '2px 6px', fontSize: 14, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', color: '#e11d48'}}>\n ×\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addItem}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', marginTop: 4}}>\n + Add Point\n </button>\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedRevisionNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-revision';\n\nexport class RevisionNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'revision-block';\n }\n\n static clone(node: RevisionNode): RevisionNode {\n return new RevisionNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedRevisionNode): RevisionNode {\n return $createRevisionNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedRevisionNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertRevisionElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <RevisionComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertRevisionElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createRevisionNode(html)};\n return null;\n}\n\nexport function $createRevisionNode(html: string): RevisionNode {\n return new RevisionNode(html);\n}\n\nexport function $isRevisionNode(node: LexicalNode | null | undefined): node is RevisionNode {\n return node instanceof RevisionNode;\n}\n","import type {JSX} from 'react';\n\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {$insertNodeToNearestRoot} from '@lexical/utils';\nimport {COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand, LexicalEditor} from 'lexical';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\n\nimport {$createTerminologyNode, TerminologyNode} from '../../nodes/TerminologyNode';\nimport {convertTerminology} from '../../utils/tnr-formatters';\n\nexport const INSERT_TERMINOLOGY_COMMAND: LexicalCommand<string> = createCommand(\n 'INSERT_TERMINOLOGY_COMMAND',\n);\n\nexport default function TerminologyPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n if (!editor.hasNodes([TerminologyNode])) {\n throw new Error('TerminologyPlugin: TerminologyNode not registered on editor');\n }\n\n return editor.registerCommand<string>(\n INSERT_TERMINOLOGY_COMMAND,\n (payload) => {\n const node = $createTerminologyNode(payload);\n $insertNodeToNearestRoot(node);\n return true;\n },\n COMMAND_PRIORITY_EDITOR,\n );\n }, [editor]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Insert Dialog (used by ToolbarPlugin showModal and ComponentPickerPlugin)\n// ---------------------------------------------------------------------------\n\nexport function InsertTerminologyDialog({\n activeEditor,\n onClose,\n}: {\n activeEditor: LexicalEditor;\n onClose: () => void;\n}): JSX.Element {\n const [input, setInput] = useState('');\n\n const preview = useMemo(() => {\n if (!input.trim()) return '';\n return convertTerminology(input);\n }, [input]);\n\n const handleInsert = useCallback(() => {\n if (!preview) return;\n activeEditor.dispatchCommand(INSERT_TERMINOLOGY_COMMAND, preview);\n onClose();\n }, [activeEditor, preview, onClose]);\n\n return (\n <div style={{minWidth: 500}}>\n <textarea\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder={'Paste terminology here...\\nExample:\\nSuperficial fascia: A layer of loose connective tissue...\\nDermis: The layer of skin deep to the epidermis...'}\n style={{\n width: '100%', minHeight: 120, fontFamily: 'monospace', fontSize: 13,\n padding: 8, border: '1px solid #ddd', borderRadius: 4, resize: 'vertical',\n marginBottom: 8,\n }}\n />\n {preview && (\n <div style={{marginBottom: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fafafa', maxHeight: 200, overflow: 'auto'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n <div style={{display: 'flex', justifyContent: 'flex-end', gap: 8}}>\n <button type=\"button\" onClick={onClose}\n style={{padding: '6px 16px', fontSize: 13, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={handleInsert} disabled={!preview}\n style={{padding: '6px 16px', fontSize: 13, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Insert\n </button>\n </div>\n </div>\n );\n}\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useMemo, useState} from 'react';\n\nimport {\n CARD_STYLES,\n convertTerminology,\n parseTerminologyHtml,\n} from '../utils/tnr-formatters';\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ntype TerminologyComponentProps = Readonly<{\n className: Readonly<{base: string; focus: string}>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction TerminologyComponent({\n className,\n format,\n nodeKey,\n html,\n}: TerminologyComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [items, setItems] = useState<Array<{term: string; definition: string}>>([]);\n\n const openEditor = useCallback(() => {\n setItems(parseTerminologyHtml(html));\n setIsEditing(true);\n }, [html]);\n\n const preview = useMemo(() => {\n if (!isEditing) return '';\n const text = items\n .filter((i) => i.term || i.definition)\n .map((i) => (i.term ? `${i.term}: ${i.definition}` : i.definition))\n .join('\\n');\n return text ? convertTerminology(text) : '';\n }, [isEditing, items]);\n\n const saveChanges = useCallback(() => {\n if (!preview) return;\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isTerminologyNode(node)) {\n node.setHtml(preview);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, preview]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n const updateItem = useCallback((index: number, field: 'term' | 'definition', value: string) => {\n setItems((prev) => prev.map((item, i) => (i === index ? {...item, [field]: value} : item)));\n }, []);\n\n const addItem = useCallback(() => {\n setItems((prev) => [...prev, {term: '', definition: ''}]);\n }, []);\n\n const removeItem = useCallback((index: number) => {\n setItems((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n return (\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute', top: 4, right: 4, zIndex: 10,\n background: CARD_STYLES.terminology.keyColor,\n color: '#fff', border: 'none', borderRadius: 4,\n padding: '2px 8px', fontSize: 12, cursor: 'pointer',\n opacity: 0, transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit Terminology\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8}}>\n <span style={{fontSize: 13, fontWeight: 600, color: CARD_STYLES.terminology.keyColor}}>\n Edit Terminology\n </span>\n <div style={{display: 'flex', gap: 4}}>\n <button type=\"button\" onClick={cancelEdit}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ccc', borderRadius: 4, background: '#fff', cursor: 'pointer'}}>\n Cancel\n </button>\n <button type=\"button\" onClick={saveChanges} disabled={!preview}\n style={{padding: '2px 10px', fontSize: 12, border: 'none', borderRadius: 4, background: '#2563eb', color: '#fff', cursor: 'pointer', opacity: preview ? 1 : 0.5}}>\n Save\n </button>\n </div>\n </div>\n {items.map((item, index) => (\n <div key={index} style={{display: 'flex', gap: 4, marginBottom: 4, alignItems: 'center'}}>\n <input\n type=\"text\" placeholder=\"Term\" value={item.term}\n onChange={(e) => updateItem(index, 'term', e.target.value)}\n style={{width: '30%', padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <input\n type=\"text\" placeholder=\"Definition\" value={item.definition}\n onChange={(e) => updateItem(index, 'definition', e.target.value)}\n style={{flex: 1, padding: '4px 6px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4}}\n />\n <button type=\"button\" onClick={() => removeItem(index)}\n style={{padding: '2px 6px', fontSize: 14, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', color: '#e11d48'}}>\n ×\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={addItem}\n style={{padding: '2px 10px', fontSize: 12, border: '1px solid #ddd', borderRadius: 4, background: '#fff', cursor: 'pointer', marginTop: 4}}>\n + Add Term\n </button>\n {preview && (\n <div style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}>\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: preview}} />\n </div>\n )}\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node\n// ---------------------------------------------------------------------------\n\nexport type SerializedTerminologyNode = Spread<{html: string}, SerializedDecoratorBlockNode>;\n\nconst DATA_ATTR = 'data-lexical-terminology';\n\nexport class TerminologyNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'terminology-block';\n }\n\n static clone(node: TerminologyNode): TerminologyNode {\n return new TerminologyNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedTerminologyNode): TerminologyNode {\n return $createTerminologyNode(serializedNode.html).updateFromJSON(serializedNode);\n }\n\n exportJSON(): SerializedTerminologyNode {\n return {...super.exportJSON(), html: this.__html};\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) return null;\n return {conversion: convertTerminologyElement, priority: 2};\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const cls = {base: embedBlockTheme.base || '', focus: embedBlockTheme.focus || ''};\n return (\n <TerminologyComponent\n className={cls}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertTerminologyElement(domNode: HTMLElement): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) return {node: $createTerminologyNode(html)};\n return null;\n}\n\nexport function $createTerminologyNode(html: string): TerminologyNode {\n return new TerminologyNode(html);\n}\n\nexport function $isTerminologyNode(node: LexicalNode | null | undefined): node is TerminologyNode {\n return node instanceof TerminologyNode;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n INSERT_TABLE_COMMAND,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from '@lexical/table';\r\nimport {EditorThemeClasses, Klass, LexicalEditor, LexicalNode} from 'lexical';\r\nimport {createContext, useContext, useEffect, useMemo, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport TextInput from '../ui/TextInput';\r\n\r\nexport type InsertTableCommandPayload = Readonly<{\r\n columns: string;\r\n rows: string;\r\n includeHeaders?: boolean;\r\n}>;\r\n\r\nexport type CellContextShape = {\r\n cellEditorConfig: null | CellEditorConfig;\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>;\r\n set: (\r\n cellEditorConfig: null | CellEditorConfig,\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>,\r\n ) => void;\r\n};\r\n\r\nexport type CellEditorConfig = Readonly<{\r\n namespace: string;\r\n nodes?: ReadonlyArray<Klass<LexicalNode>>;\r\n onError: (error: Error, editor: LexicalEditor) => void;\r\n readOnly?: boolean;\r\n theme?: EditorThemeClasses;\r\n}>;\r\n\r\nexport const CellContext = createContext<CellContextShape>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n set: () => {\r\n // Empty\r\n },\r\n});\r\n\r\nexport function TableContext({children}: {children: JSX.Element}) {\r\n const [contextValue, setContextValue] = useState<{\r\n cellEditorConfig: null | CellEditorConfig;\r\n cellEditorPlugins: null | JSX.Element | Array<JSX.Element>;\r\n }>({\r\n cellEditorConfig: null,\r\n cellEditorPlugins: null,\r\n });\r\n return (\r\n <CellContext.Provider\r\n value={useMemo(\r\n () => ({\r\n cellEditorConfig: contextValue.cellEditorConfig,\r\n cellEditorPlugins: contextValue.cellEditorPlugins,\r\n set: (cellEditorConfig, cellEditorPlugins) => {\r\n setContextValue({cellEditorConfig, cellEditorPlugins});\r\n },\r\n }),\r\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\r\n )}>\r\n {children}\r\n </CellContext.Provider>\r\n );\r\n}\r\n\r\nexport function InsertTableDialog({\r\n activeEditor,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const [rows, setRows] = useState('5');\r\n const [columns, setColumns] = useState('5');\r\n const [isDisabled, setIsDisabled] = useState(true);\r\n\r\n useEffect(() => {\r\n const row = Number(rows);\r\n const column = Number(columns);\r\n if (row && row > 0 && row <= 500 && column && column > 0 && column <= 50) {\r\n setIsDisabled(false);\r\n } else {\r\n setIsDisabled(true);\r\n }\r\n }, [rows, columns]);\r\n\r\n const onClick = () => {\r\n activeEditor.dispatchCommand(INSERT_TABLE_COMMAND, {\r\n columns,\r\n rows,\r\n });\r\n\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <TextInput\r\n placeholder={'# of rows (1-500)'}\r\n label=\"Rows\"\r\n onChange={setRows}\r\n value={rows}\r\n data-test-id=\"table-modal-rows\"\r\n type=\"number\"\r\n />\r\n <TextInput\r\n placeholder={'# of columns (1-50)'}\r\n label=\"Columns\"\r\n onChange={setColumns}\r\n value={columns}\r\n data-test-id=\"table-modal-columns\"\r\n type=\"number\"\r\n />\r\n <DialogActions data-test-id=\"table-model-confirm-insert\">\r\n <Button disabled={isDisabled} onClick={onClick}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport function TablePlugin({\r\n cellEditorConfig,\r\n children,\r\n}: {\r\n cellEditorConfig: CellEditorConfig;\r\n children: JSX.Element | Array<JSX.Element>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n const cellContext = useContext(CellContext);\r\n useEffect(() => {\r\n if (!editor.hasNodes([TableNode, TableRowNode, TableCellNode])) {\r\n throw new Error(\r\n 'TablePlugin: TableNode, TableRowNode, or TableCellNode is not registered on editor',\r\n );\r\n }\r\n }, [editor]);\r\n useEffect(() => {\r\n cellContext.set(cellEditorConfig, children);\r\n }, [cellContext, cellEditorConfig, children]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n NodeContextMenuOption,\r\n NodeContextMenuPlugin,\r\n NodeContextMenuSeparator,\r\n} from '@lexical/react/LexicalNodeContextMenuPlugin';\r\nimport {\r\n $getSelection,\r\n $isDecoratorNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n COPY_COMMAND,\r\n CUT_COMMAND,\r\n type LexicalNode,\r\n PASTE_COMMAND,\r\n} from 'lexical';\r\nimport {useMemo} from 'react';\r\n\r\nexport default function ContextMenuPlugin(): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const items = useMemo(() => {\r\n return [\r\n new NodeContextMenuOption(`Remove Link`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n },\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon\" />,\r\n }),\r\n new NodeContextMenuSeparator({\r\n $showOn: (node: LexicalNode) => $isLinkNode(node.getParent()),\r\n }),\r\n new NodeContextMenuOption(`Cut`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(CUT_COMMAND, null);\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon page-break\" />\r\n ),\r\n }),\r\n new NodeContextMenuOption(`Copy`, {\r\n $onSelect: () => {\r\n editor.dispatchCommand(COPY_COMMAND, null);\r\n },\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon copy\" />,\r\n }),\r\n new NodeContextMenuOption(`Paste`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (...args) {\r\n const data = new DataTransfer();\r\n\r\n const readClipboardItems = await navigator.clipboard.read();\r\n const item = readClipboardItems[0];\r\n\r\n const permission = await navigator.permissions.query({\r\n // @ts-expect-error These types are incorrect.\r\n name: 'clipboard-read',\r\n });\r\n if (permission.state === 'denied') {\r\n alert('Not allowed to paste from clipboard.');\r\n return;\r\n }\r\n\r\n for (const type of item.types) {\r\n const dataString = await (await item.getType(type)).text();\r\n data.setData(type, dataString);\r\n }\r\n\r\n const event = new ClipboardEvent('paste', {\r\n clipboardData: data,\r\n });\r\n\r\n editor.dispatchCommand(PASTE_COMMAND, event);\r\n });\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon paste\" />\r\n ),\r\n }),\r\n new NodeContextMenuOption(`Paste as Plain Text`, {\r\n $onSelect: () => {\r\n navigator.clipboard.read().then(async function (...args) {\r\n const permission = await navigator.permissions.query({\r\n // @ts-expect-error These types are incorrect.\r\n name: 'clipboard-read',\r\n });\r\n\r\n if (permission.state === 'denied') {\r\n alert('Not allowed to paste from clipboard.');\r\n return;\r\n }\r\n\r\n const data = new DataTransfer();\r\n const clipboardText = await navigator.clipboard.readText();\r\n data.setData('text/plain', clipboardText);\r\n\r\n const event = new ClipboardEvent('paste', {\r\n clipboardData: data,\r\n });\r\n editor.dispatchCommand(PASTE_COMMAND, event);\r\n });\r\n },\r\n disabled: false,\r\n icon: <i className=\"PlaygroundEditorTheme__contextMenuItemIcon\" />,\r\n }),\r\n new NodeContextMenuSeparator(),\r\n new NodeContextMenuOption(`Delete Node`, {\r\n $onSelect: () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const currentNode = selection.anchor.getNode();\r\n const ancestorNodeWithRootAsParent = currentNode\r\n .getParents()\r\n .at(-2);\r\n\r\n ancestorNodeWithRootAsParent?.remove();\r\n } else if ($isNodeSelection(selection)) {\r\n const selectedNodes = selection.getNodes();\r\n selectedNodes.forEach((node) => {\r\n if ($isDecoratorNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n },\r\n disabled: false,\r\n icon: (\r\n <i className=\"PlaygroundEditorTheme__contextMenuItemIcon clear\" />\r\n ),\r\n }),\r\n ];\r\n }, [editor]);\r\n\r\n return (\r\n <NodeContextMenuPlugin\r\n className=\"PlaygroundEditorTheme__contextMenu\"\r\n itemClassName=\"PlaygroundEditorTheme__contextMenuItem\"\r\n separatorClassName=\"PlaygroundEditorTheme__contextMenuSeparator\"\r\n items={items}\r\n />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {DRAG_DROP_PASTE} from '@lexical/rich-text';\r\nimport {isMimeType, mediaFileReader} from '@lexical/utils';\r\nimport {COMMAND_PRIORITY_LOW} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {useEditorConfig} from '../../context/EditorConfigContext';\r\nimport {uploadImageToBaasix} from '../../utils/baasixUpload';\r\nimport {INSERT_IMAGE_COMMAND} from '../ImagesPlugin';\r\n\r\nconst ACCEPTABLE_IMAGE_TYPES = [\r\n 'image/',\r\n 'image/heic',\r\n 'image/heif',\r\n 'image/gif',\r\n 'image/webp',\r\n];\r\n\r\nexport default function DragDropPaste(): null {\r\n const [editor] = useLexicalComposerContext();\r\n const {baasixClient, folder} = useEditorConfig();\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n DRAG_DROP_PASTE,\r\n (files) => {\r\n (async () => {\r\n const filesResult = await mediaFileReader(\r\n files,\r\n [ACCEPTABLE_IMAGE_TYPES].flatMap((x) => x),\r\n );\r\n for (const {file, result} of filesResult) {\r\n if (isMimeType(file, ACCEPTABLE_IMAGE_TYPES)) {\r\n let src: string;\r\n try {\r\n src = await uploadImageToBaasix(baasixClient, file, folder);\r\n } catch {\r\n // Fall back to data URL if upload fails\r\n src = result;\r\n }\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\r\n altText: file.name,\r\n src,\r\n });\r\n }\r\n }\r\n })();\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor, folder]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {DraggableBlockPlugin_EXPERIMENTAL} from '@lexical/react/LexicalDraggableBlockPlugin';\r\nimport {\r\n $createParagraphNode,\r\n $createTextNode,\r\n $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\r\n $isParagraphNode,\r\n $isTextNode,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport {\r\n ComponentPickerMenuItem,\r\n ComponentPickerOption,\r\n getBaseOptions,\r\n getDynamicOptions,\r\n} from '../ComponentPickerPlugin';\r\n\r\nconst DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu';\r\n\r\ntype PickerState = {\r\n insertBefore: boolean;\r\n targetNodeKey: NodeKey;\r\n};\r\n\r\nfunction isOnMenu(element: HTMLElement): boolean {\r\n return !!element.closest(`.${DRAGGABLE_BLOCK_MENU_CLASSNAME}`);\r\n}\r\n\r\nexport default function DraggableBlockPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const [modal, showModal] = useModal();\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const pickerRef = useRef<HTMLDivElement>(null);\r\n const searchInputRef = useRef<HTMLInputElement>(null);\r\n const targetLineRef = useRef<HTMLDivElement>(null);\r\n const [draggableElement, setDraggableElement] = useState<HTMLElement | null>(\r\n null,\r\n );\r\n const [pickerState, setPickerState] = useState<PickerState | null>(null);\r\n const [isPickerOpen, setIsPickerOpen] = useState(false);\r\n const [queryString, setQueryString] = useState('');\r\n const [highlightedIndex, setHighlightedIndex] = useState(0);\r\n const [pickerPosition, setPickerPosition] = useState<{\r\n left: number;\r\n top: number;\r\n } | null>(null);\r\n\r\n const options = useMemo(() => {\r\n const baseOptions = getBaseOptions(editor, showModal);\r\n\r\n if (!queryString) {\r\n return baseOptions;\r\n }\r\n\r\n const regex = new RegExp(queryString, 'i');\r\n return [\r\n ...getDynamicOptions(editor, queryString),\r\n ...baseOptions.filter(\r\n (option) =>\r\n regex.test(option.title) ||\r\n option.keywords.some((keyword) => regex.test(keyword)),\r\n ),\r\n ];\r\n }, [editor, queryString, showModal]);\r\n\r\n useEffect(() => {\r\n if (isPickerOpen && searchInputRef.current) {\r\n // Use preventScroll to avoid the Sheet scrolling to top when the\r\n // picker is portaled outside the Sheet's DOM tree.\r\n searchInputRef.current.focus({preventScroll: true});\r\n }\r\n }, [isPickerOpen]);\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen || !options.length) {\r\n return;\r\n }\r\n setHighlightedIndex((current) =>\r\n Math.min(current, Math.max(options.length - 1, 0)),\r\n );\r\n }, [isPickerOpen, options.length]);\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen) {\r\n return;\r\n }\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node | null;\r\n if (\r\n (pickerRef.current && pickerRef.current.contains(target)) ||\r\n (menuRef.current && menuRef.current.contains(target))\r\n ) {\r\n return;\r\n }\r\n setIsPickerOpen(false);\r\n setPickerState(null);\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [isPickerOpen]);\r\n\r\n const selectOption = useCallback(\r\n (option: ComponentPickerOption) => {\r\n if (!pickerState) {\r\n setIsPickerOpen(false);\r\n return;\r\n }\r\n setIsPickerOpen(false);\r\n editor.update(() => {\r\n const node = $getNodeByKey(pickerState.targetNodeKey);\r\n if (!node) {\r\n return;\r\n }\r\n const placeholder = $createParagraphNode();\r\n const textNode = $createTextNode('');\r\n placeholder.append(textNode);\r\n if (pickerState.insertBefore) {\r\n node.insertBefore(placeholder);\r\n } else {\r\n node.insertAfter(placeholder);\r\n }\r\n textNode.select();\r\n option.onSelect(queryString);\r\n const latestPlaceholder = placeholder.getLatest();\r\n if ($isParagraphNode(latestPlaceholder)) {\r\n const onlyChild = latestPlaceholder.getFirstChild();\r\n if (\r\n $isTextNode(onlyChild) &&\r\n onlyChild.getTextContent().length === 0 &&\r\n latestPlaceholder.getChildrenSize() === 1\r\n ) {\r\n latestPlaceholder.remove();\r\n }\r\n }\r\n });\r\n },\r\n [editor, pickerState, queryString],\r\n );\r\n\r\n useEffect(() => {\r\n if (!isPickerOpen) {\r\n return;\r\n }\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (!isPickerOpen || !options.length) {\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n setHighlightedIndex((index) =>\r\n index + 1 >= options.length ? 0 : index + 1,\r\n );\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n setHighlightedIndex((index) =>\r\n index - 1 < 0 ? options.length - 1 : index - 1,\r\n );\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n const option = options[highlightedIndex];\r\n if (option) {\r\n selectOption(option);\r\n }\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n setIsPickerOpen(false);\r\n setPickerState(null);\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [highlightedIndex, isPickerOpen, options, selectOption]);\r\n\r\n function openComponentPicker(e: React.MouseEvent) {\r\n if (!draggableElement || !editor) {\r\n return;\r\n }\r\n\r\n let targetNodeKey: NodeKey | null = null;\r\n editor.read(() => {\r\n const resolvedNode = $getNearestNodeFromDOMNode(draggableElement);\r\n if (resolvedNode) {\r\n targetNodeKey = resolvedNode.getKey();\r\n }\r\n });\r\n\r\n if (!targetNodeKey) {\r\n return;\r\n }\r\n\r\n const insertBefore = e.altKey || e.ctrlKey;\r\n const rect = menuRef.current?.getBoundingClientRect();\r\n setPickerPosition(\r\n rect\r\n ? {\r\n left: rect.left + rect.width + window.scrollX + 8,\r\n top: rect.top + window.scrollY,\r\n }\r\n : null,\r\n );\r\n setPickerState({insertBefore, targetNodeKey});\r\n setQueryString('');\r\n setHighlightedIndex(0);\r\n setIsPickerOpen(true);\r\n }\r\n\r\n return (\r\n <>\r\n {modal}\r\n {isPickerOpen && pickerPosition\r\n ? ReactDOM.createPortal(\r\n <div\r\n className=\"typeahead-popover component-picker-menu draggable-block-component-picker\"\r\n ref={pickerRef}\r\n style={{\r\n left: pickerPosition.left,\r\n position: 'absolute',\r\n top: pickerPosition.top,\r\n zIndex: 10,\r\n }}>\r\n <input\r\n className=\"component-picker-search\"\r\n placeholder=\"Filter blocks...\"\r\n value={queryString}\r\n ref={searchInputRef}\r\n onChange={(event) => setQueryString(event.target.value)}\r\n />\r\n <ul>\r\n {options.map((option, i: number) => (\r\n <ComponentPickerMenuItem\r\n index={i}\r\n isSelected={highlightedIndex === i}\r\n onClick={() => {\r\n setHighlightedIndex(i);\r\n selectOption(option);\r\n }}\r\n onMouseEnter={() => setHighlightedIndex(i)}\r\n key={option.key}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n document.body,\r\n )\r\n : null}\r\n <DraggableBlockPlugin_EXPERIMENTAL\r\n anchorElem={anchorElem}\r\n menuRef={menuRef}\r\n targetLineRef={targetLineRef}\r\n menuComponent={\r\n <div ref={menuRef} className=\"icon draggable-block-menu\">\r\n <button\r\n type=\"button\"\r\n title=\"Click to add below\"\r\n className=\"icon icon-plus\"\r\n onClick={openComponentPicker}\r\n />\r\n <div className=\"icon\" />\r\n </div>\r\n }\r\n targetLineComponent={\r\n <div ref={targetLineRef} className=\"draggable-block-target-line\" />\r\n }\r\n isOnMenu={isOnMenu}\r\n onElementChanged={setDraggableElement}\r\n />\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n LexicalTypeaheadMenuPlugin,\r\n MenuOption,\r\n useBasicTypeaheadTriggerMatch,\r\n} from '@lexical/react/LexicalTypeaheadMenuPlugin';\r\nimport {\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useState} from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\nclass EmojiOption extends MenuOption {\r\n title: string;\r\n emoji: string;\r\n keywords: Array<string>;\r\n\r\n constructor(\r\n title: string,\r\n emoji: string,\r\n options: {\r\n keywords?: Array<string>;\r\n },\r\n ) {\r\n super(title);\r\n this.title = title;\r\n this.emoji = emoji;\r\n this.keywords = options.keywords || [];\r\n }\r\n}\r\nfunction EmojiMenuItem({\r\n index,\r\n isSelected,\r\n onClick,\r\n onMouseEnter,\r\n option,\r\n}: {\r\n index: number;\r\n isSelected: boolean;\r\n onClick: () => void;\r\n onMouseEnter: () => void;\r\n option: EmojiOption;\r\n}) {\r\n let className = 'item';\r\n if (isSelected) {\r\n className += ' selected';\r\n }\r\n return (\r\n <li\r\n key={option.key}\r\n tabIndex={-1}\r\n className={className}\r\n ref={option.setRefElement}\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n id={'typeahead-item-' + index}\r\n onMouseEnter={onMouseEnter}\r\n onClick={onClick}>\r\n <span className=\"text\">\r\n {option.emoji} {option.title}\r\n </span>\r\n </li>\r\n );\r\n}\r\n\r\ntype Emoji = {\r\n emoji: string;\r\n description: string;\r\n category: string;\r\n aliases: Array<string>;\r\n tags: Array<string>;\r\n unicode_version: string;\r\n ios_version: string;\r\n skin_tones?: boolean;\r\n};\r\n\r\nconst MAX_EMOJI_SUGGESTION_COUNT = 10;\r\n\r\nexport default function EmojiPickerPlugin() {\r\n const [editor] = useLexicalComposerContext();\r\n const [queryString, setQueryString] = useState<string | null>(null);\r\n const [emojis, setEmojis] = useState<Array<Emoji>>([]);\r\n\r\n useEffect(() => {\r\n import('../../utils/emoji-list').then((file) => setEmojis(file.default));\r\n }, []);\r\n\r\n const emojiOptions = useMemo(\r\n () =>\r\n emojis != null\r\n ? emojis.map(\r\n ({emoji, aliases, tags}) =>\r\n new EmojiOption(aliases[0], emoji, {\r\n keywords: [...aliases, ...tags],\r\n }),\r\n )\r\n : [],\r\n [emojis],\r\n );\r\n\r\n const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(':', {\r\n minLength: 0,\r\n punctuation: '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>:;', // allow _ and -\r\n });\r\n\r\n const options: Array<EmojiOption> = useMemo(() => {\r\n return emojiOptions\r\n .filter((option: EmojiOption) => {\r\n return queryString != null\r\n ? new RegExp(queryString, 'gi').exec(option.title) ||\r\n option.keywords != null\r\n ? option.keywords.some((keyword: string) =>\r\n new RegExp(queryString, 'gi').exec(keyword),\r\n )\r\n : false\r\n : emojiOptions;\r\n })\r\n .slice(0, MAX_EMOJI_SUGGESTION_COUNT);\r\n }, [emojiOptions, queryString]);\r\n\r\n const onSelectOption = useCallback(\r\n (\r\n selectedOption: EmojiOption,\r\n nodeToRemove: TextNode | null,\r\n closeMenu: () => void,\r\n ) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection) || selectedOption == null) {\r\n return;\r\n }\r\n\r\n if (nodeToRemove) {\r\n nodeToRemove.remove();\r\n }\r\n\r\n selection.insertNodes([$createTextNode(selectedOption.emoji)]);\r\n\r\n closeMenu();\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n return (\r\n <LexicalTypeaheadMenuPlugin\r\n onQueryChange={setQueryString}\r\n onSelectOption={onSelectOption}\r\n triggerFn={checkForTriggerMatch}\r\n options={options}\r\n menuRenderFn={(\r\n anchorElementRef,\r\n {selectedIndex, selectOptionAndCleanUp, setHighlightedIndex},\r\n ) => {\r\n if (anchorElementRef.current == null || options.length === 0) {\r\n return null;\r\n }\r\n\r\n return anchorElementRef.current && options.length\r\n ? ReactDOM.createPortal(\r\n <div className=\"typeahead-popover emoji-menu\">\r\n <ul>\r\n {options.map((option: EmojiOption, index) => (\r\n <EmojiMenuItem\r\n key={option.key}\r\n index={index}\r\n isSelected={selectedIndex === index}\r\n onClick={() => {\r\n setHighlightedIndex(index);\r\n selectOptionAndCleanUp(option);\r\n }}\r\n onMouseEnter={() => {\r\n setHighlightedIndex(index);\r\n }}\r\n option={option}\r\n />\r\n ))}\r\n </ul>\r\n </div>,\r\n anchorElementRef.current,\r\n )\r\n : null;\r\n }}\r\n />\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {\r\n $createLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n TOGGLE_LINK_COMMAND,\r\n} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$findMatchingParent, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isLineBreakNode,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n getDOMSelection,\r\n KEY_ESCAPE_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPositionForLinkEditor} from '../../utils/setFloatingElemPositionForLinkEditor';\r\nimport {sanitizeUrl} from '../../utils/url';\r\n\r\nfunction preventDefault(\r\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\r\n): void {\r\n event.preventDefault();\r\n}\r\n\r\nfunction FloatingLinkEditor({\r\n editor,\r\n isLink,\r\n setIsLink,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n isLink: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n anchorElem: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element {\r\n const editorRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const [editedLinkUrl, setEditedLinkUrl] = useState('https://');\r\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(\r\n null,\r\n );\r\n\r\n const $updateLinkEditor = useCallback(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection);\r\n const linkParent = $findMatchingParent(node, $isLinkNode);\r\n\r\n if (linkParent) {\r\n setLinkUrl(linkParent.getURL());\r\n } else if ($isLinkNode(node)) {\r\n setLinkUrl(node.getURL());\r\n } else {\r\n setLinkUrl('');\r\n }\r\n if (isLinkEditMode) {\r\n setEditedLinkUrl(linkUrl);\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length > 0) {\r\n const node = nodes[0];\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent)) {\r\n setLinkUrl(parent.getURL());\r\n } else if ($isLinkNode(node)) {\r\n setLinkUrl(node.getURL());\r\n } else {\r\n setLinkUrl('');\r\n }\r\n if (isLinkEditMode) {\r\n setEditedLinkUrl(linkUrl);\r\n }\r\n }\r\n }\r\n\r\n const editorElem = editorRef.current;\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const activeElement = document.activeElement;\r\n\r\n if (editorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n\r\n if (selection !== null && rootElement !== null && editor.isEditable()) {\r\n let domRect: DOMRect | undefined;\r\n\r\n if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length > 0) {\r\n const element = editor.getElementByKey(nodes[0].getKey());\r\n if (element) {\r\n domRect = element.getBoundingClientRect();\r\n }\r\n }\r\n } else if (\r\n nativeSelection !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n domRect =\r\n nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\r\n }\r\n\r\n if (domRect) {\r\n domRect.y += 40;\r\n setFloatingElemPositionForLinkEditor(domRect, editorElem, anchorElem);\r\n }\r\n setLastSelection(selection);\r\n } else if (!activeElement || activeElement.className !== 'link-input') {\r\n if (rootElement !== null) {\r\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem);\r\n }\r\n setLastSelection(null);\r\n setIsLinkEditMode(false);\r\n setLinkUrl('');\r\n }\r\n\r\n return true;\r\n }, [anchorElem, editor, setIsLinkEditMode, isLinkEditMode, linkUrl]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [anchorElem.parentElement, editor, $updateLinkEditor]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateLinkEditor();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateLinkEditor();\r\n return true;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n () => {\r\n if (isLink) {\r\n setIsLink(false);\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n ),\r\n );\r\n }, [editor, $updateLinkEditor, setIsLink, isLink]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n }, [editor, $updateLinkEditor]);\r\n\r\n useEffect(() => {\r\n if (isLinkEditMode && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [isLinkEditMode, isLink]);\r\n\r\n useEffect(() => {\r\n const editorElement = editorRef.current;\r\n if (editorElement === null) {\r\n return;\r\n }\r\n const handleBlur = (event: FocusEvent) => {\r\n if (!editorElement.contains(event.relatedTarget as Element) && isLink) {\r\n setIsLink(false);\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n editorElement.addEventListener('focusout', handleBlur);\r\n return () => {\r\n editorElement.removeEventListener('focusout', handleBlur);\r\n };\r\n }, [editorRef, setIsLink, setIsLinkEditMode, isLink]);\r\n\r\n const monitorInputInteraction = (\r\n event: React.KeyboardEvent<HTMLInputElement>,\r\n ) => {\r\n if (event.key === 'Enter') {\r\n handleLinkSubmission(event);\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n\r\n const handleLinkSubmission = (\r\n event:\r\n | React.KeyboardEvent<HTMLInputElement>\r\n | React.MouseEvent<HTMLElement>,\r\n ) => {\r\n event.preventDefault();\r\n if (lastSelection !== null) {\r\n if (linkUrl !== '') {\r\n editor.update(() => {\r\n editor.dispatchCommand(\r\n TOGGLE_LINK_COMMAND,\r\n sanitizeUrl(editedLinkUrl),\r\n );\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const parent = getSelectedNode(selection).getParent();\r\n if ($isAutoLinkNode(parent)) {\r\n const linkNode = $createLinkNode(parent.getURL(), {\r\n rel: parent.__rel,\r\n target: parent.__target,\r\n title: parent.__title,\r\n });\r\n parent.replace(linkNode, true);\r\n }\r\n }\r\n });\r\n }\r\n setEditedLinkUrl('https://');\r\n setIsLinkEditMode(false);\r\n }\r\n };\r\n\r\n return (\r\n <div ref={editorRef} className=\"link-editor\">\r\n {!isLink ? null : isLinkEditMode ? (\r\n <>\r\n <input\r\n ref={inputRef}\r\n className=\"link-input\"\r\n value={editedLinkUrl}\r\n onChange={(event) => {\r\n setEditedLinkUrl(event.target.value);\r\n }}\r\n onKeyDown={(event) => {\r\n monitorInputInteraction(event);\r\n }}\r\n />\r\n <div>\r\n <div\r\n className=\"link-cancel\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n setIsLinkEditMode(false);\r\n }}\r\n />\r\n\r\n <div\r\n className=\"link-confirm\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={handleLinkSubmission}\r\n />\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"link-view\">\r\n <a\r\n href={sanitizeUrl(linkUrl)}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\">\r\n {linkUrl}\r\n </a>\r\n <div\r\n className=\"link-edit\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={(event) => {\r\n event.preventDefault();\r\n setEditedLinkUrl(linkUrl);\r\n setIsLinkEditMode(true);\r\n }}\r\n />\r\n <div\r\n className=\"link-trash\"\r\n role=\"button\"\r\n tabIndex={0}\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingLinkEditorToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n isLinkEditMode: boolean,\r\n setIsLinkEditMode: Dispatch<boolean>,\r\n): JSX.Element | null {\r\n const [activeEditor, setActiveEditor] = useState(editor);\r\n const [isLink, setIsLink] = useState(false);\r\n\r\n useEffect(() => {\r\n function $updateToolbar() {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const focusNode = getSelectedNode(selection);\r\n const focusLinkNode = $findMatchingParent(focusNode, $isLinkNode);\r\n const focusAutoLinkNode = $findMatchingParent(\r\n focusNode,\r\n $isAutoLinkNode,\r\n );\r\n if (!(focusLinkNode || focusAutoLinkNode)) {\r\n setIsLink(false);\r\n return;\r\n }\r\n const badNode = selection\r\n .getNodes()\r\n .filter((node) => !$isLineBreakNode(node))\r\n .find((node) => {\r\n const linkNode = $findMatchingParent(node, $isLinkNode);\r\n const autoLinkNode = $findMatchingParent(node, $isAutoLinkNode);\r\n return (\r\n (focusLinkNode && !focusLinkNode.is(linkNode)) ||\r\n (linkNode && !linkNode.is(focusLinkNode)) ||\r\n (focusAutoLinkNode && !focusAutoLinkNode.is(autoLinkNode)) ||\r\n (autoLinkNode &&\r\n (!autoLinkNode.is(focusAutoLinkNode) ||\r\n autoLinkNode.getIsUnlinked()))\r\n );\r\n });\r\n if (!badNode) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n } else if ($isNodeSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n if (nodes.length === 0) {\r\n setIsLink(false);\r\n return;\r\n }\r\n const node = nodes[0];\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n }\r\n }\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateToolbar();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_payload, newEditor) => {\r\n $updateToolbar();\r\n setActiveEditor(newEditor);\r\n return false;\r\n },\r\n COMMAND_PRIORITY_CRITICAL,\r\n ),\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const node = getSelectedNode(selection);\r\n const linkNode = $findMatchingParent(node, $isLinkNode);\r\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\r\n window.open(linkNode.getURL(), '_blank');\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n return createPortal(\r\n <FloatingLinkEditor\r\n editor={activeEditor}\r\n isLink={isLink}\r\n anchorElem={anchorElem}\r\n setIsLink={setIsLink}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingLinkEditorPlugin({\r\n anchorElem = document.body,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingLinkEditorToolbar(\r\n editor,\r\n anchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode,\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {$isAtNodeEnd} from '@lexical/selection';\r\nimport {ElementNode, RangeSelection, TextNode} from 'lexical';\r\n\r\nexport function getSelectedNode(\r\n selection: RangeSelection,\r\n): TextNode | ElementNode {\r\n const anchor = selection.anchor;\r\n const focus = selection.focus;\r\n const anchorNode = selection.anchor.getNode();\r\n const focusNode = selection.focus.getNode();\r\n if (anchorNode === focusNode) {\r\n return anchorNode;\r\n }\r\n const isBackward = selection.isBackward();\r\n if (isBackward) {\r\n return $isAtNodeEnd(focus) ? anchorNode : focusNode;\r\n } else {\r\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode;\r\n }\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPositionForLinkEditor(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n top += floatingElemRect.height + targetRect.height + verticalGap * 2;\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n getDOMSelection,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isUppercase,\r\n isLowercase,\r\n isCapitalize,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isUppercase: boolean;\r\n isLowercase: boolean;\r\n isCapitalize: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n setIsLinkEditMode(true);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n setIsLinkEditMode(false);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink, setIsLinkEditMode]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const $updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = getDOMSelection(editor._window);\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n $updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n $updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, $updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n title=\"Bold\"\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n title=\"Italic\"\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n title=\"Underline\"\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n title=\"Strikethrough\"\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n }}\r\n className={'popup-item spaced ' + (isUppercase ? 'active' : '')}\r\n title=\"Uppercase\"\r\n aria-label=\"Format text to uppercase\">\r\n <i className=\"format uppercase\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n }}\r\n className={'popup-item spaced ' + (isLowercase ? 'active' : '')}\r\n title=\"Lowercase\"\r\n aria-label=\"Format text to lowercase\">\r\n <i className=\"format lowercase\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n }}\r\n className={'popup-item spaced ' + (isCapitalize ? 'active' : '')}\r\n title=\"Capitalize\"\r\n aria-label=\"Format text to capitalize\">\r\n <i className=\"format capitalize\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n title=\"Insert code block\"\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n title=\"Insert link\"\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n title=\"Insert comment\"\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n setIsLinkEditMode: Dispatch<boolean>,\r\n): JSX.Element | null {\r\n const [isText, setIsText] = useState(false);\r\n const [isLink, setIsLink] = useState(false);\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isUppercase, setIsUppercase] = useState(false);\r\n const [isLowercase, setIsLowercase] = useState(false);\r\n const [isCapitalize, setIsCapitalize] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n\r\n const updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsUppercase(selection.hasFormat('uppercase'));\r\n setIsLowercase(selection.hasFormat('lowercase'));\r\n setIsCapitalize(selection.hasFormat('capitalize'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isUppercase={isUppercase}\r\n isLowercase={isLowercase}\r\n isCapitalize={isCapitalize}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n setIsLinkEditMode,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem, setIsLinkEditMode);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n // Check if text is end-aligned\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const textNode = range.startContainer;\r\n if (textNode.nodeType === Node.ELEMENT_NODE || textNode.parentElement) {\r\n const textElement =\r\n textNode.nodeType === Node.ELEMENT_NODE\r\n ? (textNode as Element)\r\n : (textNode.parentElement as Element);\r\n const textAlign = window.getComputedStyle(textElement).textAlign;\r\n\r\n if (textAlign === 'right' || textAlign === 'end') {\r\n // For end-aligned text, position the toolbar relative to the text end\r\n left = targetRect.right - floatingElemRect.width + horizontalOffset;\r\n }\r\n }\r\n }\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n if (left < editorScrollerRect.left) {\r\n left = editorScrollerRect.left + horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {MarkdownShortcutPlugin} from '@lexical/react/LexicalMarkdownShortcutPlugin';\r\nimport * as React from 'react';\r\n\r\nimport {PLAYGROUND_TRANSFORMERS} from '../MarkdownTransformers';\r\n\r\nexport default function MarkdownPlugin(): JSX.Element {\r\n return <MarkdownShortcutPlugin transformers={PLAYGROUND_TRANSFORMERS} />;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {$trimTextContentFromAnchor} from '@lexical/selection';\r\nimport {$restoreEditorState} from '@lexical/utils';\r\nimport {$getSelection, $isRangeSelection, EditorState, RootNode} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nexport function MaxLengthPlugin({maxLength}: {maxLength: number}): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n let lastRestoredEditorState: EditorState | null = null;\r\n\r\n return editor.registerNodeTransform(RootNode, (rootNode: RootNode) => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\r\n return;\r\n }\r\n const prevEditorState = editor.getEditorState();\r\n const prevTextContentSize = prevEditorState.read(() =>\r\n rootNode.getTextContentSize(),\r\n );\r\n const textContentSize = rootNode.getTextContentSize();\r\n if (prevTextContentSize !== textContentSize) {\r\n const delCount = textContentSize - maxLength;\r\n const anchor = selection.anchor;\r\n\r\n if (delCount > 0) {\r\n // Restore the old editor state instead if the last\r\n // text content was already at the limit.\r\n if (\r\n prevTextContentSize === maxLength &&\r\n lastRestoredEditorState !== prevEditorState\r\n ) {\r\n lastRestoredEditorState = prevEditorState;\r\n $restoreEditorState(editor, prevEditorState);\r\n } else {\r\n $trimTextContentFromAnchor(editor, anchor, delCount);\r\n }\r\n }\r\n }\r\n });\r\n }, [editor, maxLength]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {HeadingTagType} from '@lexical/rich-text';\r\nimport {\r\n COMMAND_PRIORITY_NORMAL,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n INDENT_CONTENT_COMMAND,\r\n isModifierMatch,\r\n KEY_DOWN_COMMAND,\r\n LexicalEditor,\r\n OUTDENT_CONTENT_COMMAND,\r\n} from 'lexical';\r\nimport {Dispatch, useEffect} from 'react';\r\n\r\nimport {useToolbarState} from '../../context/ToolbarContext';\r\nimport {sanitizeUrl} from '../../utils/url';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\nimport {\r\n clearFormatting,\r\n formatBulletList,\r\n formatCheckList,\r\n formatCode,\r\n formatHeading,\r\n formatNumberedList,\r\n formatParagraph,\r\n formatQuote,\r\n updateFontSize,\r\n UpdateFontSizeType,\r\n} from '../ToolbarPlugin/utils';\r\nimport {\r\n isAddComment,\r\n isCapitalize,\r\n isCenterAlign,\r\n isClearFormatting,\r\n isDecreaseFontSize,\r\n isFormatBulletList,\r\n isFormatCheckList,\r\n isFormatCode,\r\n isFormatHeading,\r\n isFormatNumberedList,\r\n isFormatParagraph,\r\n isFormatQuote,\r\n isIncreaseFontSize,\r\n isIndent,\r\n isInsertCodeBlock,\r\n isInsertLink,\r\n isJustifyAlign,\r\n isLeftAlign,\r\n isLowercase,\r\n isOutdent,\r\n isRightAlign,\r\n isStrikeThrough,\r\n isSubscript,\r\n isSuperscript,\r\n isUppercase,\r\n} from './shortcuts';\r\n\r\nexport default function ShortcutsPlugin({\r\n editor,\r\n setIsLinkEditMode,\r\n}: {\r\n editor: LexicalEditor;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}): null {\r\n const {toolbarState} = useToolbarState();\r\n\r\n useEffect(() => {\r\n const keyboardShortcutsHandler = (event: KeyboardEvent) => {\r\n // Short-circuit, a least one modifier must be set\r\n if (isModifierMatch(event, {})) {\r\n return false;\r\n } else if (isFormatParagraph(event)) {\r\n formatParagraph(editor);\r\n } else if (isFormatHeading(event)) {\r\n const {code} = event;\r\n const headingSize = `h${code[code.length - 1]}` as HeadingTagType;\r\n formatHeading(editor, toolbarState.blockType, headingSize);\r\n } else if (isFormatBulletList(event)) {\r\n formatBulletList(editor, toolbarState.blockType);\r\n } else if (isFormatNumberedList(event)) {\r\n formatNumberedList(editor, toolbarState.blockType);\r\n } else if (isFormatCheckList(event)) {\r\n formatCheckList(editor, toolbarState.blockType);\r\n } else if (isFormatCode(event)) {\r\n formatCode(editor, toolbarState.blockType);\r\n } else if (isFormatQuote(event)) {\r\n formatQuote(editor, toolbarState.blockType);\r\n } else if (isStrikeThrough(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n } else if (isLowercase(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n } else if (isUppercase(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n } else if (isCapitalize(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n } else if (isIndent(event)) {\r\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined);\r\n } else if (isOutdent(event)) {\r\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined);\r\n } else if (isCenterAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\r\n } else if (isLeftAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\r\n } else if (isRightAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\r\n } else if (isJustifyAlign(event)) {\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\r\n } else if (isSubscript(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n } else if (isSuperscript(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n } else if (isInsertCodeBlock(event)) {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n } else if (isIncreaseFontSize(event)) {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.increment,\r\n toolbarState.fontSizeInputValue,\r\n );\r\n } else if (isDecreaseFontSize(event)) {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.decrement,\r\n toolbarState.fontSizeInputValue,\r\n );\r\n } else if (isClearFormatting(event)) {\r\n clearFormatting(editor);\r\n } else if (isInsertLink(event)) {\r\n const url = toolbarState.isLink ? null : sanitizeUrl('https://');\r\n setIsLinkEditMode(!toolbarState.isLink);\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, url);\r\n } else if (isAddComment(event)) {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n } else {\r\n // No match for any of the event handlers\r\n return false;\r\n }\r\n event.preventDefault();\r\n return true;\r\n };\r\n\r\n return editor.registerCommand(\r\n KEY_DOWN_COMMAND,\r\n keyboardShortcutsHandler,\r\n COMMAND_PRIORITY_NORMAL,\r\n );\r\n }, [\r\n editor,\r\n toolbarState.isLink,\r\n toolbarState.blockType,\r\n toolbarState.fontSizeInputValue,\r\n setIsLinkEditMode,\r\n ]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport {$createCodeNode} from '@lexical/code';\r\nimport {\r\n INSERT_CHECK_LIST_COMMAND,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport {$isDecoratorBlockNode} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport {\r\n $createHeadingNode,\r\n $createQuoteNode,\r\n $isHeadingNode,\r\n $isQuoteNode,\r\n HeadingTagType,\r\n} from '@lexical/rich-text';\r\nimport {$patchStyleText, $setBlocksType} from '@lexical/selection';\r\nimport {$isTableSelection} from '@lexical/table';\r\nimport {$getNearestBlockElementAncestorOrThrow} from '@lexical/utils';\r\nimport {\r\n $addUpdateTag,\r\n $createParagraphNode,\r\n $createRangeSelection,\r\n $getSelection,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n $splitNode,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n SKIP_DOM_SELECTION_TAG,\r\n SKIP_SELECTION_FOCUS_TAG,\r\n} from 'lexical';\r\n\r\nimport {\r\n DEFAULT_FONT_SIZE,\r\n MAX_ALLOWED_FONT_SIZE,\r\n MIN_ALLOWED_FONT_SIZE,\r\n} from '../../context/ToolbarContext';\r\n\r\n// eslint-disable-next-line no-shadow\r\nexport enum UpdateFontSizeType {\r\n increment = 1,\r\n decrement,\r\n}\r\n\r\n/**\r\n * Calculates the new font size based on the update type.\r\n * @param currentFontSize - The current font size\r\n * @param updateType - The type of change, either increment or decrement\r\n * @returns the next font size\r\n */\r\nexport const calculateNextFontSize = (\r\n currentFontSize: number,\r\n updateType: UpdateFontSizeType | null,\r\n) => {\r\n if (!updateType) {\r\n return currentFontSize;\r\n }\r\n\r\n let updatedFontSize: number = currentFontSize;\r\n switch (updateType) {\r\n case UpdateFontSizeType.decrement:\r\n switch (true) {\r\n case currentFontSize > MAX_ALLOWED_FONT_SIZE:\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n break;\r\n case currentFontSize >= 48:\r\n updatedFontSize -= 12;\r\n break;\r\n case currentFontSize >= 24:\r\n updatedFontSize -= 4;\r\n break;\r\n case currentFontSize >= 14:\r\n updatedFontSize -= 2;\r\n break;\r\n case currentFontSize >= 9:\r\n updatedFontSize -= 1;\r\n break;\r\n default:\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n break;\r\n }\r\n break;\r\n\r\n case UpdateFontSizeType.increment:\r\n switch (true) {\r\n case currentFontSize < MIN_ALLOWED_FONT_SIZE:\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n break;\r\n case currentFontSize < 12:\r\n updatedFontSize += 1;\r\n break;\r\n case currentFontSize < 20:\r\n updatedFontSize += 2;\r\n break;\r\n case currentFontSize < 36:\r\n updatedFontSize += 4;\r\n break;\r\n case currentFontSize <= 60:\r\n updatedFontSize += 12;\r\n break;\r\n default:\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n break;\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n return updatedFontSize;\r\n};\r\n\r\n/**\r\n * Patches the selection with the updated font size.\r\n */\r\nexport const updateFontSizeInSelection = (\r\n editor: LexicalEditor,\r\n newFontSize: string | null,\r\n updateType: UpdateFontSizeType | null,\r\n skipRefocus: boolean,\r\n) => {\r\n const getNextFontSize = (prevFontSize: string | null): string => {\r\n if (!prevFontSize) {\r\n prevFontSize = `${DEFAULT_FONT_SIZE}px`;\r\n }\r\n prevFontSize = prevFontSize.slice(0, -2);\r\n const nextFontSize = calculateNextFontSize(\r\n Number(prevFontSize),\r\n updateType,\r\n );\r\n return `${nextFontSize}px`;\r\n };\r\n\r\n editor.update(() => {\r\n if (skipRefocus) {\r\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\r\n }\r\n if (editor.isEditable()) {\r\n const selection = $getSelection();\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n 'font-size': newFontSize || getNextFontSize,\r\n });\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const updateFontSize = (\r\n editor: LexicalEditor,\r\n updateType: UpdateFontSizeType,\r\n inputValue: string,\r\n skipRefocus: boolean = false,\r\n) => {\r\n if (inputValue !== '') {\r\n const nextFontSize = calculateNextFontSize(Number(inputValue), updateType);\r\n updateFontSizeInSelection(\r\n editor,\r\n String(nextFontSize) + 'px',\r\n null,\r\n skipRefocus,\r\n );\r\n } else {\r\n updateFontSizeInSelection(editor, null, updateType, skipRefocus);\r\n }\r\n};\r\n\r\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n });\r\n};\r\n\r\nexport const formatHeading = (\r\n editor: LexicalEditor,\r\n blockType: string,\r\n headingSize: HeadingTagType,\r\n) => {\r\n if (blockType !== headingSize) {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\r\n });\r\n }\r\n};\r\n\r\nexport const formatBulletList = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'bullet') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatCheckList = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'check') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatNumberedList = (\r\n editor: LexicalEditor,\r\n blockType: string,\r\n) => {\r\n if (blockType !== 'number') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\r\n });\r\n } else {\r\n formatParagraph(editor);\r\n }\r\n};\r\n\r\nexport const formatQuote = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'quote') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n });\r\n }\r\n};\r\n\r\nfunction $splitParagraphsByLineBreaks(selection: RangeSelection): void {\r\n const blocks: Set<ElementNode> = new Set();\r\n for (const node of selection.getNodes()) {\r\n const block = $isParagraphNode(node) ? node : $findParagraphParent(node);\r\n if (block !== null) {\r\n blocks.add(block);\r\n }\r\n }\r\n for (const point of [selection.anchor, selection.focus]) {\r\n const block = $findParagraphParent(point.getNode());\r\n if (block !== null) {\r\n blocks.add(block);\r\n }\r\n }\r\n\r\n const anchorKey = selection.anchor.key;\r\n const anchorOffset = selection.anchor.offset;\r\n const anchorType = selection.anchor.type;\r\n const focusKey = selection.focus.key;\r\n const focusOffset = selection.focus.offset;\r\n const focusType = selection.focus.type;\r\n\r\n for (const block of blocks) {\r\n const children = block.getChildren();\r\n const lbIndices: number[] = [];\r\n for (let i = 0; i < children.length; i++) {\r\n if ($isLineBreakNode(children[i])) {\r\n lbIndices.push(i);\r\n }\r\n }\r\n if (lbIndices.length === 0) {\r\n continue;\r\n }\r\n for (let j = lbIndices.length - 1; j >= 0; j--) {\r\n const [, rightBlock] = $splitNode(block, lbIndices[j]);\r\n const firstChild = rightBlock.getFirstChild();\r\n if ($isLineBreakNode(firstChild)) {\r\n firstChild.remove();\r\n }\r\n }\r\n }\r\n\r\n const newSelection = $createRangeSelection();\r\n newSelection.anchor.set(anchorKey, anchorOffset, anchorType);\r\n newSelection.focus.set(focusKey, focusOffset, focusType);\r\n $setSelection(newSelection);\r\n}\r\n\r\nfunction $findParagraphParent(node: LexicalNode): ElementNode | null {\r\n if ($isParagraphNode(node)) {\r\n return node;\r\n }\r\n const parent = node.getParent();\r\n return $isElementNode(parent) && $isParagraphNode(parent) ? parent : null;\r\n}\r\n\r\nexport const formatCode = (editor: LexicalEditor, blockType: string) => {\r\n if (blockType !== 'code') {\r\n editor.update(() => {\r\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\r\n let selection = $getSelection();\r\n if (!selection) {\r\n return;\r\n }\r\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n } else {\r\n $splitParagraphsByLineBreaks(selection);\r\n selection = $getSelection();\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n const textContent = selection.getTextContent();\r\n const codeNode = $createCodeNode();\r\n selection.insertNodes([codeNode]);\r\n selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n selection.insertRawText(textContent);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nexport const clearFormatting = (\r\n editor: LexicalEditor,\r\n skipRefocus: boolean = false,\r\n) => {\r\n editor.update(() => {\r\n if (skipRefocus) {\r\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\r\n }\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const anchor = selection.anchor;\r\n const focus = selection.focus;\r\n const nodes = selection.getNodes();\r\n const extractedNodes = selection.extract();\r\n\r\n if (anchor.key === focus.key && anchor.offset === focus.offset) {\r\n return;\r\n }\r\n\r\n nodes.forEach((node, idx) => {\r\n // We split the first and last node by the selection\r\n // So that we don't format unselected text inside those nodes\r\n if ($isTextNode(node)) {\r\n // Use a separate variable to ensure TS does not lose the refinement\r\n let textNode = node;\r\n if (idx === 0 && anchor.offset !== 0) {\r\n textNode = textNode.splitText(anchor.offset)[1] || textNode;\r\n }\r\n if (idx === nodes.length - 1) {\r\n textNode = textNode.splitText(focus.offset)[0] || textNode;\r\n }\r\n /**\r\n * If the selected text has one format applied\r\n * selecting a portion of the text, could\r\n * clear the format to the wrong portion of the text.\r\n *\r\n * The cleared text is based on the length of the selected text.\r\n */\r\n // We need this in case the selected text only has one format\r\n const extractedTextNode = extractedNodes[0];\r\n if (nodes.length === 1 && $isTextNode(extractedTextNode)) {\r\n textNode = extractedTextNode;\r\n }\r\n\r\n if (textNode.__style !== '') {\r\n textNode.setStyle('');\r\n }\r\n if (textNode.__format !== 0) {\r\n textNode.setFormat(0);\r\n }\r\n const nearestBlockElement =\r\n $getNearestBlockElementAncestorOrThrow(textNode);\r\n if (nearestBlockElement.__format !== 0) {\r\n nearestBlockElement.setFormat('');\r\n }\r\n if (nearestBlockElement.__indent !== 0) {\r\n nearestBlockElement.setIndent(0);\r\n }\r\n node = textNode;\r\n } else if ($isHeadingNode(node) || $isQuoteNode(node)) {\r\n node.replace($createParagraphNode(), true);\r\n } else if ($isDecoratorBlockNode(node)) {\r\n node.setFormat('');\r\n }\r\n });\r\n }\r\n });\r\n};\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {IS_APPLE} from '@lexical/utils';\r\nimport {isModifierMatch} from 'lexical';\r\n\r\n//disable eslint sorting rule for quick reference to shortcuts\r\n/* eslint-disable */\r\nexport const SHORTCUTS = Object.freeze({\r\n // (Ctrl|⌘) + (Alt|Option) + <key> shortcuts\r\n NORMAL: IS_APPLE ? '⌘+Opt+0' : 'Ctrl+Alt+0',\r\n HEADING1: IS_APPLE ? '⌘+Opt+1' : 'Ctrl+Alt+1',\r\n HEADING2: IS_APPLE ? '⌘+Opt+2' : 'Ctrl+Alt+2',\r\n HEADING3: IS_APPLE ? '⌘+Opt+3' : 'Ctrl+Alt+3',\r\n NUMBERED_LIST: IS_APPLE ? '⌘+Shift+7' : 'Ctrl+Shift+7',\r\n BULLET_LIST: IS_APPLE ? '⌘+Shift+8' : 'Ctrl+Shift+8',\r\n CHECK_LIST: IS_APPLE ? '⌘+Shift+9' : 'Ctrl+Shift+9',\r\n CODE_BLOCK: IS_APPLE ? '⌘+Opt+C' : 'Ctrl+Alt+C',\r\n QUOTE: IS_APPLE ? '⌃+Shift+Q' : 'Ctrl+Shift+Q',\r\n ADD_COMMENT: IS_APPLE ? '⌘+Opt+M' : 'Ctrl+Alt+M',\r\n\r\n // (Ctrl|⌘) + Shift + <key> shortcuts\r\n INCREASE_FONT_SIZE: IS_APPLE ? '⌘+Shift+.' : 'Ctrl+Shift+.',\r\n DECREASE_FONT_SIZE: IS_APPLE ? '⌘+Shift+,' : 'Ctrl+Shift+,',\r\n INSERT_CODE_BLOCK: IS_APPLE ? '⌘+Shift+C' : 'Ctrl+Shift+C',\r\n STRIKETHROUGH: IS_APPLE ? '⌘+Shift+X' : 'Ctrl+Shift+X',\r\n LOWERCASE: IS_APPLE ? '⌃+Shift+1' : 'Ctrl+Shift+1',\r\n UPPERCASE: IS_APPLE ? '⌃+Shift+2' : 'Ctrl+Shift+2',\r\n CAPITALIZE: IS_APPLE ? '⌃+Shift+3' : 'Ctrl+Shift+3',\r\n CENTER_ALIGN: IS_APPLE ? '⌘+Shift+E' : 'Ctrl+Shift+E',\r\n JUSTIFY_ALIGN: IS_APPLE ? '⌘+Shift+J' : 'Ctrl+Shift+J',\r\n LEFT_ALIGN: IS_APPLE ? '⌘+Shift+L' : 'Ctrl+Shift+L',\r\n RIGHT_ALIGN: IS_APPLE ? '⌘+Shift+R' : 'Ctrl+Shift+R',\r\n\r\n // (Ctrl|⌘) + <key> shortcuts\r\n SUBSCRIPT: IS_APPLE ? '⌘+,' : 'Ctrl+,',\r\n SUPERSCRIPT: IS_APPLE ? '⌘+.' : 'Ctrl+.',\r\n INDENT: IS_APPLE ? '⌘+]' : 'Ctrl+]',\r\n OUTDENT: IS_APPLE ? '⌘+[' : 'Ctrl+[',\r\n CLEAR_FORMATTING: IS_APPLE ? '⌘+\\\\' : 'Ctrl+\\\\',\r\n REDO: IS_APPLE ? '⌘+Shift+Z' : 'Ctrl+Y',\r\n UNDO: IS_APPLE ? '⌘+Z' : 'Ctrl+Z',\r\n BOLD: IS_APPLE ? '⌘+B' : 'Ctrl+B',\r\n ITALIC: IS_APPLE ? '⌘+I' : 'Ctrl+I',\r\n UNDERLINE: IS_APPLE ? '⌘+U' : 'Ctrl+U',\r\n INSERT_LINK: IS_APPLE ? '⌘+K' : 'Ctrl+K',\r\n});\r\n\r\nconst CONTROL_OR_META = {ctrlKey: !IS_APPLE, metaKey: IS_APPLE};\r\n\r\nexport function isFormatParagraph(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n\r\n return (\r\n (code === 'Numpad0' || code === 'Digit0') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatHeading(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n\r\n // Apple pencil keyboard events don't have a code property\r\n if (!code) {\r\n return false;\r\n }\r\n\r\n const keyNumber = code[code.length - 1];\r\n\r\n return (\r\n ['1', '2', '3'].includes(keyNumber) &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatNumberedList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad7' || code === 'Digit7') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatBulletList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad8' || code === 'Digit8') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatCheckList(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad9' || code === 'Digit9') &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatCode(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyC' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n\r\nexport function isFormatQuote(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyQ' &&\r\n isModifierMatch(event, {\r\n ctrlKey: true,\r\n shiftKey: true,\r\n })\r\n );\r\n}\r\n\r\nexport function isLowercase(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad1' || code === 'Digit1') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isUppercase(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad2' || code === 'Digit2') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isCapitalize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n (code === 'Numpad3' || code === 'Digit3') &&\r\n isModifierMatch(event, {ctrlKey: true, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isStrikeThrough(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyX' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isIndent(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'BracketRight' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isOutdent(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'BracketLeft' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isCenterAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyE' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isLeftAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyL' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isRightAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyR' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isJustifyAlign(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyJ' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isSubscript(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Comma' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isSuperscript(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Period' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isInsertCodeBlock(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyC' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isIncreaseFontSize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'Period' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isDecreaseFontSize(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'Comma' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, shiftKey: true})\r\n );\r\n}\r\n\r\nexport function isClearFormatting(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'Backslash' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isInsertLink(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return code === 'KeyK' && isModifierMatch(event, CONTROL_OR_META);\r\n}\r\n\r\nexport function isAddComment(event: KeyboardEvent): boolean {\r\n const {code} = event;\r\n return (\r\n code === 'KeyM' &&\r\n isModifierMatch(event, {...CONTROL_OR_META, altKey: true})\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {TextNode} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nimport {\r\n $createSpecialTextNode,\r\n SpecialTextNode,\r\n} from '../../nodes/SpecialTextNode';\r\n\r\nconst BRACKETED_TEXT_REGEX = /\\[([^\\[\\]]+)\\]/; // eslint-disable-line\r\n\r\nfunction $findAndTransformText(node: TextNode): null | TextNode {\r\n const text = node.getTextContent();\r\n\r\n const match = BRACKETED_TEXT_REGEX.exec(text);\r\n if (match) {\r\n const matchedText = match[1];\r\n const startIndex = match.index;\r\n\r\n let targetNode;\r\n if (startIndex === 0) {\r\n [targetNode] = node.splitText(startIndex + match[0].length);\r\n } else {\r\n [, targetNode] = node.splitText(startIndex, startIndex + match[0].length);\r\n }\r\n\r\n const specialTextNode = $createSpecialTextNode(matchedText);\r\n targetNode.replace(specialTextNode);\r\n return specialTextNode;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction $textNodeTransform(node: TextNode): void {\r\n let targetNode: TextNode | null = node;\r\n\r\n while (targetNode !== null) {\r\n if (!targetNode.isSimpleText()) {\r\n return;\r\n }\r\n\r\n targetNode = $findAndTransformText(targetNode);\r\n }\r\n}\r\n\r\nfunction useTextTransformation(editor: LexicalEditor): void {\r\n useEffect(() => {\r\n if (!editor.hasNodes([SpecialTextNode])) {\r\n throw new Error(\r\n 'SpecialTextPlugin: SpecialTextNode not registered on editor',\r\n );\r\n }\r\n\r\n return editor.registerNodeTransform(TextNode, $textNodeTransform);\r\n }, [editor]);\r\n}\r\n\r\nexport default function SpecialTextPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useTextTransformation(editor);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {EditorConfig, LexicalNode, SerializedTextNode} from 'lexical';\r\n\r\nimport {addClassNamesToElement} from '@lexical/utils';\r\nimport {$applyNodeReplacement, TextNode} from 'lexical';\r\n\r\n/** @noInheritDoc */\r\nexport class SpecialTextNode extends TextNode {\r\n static getType(): string {\r\n return 'specialText';\r\n }\r\n\r\n static clone(node: SpecialTextNode): SpecialTextNode {\r\n return new SpecialTextNode(node.__text, node.__key);\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = document.createElement('span');\r\n addClassNamesToElement(dom, config.theme.specialText);\r\n dom.textContent = this.getTextContent();\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\r\n if (prevNode.__text.startsWith('[') && prevNode.__text.endsWith(']')) {\r\n const strippedText = this.__text.substring(1, this.__text.length - 1); // Strip brackets again\r\n dom.textContent = strippedText; // Update the text content\r\n }\r\n\r\n addClassNamesToElement(dom, config.theme.specialText);\r\n\r\n return false;\r\n }\r\n\r\n static importJSON(serializedNode: SerializedTextNode): SpecialTextNode {\r\n return $createSpecialTextNode().updateFromJSON(serializedNode);\r\n }\r\n\r\n isTextEntity(): true {\r\n return true;\r\n }\r\n canInsertTextAfter(): boolean {\r\n return false; // Prevents appending text to this node\r\n }\r\n}\r\n\r\n/**\r\n * Creates a SpecialTextNode with the given text.\r\n * @param text - Text content for the SpecialTextNode.\r\n * @returns A new SpecialTextNode instance.\r\n */\r\nexport function $createSpecialTextNode(text = ''): SpecialTextNode {\r\n return $applyNodeReplacement(new SpecialTextNode(text));\r\n}\r\n\r\n/**\r\n * Checks if a node is a SpecialTextNode.\r\n * @param node - Node to check.\r\n * @returns True if the node is a SpecialTextNode.\r\n */\r\nexport function $isSpecialTextNode(\r\n node: LexicalNode | null | undefined,\r\n): node is SpecialTextNode {\r\n return node instanceof SpecialTextNode;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n COMMAND_PRIORITY_LOW,\r\n FOCUS_COMMAND,\r\n} from 'lexical';\r\nimport {useEffect} from 'react';\r\n\r\nconst TAB_TO_FOCUS_INTERVAL = 100;\r\n\r\nlet lastTabKeyDownTimestamp = 0;\r\nlet hasRegisteredKeyDownListener = false;\r\n\r\nfunction registerKeyTimeStampTracker() {\r\n window.addEventListener(\r\n 'keydown',\r\n (event: KeyboardEvent) => {\r\n // Tab\r\n if (event.key === 'Tab') {\r\n lastTabKeyDownTimestamp = event.timeStamp;\r\n }\r\n },\r\n true,\r\n );\r\n}\r\n\r\nexport default function TabFocusPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!hasRegisteredKeyDownListener) {\r\n registerKeyTimeStampTracker();\r\n hasRegisteredKeyDownListener = true;\r\n }\r\n\r\n return editor.registerCommand(\r\n FOCUS_COMMAND,\r\n (event: FocusEvent) => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n if (\r\n lastTabKeyDownTimestamp + TAB_TO_FOCUS_INTERVAL >\r\n event.timeStamp\r\n ) {\r\n $setSelection(selection.clone());\r\n }\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {ElementNode, LexicalEditor} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {\r\n $computeTableMapSkipCellCheck,\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $getNodeTriplet,\r\n $getTableCellNodeFromLexicalNode,\r\n $getTableColumnIndexFromTableCellNode,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $insertTableColumnAtSelection,\r\n $insertTableRowAtSelection,\r\n $isTableCellNode,\r\n $isTableSelection,\r\n $mergeCells,\r\n $unmergeCell,\r\n getTableElement,\r\n getTableObserverFromTableElement,\r\n TableCellHeaderStates,\r\n TableCellNode,\r\n TableObserver,\r\n TableSelection,\r\n} from '@lexical/table';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n COMMAND_PRIORITY_CRITICAL,\r\n getDOMSelection,\r\n isDOMNode,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {ReactPortal, useCallback, useEffect, useRef, useState} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport useModal from '../../hooks/useModal';\r\nimport ColorPicker from '../../ui/ColorPicker';\r\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\r\n\r\nfunction computeSelectionCount(selection: TableSelection): {\r\n columns: number;\r\n rows: number;\r\n} {\r\n const selectionShape = selection.getShape();\r\n return {\r\n columns: selectionShape.toX - selectionShape.fromX + 1,\r\n rows: selectionShape.toY - selectionShape.fromY + 1,\r\n };\r\n}\r\n\r\nfunction $canUnmerge(): boolean {\r\n const selection = $getSelection();\r\n if (\r\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\r\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\r\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\r\n ) {\r\n return false;\r\n }\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n return cell.__colSpan > 1 || cell.__rowSpan > 1;\r\n}\r\n\r\nfunction $selectLastDescendant(node: ElementNode): void {\r\n const lastDescendant = node.getLastDescendant();\r\n if ($isTextNode(lastDescendant)) {\r\n lastDescendant.select();\r\n } else if ($isElementNode(lastDescendant)) {\r\n lastDescendant.selectEnd();\r\n } else if (lastDescendant !== null) {\r\n lastDescendant.selectNext();\r\n }\r\n}\r\n\r\nfunction currentCellBackgroundColor(editor: LexicalEditor): null | string {\r\n return editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n return cell.getBackgroundColor();\r\n }\r\n }\r\n return null;\r\n });\r\n}\r\n\r\ntype TableCellActionMenuProps = Readonly<{\r\n contextRef: {current: null | HTMLElement};\r\n onClose: () => void;\r\n setIsMenuOpen: (isOpen: boolean) => void;\r\n showColorPickerModal: (\r\n title: string,\r\n showModal: (onClose: () => void) => JSX.Element,\r\n ) => void;\r\n tableCellNode: TableCellNode;\r\n cellMerge: boolean;\r\n}>;\r\n\r\nfunction TableActionMenu({\r\n onClose,\r\n tableCellNode: _tableCellNode,\r\n setIsMenuOpen,\r\n contextRef,\r\n cellMerge,\r\n showColorPickerModal,\r\n}: TableCellActionMenuProps) {\r\n const [editor] = useLexicalComposerContext();\r\n const dropDownRef = useRef<HTMLDivElement | null>(null);\r\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode);\r\n const [selectionCounts, updateSelectionCounts] = useState({\r\n columns: 1,\r\n rows: 1,\r\n });\r\n const [canMergeCells, setCanMergeCells] = useState(false);\r\n const [canUnmergeCell, setCanUnmergeCell] = useState(false);\r\n const [backgroundColor, setBackgroundColor] = useState(\r\n () => currentCellBackgroundColor(editor) || '',\r\n );\r\n\r\n useEffect(() => {\r\n return editor.registerMutationListener(\r\n TableCellNode,\r\n (nodeMutations) => {\r\n const nodeUpdated =\r\n nodeMutations.get(tableCellNode.getKey()) === 'updated';\r\n\r\n if (nodeUpdated) {\r\n editor.getEditorState().read(() => {\r\n updateTableCellNode(tableCellNode.getLatest());\r\n });\r\n setBackgroundColor(currentCellBackgroundColor(editor) || '');\r\n }\r\n },\r\n {skipInitialization: true},\r\n );\r\n }, [editor, tableCellNode]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n // Merge cells\r\n if ($isTableSelection(selection)) {\r\n const currentSelectionCounts = computeSelectionCount(selection);\r\n updateSelectionCounts(computeSelectionCount(selection));\r\n setCanMergeCells(\r\n currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1,\r\n );\r\n }\r\n // Unmerge cell\r\n setCanUnmergeCell($canUnmerge());\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n const menuButtonElement = contextRef.current;\r\n const dropDownElement = dropDownRef.current;\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n menuButtonElement != null &&\r\n dropDownElement != null &&\r\n rootElement != null\r\n ) {\r\n const rootEleRect = rootElement.getBoundingClientRect();\r\n const menuButtonRect = menuButtonElement.getBoundingClientRect();\r\n dropDownElement.style.opacity = '1';\r\n const dropDownElementRect = dropDownElement.getBoundingClientRect();\r\n const margin = 5;\r\n let leftPosition = menuButtonRect.right + margin;\r\n if (\r\n leftPosition + dropDownElementRect.width > window.innerWidth ||\r\n leftPosition + dropDownElementRect.width > rootEleRect.right\r\n ) {\r\n const position =\r\n menuButtonRect.left - dropDownElementRect.width - margin;\r\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset;\r\n }\r\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`;\r\n\r\n let topPosition = menuButtonRect.top;\r\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\r\n const position = menuButtonRect.bottom - dropDownElementRect.height;\r\n topPosition = position < 0 ? margin : position;\r\n }\r\n dropDownElement.style.top = `${topPosition}px`;\r\n }\r\n }, [contextRef, dropDownRef, editor]);\r\n\r\n useEffect(() => {\r\n function handleClickOutside(event: MouseEvent) {\r\n if (\r\n dropDownRef.current != null &&\r\n contextRef.current != null &&\r\n isDOMNode(event.target) &&\r\n !dropDownRef.current.contains(event.target) &&\r\n !contextRef.current.contains(event.target)\r\n ) {\r\n setIsMenuOpen(false);\r\n }\r\n }\r\n\r\n window.addEventListener('click', handleClickOutside);\r\n\r\n return () => window.removeEventListener('click', handleClickOutside);\r\n }, [setIsMenuOpen, contextRef]);\r\n\r\n const clearTableSelection = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n\r\n const tableObserver = getTableObserverFromTableElement(tableElement);\r\n if (tableObserver !== null) {\r\n tableObserver.$clearHighlight();\r\n }\r\n\r\n tableNode.markDirty();\r\n updateTableCellNode(tableCellNode.getLatest());\r\n }\r\n $setSelection(null);\r\n });\r\n }, [editor, tableCellNode]);\r\n\r\n const mergeTableCellsAtSelection = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (!$isTableSelection(selection)) {\r\n return;\r\n }\r\n\r\n const nodes = selection.getNodes();\r\n const tableCells = nodes.filter($isTableCellNode);\r\n const targetCell = $mergeCells(tableCells);\r\n\r\n if (targetCell) {\r\n $selectLastDescendant(targetCell);\r\n onClose();\r\n }\r\n });\r\n };\r\n\r\n const unmergeTableCellsAtSelection = () => {\r\n editor.update(() => {\r\n $unmergeCell();\r\n });\r\n };\r\n\r\n const insertTableRowAtSelection = useCallback(\r\n (shouldInsertAfter: boolean) => {\r\n editor.update(() => {\r\n for (let i = 0; i < selectionCounts.rows; i++) {\r\n $insertTableRowAtSelection(shouldInsertAfter);\r\n }\r\n onClose();\r\n });\r\n },\r\n [editor, onClose, selectionCounts.rows],\r\n );\r\n\r\n const insertTableColumnAtSelection = useCallback(\r\n (shouldInsertAfter: boolean) => {\r\n editor.update(() => {\r\n for (let i = 0; i < selectionCounts.columns; i++) {\r\n $insertTableColumnAtSelection(shouldInsertAfter);\r\n }\r\n onClose();\r\n });\r\n },\r\n [editor, onClose, selectionCounts.columns],\r\n );\r\n\r\n const deleteTableRowAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n $deleteTableRowAtSelection();\r\n onClose();\r\n });\r\n }, [editor, onClose]);\r\n\r\n const deleteTableAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n tableNode.remove();\r\n\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const deleteTableColumnAtSelection = useCallback(() => {\r\n editor.update(() => {\r\n $deleteTableColumnAtSelection();\r\n onClose();\r\n });\r\n }, [editor, onClose]);\r\n\r\n const toggleTableRowIsHeader = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n\r\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);\r\n\r\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\r\n\r\n const rowCells = new Set<TableCellNode>();\r\n\r\n const newStyle =\r\n tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW;\r\n\r\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\r\n const mapCell = gridMap[tableRowIndex][col];\r\n\r\n if (!mapCell?.cell) {\r\n continue;\r\n }\r\n\r\n if (!rowCells.has(mapCell.cell)) {\r\n rowCells.add(mapCell.cell);\r\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleTableColumnIsHeader = useCallback(() => {\r\n editor.update(() => {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n\r\n const tableColumnIndex =\r\n $getTableColumnIndexFromTableCellNode(tableCellNode);\r\n\r\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\r\n\r\n const columnCells = new Set<TableCellNode>();\r\n const newStyle =\r\n tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN;\r\n\r\n for (let row = 0; row < gridMap.length; row++) {\r\n const mapCell = gridMap[row][tableColumnIndex];\r\n\r\n if (!mapCell?.cell) {\r\n continue;\r\n }\r\n\r\n if (!columnCells.has(mapCell.cell)) {\r\n columnCells.add(mapCell.cell);\r\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleRowStriping = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setRowStriping(!tableNode.getRowStriping());\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleFirstRowFreeze = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setFrozenRows(tableNode.getFrozenRows() === 0 ? 1 : 0);\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const toggleFirstColumnFreeze = useCallback(() => {\r\n editor.update(() => {\r\n if (tableCellNode.isAttached()) {\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n if (tableNode) {\r\n tableNode.setFrozenColumns(\r\n tableNode.getFrozenColumns() === 0 ? 1 : 0,\r\n );\r\n }\r\n }\r\n clearTableSelection();\r\n onClose();\r\n });\r\n }, [editor, tableCellNode, clearTableSelection, onClose]);\r\n\r\n const handleCellBackgroundColor = useCallback(\r\n (value: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n cell.setBackgroundColor(value);\r\n }\r\n\r\n if ($isTableSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if ($isTableCellNode(node)) {\r\n node.setBackgroundColor(value);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n const formatVerticalAlign = (value: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\r\n const [cell] = $getNodeTriplet(selection.anchor);\r\n if ($isTableCellNode(cell)) {\r\n cell.setVerticalAlign(value);\r\n }\r\n\r\n if ($isTableSelection(selection)) {\r\n const nodes = selection.getNodes();\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if ($isTableCellNode(node)) {\r\n node.setVerticalAlign(value);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n let mergeCellButton: null | JSX.Element = null;\r\n if (cellMerge) {\r\n if (canMergeCells) {\r\n mergeCellButton = (\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => mergeTableCellsAtSelection()}\r\n data-test-id=\"table-merge-cells\">\r\n <span className=\"text\">Merge cells</span>\r\n </button>\r\n );\r\n } else if (canUnmergeCell) {\r\n mergeCellButton = (\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => unmergeTableCellsAtSelection()}\r\n data-test-id=\"table-unmerge-cells\">\r\n <span className=\"text\">Unmerge cells</span>\r\n </button>\r\n );\r\n }\r\n }\r\n\r\n return createPortal(\r\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\r\n <div\r\n className=\"dropdown\"\r\n ref={dropDownRef}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n }}>\r\n {mergeCellButton}\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() =>\r\n showColorPickerModal('Cell background color', () => (\r\n <ColorPicker\r\n color={backgroundColor}\r\n onChange={handleCellBackgroundColor}\r\n />\r\n ))\r\n }\r\n data-test-id=\"table-background-color\">\r\n <span className=\"text\">Background color</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleRowStriping()}\r\n data-test-id=\"table-row-striping\">\r\n <span className=\"text\">Toggle Row Striping</span>\r\n </button>\r\n <DropDown\r\n buttonLabel=\"Vertical Align\"\r\n buttonClassName=\"item\"\r\n buttonAriaLabel=\"Formatting options for vertical alignment\">\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('top');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-top\" />\r\n <span className=\"text\">Top Align</span>\r\n </div>\r\n </DropDownItem>\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('middle');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-middle\" />\r\n <span className=\"text\">Middle Align</span>\r\n </div>\r\n </DropDownItem>\r\n <DropDownItem\r\n onClick={() => {\r\n formatVerticalAlign('bottom');\r\n }}\r\n className=\"item wide\">\r\n <div className=\"icon-text-container\">\r\n <i className=\"icon vertical-bottom\" />\r\n <span className=\"text\">Bottom Align</span>\r\n </div>\r\n </DropDownItem>\r\n </DropDown>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleFirstRowFreeze()}\r\n data-test-id=\"table-freeze-first-row\">\r\n <span className=\"text\">Toggle First Row Freeze</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleFirstColumnFreeze()}\r\n data-test-id=\"table-freeze-first-column\">\r\n <span className=\"text\">Toggle First Column Freeze</span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableRowAtSelection(false)}\r\n data-test-id=\"table-insert-row-above\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`}{' '}\r\n above\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableRowAtSelection(true)}\r\n data-test-id=\"table-insert-row-below\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`}{' '}\r\n below\r\n </span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableColumnAtSelection(false)}\r\n data-test-id=\"table-insert-column-before\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.columns === 1\r\n ? 'column'\r\n : `${selectionCounts.columns} columns`}{' '}\r\n left\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => insertTableColumnAtSelection(true)}\r\n data-test-id=\"table-insert-column-after\">\r\n <span className=\"text\">\r\n Insert{' '}\r\n {selectionCounts.columns === 1\r\n ? 'column'\r\n : `${selectionCounts.columns} columns`}{' '}\r\n right\r\n </span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableColumnAtSelection()}\r\n data-test-id=\"table-delete-columns\">\r\n <span className=\"text\">Delete column</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableRowAtSelection()}\r\n data-test-id=\"table-delete-rows\">\r\n <span className=\"text\">Delete row</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => deleteTableAtSelection()}\r\n data-test-id=\"table-delete\">\r\n <span className=\"text\">Delete table</span>\r\n </button>\r\n <hr />\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleTableRowIsHeader()}\r\n data-test-id=\"table-row-header\">\r\n <span className=\"text\">\r\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) ===\r\n TableCellHeaderStates.ROW\r\n ? 'Remove'\r\n : 'Add'}{' '}\r\n row header\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"item\"\r\n onClick={() => toggleTableColumnIsHeader()}\r\n data-test-id=\"table-column-header\">\r\n <span className=\"text\">\r\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\r\n TableCellHeaderStates.COLUMN\r\n ? 'Remove'\r\n : 'Add'}{' '}\r\n column header\r\n </span>\r\n </button>\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\nfunction TableCellActionMenuContainer({\r\n anchorElem,\r\n cellMerge,\r\n}: {\r\n anchorElem: HTMLElement;\r\n cellMerge: boolean;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const menuButtonRef = useRef<HTMLDivElement | null>(null);\r\n const menuRootRef = useRef<HTMLButtonElement | null>(null);\r\n const [isMenuOpen, setIsMenuOpen] = useState(false);\r\n\r\n const [tableCellNode, setTableMenuCellNode] = useState<TableCellNode | null>(\r\n null,\r\n );\r\n\r\n const [colorPickerModal, showColorPickerModal] = useModal();\r\n\r\n const checkTableCellOverflow = useCallback(\r\n (tableCellParentNodeDOM: HTMLElement): boolean => {\r\n const scrollableContainer = tableCellParentNodeDOM.closest(\r\n '.PlaygroundEditorTheme__tableScrollableWrapper',\r\n );\r\n if (scrollableContainer) {\r\n const containerRect = (\r\n scrollableContainer as HTMLElement\r\n ).getBoundingClientRect();\r\n const cellRect = tableCellParentNodeDOM.getBoundingClientRect();\r\n\r\n // Calculate where the action button would be positioned (5px from right edge of cell)\r\n // Also account for the button width and table cell padding (8px)\r\n const actionButtonRight = cellRect.right - 5;\r\n const actionButtonLeft = actionButtonRight - 28; // 20px width + 8px padding\r\n\r\n // Only hide if the action button would overflow the container\r\n if (\r\n actionButtonRight > containerRect.right ||\r\n actionButtonLeft < containerRect.left\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [],\r\n );\r\n\r\n const $moveMenu = useCallback(() => {\r\n const menu = menuButtonRef.current;\r\n const selection = $getSelection();\r\n const nativeSelection = getDOMSelection(editor._window);\r\n const activeElement = document.activeElement;\r\n function disable() {\r\n if (menu) {\r\n menu.classList.remove('table-cell-action-button-container--active');\r\n menu.classList.add('table-cell-action-button-container--inactive');\r\n }\r\n setTableMenuCellNode(null);\r\n }\r\n\r\n if (selection == null || menu == null) {\r\n return disable();\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n let tableObserver: TableObserver | null = null;\r\n let tableCellParentNodeDOM: HTMLElement | null = null;\r\n\r\n if (\r\n $isRangeSelection(selection) &&\r\n rootElement !== null &&\r\n nativeSelection !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\r\n selection.anchor.getNode(),\r\n );\r\n\r\n if (tableCellNodeFromSelection == null) {\r\n return disable();\r\n }\r\n\r\n tableCellParentNodeDOM = editor.getElementByKey(\r\n tableCellNodeFromSelection.getKey(),\r\n );\r\n\r\n if (\r\n tableCellParentNodeDOM == null ||\r\n !tableCellNodeFromSelection.isAttached()\r\n ) {\r\n return disable();\r\n }\r\n\r\n if (checkTableCellOverflow(tableCellParentNodeDOM)) {\r\n return disable();\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(\r\n tableCellNodeFromSelection,\r\n );\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n\r\n tableObserver = getTableObserverFromTableElement(tableElement);\r\n setTableMenuCellNode(tableCellNodeFromSelection);\r\n } else if ($isTableSelection(selection)) {\r\n const anchorNode = $getTableCellNodeFromLexicalNode(\r\n selection.anchor.getNode(),\r\n );\r\n if (!$isTableCellNode(anchorNode)) {\r\n throw new Error('TableSelection anchorNode must be a TableCellNode');\r\n }\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n if (tableElement === null) {\r\n throw new Error(\r\n 'TableActionMenu: Expected to find tableElement in DOM',\r\n );\r\n }\r\n tableObserver = getTableObserverFromTableElement(tableElement);\r\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey());\r\n\r\n if (tableCellParentNodeDOM === null) {\r\n return disable();\r\n }\r\n\r\n if (checkTableCellOverflow(tableCellParentNodeDOM)) {\r\n return disable();\r\n }\r\n } else if (!activeElement) {\r\n return disable();\r\n }\r\n if (tableObserver === null || tableCellParentNodeDOM === null) {\r\n return disable();\r\n }\r\n const enabled = !tableObserver || !tableObserver.isSelecting;\r\n menu.classList.toggle(\r\n 'table-cell-action-button-container--active',\r\n enabled,\r\n );\r\n menu.classList.toggle(\r\n 'table-cell-action-button-container--inactive',\r\n !enabled,\r\n );\r\n if (enabled) {\r\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect();\r\n const anchorRect = anchorElem.getBoundingClientRect();\r\n const top = tableCellRect.top - anchorRect.top;\r\n const left = tableCellRect.right - anchorRect.left;\r\n menu.style.transform = `translate(${left}px, ${top}px)`;\r\n }\r\n }, [editor, anchorElem, checkTableCellOverflow]);\r\n\r\n useEffect(() => {\r\n // We call the $moveMenu callback every time the selection changes,\r\n // once up front, and once after each pointerUp\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\r\n const callback = () => {\r\n timeoutId = undefined;\r\n editor.getEditorState().read($moveMenu);\r\n };\r\n const delayedCallback = () => {\r\n if (timeoutId === undefined) {\r\n timeoutId = setTimeout(callback, 0);\r\n }\r\n return false;\r\n };\r\n return mergeRegister(\r\n editor.registerUpdateListener(delayedCallback),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n delayedCallback,\r\n COMMAND_PRIORITY_CRITICAL,\r\n ),\r\n editor.registerRootListener((rootElement, prevRootElement) => {\r\n if (prevRootElement) {\r\n prevRootElement.removeEventListener('pointerup', delayedCallback);\r\n }\r\n if (rootElement) {\r\n rootElement.addEventListener('pointerup', delayedCallback);\r\n delayedCallback();\r\n }\r\n }),\r\n () => clearTimeout(timeoutId),\r\n );\r\n });\r\n\r\n const prevTableCellDOM = useRef(tableCellNode);\r\n\r\n useEffect(() => {\r\n if (prevTableCellDOM.current !== tableCellNode) {\r\n setIsMenuOpen(false);\r\n }\r\n\r\n prevTableCellDOM.current = tableCellNode;\r\n }, [prevTableCellDOM, tableCellNode]);\r\n\r\n return (\r\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\r\n {tableCellNode != null && (\r\n <>\r\n <button\r\n type=\"button\"\r\n className=\"table-cell-action-button chevron-down\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsMenuOpen(!isMenuOpen);\r\n }}\r\n ref={menuRootRef}>\r\n <i className=\"chevron-down\" />\r\n </button>\r\n {colorPickerModal}\r\n {isMenuOpen && (\r\n <TableActionMenu\r\n contextRef={menuRootRef}\r\n setIsMenuOpen={setIsMenuOpen}\r\n onClose={() => setIsMenuOpen(false)}\r\n tableCellNode={tableCellNode}\r\n cellMerge={cellMerge}\r\n showColorPickerModal={showColorPickerModal}\r\n />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableActionMenuPlugin({\r\n anchorElem = document.body,\r\n cellMerge = false,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n cellMerge?: boolean;\r\n}): null | ReactPortal {\r\n const isEditable = useLexicalEditable();\r\n return createPortal(\r\n isEditable ? (\r\n <TableCellActionMenuContainer\r\n anchorElem={anchorElem}\r\n cellMerge={cellMerge}\r\n />\r\n ) : null,\r\n anchorElem,\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {JSX} from 'react';\n\nimport './ColorPicker.css';\n\nimport {calculateZoomLevel} from '@lexical/utils';\nimport {useMemo, useRef, useState} from 'react';\nimport * as React from 'react';\n\nimport {isKeyboardInput} from '../utils/focusUtils';\nimport TextInput from './TextInput';\n\nlet skipAddingToHistoryStack = false;\n\ninterface ColorPickerProps {\n color: string;\n onChange?: (\n value: string,\n skipHistoryStack: boolean,\n skipRefocus: boolean,\n ) => void;\n}\n\nexport function parseAllowedColor(input: string) {\n return /^rgb\\(\\d+, \\d+, \\d+\\)$/.test(input) ? input : '';\n}\n\nconst basicColors = [\n '#d0021b',\n '#f5a623',\n '#f8e71c',\n '#8b572a',\n '#7ed321',\n '#417505',\n '#bd10e0',\n '#9013fe',\n '#4a90e2',\n '#50e3c2',\n '#b8e986',\n '#000000',\n '#4a4a4a',\n '#9b9b9b',\n '#ffffff',\n];\n\nconst WIDTH = 214;\nconst HEIGHT = 150;\n\nexport default function ColorPicker({\n color,\n onChange,\n}: Readonly<ColorPickerProps>): JSX.Element {\n const [selfColor, setSelfColor] = useState(transformColor('hex', color));\n const [inputColor, setInputColor] = useState(\n transformColor('hex', color).hex,\n );\n const innerDivRef = useRef(null);\n\n const saturationPosition = useMemo(\n () => ({\n x: (selfColor.hsv.s / 100) * WIDTH,\n y: ((100 - selfColor.hsv.v) / 100) * HEIGHT,\n }),\n [selfColor.hsv.s, selfColor.hsv.v],\n );\n\n const huePosition = useMemo(\n () => ({\n x: (selfColor.hsv.h / 360) * WIDTH,\n }),\n [selfColor.hsv],\n );\n\n const emitOnChange = (newColor: string, skipRefocus: boolean = false) => {\n // Check if the dropdown is actually active\n if (innerDivRef.current !== null && onChange) {\n onChange(newColor, skipAddingToHistoryStack, skipRefocus);\n }\n };\n\n const onSetHex = (hex: string) => {\n setInputColor(hex);\n if (/^#[0-9A-Fa-f]{6}$/i.test(hex)) {\n const newColor = transformColor('hex', hex);\n setSelfColor(newColor);\n emitOnChange(newColor.hex);\n }\n };\n\n const onMoveSaturation = ({x, y}: Position) => {\n const newHsv = {\n ...selfColor.hsv,\n s: (x / WIDTH) * 100,\n v: 100 - (y / HEIGHT) * 100,\n };\n const newColor = transformColor('hsv', newHsv);\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex);\n };\n\n const onMoveHue = ({x}: Position) => {\n const newHsv = {...selfColor.hsv, h: (x / WIDTH) * 360};\n const newColor = transformColor('hsv', newHsv);\n\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex);\n };\n\n const onBasicColorClick = (e: React.MouseEvent, basicColor: string) => {\n const newColor = transformColor('hex', basicColor);\n\n setSelfColor(newColor);\n setInputColor(newColor.hex);\n emitOnChange(newColor.hex, isKeyboardInput(e));\n };\n\n return (\n <div\n className=\"color-picker-wrapper\"\n style={{width: WIDTH}}\n ref={innerDivRef}>\n <TextInput label=\"Hex\" onChange={onSetHex} value={inputColor} />\n <div className=\"color-picker-basic-color\">\n {basicColors.map((basicColor) => (\n <button type=\"button\"\n className={basicColor === selfColor.hex ? ' active' : ''}\n key={basicColor}\n style={{backgroundColor: basicColor}}\n onClick={(e) => onBasicColorClick(e, basicColor)}\n />\n ))}\n </div>\n <MoveWrapper\n className=\"color-picker-saturation\"\n style={{backgroundColor: `hsl(${selfColor.hsv.h}, 100%, 50%)`}}\n onChange={onMoveSaturation}>\n <div\n className=\"color-picker-saturation_cursor\"\n style={{\n backgroundColor: selfColor.hex,\n left: saturationPosition.x,\n top: saturationPosition.y,\n }}\n />\n </MoveWrapper>\n <MoveWrapper className=\"color-picker-hue\" onChange={onMoveHue}>\n <div\n className=\"color-picker-hue_cursor\"\n style={{\n backgroundColor: `hsl(${selfColor.hsv.h}, 100%, 50%)`,\n left: huePosition.x,\n }}\n />\n </MoveWrapper>\n <div\n className=\"color-picker-color\"\n style={{backgroundColor: selfColor.hex}}\n />\n </div>\n );\n}\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface MoveWrapperProps {\n className?: string;\n style?: React.CSSProperties;\n onChange: (position: Position) => void;\n children: JSX.Element;\n}\n\nfunction MoveWrapper({className, style, onChange, children}: MoveWrapperProps) {\n const divRef = useRef<HTMLDivElement>(null);\n const draggedRef = useRef(false);\n\n const move = (e: React.MouseEvent | MouseEvent): void => {\n if (divRef.current) {\n const {current: div} = divRef;\n const {width, height, left, top} = div.getBoundingClientRect();\n const zoom = calculateZoomLevel(div);\n const x = clamp(e.clientX / zoom - left, width, 0);\n const y = clamp(e.clientY / zoom - top, height, 0);\n\n onChange({x, y});\n }\n };\n\n const onMouseDown = (e: React.MouseEvent): void => {\n if (e.button !== 0) {\n return;\n }\n\n move(e);\n\n const onMouseMove = (_e: MouseEvent): void => {\n draggedRef.current = true;\n skipAddingToHistoryStack = true;\n move(_e);\n };\n\n const onMouseUp = (_e: MouseEvent): void => {\n if (draggedRef.current) {\n skipAddingToHistoryStack = false;\n }\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n move(_e);\n draggedRef.current = false;\n };\n\n document.addEventListener('mousemove', onMouseMove, false);\n document.addEventListener('mouseup', onMouseUp, false);\n };\n\n return (\n <div\n ref={divRef}\n className={className}\n style={style}\n onMouseDown={onMouseDown}>\n {children}\n </div>\n );\n}\n\nfunction clamp(value: number, max: number, min: number) {\n return value > max ? max : value < min ? min : value;\n}\n\ninterface RGB {\n b: number;\n g: number;\n r: number;\n}\ninterface HSV {\n h: number;\n s: number;\n v: number;\n}\ninterface Color {\n hex: string;\n hsv: HSV;\n rgb: RGB;\n}\n\nexport function toHex(value: string): string {\n if (!value.startsWith('#')) {\n const ctx = document.createElement('canvas').getContext('2d');\n\n if (!ctx) {\n throw new Error('2d context not supported or canvas already initialized');\n }\n\n ctx.fillStyle = value;\n\n return ctx.fillStyle;\n } else if (value.length === 4 || value.length === 5) {\n value = value\n .split('')\n .map((v, i) => (i ? v + v : '#'))\n .join('');\n\n return value;\n } else if (value.length === 7 || value.length === 9) {\n return value;\n }\n\n return '#000000';\n}\n\nfunction hex2rgb(hex: string): RGB {\n const rbgArr = (\n hex\n .replace(\n /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,\n (m, r, g, b) => '#' + r + r + g + g + b + b,\n )\n .substring(1)\n .match(/.{2}/g) || []\n ).map((x) => parseInt(x, 16));\n\n return {\n b: rbgArr[2],\n g: rbgArr[1],\n r: rbgArr[0],\n };\n}\n\nfunction rgb2hsv({r, g, b}: RGB): HSV {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const d = max - Math.min(r, g, b);\n\n const h = d\n ? (max === r\n ? (g - b) / d + (g < b ? 6 : 0)\n : max === g\n ? 2 + (b - r) / d\n : 4 + (r - g) / d) * 60\n : 0;\n const s = max ? (d / max) * 100 : 0;\n const v = max * 100;\n\n return {h, s, v};\n}\n\nfunction hsv2rgb({h, s, v}: HSV): RGB {\n s /= 100;\n v /= 100;\n\n const i = ~~(h / 60);\n const f = h / 60 - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n const index = i % 6;\n\n const r = Math.round([v, q, p, p, t, v][index] * 255);\n const g = Math.round([t, v, v, q, p, p][index] * 255);\n const b = Math.round([p, p, t, v, v, q][index] * 255);\n\n return {b, g, r};\n}\n\nfunction rgb2hex({b, g, r}: RGB): string {\n return '#' + [r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('');\n}\n\nfunction transformColor<M extends keyof Color, C extends Color[M]>(\n format: M,\n color: C,\n): Color {\n let hex: Color['hex'] = toHex('#121212');\n let rgb: Color['rgb'] = hex2rgb(hex);\n let hsv: Color['hsv'] = rgb2hsv(rgb);\n\n if (format === 'hex') {\n const value = color as Color['hex'];\n\n hex = toHex(value);\n rgb = hex2rgb(hex);\n hsv = rgb2hsv(rgb);\n } else if (format === 'rgb') {\n const value = color as Color['rgb'];\n\n rgb = value;\n hex = rgb2hex(rgb);\n hsv = rgb2hsv(rgb);\n } else if (format === 'hsv') {\n const value = color as Color['hsv'];\n\n hsv = value;\n rgb = hsv2rgb(hsv);\n hex = rgb2hex(rgb);\n }\n\n return {hex, hsv, rgb};\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {TableCellNode, TableDOMCell, TableMapType} from '@lexical/table';\r\nimport type {LexicalEditor, NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\r\nimport {\r\n $computeTableMapSkipCellCheck,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $isTableCellNode,\r\n $isTableRowNode,\r\n getDOMCellFromTarget,\r\n getTableElement,\r\n TableNode,\r\n} from '@lexical/table';\r\nimport {calculateZoomLevel, mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNearestNodeFromDOMNode,\r\n isHTMLElement,\r\n SKIP_SCROLL_INTO_VIEW_TAG,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {\r\n CSSProperties,\r\n PointerEventHandler,\r\n ReactPortal,\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\ntype PointerPosition = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\ntype PointerDraggingDirection = 'right' | 'bottom';\r\n\r\nconst MIN_ROW_HEIGHT = 33;\r\nconst MIN_COLUMN_WIDTH = 92;\r\nconst ACTIVE_RESIZER_COLOR = '#76b6ff';\r\n\r\nfunction TableCellResizer({editor}: {editor: LexicalEditor}): JSX.Element {\r\n const targetRef = useRef<HTMLElement | null>(null);\r\n const resizerRef = useRef<HTMLDivElement | null>(null);\r\n const tableRectRef = useRef<ClientRect | null>(null);\r\n const [hasTable, setHasTable] = useState(false);\r\n\r\n const pointerStartPosRef = useRef<PointerPosition | null>(null);\r\n const [pointerCurrentPos, updatePointerCurrentPos] =\r\n useState<PointerPosition | null>(null);\r\n\r\n const [activeCell, updateActiveCell] = useState<TableDOMCell | null>(null);\r\n const [draggingDirection, updateDraggingDirection] =\r\n useState<PointerDraggingDirection | null>(null);\r\n const [hoveredDirection, updateHoveredDirection] =\r\n useState<PointerDraggingDirection | null>(null);\r\n\r\n const resetState = useCallback(() => {\r\n updateActiveCell(null);\r\n targetRef.current = null;\r\n updateDraggingDirection(null);\r\n updateHoveredDirection(null);\r\n pointerStartPosRef.current = null;\r\n tableRectRef.current = null;\r\n }, []);\r\n\r\n useEffect(() => {\r\n const tableKeys = new Set<NodeKey>();\r\n return mergeRegister(\r\n editor.registerMutationListener(TableNode, (nodeMutations) => {\r\n for (const [nodeKey, mutation] of nodeMutations) {\r\n if (mutation === 'destroyed') {\r\n tableKeys.delete(nodeKey);\r\n } else {\r\n tableKeys.add(nodeKey);\r\n }\r\n }\r\n setHasTable(tableKeys.size > 0);\r\n }),\r\n editor.registerNodeTransform(TableNode, (tableNode) => {\r\n if (tableNode.getColWidths()) {\r\n return tableNode;\r\n }\r\n\r\n const numColumns = tableNode.getColumnCount();\r\n const columnWidth = MIN_COLUMN_WIDTH;\r\n\r\n tableNode.setColWidths(Array(numColumns).fill(columnWidth));\r\n return tableNode;\r\n }),\r\n );\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n if (!hasTable) {\r\n return;\r\n }\r\n\r\n const onPointerMove = (event: PointerEvent) => {\r\n const target = event.target;\r\n if (!isHTMLElement(target)) {\r\n return;\r\n }\r\n\r\n if (draggingDirection) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n updatePointerCurrentPos({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n return;\r\n }\r\n if (resizerRef.current && resizerRef.current.contains(target)) {\r\n return;\r\n }\r\n\r\n if (targetRef.current !== target) {\r\n targetRef.current = target;\r\n const cell = getDOMCellFromTarget(target);\r\n\r\n if (cell && activeCell !== cell) {\r\n editor.getEditorState().read(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem);\r\n if (!tableCellNode) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode =\r\n $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = getTableElement(\r\n tableNode,\r\n editor.getElementByKey(tableNode.getKey()),\r\n );\r\n\r\n if (!tableElement) {\r\n throw new Error('TableCellResizer: Table element not found.');\r\n }\r\n\r\n targetRef.current = target;\r\n tableRectRef.current = tableElement.getBoundingClientRect();\r\n updateActiveCell(cell);\r\n },\r\n {editor},\r\n );\r\n } else if (cell == null) {\r\n resetState();\r\n }\r\n }\r\n };\r\n\r\n const onPointerDown = (event: PointerEvent) => {\r\n const isTouchEvent = event.pointerType === 'touch';\r\n if (isTouchEvent) {\r\n onPointerMove(event);\r\n }\r\n };\r\n\r\n const resizerContainer = resizerRef.current;\r\n resizerContainer?.addEventListener('pointermove', onPointerMove, {\r\n capture: true,\r\n });\r\n\r\n const removeRootListener = editor.registerRootListener(\r\n (rootElement, prevRootElement) => {\r\n prevRootElement?.removeEventListener('pointermove', onPointerMove);\r\n prevRootElement?.removeEventListener('pointerdown', onPointerDown);\r\n rootElement?.addEventListener('pointermove', onPointerMove);\r\n rootElement?.addEventListener('pointerdown', onPointerDown);\r\n },\r\n );\r\n\r\n return () => {\r\n removeRootListener();\r\n resizerContainer?.removeEventListener('pointermove', onPointerMove);\r\n };\r\n }, [activeCell, draggingDirection, editor, resetState, hasTable]);\r\n\r\n const isHeightChanging = (direction: PointerDraggingDirection) => {\r\n if (direction === 'bottom') {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const updateRowHeight = useCallback(\r\n (heightChange: number) => {\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n editor.update(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const baseRowIndex =\r\n $getTableRowIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n // Determine if this is a full row merge by checking colspan\r\n const isFullRowMerge =\r\n tableCellNode.getColSpan() === tableNode.getColumnCount();\r\n\r\n // For full row merges, apply to first row. For partial merges, apply to last row\r\n const tableRowIndex = isFullRowMerge\r\n ? baseRowIndex\r\n : baseRowIndex + tableCellNode.getRowSpan() - 1;\r\n\r\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\r\n throw new Error('Expected table cell to be inside of table row.');\r\n }\r\n\r\n const tableRow = tableRows[tableRowIndex];\r\n\r\n if (!$isTableRowNode(tableRow)) {\r\n throw new Error('Expected table row');\r\n }\r\n\r\n let height = tableRow.getHeight();\r\n if (height === undefined) {\r\n const rowCells = tableRow.getChildren<TableCellNode>();\r\n height = Math.min(\r\n ...rowCells.map(\r\n (cell) => getCellNodeHeight(cell, editor) ?? Infinity,\r\n ),\r\n );\r\n }\r\n\r\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT);\r\n tableRow.setHeight(newHeight);\r\n },\r\n {tag: SKIP_SCROLL_INTO_VIEW_TAG},\r\n );\r\n },\r\n [activeCell, editor],\r\n );\r\n\r\n const getCellNodeHeight = (\r\n cell: TableCellNode,\r\n activeEditor: LexicalEditor,\r\n ): number | undefined => {\r\n const domCellNode = activeEditor.getElementByKey(cell.getKey());\r\n return domCellNode?.clientHeight;\r\n };\r\n\r\n const getCellColumnIndex = (\r\n tableCellNode: TableCellNode,\r\n tableMap: TableMapType,\r\n ) => {\r\n for (let row = 0; row < tableMap.length; row++) {\r\n for (let column = 0; column < tableMap[row].length; column++) {\r\n if (tableMap[row][column].cell === tableCellNode) {\r\n return column;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const updateColumnWidth = useCallback(\r\n (widthChange: number) => {\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n editor.update(\r\n () => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) {\r\n throw new Error('TableCellResizer: Table cell node not found.');\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const [tableMap] = $computeTableMapSkipCellCheck(\r\n tableNode,\r\n null,\r\n null,\r\n );\r\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap);\r\n if (columnIndex === undefined) {\r\n throw new Error('TableCellResizer: Table column not found.');\r\n }\r\n\r\n const colWidths = tableNode.getColWidths();\r\n if (!colWidths) {\r\n return;\r\n }\r\n const width = colWidths[columnIndex];\r\n if (width === undefined) {\r\n return;\r\n }\r\n const newColWidths = [...colWidths];\r\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH);\r\n newColWidths[columnIndex] = newWidth;\r\n tableNode.setColWidths(newColWidths);\r\n },\r\n {tag: SKIP_SCROLL_INTO_VIEW_TAG},\r\n );\r\n },\r\n [activeCell, editor],\r\n );\r\n\r\n const pointerUpHandler = useCallback(\r\n (direction: PointerDraggingDirection) => {\r\n const handler = (event: PointerEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n if (pointerStartPosRef.current) {\r\n const {x, y} = pointerStartPosRef.current;\r\n\r\n if (activeCell === null) {\r\n return;\r\n }\r\n const zoom = calculateZoomLevel(event.target as Element);\r\n\r\n if (isHeightChanging(direction)) {\r\n const heightChange = (event.clientY - y) / zoom;\r\n updateRowHeight(heightChange);\r\n } else {\r\n const widthChange = (event.clientX - x) / zoom;\r\n updateColumnWidth(widthChange);\r\n }\r\n\r\n resetState();\r\n document.removeEventListener('pointerup', handler);\r\n }\r\n };\r\n return handler;\r\n },\r\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\r\n );\r\n\r\n const toggleResize = useCallback(\r\n (\r\n direction: PointerDraggingDirection,\r\n ): PointerEventHandler<HTMLDivElement> =>\r\n (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) {\r\n throw new Error('TableCellResizer: Expected active cell.');\r\n }\r\n\r\n pointerStartPosRef.current = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n updatePointerCurrentPos(pointerStartPosRef.current);\r\n updateDraggingDirection(direction);\r\n\r\n document.addEventListener('pointerup', pointerUpHandler(direction));\r\n },\r\n [activeCell, pointerUpHandler],\r\n );\r\n\r\n const getResizers = useCallback(() => {\r\n if (activeCell) {\r\n const {height, width, top, left} =\r\n activeCell.elem.getBoundingClientRect();\r\n const zoom = calculateZoomLevel(activeCell.elem);\r\n const zoneWidth = 16; // Pixel width of the zone where you can drag the edge\r\n const styles: Record<string, CSSProperties> = {\r\n bottom: {\r\n backgroundColor: 'transparent',\r\n cursor: 'row-resize',\r\n height: `${zoneWidth}px`,\r\n left: `${window.scrollX + left}px`,\r\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\r\n width: `${width}px`,\r\n },\r\n right: {\r\n backgroundColor: 'transparent',\r\n cursor: 'col-resize',\r\n height: `${height}px`,\r\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\r\n top: `${window.scrollY + top}px`,\r\n width: `${zoneWidth}px`,\r\n },\r\n };\r\n\r\n const tableRect = tableRectRef.current;\r\n\r\n if (draggingDirection && pointerCurrentPos && tableRect) {\r\n if (isHeightChanging(draggingDirection)) {\r\n styles[draggingDirection].left = `${\r\n window.scrollX + tableRect.left\r\n }px`;\r\n styles[draggingDirection].top = `${\r\n window.scrollY + pointerCurrentPos.y / zoom\r\n }px`;\r\n styles[draggingDirection].height = '3px';\r\n styles[draggingDirection].width = `${tableRect.width}px`;\r\n } else {\r\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`;\r\n styles[draggingDirection].left = `${\r\n window.scrollX + pointerCurrentPos.x / zoom\r\n }px`;\r\n styles[draggingDirection].width = '3px';\r\n styles[draggingDirection].height = `${tableRect.height}px`;\r\n }\r\n\r\n styles[draggingDirection].backgroundColor = '#adf';\r\n styles[draggingDirection].mixBlendMode = 'unset';\r\n } else if (!draggingDirection && hoveredDirection === 'right') {\r\n const halfZoneWidth = zoneWidth / 2;\r\n const highlightWidth = 2;\r\n const highlightStart = halfZoneWidth - highlightWidth / 2;\r\n styles.right.backgroundImage = `linear-gradient(90deg, transparent ${highlightStart}px, ${ACTIVE_RESIZER_COLOR} ${highlightStart}px, ${ACTIVE_RESIZER_COLOR} ${\r\n highlightStart + highlightWidth\r\n }px, transparent ${highlightStart + highlightWidth}px)`;\r\n styles.right.mixBlendMode = 'unset';\r\n if (tableRect) {\r\n styles.right.top = `${window.scrollY + tableRect.top}px`;\r\n styles.right.height = `${tableRect.height}px`;\r\n }\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n return {\r\n bottom: null,\r\n left: null,\r\n right: null,\r\n top: null,\r\n };\r\n }, [activeCell, draggingDirection, hoveredDirection, pointerCurrentPos]);\r\n\r\n const handlePointerEnter = useCallback(\r\n (\r\n direction: PointerDraggingDirection,\r\n ): PointerEventHandler<HTMLDivElement> =>\r\n () => {\r\n if (!draggingDirection) {\r\n updateHoveredDirection(direction);\r\n }\r\n },\r\n [draggingDirection],\r\n );\r\n\r\n const handlePointerLeave = useCallback(() => {\r\n if (!draggingDirection) {\r\n updateHoveredDirection(null);\r\n }\r\n }, [draggingDirection]);\r\n\r\n const resizerStyles = getResizers();\r\n\r\n return (\r\n <div ref={resizerRef}>\r\n {activeCell != null && (\r\n <>\r\n <div\r\n className=\"TableCellResizer__resizer TableCellResizer__ui\"\r\n style={resizerStyles.right || undefined}\r\n onPointerEnter={handlePointerEnter('right')}\r\n onPointerLeave={handlePointerLeave}\r\n onPointerDown={toggleResize('right')}\r\n />\r\n <div\r\n className=\"TableCellResizer__resizer TableCellResizer__ui\"\r\n style={resizerStyles.bottom || undefined}\r\n onPointerDown={toggleResize('bottom')}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableCellResizerPlugin(): null | ReactPortal {\r\n const [editor] = useLexicalComposerContext();\r\n const isEditable = useLexicalEditable();\r\n\r\n return useMemo(\r\n () =>\r\n isEditable\r\n ? createPortal(<TableCellResizer editor={editor} />, document.body)\r\n : null,\r\n [editor, isEditable],\r\n );\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type {JSX} from 'react';\n\nimport './index.css';\n\nimport DropIndicator from '@atlaskit/drag-and-drop-indicator/box';\nimport {\n draggable,\n dropTargetForElements,\n type ElementDragPayload,\n} from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport {\n autoUpdate,\n offset,\n shift,\n useFloating,\n type VirtualElement,\n} from '@floating-ui/react';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport {\n $computeTableMapSkipCellCheck,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isSimpleTable,\n $isTableCellNode,\n $isTableNode,\n $isTableRowNode,\n $moveTableColumn,\n} from '@lexical/table';\nimport {\n $getChildCaret,\n $getNearestNodeFromDOMNode,\n $getSiblingCaret,\n type EditorThemeClasses,\n isHTMLElement,\n} from 'lexical';\nimport {useEffect, useRef, useState} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\nimport {getThemeSelector} from '../../utils/getThemeSelector';\n\nconst INDICATOR_SIZE_PX = 18;\nconst SIDE_INDICATOR_SIZE_PX = 18;\nconst TOP_BUTTON_OVERHANG = INDICATOR_SIZE_PX / 2;\nconst LEFT_BUTTON_OVERHANG = SIDE_INDICATOR_SIZE_PX / 2;\n\nfunction getTableFromMouseEvent(\n event: MouseEvent,\n getTheme: () => EditorThemeClasses | null | undefined,\n): {\n isOutside: boolean;\n tableElement: HTMLTableElement | null;\n} {\n if (!isHTMLElement(event.target)) {\n return {isOutside: true, tableElement: null};\n }\n\n const cellSelector = `td${getThemeSelector(getTheme, 'tableCell')}, th${getThemeSelector(getTheme, 'tableCell')}`;\n const cell = event.target.closest<HTMLTableCellElement>(cellSelector);\n const tableElement = cell?.closest<HTMLTableElement>('table') ?? null;\n\n return {\n isOutside: tableElement == null,\n tableElement,\n };\n}\n\nfunction getClosestTopCellPosition(\n tableElement: HTMLTableElement,\n clientX: number,\n): {centerX: number; top: number; cell: HTMLTableCellElement} | null {\n const firstRow = tableElement.rows[0];\n if (!firstRow) {\n return null;\n }\n\n let closest: {\n cell: HTMLTableCellElement;\n centerX: number;\n top: number;\n } | null = null;\n let smallestDelta = Number.POSITIVE_INFINITY;\n\n for (const cell of Array.from(firstRow.cells)) {\n const rect = cell.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const delta = Math.abs(centerX - clientX);\n if (delta < smallestDelta) {\n smallestDelta = delta;\n closest = {cell, centerX, top: rect.top};\n }\n }\n\n return closest;\n}\n\nfunction isTableFromEditor(\n tableElement: HTMLTableElement | null,\n editor: ReturnType<typeof useLexicalComposerContext>[0],\n): boolean {\n const root = editor.getRootElement();\n return !!root && !!tableElement && root.contains(tableElement);\n}\n\ntype ColumnDragData = {\n columnIndex: number;\n tableKey: string | null;\n type: 'table-column';\n};\n\ntype DropIndicatorState = {\n edge: 'left' | 'right';\n height: number;\n left: number;\n top: number;\n};\n\nfunction getBoundaryIndex(cell: HTMLTableCellElement, clientX: number): number {\n const rect = cell.getBoundingClientRect();\n const isRightHalf = clientX > rect.left + rect.width / 2;\n const cellIndex = cell.cellIndex ?? 0;\n return cellIndex + (isRightHalf ? 1 : 0);\n}\n\nfunction getDropIndicatorState(\n headerRow: HTMLTableRowElement,\n tableRect: DOMRect,\n boundaryIndex: number,\n): DropIndicatorState | null {\n const cellCount = headerRow.cells.length;\n if (cellCount === 0) {\n return null;\n }\n const clampedIndex = Math.max(0, Math.min(boundaryIndex, cellCount));\n if (clampedIndex === 0) {\n const firstRect = headerRow.cells[0].getBoundingClientRect();\n return {\n edge: 'left',\n height: tableRect.height,\n left: firstRect.left,\n top: tableRect.top,\n };\n }\n if (clampedIndex === cellCount) {\n const lastRect = headerRow.cells[cellCount - 1].getBoundingClientRect();\n return {\n edge: 'right',\n height: tableRect.height,\n left: lastRect.right,\n top: tableRect.top,\n };\n }\n const targetRect = headerRow.cells[clampedIndex].getBoundingClientRect();\n return {\n edge: 'left',\n height: tableRect.height,\n left: targetRect.left,\n top: tableRect.top,\n };\n}\n\nfunction isColumnDrag(\n source: ElementDragPayload,\n tableKey: string | null,\n): source is ElementDragPayload & {data: ColumnDragData} {\n const data = source?.data as ColumnDragData | undefined;\n return data?.type === 'table-column' && data.tableKey === tableKey;\n}\n\nfunction getTableKey(tableElement: HTMLTableElement | null): string | null {\n return tableElement?.getAttribute('data-lexical-key') ?? null;\n}\n\nfunction TableHoverActionsV2({\n anchorElem,\n}: {\n anchorElem: HTMLElement;\n}): JSX.Element | null {\n const [editor, {getTheme}] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isVisible, setIsVisible] = useState(false);\n const [isLeftVisible, setIsLeftVisible] = useState(false);\n const virtualRef = useRef<VirtualElement>({\n getBoundingClientRect: () => new DOMRect(),\n });\n const leftVirtualRef = useRef<VirtualElement>({\n getBoundingClientRect: () => new DOMRect(),\n });\n const floatingElemRef = useRef<HTMLElement | null>(null);\n const leftFloatingElemRef = useRef<HTMLElement | null>(null);\n const dragHandleRef = useRef<HTMLButtonElement | null>(null);\n const hoveredLeftCellRef = useRef<HTMLTableCellElement | null>(null);\n const hoveredTopCellRef = useRef<HTMLTableCellElement | null>(null);\n const handleMouseLeaveRef = useRef<((event: MouseEvent) => void) | null>(\n null,\n );\n const dropIndicatorCleanupRef = useRef<Array<() => void>>([]);\n const [hoveredTable, setHoveredTable] = useState<HTMLTableElement | null>(\n null,\n );\n const [hoveredColumnIndex, setHoveredColumnIndex] = useState<number | null>(\n null,\n );\n const [canReorder, setCanReorder] = useState(false);\n const [dropIndicatorState, setDropIndicatorState] =\n useState<DropIndicatorState | null>(null);\n\n const {refs, floatingStyles, update} = useFloating({\n middleware: [\n offset({mainAxis: -TOP_BUTTON_OVERHANG}),\n shift({\n padding: 8,\n }),\n ],\n placement: 'top',\n strategy: 'fixed',\n whileElementsMounted: autoUpdate,\n });\n\n const {\n refs: leftRefs,\n floatingStyles: leftFloatingStyles,\n update: updateLeft,\n } = useFloating({\n middleware: [\n offset({mainAxis: -LEFT_BUTTON_OVERHANG}),\n shift({\n padding: 8,\n }),\n ],\n placement: 'left',\n strategy: 'fixed',\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (!isEditable) {\n return;\n }\n\n const handleMouseMove = (event: MouseEvent) => {\n if (\n (floatingElemRef.current &&\n event.target instanceof Node &&\n floatingElemRef.current.contains(event.target)) ||\n (leftFloatingElemRef.current &&\n event.target instanceof Node &&\n leftFloatingElemRef.current.contains(event.target))\n ) {\n return;\n }\n\n const {tableElement, isOutside} = getTableFromMouseEvent(event, getTheme);\n\n if (\n isOutside ||\n tableElement == null ||\n (anchorElem && !anchorElem.contains(tableElement))\n ) {\n setIsVisible(false);\n setIsLeftVisible(false);\n setHoveredTable(null);\n setHoveredColumnIndex(null);\n setDropIndicatorState(null);\n return;\n }\n\n const cellSelector = `td${getThemeSelector(getTheme, 'tableCell')}, th${getThemeSelector(getTheme, 'tableCell')}`;\n const hoveredCell = isHTMLElement(event.target)\n ? event.target.closest<HTMLTableCellElement>(cellSelector)\n : null;\n\n if (!hoveredCell) {\n setIsVisible(false);\n setIsLeftVisible(false);\n hoveredTopCellRef.current = null;\n hoveredLeftCellRef.current = null;\n return;\n }\n\n const rowIndex =\n hoveredCell.parentElement instanceof HTMLTableRowElement\n ? hoveredCell.parentElement.rowIndex\n : -1;\n const colIndex = hoveredCell.cellIndex ?? -1;\n\n const closestTopCell = getClosestTopCellPosition(\n tableElement,\n event.clientX,\n );\n\n if (!closestTopCell || rowIndex !== 0) {\n setIsVisible(false);\n hoveredTopCellRef.current = null;\n setHoveredTable(null);\n setHoveredColumnIndex(null);\n } else {\n hoveredTopCellRef.current = closestTopCell.cell;\n setHoveredTable(tableElement);\n setHoveredColumnIndex(closestTopCell.cell.cellIndex ?? null);\n virtualRef.current.getBoundingClientRect = () =>\n new DOMRect(closestTopCell.centerX, closestTopCell.top, 0, 0);\n refs.setPositionReference(virtualRef.current);\n setIsVisible(true);\n update?.();\n }\n\n const tableRect = tableElement.getBoundingClientRect();\n if (colIndex !== 0) {\n setIsLeftVisible(false);\n hoveredLeftCellRef.current = null;\n } else {\n const {top, height} = hoveredCell.getBoundingClientRect();\n const centerY = top + height / 2;\n hoveredLeftCellRef.current = hoveredCell;\n leftVirtualRef.current.getBoundingClientRect = () =>\n new DOMRect(tableRect.left, centerY, 0, 0);\n leftRefs.setPositionReference(leftVirtualRef.current);\n setIsLeftVisible(true);\n updateLeft?.();\n }\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n setIsVisible(false);\n setIsLeftVisible(false);\n };\n }, [anchorElem, getTheme, isEditable, leftRefs, refs, update, updateLeft]);\n\n useEffect(() => {\n const handleMouseLeave = (event: MouseEvent) => {\n const nextTarget = event.relatedTarget;\n if (\n nextTarget &&\n floatingElemRef.current &&\n floatingElemRef.current.contains(nextTarget as Node)\n ) {\n return;\n }\n if (\n nextTarget &&\n leftFloatingElemRef.current &&\n leftFloatingElemRef.current.contains(nextTarget as Node)\n ) {\n return;\n }\n setIsVisible(false);\n setIsLeftVisible(false);\n };\n handleMouseLeaveRef.current = handleMouseLeave;\n\n return editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement && handleMouseLeaveRef.current) {\n prevRootElement.removeEventListener(\n 'mouseleave',\n handleMouseLeaveRef.current,\n );\n }\n if (rootElement && handleMouseLeaveRef.current) {\n rootElement.addEventListener('mouseleave', handleMouseLeaveRef.current);\n }\n });\n }, [editor]);\n\n useEffect(() => {\n if (!hoveredTable) {\n setCanReorder(false);\n return;\n }\n if (!isTableFromEditor(hoveredTable, editor)) {\n setCanReorder(false);\n return;\n }\n editor.getEditorState().read(\n () => {\n const tableNode = $getNearestNodeFromDOMNode(hoveredTable);\n setCanReorder($isTableNode(tableNode) && $isSimpleTable(tableNode));\n },\n {editor},\n );\n }, [editor, hoveredTable]);\n\n useEffect(() => {\n const handle = dragHandleRef.current;\n const tableElement = hoveredTable;\n const columnIndex = hoveredColumnIndex;\n if (!handle || tableElement == null || columnIndex == null || !canReorder) {\n return;\n }\n\n const cleanup = draggable({\n canDrag: () => canReorder,\n element: handle,\n getInitialData: () => ({\n columnIndex,\n tableKey: getTableKey(tableElement),\n type: 'table-column',\n }),\n onDrop: () => setDropIndicatorState(null),\n });\n\n return cleanup;\n }, [canReorder, hoveredColumnIndex, hoveredTable]);\n\n useEffect(() => {\n dropIndicatorCleanupRef.current.forEach((cleanup) => cleanup());\n dropIndicatorCleanupRef.current = [];\n if (!hoveredTable || !canReorder) {\n return;\n }\n const headerRow = hoveredTable.rows[0];\n if (!headerRow) {\n return;\n }\n if (!isTableFromEditor(hoveredTable, editor)) {\n return;\n }\n const tableKey = getTableKey(hoveredTable);\n const registerDropTarget = (cell: HTMLTableCellElement) =>\n dropTargetForElements({\n canDrop: ({source}: {source: any}) => isColumnDrag(source, tableKey),\n element: cell,\n getData: ({input}: {input: any}) => ({\n boundaryIndex: getBoundaryIndex(cell, input.clientX),\n }),\n onDrag: ({location, source}: {location: any; source: any}) => {\n if (!isColumnDrag(source, tableKey)) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const tableRect = hoveredTable.getBoundingClientRect();\n setDropIndicatorState(\n getDropIndicatorState(headerRow, tableRect, boundaryIndex),\n );\n },\n onDragEnter: ({location, source}: {location: any; source: any}) => {\n if (!isColumnDrag(source, tableKey)) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const tableRect = hoveredTable.getBoundingClientRect();\n setDropIndicatorState(\n getDropIndicatorState(headerRow, tableRect, boundaryIndex),\n );\n },\n onDragLeave: () => setDropIndicatorState(null),\n onDrop: ({location, source}: {location: any; source: any}) => {\n setDropIndicatorState(null);\n const data = (source?.data ?? {}) as ColumnDragData;\n if (data.columnIndex == null) {\n return;\n }\n const boundaryIndex = getBoundaryIndex(\n cell,\n location.current.input.clientX,\n );\n const targetTable = cell.closest('table');\n if (!isHTMLElement(targetTable) || !isColumnDrag(source, tableKey)) {\n return;\n }\n editor.update(() => {\n const tableNode = $getNearestNodeFromDOMNode(targetTable);\n if (!$isTableNode(tableNode)) {\n return;\n }\n const columnCount = tableNode.getColumnCount();\n const clampedBoundary = Math.max(\n 0,\n Math.min(boundaryIndex, columnCount),\n );\n const startIndex = data.columnIndex;\n if (\n clampedBoundary === startIndex ||\n clampedBoundary === startIndex + 1 ||\n startIndex < 0 ||\n startIndex >= columnCount\n ) {\n return;\n }\n const finishIndex =\n clampedBoundary > startIndex\n ? clampedBoundary - 1\n : clampedBoundary;\n $moveTableColumn(tableNode, startIndex, finishIndex);\n });\n },\n });\n\n dropIndicatorCleanupRef.current = Array.from(headerRow.cells).map((cell) =>\n registerDropTarget(cell),\n );\n\n return () => {\n dropIndicatorCleanupRef.current.forEach((cleanup) => cleanup());\n dropIndicatorCleanupRef.current = [];\n setDropIndicatorState(null);\n };\n }, [canReorder, editor, hoveredTable]);\n\n if (!isEditable) {\n return null;\n }\n\n const handleAddColumn = () => {\n const targetCell = hoveredTopCellRef.current;\n if (!targetCell) {\n return;\n }\n editor.update(() => {\n const maybeCellNode = $getNearestNodeFromDOMNode(targetCell);\n if ($isTableCellNode(maybeCellNode)) {\n maybeCellNode.selectEnd();\n $insertTableColumnAtSelection();\n }\n });\n };\n\n const handleAddRow = () => {\n const targetCell = hoveredLeftCellRef.current;\n if (!targetCell) {\n return;\n }\n editor.update(() => {\n const maybeCellNode = $getNearestNodeFromDOMNode(targetCell);\n if ($isTableCellNode(maybeCellNode)) {\n maybeCellNode.selectEnd();\n $insertTableRowAtSelection();\n }\n });\n };\n\n const handleSortColumn = (direction: 'asc' | 'desc') => {\n const targetCell = hoveredTopCellRef.current;\n if (!targetCell) {\n return;\n }\n\n editor.update(() => {\n const cellNode = $getNearestNodeFromDOMNode(targetCell);\n if (!$isTableCellNode(cellNode)) {\n return;\n }\n\n const rowNode = cellNode.getParent();\n if (!rowNode || !$isTableRowNode(rowNode)) {\n return;\n }\n\n const tableNode = rowNode.getParent();\n if (!$isTableNode(tableNode) || !$isSimpleTable(tableNode)) {\n return;\n }\n\n const colIndex = cellNode.getIndexWithinParent();\n const rows = tableNode.getChildren().filter($isTableRowNode);\n\n const [tableMap] = $computeTableMapSkipCellCheck(\n tableNode,\n cellNode,\n cellNode,\n );\n\n const headerCell = tableMap[0]?.[colIndex]?.cell;\n const shouldSkipTopRow = headerCell?.hasHeader() ?? false;\n\n const sortableRows = shouldSkipTopRow ? rows.slice(1) : rows;\n\n if (sortableRows.length <= 1) {\n return;\n }\n\n sortableRows.sort((a, b) => {\n const aRowIndex = rows.indexOf(a);\n const bRowIndex = rows.indexOf(b);\n\n const aMapRow = tableMap[aRowIndex] ?? [];\n const bMapRow = tableMap[bRowIndex] ?? [];\n\n const aCellValue = aMapRow[colIndex];\n const bCellValue = bMapRow[colIndex];\n\n const aText = aCellValue?.cell.getTextContent() ?? '';\n const bText = bCellValue?.cell.getTextContent() ?? '';\n const result = aText.localeCompare(bText, undefined, {numeric: true});\n return direction === 'asc' ? -result : result;\n });\n\n const insertionCaret = shouldSkipTopRow\n ? $getSiblingCaret(rows[0], 'next')\n : $getChildCaret(tableNode, 'next');\n\n insertionCaret?.splice(0, sortableRows);\n });\n };\n\n return (\n <>\n <div\n ref={(node) => {\n floatingElemRef.current = node;\n refs.setFloating(node);\n }}\n style={{\n ...floatingStyles,\n opacity: isVisible ? 1 : 0,\n }}\n className=\"floating-top-actions\">\n <button\n ref={dragHandleRef}\n className=\"floating-drag-indicator\"\n aria-label=\"Drag to reorder column\"\n type=\"button\"\n />\n <DropDown\n buttonAriaLabel=\"Sort column\"\n buttonClassName=\"floating-filter-indicator\"\n hideChevron={true}>\n <DropDownItem\n className=\"item\"\n onClick={() => handleSortColumn('desc')}>\n Sort Ascending\n </DropDownItem>\n <DropDownItem\n className=\"item\"\n onClick={() => handleSortColumn('asc')}>\n Sort Descending\n </DropDownItem>\n </DropDown>\n <button\n className=\"floating-add-indicator\"\n aria-label=\"Add column\"\n type=\"button\"\n onClick={handleAddColumn}\n />\n </div>\n <button\n ref={(node) => {\n leftFloatingElemRef.current = node;\n leftRefs.setFloating(node);\n }}\n style={{\n ...leftFloatingStyles,\n opacity: isLeftVisible ? 1 : 0,\n }}\n className=\"floating-add-indicator\"\n aria-label=\"Add row\"\n type=\"button\"\n onClick={handleAddRow}\n />\n {dropIndicatorState ? (\n <div\n style={{\n height: dropIndicatorState.height,\n left: dropIndicatorState.left,\n pointerEvents: 'none',\n position: 'fixed',\n top: dropIndicatorState.top,\n width: 2,\n zIndex: 20,\n }}>\n <DropIndicator edge={dropIndicatorState.edge} />\n </div>\n ) : null}\n </>\n );\n}\n\nexport default function TableHoverActionsV2Plugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement;\n}): React.ReactPortal | null {\n const isEditable = useLexicalEditable();\n\n return isEditable\n ? createPortal(<TableHoverActionsV2 anchorElem={anchorElem} />, anchorElem)\n : null;\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {EditorThemeClasses} from 'lexical';\r\n\r\nexport function getThemeSelector(\r\n getTheme: () => EditorThemeClasses | null | undefined,\r\n name: keyof EditorThemeClasses,\r\n): string {\r\n const className = getTheme()?.[name];\r\n if (typeof className !== 'string') {\r\n throw new Error(\r\n `getThemeClass: required theme property ${name} not defined`,\r\n );\r\n }\r\n return className\r\n .split(/\\s+/g)\r\n .map((cls) => `.${cls}`)\r\n .join();\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {TableOfContentsEntry} from '@lexical/react/LexicalTableOfContentsPlugin';\r\nimport type {HeadingTagType} from '@lexical/rich-text';\r\nimport type {NodeKey} from 'lexical';\r\nimport type {JSX} from 'react';\r\n\r\nimport './index.css';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {TableOfContentsPlugin as LexicalTableOfContentsPlugin} from '@lexical/react/LexicalTableOfContentsPlugin';\r\nimport {useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\n\r\nconst MARGIN_ABOVE_EDITOR = 624;\r\nconst HEADING_WIDTH = 9;\r\n\r\nfunction indent(tagName: HeadingTagType) {\r\n if (tagName === 'h2') {\r\n return 'heading2';\r\n } else if (tagName === 'h3') {\r\n return 'heading3';\r\n }\r\n}\r\n\r\nfunction isHeadingAtTheTopOfThePage(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return (\r\n elementYPosition >= MARGIN_ABOVE_EDITOR &&\r\n elementYPosition <= MARGIN_ABOVE_EDITOR + HEADING_WIDTH\r\n );\r\n}\r\nfunction isHeadingAboveViewport(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return elementYPosition < MARGIN_ABOVE_EDITOR;\r\n}\r\nfunction isHeadingBelowTheTopOfThePage(element: HTMLElement): boolean {\r\n const elementYPosition = element?.getClientRects()[0].y;\r\n return elementYPosition >= MARGIN_ABOVE_EDITOR + HEADING_WIDTH;\r\n}\r\n\r\nfunction TableOfContentsList({\r\n tableOfContents,\r\n}: {\r\n tableOfContents: Array<TableOfContentsEntry>;\r\n}): JSX.Element {\r\n const [selectedKey, setSelectedKey] = useState('');\r\n const selectedIndex = useRef(0);\r\n const [editor] = useLexicalComposerContext();\r\n\r\n function scrollToNode(key: NodeKey, currIndex: number) {\r\n editor.getEditorState().read(() => {\r\n const domElement = editor.getElementByKey(key);\r\n if (domElement !== null) {\r\n domElement.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n setSelectedKey(key);\r\n selectedIndex.current = currIndex;\r\n }\r\n });\r\n }\r\n\r\n useEffect(() => {\r\n function scrollCallback() {\r\n if (\r\n tableOfContents.length !== 0 &&\r\n selectedIndex.current < tableOfContents.length - 1\r\n ) {\r\n let currentHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current][0],\r\n );\r\n if (currentHeading !== null) {\r\n if (isHeadingBelowTheTopOfThePage(currentHeading)) {\r\n //On natural scroll, user is scrolling up\r\n while (\r\n currentHeading !== null &&\r\n isHeadingBelowTheTopOfThePage(currentHeading) &&\r\n selectedIndex.current > 0\r\n ) {\r\n const prevHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current - 1][0],\r\n );\r\n if (\r\n prevHeading !== null &&\r\n (isHeadingAboveViewport(prevHeading) ||\r\n isHeadingBelowTheTopOfThePage(prevHeading))\r\n ) {\r\n selectedIndex.current--;\r\n }\r\n currentHeading = prevHeading;\r\n }\r\n const prevHeadingKey = tableOfContents[selectedIndex.current][0];\r\n setSelectedKey(prevHeadingKey);\r\n } else if (isHeadingAboveViewport(currentHeading)) {\r\n //On natural scroll, user is scrolling down\r\n while (\r\n currentHeading !== null &&\r\n isHeadingAboveViewport(currentHeading) &&\r\n selectedIndex.current < tableOfContents.length - 1\r\n ) {\r\n const nextHeading = editor.getElementByKey(\r\n tableOfContents[selectedIndex.current + 1][0],\r\n );\r\n if (\r\n nextHeading !== null &&\r\n (isHeadingAtTheTopOfThePage(nextHeading) ||\r\n isHeadingAboveViewport(nextHeading))\r\n ) {\r\n selectedIndex.current++;\r\n }\r\n currentHeading = nextHeading;\r\n }\r\n const nextHeadingKey = tableOfContents[selectedIndex.current][0];\r\n setSelectedKey(nextHeadingKey);\r\n }\r\n }\r\n } else {\r\n selectedIndex.current = 0;\r\n }\r\n }\r\n let timerId: ReturnType<typeof setTimeout>;\r\n\r\n function debounceFunction(func: () => void, delay: number) {\r\n clearTimeout(timerId);\r\n timerId = setTimeout(func, delay);\r\n }\r\n\r\n function onScroll(): void {\r\n debounceFunction(scrollCallback, 10);\r\n }\r\n\r\n document.addEventListener('scroll', onScroll);\r\n return () => document.removeEventListener('scroll', onScroll);\r\n }, [tableOfContents, editor]);\r\n\r\n return (\r\n <div className=\"table-of-contents\">\r\n <ul className=\"headings\">\r\n {tableOfContents.map(([key, text, tag], index) => {\r\n if (index === 0) {\r\n return (\r\n <div className=\"normal-heading-wrapper\" key={key}>\r\n <div\r\n className=\"first-heading\"\r\n onClick={() => scrollToNode(key, index)}\r\n role=\"button\"\r\n tabIndex={0}>\r\n {('' + text).length > 20\r\n ? text.substring(0, 20) + '...'\r\n : text}\r\n </div>\r\n <br />\r\n </div>\r\n );\r\n } else {\r\n return (\r\n <div\r\n className={`normal-heading-wrapper ${\r\n selectedKey === key ? 'selected-heading-wrapper' : ''\r\n }`}\r\n key={key}>\r\n <div\r\n onClick={() => scrollToNode(key, index)}\r\n role=\"button\"\r\n className={indent(tag)}\r\n tabIndex={0}>\r\n <li\r\n className={`normal-heading ${\r\n selectedKey === key ? 'selected-heading' : ''\r\n }\r\n `}>\r\n {('' + text).length > 27\r\n ? text.substring(0, 27) + '...'\r\n : text}\r\n </li>\r\n </div>\r\n </div>\r\n );\r\n }\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableOfContentsPlugin() {\r\n return (\r\n <LexicalTableOfContentsPlugin>\r\n {(tableOfContents) => {\r\n return <TableOfContentsList tableOfContents={tableOfContents} />;\r\n }}\r\n </LexicalTableOfContentsPlugin>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nconst SCROLLABLE_WRAPPER_CLASS =\r\n 'PlaygroundEditorTheme__tableScrollableWrapper';\r\nconst HAS_SCROLL_RIGHT_CLASS = 'PlaygroundEditorTheme__tableScrollRight';\r\nconst HAS_SCROLL_LEFT_CLASS = 'PlaygroundEditorTheme__tableScrollLeft';\r\nconst HAS_SCROLL_MIDDLE_CLASS = 'PlaygroundEditorTheme__tableScrollMiddle';\r\n\r\nfunction updateTableScrollState(element: HTMLElement): void {\r\n const hasScroll = element.scrollWidth > element.clientWidth;\r\n // Adding and removing 1 and -1 for floating point precision\r\n const isScrolledToRight =\r\n element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;\r\n const isScrolledToLeft = element.scrollLeft <= 1;\r\n\r\n // Remove all scroll classes first\r\n element.classList.remove(HAS_SCROLL_RIGHT_CLASS);\r\n element.classList.remove(HAS_SCROLL_LEFT_CLASS);\r\n element.classList.remove(HAS_SCROLL_MIDDLE_CLASS);\r\n\r\n if (hasScroll) {\r\n // Middle state: not at either edge\r\n if (!isScrolledToLeft && !isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_MIDDLE_CLASS);\r\n }\r\n // Right edge\r\n else if (isScrolledToLeft && !isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_RIGHT_CLASS);\r\n }\r\n // Left edge\r\n else if (!isScrolledToLeft && isScrolledToRight) {\r\n element.classList.add(HAS_SCROLL_LEFT_CLASS);\r\n }\r\n }\r\n}\r\n\r\nexport default function TableScrollShadowPlugin(): null {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const editorElement = editor.getRootElement();\r\n if (!editorElement) {\r\n return;\r\n }\r\n\r\n const updateAllTableScrollStates = () => {\r\n const wrappers = editorElement.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n wrappers.forEach(updateTableScrollState);\r\n };\r\n\r\n // Initial check\r\n updateAllTableScrollStates();\r\n\r\n // Watch for new table wrappers being added\r\n const observer = new MutationObserver(() => {\r\n updateAllTableScrollStates();\r\n });\r\n\r\n observer.observe(editorElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n // Also watch for resize events on the wrappers themselves\r\n const resizeObserver = new ResizeObserver(() => {\r\n updateAllTableScrollStates();\r\n });\r\n\r\n const scrollHandlers = new Map<HTMLElement, () => void>();\r\n\r\n const addScrollListener = (wrapper: HTMLElement) => {\r\n if (scrollHandlers.has(wrapper)) {\r\n return; // Already has a listener\r\n }\r\n const handler = () => {\r\n updateTableScrollState(wrapper);\r\n };\r\n wrapper.addEventListener('scroll', handler, {passive: true});\r\n scrollHandlers.set(wrapper, handler);\r\n };\r\n\r\n const wrappers = editorElement.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n wrappers.forEach((wrapper) => {\r\n resizeObserver.observe(wrapper);\r\n addScrollListener(wrapper);\r\n });\r\n\r\n // Watch for new wrappers to observe\r\n const wrapperObserver = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n mutation.addedNodes.forEach((node) => {\r\n if (node instanceof HTMLElement) {\r\n if (node.classList.contains(SCROLLABLE_WRAPPER_CLASS)) {\r\n resizeObserver.observe(node);\r\n addScrollListener(node);\r\n updateTableScrollState(node);\r\n }\r\n\r\n const childWrappers = node.querySelectorAll<HTMLElement>(\r\n `.${SCROLLABLE_WRAPPER_CLASS}`,\r\n );\r\n childWrappers.forEach((wrapper) => {\r\n resizeObserver.observe(wrapper);\r\n addScrollListener(wrapper);\r\n updateTableScrollState(wrapper);\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n wrapperObserver.observe(editorElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n return () => {\r\n observer.disconnect();\r\n resizeObserver.disconnect();\r\n wrapperObserver.disconnect();\r\n\r\n scrollHandlers.forEach((handler, wrapper) => {\r\n wrapper.removeEventListener('scroll', handler);\r\n });\r\n scrollHandlers.clear();\r\n };\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {JSX} from 'react';\n\nimport {\n $isCodeNode,\n getCodeLanguageOptions as getCodeLanguageOptionsPrism,\n normalizeCodeLanguage as normalizeCodeLanguagePrism,\n} from '@lexical/code';\nimport {\n getCodeLanguageOptions as getCodeLanguageOptionsShiki,\n getCodeThemeOptions as getCodeThemeOptionsShiki,\n normalizeCodeLanguage as normalizeCodeLanguageShiki,\n} from '@lexical/code-shiki';\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\nimport {$isListNode, ListNode} from '@lexical/list';\nimport {INSERT_EMBED_COMMAND} from '@lexical/react/LexicalAutoEmbedPlugin';\nimport {INSERT_HORIZONTAL_RULE_COMMAND} from '@lexical/react/LexicalHorizontalRuleNode';\nimport {$isHeadingNode} from '@lexical/rich-text';\nimport {\n $getSelectionStyleValueForProperty,\n $isParentElementRTL,\n $patchStyleText,\n} from '@lexical/selection';\nimport {$isTableNode, $isTableSelection} from '@lexical/table';\nimport {\n $findMatchingParent,\n $getNearestNodeOfType,\n $isEditorIsNestedEditor,\n IS_APPLE,\n mergeRegister,\n} from '@lexical/utils';\nimport {\n $addUpdateTag,\n $getNodeByKey,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isNodeSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n CommandPayloadType,\n ElementFormatType,\n FORMAT_ELEMENT_COMMAND,\n FORMAT_TEXT_COMMAND,\n HISTORIC_TAG,\n INDENT_CONTENT_COMMAND,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n OUTDENT_CONTENT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n SKIP_DOM_SELECTION_TAG,\n SKIP_SELECTION_FOCUS_TAG,\n TextFormatType,\n UNDO_COMMAND,\n} from 'lexical';\nimport {Dispatch, useCallback, useEffect, useState} from 'react';\n\nimport {useSettings} from '../../context/SettingsContext';\nimport {\n blockTypeToBlockName,\n useToolbarState,\n} from '../../context/ToolbarContext';\nimport useModal from '../../hooks/useModal';\nimport {$createStickyNode} from '../../nodes/StickyNode';\nimport DropDown, {DropDownItem} from '../../ui/DropDown';\nimport DropdownColorPicker from '../../ui/DropdownColorPicker';\nimport {isKeyboardInput} from '../../utils/focusUtils';\nimport {getSelectedNode} from '../../utils/getSelectedNode';\nimport {sanitizeUrl} from '../../utils/url';\nimport {EmbedConfigs} from '../AutoEmbedPlugin';\nimport {INSERT_COLLAPSIBLE_COMMAND} from '../CollapsiblePlugin';\nimport {INSERT_DATETIME_COMMAND} from '../DateTimePlugin';\nimport {InsertEquationDialog} from '../EquationsPlugin';\nimport {INSERT_EXCALIDRAW_COMMAND} from '../ExcalidrawPlugin';\nimport {\n InsertImageDialog,\n} from '../ImagesPlugin';\nimport InsertLayoutDialog from '../LayoutPlugin/InsertLayoutDialog';\nimport {INSERT_PAGE_BREAK} from '../PageBreakPlugin';\nimport {InsertNotesDialog} from '../NotesPlugin';\nimport {InsertPollDialog} from '../PollPlugin';\nimport {InsertRevisionDialog} from '../RevisionPlugin';\nimport {InsertTerminologyDialog} from '../TerminologyPlugin';\nimport {SHORTCUTS} from '../ShortcutsPlugin/shortcuts';\nimport {InsertTableDialog} from '../TablePlugin';\nimport FontSize, {parseFontSizeForToolbar} from './fontSize';\nimport {\n clearFormatting,\n formatBulletList,\n formatCheckList,\n formatCode,\n formatHeading,\n formatNumberedList,\n formatParagraph,\n formatQuote,\n} from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst rootTypeToRootName = {\n root: 'Root',\n table: 'Table',\n};\n\nconst CODE_LANGUAGE_OPTIONS_PRISM: [string, string][] =\n getCodeLanguageOptionsPrism().filter((option) =>\n [\n 'c',\n 'clike',\n 'cpp',\n 'css',\n 'html',\n 'java',\n 'js',\n 'javascript',\n 'markdown',\n 'objc',\n 'objective-c',\n 'plain',\n 'powershell',\n 'py',\n 'python',\n 'rust',\n 'sql',\n 'swift',\n 'typescript',\n 'xml',\n ].includes(option[0]),\n );\n\nconst CODE_LANGUAGE_OPTIONS_SHIKI: [string, string][] =\n getCodeLanguageOptionsShiki().filter((option) =>\n [\n 'c',\n 'clike',\n 'cpp',\n 'css',\n 'html',\n 'java',\n 'js',\n 'javascript',\n 'markdown',\n 'objc',\n 'objective-c',\n 'plain',\n 'powershell',\n 'py',\n 'python',\n 'rust',\n 'sql',\n 'typescript',\n 'xml',\n ].includes(option[0]),\n );\n\nconst CODE_THEME_OPTIONS_SHIKI: [string, string][] =\n getCodeThemeOptionsShiki().filter((option) =>\n [\n 'catppuccin-latte',\n 'everforest-light',\n 'github-light',\n 'gruvbox-light-medium',\n 'kanagawa-lotus',\n 'dark-plus',\n 'light-plus',\n 'material-theme-lighter',\n 'min-light',\n 'one-light',\n 'rose-pine-dawn',\n 'slack-ochin',\n 'snazzy-light',\n 'solarized-light',\n 'vitesse-light',\n ].includes(option[0]),\n );\n\nconst FONT_FAMILY_OPTIONS: [string, string][] = [\n ['Arial', 'Arial'],\n ['Courier New', 'Courier New'],\n ['Georgia', 'Georgia'],\n ['Times New Roman', 'Times New Roman'],\n ['Trebuchet MS', 'Trebuchet MS'],\n ['Verdana', 'Verdana'],\n];\n\nconst FONT_SIZE_OPTIONS: [string, string][] = [\n ['10px', '10px'],\n ['11px', '11px'],\n ['12px', '12px'],\n ['13px', '13px'],\n ['14px', '14px'],\n ['15px', '15px'],\n ['16px', '16px'],\n ['17px', '17px'],\n ['18px', '18px'],\n ['19px', '19px'],\n ['20px', '20px'],\n];\n\nconst ELEMENT_FORMAT_OPTIONS: {\n [key in Exclude<ElementFormatType, ''>]: {\n icon: string;\n iconRTL: string;\n name: string;\n };\n} = {\n center: {\n icon: 'center-align',\n iconRTL: 'center-align',\n name: 'Center Align',\n },\n end: {\n icon: 'right-align',\n iconRTL: 'left-align',\n name: 'End Align',\n },\n justify: {\n icon: 'justify-align',\n iconRTL: 'justify-align',\n name: 'Justify Align',\n },\n left: {\n icon: 'left-align',\n iconRTL: 'left-align',\n name: 'Left Align',\n },\n right: {\n icon: 'right-align',\n iconRTL: 'right-align',\n name: 'Right Align',\n },\n start: {\n icon: 'left-align',\n iconRTL: 'right-align',\n name: 'Start Align',\n },\n};\n\nfunction dropDownActiveClass(active: boolean) {\n if (active) {\n return 'active dropdown-item-active';\n } else {\n return '';\n }\n}\n\nfunction BlockFormatDropDown({\n editor,\n blockType,\n rootType,\n disabled = false,\n}: {\n blockType: keyof typeof blockTypeToBlockName;\n rootType: keyof typeof rootTypeToRootName;\n editor: LexicalEditor;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <DropDown\n disabled={disabled}\n buttonClassName=\"toolbar-item block-controls\"\n buttonIconClassName={'icon block-type ' + blockType}\n buttonLabel={blockTypeToBlockName[blockType]}\n buttonAriaLabel=\"Formatting options for text style\">\n <DropDownItem\n className={\n 'item wide ' + dropDownActiveClass(blockType === 'paragraph')\n }\n onClick={() => formatParagraph(editor)}>\n <div className=\"icon-text-container\">\n <i className=\"icon paragraph\" />\n <span className=\"text\">Normal</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.NORMAL}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h1')}\n onClick={() => formatHeading(editor, blockType, 'h1')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h1\" />\n <span className=\"text\">Heading 1</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING1}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h2')}\n onClick={() => formatHeading(editor, blockType, 'h2')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h2\" />\n <span className=\"text\">Heading 2</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING2}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'h3')}\n onClick={() => formatHeading(editor, blockType, 'h3')}>\n <div className=\"icon-text-container\">\n <i className=\"icon h3\" />\n <span className=\"text\">Heading 3</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.HEADING3}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'number')}\n onClick={() => formatNumberedList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon numbered-list\" />\n <span className=\"text\">Numbered List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.NUMBERED_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'bullet')}\n onClick={() => formatBulletList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon bullet-list\" />\n <span className=\"text\">Bullet List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.BULLET_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'check')}\n onClick={() => formatCheckList(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon check-list\" />\n <span className=\"text\">Check List</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CHECK_LIST}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'quote')}\n onClick={() => formatQuote(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon quote\" />\n <span className=\"text\">Quote</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.QUOTE}</span>\n </DropDownItem>\n <DropDownItem\n className={'item wide ' + dropDownActiveClass(blockType === 'code')}\n onClick={() => formatCode(editor, blockType)}>\n <div className=\"icon-text-container\">\n <i className=\"icon code\" />\n <span className=\"text\">Code Block</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CODE_BLOCK}</span>\n </DropDownItem>\n </DropDown>\n );\n}\n\nfunction Divider(): JSX.Element {\n return <div className=\"divider\" />;\n}\n\nfunction FontDropDown({\n editor,\n value,\n style,\n disabled = false,\n}: {\n editor: LexicalEditor;\n value: string;\n style: string;\n disabled?: boolean;\n}): JSX.Element {\n const handleClick = useCallback(\n (option: string) => {\n editor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n const selection = $getSelection();\n if (selection !== null) {\n $patchStyleText(selection, {\n [style]: option,\n });\n }\n });\n },\n [editor, style],\n );\n\n const buttonAriaLabel =\n style === 'font-family'\n ? 'Formatting options for font family'\n : 'Formatting options for font size';\n\n return (\n <DropDown\n disabled={disabled}\n buttonClassName={'toolbar-item ' + style}\n buttonLabel={value}\n buttonIconClassName={\n style === 'font-family' ? 'icon block-type font-family' : ''\n }\n buttonAriaLabel={buttonAriaLabel}>\n {(style === 'font-family' ? FONT_FAMILY_OPTIONS : FONT_SIZE_OPTIONS).map(\n ([option, text]) => (\n <DropDownItem\n className={`item ${dropDownActiveClass(value === option)} ${\n style === 'font-size' ? 'fontsize-item' : ''\n }`}\n onClick={() => handleClick(option)}\n key={option}>\n <span className=\"text\">{text}</span>\n </DropDownItem>\n ),\n )}\n </DropDown>\n );\n}\n\nfunction ElementFormatDropdown({\n editor,\n value,\n isRTL,\n disabled = false,\n}: {\n editor: LexicalEditor;\n value: ElementFormatType;\n isRTL: boolean;\n disabled: boolean;\n}) {\n const formatOption = ELEMENT_FORMAT_OPTIONS[value || 'left'];\n\n return (\n <DropDown\n disabled={disabled}\n buttonLabel={formatOption.name}\n buttonIconClassName={`icon ${\n isRTL ? formatOption.iconRTL : formatOption.icon\n }`}\n buttonClassName=\"toolbar-item spaced alignment\"\n buttonAriaLabel=\"Formatting options for text alignment\">\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon left-align\" />\n <span className=\"text\">Left Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.LEFT_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon center-align\" />\n <span className=\"text\">Center Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CENTER_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon right-align\" />\n <span className=\"text\">Right Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.RIGHT_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className=\"icon justify-align\" />\n <span className=\"text\">Justify Align</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.JUSTIFY_ALIGN}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'start');\n }}\n className=\"item wide\">\n <i\n className={`icon ${\n isRTL\n ? ELEMENT_FORMAT_OPTIONS.start.iconRTL\n : ELEMENT_FORMAT_OPTIONS.start.icon\n }`}\n />\n <span className=\"text\">Start Align</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'end');\n }}\n className=\"item wide\">\n <i\n className={`icon ${\n isRTL\n ? ELEMENT_FORMAT_OPTIONS.end.iconRTL\n : ELEMENT_FORMAT_OPTIONS.end.icon\n }`}\n />\n <span className=\"text\">End Align</span>\n </DropDownItem>\n <Divider />\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined);\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className={'icon ' + (isRTL ? 'indent' : 'outdent')} />\n <span className=\"text\">Outdent</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.OUTDENT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined);\n }}\n className=\"item wide\">\n <div className=\"icon-text-container\">\n <i className={'icon ' + (isRTL ? 'outdent' : 'indent')} />\n <span className=\"text\">Indent</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.INDENT}</span>\n </DropDownItem>\n </DropDown>\n );\n}\n\nfunction $findTopLevelElement(node: LexicalNode) {\n let topLevelElement =\n node.getKey() === 'root'\n ? node\n : $findMatchingParent(node, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (topLevelElement === null) {\n topLevelElement = node.getTopLevelElementOrThrow();\n }\n return topLevelElement;\n}\n\nexport default function ToolbarPlugin({\n editor,\n activeEditor,\n setActiveEditor,\n setIsLinkEditMode,\n}: {\n editor: LexicalEditor;\n activeEditor: LexicalEditor;\n setActiveEditor: Dispatch<LexicalEditor>;\n setIsLinkEditMode: Dispatch<boolean>;\n}): JSX.Element {\n const [selectedElementKey, setSelectedElementKey] = useState<NodeKey | null>(\n null,\n );\n const [modal, showModal] = useModal();\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\n const {toolbarState, updateToolbarState} = useToolbarState();\n\n const dispatchToolbarCommand = <T extends LexicalCommand<unknown>>(\n command: T,\n payload: CommandPayloadType<T> | undefined = undefined,\n skipRefocus: boolean = false,\n ) => {\n activeEditor.update(() => {\n if (skipRefocus) {\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\n }\n\n // Re-assert on Type so that payload can have a default param\n activeEditor.dispatchCommand(command, payload as CommandPayloadType<T>);\n });\n };\n\n const dispatchFormatTextCommand = (\n payload: TextFormatType,\n skipRefocus: boolean = false,\n ) => dispatchToolbarCommand(FORMAT_TEXT_COMMAND, payload, skipRefocus);\n\n const $handleHeadingNode = useCallback(\n (selectedElement: LexicalNode) => {\n const type = $isHeadingNode(selectedElement)\n ? selectedElement.getTag()\n : selectedElement.getType();\n\n if (type in blockTypeToBlockName) {\n updateToolbarState(\n 'blockType',\n type as keyof typeof blockTypeToBlockName,\n );\n }\n },\n [updateToolbarState],\n );\n\n const {\n settings: {isCodeHighlighted, isCodeShiki},\n } = useSettings();\n\n const $handleCodeNode = useCallback(\n (element: LexicalNode): boolean => {\n if ($isCodeNode(element)) {\n const language = element.getLanguage();\n updateToolbarState(\n 'codeLanguage',\n language\n ? (isCodeHighlighted &&\n (isCodeShiki\n ? normalizeCodeLanguageShiki(language)\n : normalizeCodeLanguagePrism(language))) ||\n language\n : '',\n );\n const theme = element.getTheme();\n updateToolbarState('codeTheme', theme || '');\n return true;\n }\n return false;\n },\n [updateToolbarState, isCodeHighlighted, isCodeShiki],\n );\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n if (activeEditor !== editor && $isEditorIsNestedEditor(activeEditor)) {\n const rootElement = activeEditor.getRootElement();\n updateToolbarState(\n 'isImageCaption',\n !!rootElement?.parentElement?.classList.contains(\n 'image-caption-container',\n ),\n );\n } else {\n updateToolbarState('isImageCaption', false);\n }\n\n const anchorNode = selection.anchor.getNode();\n const element = $findTopLevelElement(anchorNode);\n const elementKey = element.getKey();\n const elementDOM = activeEditor.getElementByKey(elementKey);\n\n updateToolbarState('isRTL', $isParentElementRTL(selection));\n\n // Update links\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isLink = $isLinkNode(parent) || $isLinkNode(node);\n updateToolbarState('isLink', isLink);\n\n const tableNode = $findMatchingParent(node, $isTableNode);\n if ($isTableNode(tableNode)) {\n updateToolbarState('rootType', 'table');\n } else {\n updateToolbarState('rootType', 'root');\n }\n\n if (elementDOM !== null) {\n setSelectedElementKey(elementKey);\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(\n anchorNode,\n ListNode,\n );\n const type = parentList\n ? parentList.getListType()\n : element.getListType();\n\n updateToolbarState('blockType', type);\n } else {\n $handleHeadingNode(element);\n if ($handleCodeNode(element)) {\n return;\n }\n }\n }\n\n // Handle buttons\n updateToolbarState(\n 'fontColor',\n $getSelectionStyleValueForProperty(selection, 'color', '#000'),\n );\n updateToolbarState(\n 'bgColor',\n $getSelectionStyleValueForProperty(\n selection,\n 'background-color',\n '#fff',\n ),\n );\n updateToolbarState(\n 'fontFamily',\n $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial'),\n );\n let matchingParent;\n if ($isLinkNode(parent)) {\n // If node is a link, we need to fetch the parent paragraph node to set format\n matchingParent = $findMatchingParent(\n node,\n (parentNode) => $isElementNode(parentNode) && !parentNode.isInline(),\n );\n }\n\n // If matchingParent is a valid node, pass it's format type\n updateToolbarState(\n 'elementFormat',\n $isElementNode(matchingParent)\n ? matchingParent.getFormatType()\n : $isElementNode(node)\n ? node.getFormatType()\n : parent?.getFormatType() || 'left',\n );\n }\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n // Update text format\n updateToolbarState('isBold', selection.hasFormat('bold'));\n updateToolbarState('isItalic', selection.hasFormat('italic'));\n updateToolbarState('isUnderline', selection.hasFormat('underline'));\n updateToolbarState(\n 'isStrikethrough',\n selection.hasFormat('strikethrough'),\n );\n updateToolbarState('isSubscript', selection.hasFormat('subscript'));\n updateToolbarState('isSuperscript', selection.hasFormat('superscript'));\n updateToolbarState('isHighlight', selection.hasFormat('highlight'));\n updateToolbarState('isCode', selection.hasFormat('code'));\n updateToolbarState(\n 'fontSize',\n $getSelectionStyleValueForProperty(selection, 'font-size', '15px'),\n );\n updateToolbarState('isLowercase', selection.hasFormat('lowercase'));\n updateToolbarState('isUppercase', selection.hasFormat('uppercase'));\n updateToolbarState('isCapitalize', selection.hasFormat('capitalize'));\n }\n if ($isNodeSelection(selection)) {\n const nodes = selection.getNodes();\n for (const selectedNode of nodes) {\n const parentList = $getNearestNodeOfType<ListNode>(\n selectedNode,\n ListNode,\n );\n if (parentList) {\n const type = parentList.getListType();\n updateToolbarState('blockType', type);\n } else {\n const selectedElement = $findTopLevelElement(selectedNode);\n $handleHeadingNode(selectedElement);\n $handleCodeNode(selectedElement);\n // Update elementFormat for node selection (e.g., images)\n if ($isElementNode(selectedElement)) {\n updateToolbarState(\n 'elementFormat',\n selectedElement.getFormatType(),\n );\n }\n }\n }\n }\n }, [\n activeEditor,\n editor,\n updateToolbarState,\n $handleHeadingNode,\n $handleCodeNode,\n ]);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n setActiveEditor(newEditor);\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor, $updateToolbar, setActiveEditor]);\n\n useEffect(() => {\n activeEditor.getEditorState().read(\n () => {\n $updateToolbar();\n },\n {editor: activeEditor},\n );\n }, [activeEditor, $updateToolbar]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerEditableListener((editable) => {\n setIsEditable(editable);\n }),\n activeEditor.registerUpdateListener(({editorState}) => {\n editorState.read(\n () => {\n $updateToolbar();\n },\n {editor: activeEditor},\n );\n }),\n activeEditor.registerCommand<boolean>(\n CAN_UNDO_COMMAND,\n (payload) => {\n updateToolbarState('canUndo', payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n activeEditor.registerCommand<boolean>(\n CAN_REDO_COMMAND,\n (payload) => {\n updateToolbarState('canRedo', payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n ),\n );\n }, [$updateToolbar, activeEditor, editor, updateToolbarState]);\n\n const applyStyleText = useCallback(\n (\n styles: Record<string, string>,\n skipHistoryStack?: boolean,\n skipRefocus: boolean = false,\n ) => {\n activeEditor.update(\n () => {\n if (skipRefocus) {\n $addUpdateTag(SKIP_DOM_SELECTION_TAG);\n }\n const selection = $getSelection();\n if (selection !== null) {\n $patchStyleText(selection, styles);\n }\n },\n skipHistoryStack ? {tag: HISTORIC_TAG} : {},\n );\n },\n [activeEditor],\n );\n\n const onFontColorSelect = useCallback(\n (value: string, skipHistoryStack: boolean, skipRefocus: boolean) => {\n applyStyleText({color: value}, skipHistoryStack, skipRefocus);\n },\n [applyStyleText],\n );\n\n const onBgColorSelect = useCallback(\n (value: string, skipHistoryStack: boolean, skipRefocus: boolean) => {\n applyStyleText(\n {'background-color': value},\n skipHistoryStack,\n skipRefocus,\n );\n },\n [applyStyleText],\n );\n\n const insertLink = useCallback(() => {\n if (!toolbarState.isLink) {\n setIsLinkEditMode(true);\n activeEditor.dispatchCommand(\n TOGGLE_LINK_COMMAND,\n sanitizeUrl('https://'),\n );\n } else {\n setIsLinkEditMode(false);\n activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [activeEditor, setIsLinkEditMode, toolbarState.isLink]);\n\n const onCodeLanguageSelect = useCallback(\n (value: string) => {\n activeEditor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n if (selectedElementKey !== null) {\n const node = $getNodeByKey(selectedElementKey);\n if ($isCodeNode(node)) {\n node.setLanguage(value);\n }\n }\n });\n },\n [activeEditor, selectedElementKey],\n );\n const onCodeThemeSelect = useCallback(\n (value: string) => {\n activeEditor.update(() => {\n if (selectedElementKey !== null) {\n const node = $getNodeByKey(selectedElementKey);\n if ($isCodeNode(node)) {\n node.setTheme(value);\n }\n }\n });\n },\n [activeEditor, selectedElementKey],\n );\n const canViewerSeeInsertDropdown = !toolbarState.isImageCaption;\n const canViewerSeeInsertCodeButton = !toolbarState.isImageCaption;\n\n return (\n <div className=\"toolbar\">\n <button\n disabled={!toolbarState.canUndo || !isEditable}\n onClick={(e) =>\n dispatchToolbarCommand(UNDO_COMMAND, undefined, isKeyboardInput(e))\n }\n title={IS_APPLE ? 'Undo (⌘Z)' : 'Undo (Ctrl+Z)'}\n type=\"button\"\n className=\"toolbar-item spaced\"\n aria-label=\"Undo\">\n <i className=\"format undo\" />\n </button>\n <button\n disabled={!toolbarState.canRedo || !isEditable}\n onClick={(e) =>\n dispatchToolbarCommand(REDO_COMMAND, undefined, isKeyboardInput(e))\n }\n title={IS_APPLE ? 'Redo (⇧⌘Z)' : 'Redo (Ctrl+Y)'}\n type=\"button\"\n className=\"toolbar-item\"\n aria-label=\"Redo\">\n <i className=\"format redo\" />\n </button>\n <Divider />\n {toolbarState.blockType in blockTypeToBlockName &&\n activeEditor === editor && (\n <>\n <BlockFormatDropDown\n disabled={!isEditable}\n blockType={toolbarState.blockType}\n rootType={toolbarState.rootType}\n editor={activeEditor}\n />\n <Divider />\n </>\n )}\n {toolbarState.blockType === 'code' && isCodeHighlighted ? (\n <>\n {!isCodeShiki && (\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_LANGUAGE_OPTIONS_PRISM.find(\n (opt) =>\n opt[0] ===\n normalizeCodeLanguagePrism(toolbarState.codeLanguage),\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select language\">\n {CODE_LANGUAGE_OPTIONS_PRISM.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeLanguage,\n )}`}\n onClick={() => onCodeLanguageSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n )}\n {isCodeShiki && (\n <>\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_LANGUAGE_OPTIONS_SHIKI.find(\n (opt) =>\n opt[0] ===\n normalizeCodeLanguageShiki(toolbarState.codeLanguage),\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select language\">\n {CODE_LANGUAGE_OPTIONS_SHIKI.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeLanguage,\n )}`}\n onClick={() => onCodeLanguageSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={\n (CODE_THEME_OPTIONS_SHIKI.find(\n (opt) => opt[0] === toolbarState.codeTheme,\n ) || ['', ''])[1]\n }\n buttonAriaLabel=\"Select theme\">\n {CODE_THEME_OPTIONS_SHIKI.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(\n value === toolbarState.codeTheme,\n )}`}\n onClick={() => onCodeThemeSelect(value)}\n key={value}>\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n </>\n )}\n </>\n ) : (\n <>\n <FontDropDown\n disabled={!isEditable}\n style={'font-family'}\n value={toolbarState.fontFamily}\n editor={activeEditor}\n />\n <Divider />\n <FontSize\n selectionFontSize={parseFontSizeForToolbar(\n toolbarState.fontSize,\n ).slice(0, -2)}\n editor={activeEditor}\n disabled={!isEditable}\n />\n <Divider />\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('bold', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isBold ? 'active' : '')\n }\n title={`Bold (${SHORTCUTS.BOLD})`}\n type=\"button\"\n aria-label={`Format text as bold. Shortcut: ${SHORTCUTS.BOLD}`}>\n <i className=\"format bold\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('italic', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isItalic ? 'active' : '')\n }\n title={`Italic (${SHORTCUTS.ITALIC})`}\n type=\"button\"\n aria-label={`Format text as italics. Shortcut: ${SHORTCUTS.ITALIC}`}>\n <i className=\"format italic\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('underline', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' +\n (toolbarState.isUnderline ? 'active' : '')\n }\n title={`Underline (${SHORTCUTS.UNDERLINE})`}\n type=\"button\"\n aria-label={`Format text to underlined. Shortcut: ${SHORTCUTS.UNDERLINE}`}>\n <i className=\"format underline\" />\n </button>\n {canViewerSeeInsertCodeButton && (\n <button\n disabled={!isEditable}\n onClick={(e) =>\n dispatchFormatTextCommand('code', isKeyboardInput(e))\n }\n className={\n 'toolbar-item spaced ' + (toolbarState.isCode ? 'active' : '')\n }\n title={`Insert code block (${SHORTCUTS.INSERT_CODE_BLOCK})`}\n type=\"button\"\n aria-label=\"Insert code block\">\n <i className=\"format code\" />\n </button>\n )}\n <button\n disabled={!isEditable}\n onClick={insertLink}\n className={\n 'toolbar-item spaced ' + (toolbarState.isLink ? 'active' : '')\n }\n aria-label=\"Insert link\"\n title={`Insert link (${SHORTCUTS.INSERT_LINK})`}\n type=\"button\">\n <i className=\"format link\" />\n </button>\n <DropdownColorPicker\n disabled={!isEditable}\n buttonClassName=\"toolbar-item color-picker\"\n buttonAriaLabel=\"Formatting text color\"\n buttonIconClassName=\"icon font-color\"\n color={toolbarState.fontColor}\n onChange={onFontColorSelect}\n title=\"text color\"\n />\n <DropdownColorPicker\n disabled={!isEditable}\n buttonClassName=\"toolbar-item color-picker\"\n buttonAriaLabel=\"Formatting background color\"\n buttonIconClassName=\"icon bg-color\"\n color={toolbarState.bgColor}\n onChange={onBgColorSelect}\n title=\"bg color\"\n />\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item spaced\"\n buttonLabel=\"\"\n buttonAriaLabel=\"Formatting options for additional text styles\"\n buttonIconClassName=\"icon dropdown-more\">\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('lowercase', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isLowercase)\n }\n title=\"Lowercase\"\n aria-label=\"Format text to lowercase\">\n <div className=\"icon-text-container\">\n <i className=\"icon lowercase\" />\n <span className=\"text\">Lowercase</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.LOWERCASE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('uppercase', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isUppercase)\n }\n title=\"Uppercase\"\n aria-label=\"Format text to uppercase\">\n <div className=\"icon-text-container\">\n <i className=\"icon uppercase\" />\n <span className=\"text\">Uppercase</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.UPPERCASE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('capitalize', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isCapitalize)\n }\n title=\"Capitalize\"\n aria-label=\"Format text to capitalize\">\n <div className=\"icon-text-container\">\n <i className=\"icon capitalize\" />\n <span className=\"text\">Capitalize</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CAPITALIZE}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('strikethrough', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isStrikethrough)\n }\n title=\"Strikethrough\"\n aria-label=\"Format text with a strikethrough\">\n <div className=\"icon-text-container\">\n <i className=\"icon strikethrough\" />\n <span className=\"text\">Strikethrough</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.STRIKETHROUGH}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('subscript', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isSubscript)\n }\n title=\"Subscript\"\n aria-label=\"Format text with a subscript\">\n <div className=\"icon-text-container\">\n <i className=\"icon subscript\" />\n <span className=\"text\">Subscript</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.SUBSCRIPT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('superscript', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isSuperscript)\n }\n title=\"Superscript\"\n aria-label=\"Format text with a superscript\">\n <div className=\"icon-text-container\">\n <i className=\"icon superscript\" />\n <span className=\"text\">Superscript</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.SUPERSCRIPT}</span>\n </DropDownItem>\n <DropDownItem\n onClick={(e) =>\n dispatchFormatTextCommand('highlight', isKeyboardInput(e))\n }\n className={\n 'item wide ' + dropDownActiveClass(toolbarState.isHighlight)\n }\n title=\"Highlight\"\n aria-label=\"Format text with a highlight\">\n <div className=\"icon-text-container\">\n <i className=\"icon highlight\" />\n <span className=\"text\">Highlight</span>\n </div>\n </DropDownItem>\n <DropDownItem\n onClick={(e) => clearFormatting(activeEditor, isKeyboardInput(e))}\n className=\"item wide\"\n title=\"Clear text formatting\"\n aria-label=\"Clear all text formatting\">\n <div className=\"icon-text-container\">\n <i className=\"icon clear\" />\n <span className=\"text\">Clear Formatting</span>\n </div>\n <span className=\"shortcut\">{SHORTCUTS.CLEAR_FORMATTING}</span>\n </DropDownItem>\n </DropDown>\n {canViewerSeeInsertDropdown && (\n <>\n <Divider />\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item spaced\"\n buttonLabel=\"Insert\"\n buttonAriaLabel=\"Insert specialized editor node\"\n buttonIconClassName=\"icon plus\">\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_HORIZONTAL_RULE_COMMAND)\n }\n className=\"item\">\n <i className=\"icon horizontal-rule\" />\n <span className=\"text\">Horizontal Rule</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => dispatchToolbarCommand(INSERT_PAGE_BREAK)}\n className=\"item\">\n <i className=\"icon page-break\" />\n <span className=\"text\">Page Break</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Image', (onClose) => (\n <InsertImageDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon image\" />\n <span className=\"text\">Image</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert GIF', (onClose) => (\n <InsertImageDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon gif\" />\n <span className=\"text\">GIF</span>\n </DropDownItem>\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_EXCALIDRAW_COMMAND)\n }\n className=\"item\">\n <i className=\"icon diagram-2\" />\n <span className=\"text\">Excalidraw</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Table', (onClose) => (\n <InsertTableDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon table\" />\n <span className=\"text\">Table</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Poll', (onClose) => (\n <InsertPollDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon poll\" />\n <span className=\"text\">Poll</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Columns Layout', (onClose) => (\n <InsertLayoutDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon columns\" />\n <span className=\"text\">Columns Layout</span>\n </DropDownItem>\n\n <DropDownItem\n onClick={() => {\n showModal('Insert Equation', (onClose) => (\n <InsertEquationDialog\n activeEditor={activeEditor}\n onClose={onClose}\n />\n ));\n }}\n className=\"item\">\n <i className=\"icon equation\" />\n <span className=\"text\">Equation</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n editor.update(() => {\n $addUpdateTag(SKIP_SELECTION_FOCUS_TAG);\n const root = $getRoot();\n const stickyNode = $createStickyNode(0, 0);\n root.append(stickyNode);\n });\n }}\n className=\"item\">\n <i className=\"icon sticky\" />\n <span className=\"text\">Sticky Note</span>\n </DropDownItem>\n <DropDownItem\n onClick={() =>\n dispatchToolbarCommand(INSERT_COLLAPSIBLE_COMMAND)\n }\n className=\"item\">\n <i className=\"icon caret-right\" />\n <span className=\"text\">Collapsible container</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n const dateTime = new Date();\n dateTime.setHours(0, 0, 0, 0);\n dispatchToolbarCommand(INSERT_DATETIME_COMMAND, {dateTime});\n }}\n className=\"item\">\n <i className=\"icon calendar\" />\n <span className=\"text\">Date</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Terminology', (onClose) => (\n <InsertTerminologyDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon quote\" />\n <span className=\"text\">Terminology</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Notes', (onClose) => (\n <InsertNotesDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon paragraph\" />\n <span className=\"text\">Notes</span>\n </DropDownItem>\n <DropDownItem\n onClick={() => {\n showModal('Insert Revision Points', (onClose) => (\n <InsertRevisionDialog activeEditor={activeEditor} onClose={onClose} />\n ));\n }}\n className=\"item\">\n <i className=\"icon check-list\" />\n <span className=\"text\">Revision Points</span>\n </DropDownItem>\n {EmbedConfigs.map((embedConfig) => (\n <DropDownItem\n key={embedConfig.type}\n onClick={() =>\n dispatchToolbarCommand(\n INSERT_EMBED_COMMAND,\n embedConfig.type,\n )\n }\n className=\"item\">\n {embedConfig.icon}\n <span className=\"text\">{embedConfig.contentName}</span>\n </DropDownItem>\n ))}\n </DropDown>\n </>\n )}\n </>\n )}\n <Divider />\n <ElementFormatDropdown\n disabled={!isEditable}\n value={toolbarState.elementFormat}\n editor={activeEditor}\n isRTL={toolbarState.isRTL}\n />\n\n {modal}\n </div>\n );\n}\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport * as React from 'react';\r\n\r\nimport ColorPicker from './ColorPicker';\r\nimport DropDown from './DropDown';\r\n\r\ntype Props = {\r\n disabled?: boolean;\r\n buttonAriaLabel?: string;\r\n buttonClassName: string;\r\n buttonIconClassName?: string;\r\n buttonLabel?: string;\r\n title?: string;\r\n stopCloseOnClickSelf?: boolean;\r\n color: string;\r\n onChange?: (\r\n color: string,\r\n skipHistoryStack: boolean,\r\n skipRefocus: boolean,\r\n ) => void;\r\n};\r\n\r\nexport default function DropdownColorPicker({\r\n disabled = false,\r\n stopCloseOnClickSelf = true,\r\n color,\r\n onChange,\r\n ...rest\r\n}: Props) {\r\n return (\r\n <DropDown\r\n {...rest}\r\n disabled={disabled}\r\n stopCloseOnClickSelf={stopCloseOnClickSelf}>\r\n <ColorPicker color={color} onChange={onChange} />\r\n </DropDown>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './fontSize.css';\r\n\r\nimport {LexicalEditor} from 'lexical';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n MAX_ALLOWED_FONT_SIZE,\r\n MIN_ALLOWED_FONT_SIZE,\r\n} from '../../context/ToolbarContext';\r\nimport {isKeyboardInput} from '../../utils/focusUtils';\r\nimport {SHORTCUTS} from '../ShortcutsPlugin/shortcuts';\r\nimport {\r\n updateFontSize,\r\n updateFontSizeInSelection,\r\n UpdateFontSizeType,\r\n} from './utils';\r\n\r\nfunction parseFontSize(input: string): [number, string] | null {\r\n const match = input.match(/^(\\d+(?:\\.\\d+)?)(px|pt)$/);\r\n return match ? [Number(match[1]), match[2]] : null;\r\n}\r\n\r\nfunction normalizeToPx(fontSize: number, unit: string): number {\r\n return unit === 'pt' ? Math.round((fontSize * 4) / 3) : fontSize;\r\n}\r\n\r\nfunction isValidFontSize(fontSizePx: number): boolean {\r\n return (\r\n fontSizePx >= MIN_ALLOWED_FONT_SIZE && fontSizePx <= MAX_ALLOWED_FONT_SIZE\r\n );\r\n}\r\n\r\nexport function parseFontSizeForToolbar(input: string): string {\r\n const parsed = parseFontSize(input);\r\n if (!parsed) {\r\n return '';\r\n }\r\n\r\n const [fontSize, unit] = parsed;\r\n const fontSizePx = normalizeToPx(fontSize, unit);\r\n return `${fontSizePx}px`;\r\n}\r\n\r\nexport function parseAllowedFontSize(input: string): string {\r\n const parsed = parseFontSize(input);\r\n if (!parsed) {\r\n return '';\r\n }\r\n\r\n const [fontSize, unit] = parsed;\r\n const fontSizePx = normalizeToPx(fontSize, unit);\r\n return isValidFontSize(fontSizePx) ? input : '';\r\n}\r\n\r\nexport default function FontSize({\r\n selectionFontSize,\r\n disabled,\r\n editor,\r\n}: {\r\n selectionFontSize: string;\r\n disabled: boolean;\r\n editor: LexicalEditor;\r\n}) {\r\n const [inputValue, setInputValue] = React.useState<string>(selectionFontSize);\r\n const [inputChangeFlag, setInputChangeFlag] = React.useState<boolean>(false);\r\n const [isMouseMode, setIsMouseMode] = React.useState(false);\r\n\r\n const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n const inputValueNumber = Number(inputValue);\r\n\r\n if (e.key === 'Tab') {\r\n return;\r\n }\r\n if (['e', 'E', '+', '-'].includes(e.key) || isNaN(inputValueNumber)) {\r\n e.preventDefault();\r\n setInputValue('');\r\n return;\r\n }\r\n setInputChangeFlag(true);\r\n if (e.key === 'Enter' || e.key === 'Escape') {\r\n e.preventDefault();\r\n\r\n updateFontSizeByInputValue(inputValueNumber, !isMouseMode);\r\n }\r\n };\r\n\r\n const handleInputBlur = () => {\r\n setIsMouseMode(false);\r\n\r\n if (inputValue !== '' && inputChangeFlag) {\r\n const inputValueNumber = Number(inputValue);\r\n updateFontSizeByInputValue(inputValueNumber);\r\n }\r\n };\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n setIsMouseMode(true);\r\n };\r\n\r\n const updateFontSizeByInputValue = (\r\n inputValueNumber: number,\r\n skipRefocus: boolean = false,\r\n ) => {\r\n let updatedFontSize = inputValueNumber;\r\n if (inputValueNumber > MAX_ALLOWED_FONT_SIZE) {\r\n updatedFontSize = MAX_ALLOWED_FONT_SIZE;\r\n } else if (inputValueNumber < MIN_ALLOWED_FONT_SIZE) {\r\n updatedFontSize = MIN_ALLOWED_FONT_SIZE;\r\n }\r\n\r\n setInputValue(String(updatedFontSize));\r\n updateFontSizeInSelection(\r\n editor,\r\n String(updatedFontSize) + 'px',\r\n null,\r\n skipRefocus,\r\n );\r\n setInputChangeFlag(false);\r\n };\r\n\r\n React.useEffect(() => {\r\n setInputValue(selectionFontSize);\r\n }, [selectionFontSize]);\r\n\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n disabled={\r\n disabled ||\r\n (selectionFontSize !== '' &&\r\n Number(inputValue) <= MIN_ALLOWED_FONT_SIZE)\r\n }\r\n onClick={(e) => {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.decrement,\r\n inputValue,\r\n isKeyboardInput(e),\r\n );\r\n }}\r\n className=\"toolbar-item font-decrement\"\r\n aria-label=\"Decrease font size\"\r\n title={`Decrease font size (${SHORTCUTS.DECREASE_FONT_SIZE})`}>\r\n <i className=\"format minus-icon\" />\r\n </button>\r\n\r\n <input\r\n type=\"number\"\r\n title=\"Font size\"\r\n value={inputValue}\r\n disabled={disabled}\r\n className=\"toolbar-item font-size-input\"\r\n min={MIN_ALLOWED_FONT_SIZE}\r\n max={MAX_ALLOWED_FONT_SIZE}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyPress}\r\n onBlur={handleInputBlur}\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n disabled={\r\n disabled ||\r\n (selectionFontSize !== '' &&\r\n Number(inputValue) >= MAX_ALLOWED_FONT_SIZE)\r\n }\r\n onClick={(e) => {\r\n updateFontSize(\r\n editor,\r\n UpdateFontSizeType.increment,\r\n inputValue,\r\n isKeyboardInput(e),\r\n );\r\n }}\r\n className=\"toolbar-item font-increment\"\r\n aria-label=\"Increase font size\"\r\n title={`Increase font size (${SHORTCUTS.INCREASE_FONT_SIZE})`}>\r\n <i className=\"format add-icon\" />\r\n </button>\r\n </>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {JSX} from 'react';\r\n\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useEffect} from 'react';\r\n\r\nimport {StickyNode} from '../../nodes/StickyNode';\r\n\r\nexport default function StickyPlugin(): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n if (!editor.hasNodes([StickyNode])) {\r\n throw new Error('StickyPlugin: StickyNode not registered on editor');\r\n }\r\n }, [editor]);\r\n return null;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {Klass, LexicalNode} from 'lexical';\r\n\r\nimport {CodeHighlightNode, CodeNode} from '@lexical/code';\r\nimport {HashtagNode} from '@lexical/hashtag';\r\nimport {AutoLinkNode, LinkNode} from '@lexical/link';\r\nimport {ListItemNode, ListNode} from '@lexical/list';\r\nimport {MarkNode} from '@lexical/mark';\r\nimport {OverflowNode} from '@lexical/overflow';\r\nimport {HorizontalRuleNode} from '@lexical/react/LexicalHorizontalRuleNode';\r\nimport {HeadingNode, QuoteNode} from '@lexical/rich-text';\r\nimport {TableCellNode, TableNode, TableRowNode} from '@lexical/table';\r\n\r\nimport {CollapsibleContainerNode} from '../plugins/CollapsiblePlugin/CollapsibleContainerNode';\r\nimport {CollapsibleContentNode} from '../plugins/CollapsiblePlugin/CollapsibleContentNode';\r\nimport {CollapsibleTitleNode} from '../plugins/CollapsiblePlugin/CollapsibleTitleNode';\r\nimport {AutocompleteNode} from './AutocompleteNode';\r\nimport {DateTimeNode} from './DateTimeNode/DateTimeNode';\r\nimport {EmojiNode} from './EmojiNode';\r\nimport {EquationNode} from './EquationNode';\r\nimport {ExcalidrawNode} from './ExcalidrawNode';\r\nimport {FigmaNode} from './FigmaNode';\r\nimport {HtmlBlockNode} from './HtmlBlockNode';\r\nimport {NotesNode} from './NotesNode';\r\nimport {RevisionNode} from './RevisionNode';\r\nimport {TerminologyNode} from './TerminologyNode';\r\nimport {ImageNode} from './ImageNode';\r\nimport {KeywordNode} from './KeywordNode';\r\nimport {LayoutContainerNode} from './LayoutContainerNode';\r\nimport {LayoutItemNode} from './LayoutItemNode';\r\nimport {MentionNode} from './MentionNode';\r\nimport {PageBreakNode} from './PageBreakNode';\r\nimport {PollNode} from './PollNode';\r\nimport {SpecialTextNode} from './SpecialTextNode';\r\nimport {StickyNode} from './StickyNode';\r\nimport {TweetNode} from './TweetNode';\r\nimport {YouTubeNode} from './YouTubeNode';\r\n\r\nconst PlaygroundNodes: Array<Klass<LexicalNode>> = [\r\n HeadingNode,\r\n ListNode,\r\n ListItemNode,\r\n QuoteNode,\r\n CodeNode,\r\n TableNode,\r\n TableCellNode,\r\n TableRowNode,\r\n HashtagNode,\r\n CodeHighlightNode,\r\n AutoLinkNode,\r\n LinkNode,\r\n OverflowNode,\r\n PollNode,\r\n StickyNode,\r\n ImageNode,\r\n MentionNode,\r\n EmojiNode,\r\n ExcalidrawNode,\r\n EquationNode,\r\n AutocompleteNode,\r\n KeywordNode,\r\n HorizontalRuleNode,\r\n TweetNode,\r\n YouTubeNode,\r\n FigmaNode,\r\n MarkNode,\r\n CollapsibleContainerNode,\r\n CollapsibleContentNode,\r\n CollapsibleTitleNode,\r\n PageBreakNode,\r\n LayoutContainerNode,\r\n LayoutItemNode,\r\n SpecialTextNode,\r\n DateTimeNode,\r\n HtmlBlockNode,\r\n TerminologyNode,\r\n NotesNode,\r\n RevisionNode,\r\n];\r\n\r\nexport default PlaygroundNodes;\r\n","import type {\n EditorConfig,\n ElementFormatType,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n} from 'lexical';\nimport {$getNodeByKey} from 'lexical';\nimport type {JSX} from 'react';\n\nimport {BlockWithAlignableContents} from '@lexical/react/LexicalBlockWithAlignableContents';\nimport {\n DecoratorBlockNode,\n SerializedDecoratorBlockNode,\n} from '@lexical/react/LexicalDecoratorBlockNode';\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\nimport {useLexicalEditable} from '@lexical/react/useLexicalEditable';\nimport * as React from 'react';\nimport {useCallback, useRef, useState} from 'react';\n\ntype HtmlBlockComponentProps = Readonly<{\n className: Readonly<{\n base: string;\n focus: string;\n }>;\n format: ElementFormatType | null;\n nodeKey: NodeKey;\n html: string;\n}>;\n\nfunction HtmlBlockComponent({\n className,\n format,\n nodeKey,\n html,\n}: HtmlBlockComponentProps) {\n const [editor] = useLexicalComposerContext();\n const isEditable = useLexicalEditable();\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const openEditor = useCallback(() => {\n setEditValue(html);\n setIsEditing(true);\n // Focus textarea after render\n setTimeout(() => textareaRef.current?.focus(), 50);\n }, [html]);\n\n const saveHtml = useCallback(() => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isHtmlBlockNode(node)) {\n node.setHtml(editValue);\n }\n });\n setIsEditing(false);\n }, [editor, nodeKey, editValue]);\n\n const cancelEdit = useCallback(() => {\n setIsEditing(false);\n }, []);\n\n return (\n <BlockWithAlignableContents\n className={className}\n format={format}\n nodeKey={nodeKey}>\n <div style={{position: 'relative'}}>\n {isEditable && !isEditing && (\n <button\n type=\"button\"\n onClick={openEditor}\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n zIndex: 10,\n background: 'rgba(0,0,0,0.6)',\n color: '#fff',\n border: 'none',\n borderRadius: 4,\n padding: '2px 8px',\n fontSize: 12,\n cursor: 'pointer',\n opacity: 0,\n transition: 'opacity 0.15s',\n }}\n className=\"html-block-edit-btn\"\n >\n Edit HTML\n </button>\n )}\n {isEditing ? (\n <div style={{border: '1px solid #ccc', borderRadius: 4, padding: 8, background: '#f9f9f9'}}>\n <div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 6}}>\n <span style={{fontSize: 12, fontWeight: 600, color: '#333'}}>Edit HTML Source</span>\n <div style={{display: 'flex', gap: 4}}>\n <button\n type=\"button\"\n onClick={cancelEdit}\n style={{\n padding: '2px 10px',\n fontSize: 12,\n border: '1px solid #ccc',\n borderRadius: 4,\n background: '#fff',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={saveHtml}\n style={{\n padding: '2px 10px',\n fontSize: 12,\n border: 'none',\n borderRadius: 4,\n background: '#2563eb',\n color: '#fff',\n cursor: 'pointer',\n }}\n >\n Save\n </button>\n </div>\n </div>\n <textarea\n ref={textareaRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n style={{\n width: '100%',\n minHeight: 150,\n fontFamily: 'monospace',\n fontSize: 12,\n padding: 8,\n border: '1px solid #ddd',\n borderRadius: 4,\n resize: 'vertical',\n }}\n />\n <div\n style={{marginTop: 8, padding: 8, border: '1px solid #e5e7eb', borderRadius: 4, background: '#fff'}}\n >\n <span style={{fontSize: 11, color: '#888', display: 'block', marginBottom: 4}}>Preview:</span>\n <div dangerouslySetInnerHTML={{__html: editValue}} />\n </div>\n </div>\n ) : (\n <div dangerouslySetInnerHTML={{__html: html}} />\n )}\n </div>\n </BlockWithAlignableContents>\n );\n}\n\nexport type SerializedHtmlBlockNode = Spread<\n {\n html: string;\n },\n SerializedDecoratorBlockNode\n>;\n\nconst DATA_ATTR = 'data-lexical-html-block';\n\nexport class HtmlBlockNode extends DecoratorBlockNode {\n __html: string;\n\n static getType(): string {\n return 'html-block';\n }\n\n static clone(node: HtmlBlockNode): HtmlBlockNode {\n return new HtmlBlockNode(node.__html, node.__format, node.__key);\n }\n\n static importJSON(serializedNode: SerializedHtmlBlockNode): HtmlBlockNode {\n return $createHtmlBlockNode(serializedNode.html).updateFromJSON(\n serializedNode,\n );\n }\n\n exportJSON(): SerializedHtmlBlockNode {\n return {\n ...super.exportJSON(),\n html: this.__html,\n };\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n div: (domNode: HTMLElement) => {\n if (!domNode.hasAttribute(DATA_ATTR)) {\n return null;\n }\n return {\n conversion: convertHtmlBlockElement,\n priority: 2,\n };\n },\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('div');\n element.setAttribute(DATA_ATTR, 'true');\n element.innerHTML = this.__html;\n return {element};\n }\n\n constructor(html: string, format?: ElementFormatType, key?: NodeKey) {\n super(format, key);\n this.__html = html;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getHtml(): string {\n return this.__html;\n }\n\n setHtml(html: string): void {\n const writable = this.getWritable();\n writable.__html = html;\n }\n\n getTextContent(): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.__html, 'text/html');\n return doc.body.textContent || '';\n }\n\n decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n const embedBlockTheme = config.theme.embedBlock || {};\n const className = {\n base: embedBlockTheme.base || '',\n focus: embedBlockTheme.focus || '',\n };\n return (\n <HtmlBlockComponent\n className={className}\n format={this.__format}\n nodeKey={this.getKey()}\n html={this.__html}\n />\n );\n }\n}\n\nfunction convertHtmlBlockElement(\n domNode: HTMLElement,\n): DOMConversionOutput | null {\n const html = domNode.innerHTML;\n if (html) {\n return {node: $createHtmlBlockNode(html)};\n }\n return null;\n}\n\nexport function $createHtmlBlockNode(html: string): HtmlBlockNode {\n return new HtmlBlockNode(html);\n}\n\nexport function $isHtmlBlockNode(\n node: LexicalNode | null | undefined,\n): node is HtmlBlockNode {\n return node instanceof HtmlBlockNode;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAAA,EACE,eAAAA;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,6BAAAC,mCAAiC;AAC1C,SAAS,wBAAwB,6BAA6B;AAC9D,SAAS,wBAAAC,wBAAsB,YAAAC,WAAU,gBAAAC,eAAc,iBAAAC,gBAAe,wBAAAC,wBAAmC,iBAAAC,sBAAqB;;;ACF9H,SAAQ,4BAA2B;AACnC,SAAQ,uBAAsB;AAC9B,SAAQ,qBAAAC,0BAAwB;AAChC,SAAQ,2BAA0B;AAClC,SAAQ,6BAAAC,mCAAgC;AACxC,SAAQ,wBAAAC,6BAA2B;AACnC,SAAQ,qBAAoB;AAC5B,SAAQ,iBAAAC,sBAAoB;AAC5B,SAAQ,4BAA2B;AACnC,SAAQ,kBAAiB;AACzB,SAAQ,mBAAAC,wBAAsB;AAC9B,SAAQ,sBAAqB;AAC7B,SAAQ,gCAA+B;AACvC,SAAQ,4BAA2B;AACnC,SAAQ,mBAAkB;AAC1B,SAAQ,sBAAAC,2BAAyB;AACjC,SAAQ,mBAAkB;AAC1B,SAAQ,aAAAC,aAAW,YAAAC,kBAAe;;;AChBlC,SAAQ,iBAAiB,mBAAkB;AAC3C;AAAA,EACE,8BAAAC;AAAA,EACA,4BAAAC;AAAA,OACK;AACP,SAAQ,6BAAAC,kCAAgC;AACxC,SAAQ,qBAAoB;AAC5B;AAAA,EACE,mBAAAC;AAAA,EACA;AAAA,EACA,oBAAAC;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAQ,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAe;;;ACjB/C,SAAQ,aAAa,SAAS,gBAAe;AAyBvC;AApBS,SAAR,WAGL;AACA,QAAM,CAAC,cAAc,eAAe,IAAI,SAIrC,IAAI;AAEP,QAAM,UAAU,YAAY,MAAM;AAChC,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,QAAQ,MAAM;AAC1B,QAAI,iBAAiB,MAAM;AACzB,aAAO;AAAA,IACT;AACA,UAAM,EAAC,OAAO,SAAS,oBAAmB,IAAI;AAC9C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACC;AAAA;AAAA,IACH;AAAA,EAEJ,GAAG,CAAC,cAAc,OAAO,CAAC;AAE1B,QAAM,YAAY;AAAA,IAChB,CACE,OAEA,YACA,sBAAsB,UACnB;AACH,sBAAgB;AAAA,QACd;AAAA,QACA,SAAS,WAAW,OAAO;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SAAO,CAAC,OAAO,SAAS;AAC1B;;;AC7DA,SAAS,eAAe,kBAAkB;AAOnC,IAAM,oBAAoB,cAAqC;AAAA,EACpE,cAAc;AAAA,EACd,kBAAkB,MAAM;AAAA,EAAC;AAC3B,CAAC;AAEM,SAAS,gBAAgB;AAC9B,SAAO,WAAW,iBAAiB;AACrC;;;ACNA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACrBP,SAAQ,kCAAiC;AACzC;AAAA,EACE;AAAA,OAEK;AAEP,SAAQ,eAAAC,cAAa,WAAW,QAAQ,YAAAC,iBAAe;AAsFnD,SAKE,OAAAC,MALF;AApFJ,IAAM,oBAAoB;AAe1B,SAAS,qBACP,SAC4B;AAC5B,QAAM,KAAK,QAAQ,aAAa,uBAAuB;AACvD,MAAI,IAAI;AACN,UAAM,OAAO,iBAAiB,EAAE;AAChC,WAAO,EAAC,KAAI;AAAA,EACd;AACA,SAAO;AACT;AAEA,IAAI,yBAAyB;AAE7B,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,eAAe,OAA8B,IAAI;AAEvD,QAAM,qBAAqB,OAAe,EAAE;AAC5C,QAAM,CAAC,gBAAgB,iBAAiB,IAAID,UAAS,KAAK;AAE1D,QAAM,cAAcD,aAAY,YAAY;AAC1C,QAAI;AAEF,YAAM,OAAO,MAAM,QAAQ,YAAY,SAAS,aAAa,OAAO;AAEpE,wBAAkB,KAAK;AACvB,+BAAyB;AAEzB,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,UAAI,SAAS;AACX,gBAAQ,OAAO,KAAK,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,OAAO,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,YAAY,mBAAmB,SAAS;AAC1C,wBAAkB,IAAI;AAEtB,UAAI,wBAAwB;AAC1B,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,MAAM;AACb,eAAO,QAAQ;AACf,iBAAS,MAAM,YAAY,MAAM;AACjC,eAAO,SAAS;AAChB,YAAI,SAAS;AACX,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF,OAAO;AACL,oBAAY;AAAA,MACd;AAEA,UAAI,oBAAoB;AACtB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,SAAS,OAAO,CAAC;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACC;AAAA,yBAAiB,mBAAmB;AAAA,QACrC,gBAAAE;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAC,SAAS,gBAAgB,OAAO,QAAO;AAAA,YAC/C,KAAK;AAAA;AAAA,QACP;AAAA;AAAA;AAAA,EACF;AAEJ;AASO,IAAM,YAAN,MAAM,mBAAkB,mBAAmB;AAAA,EAChD;AAAA,EAEA,OAAO,UAAkB;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,MAA4B;AACvC,WAAO,IAAI,WAAU,KAAK,MAAM,KAAK,UAAU,KAAK,KAAK;AAAA,EAC3D;AAAA,EAEA,OAAO,WAAW,gBAAgD;AAChE,WAAO,iBAAiB,eAAe,EAAE,EAAE,eAAe,cAAc;AAAA,EAC1E;AAAA,EAEA,aAAkC;AAChC,WAAO;AAAA,MACL,GAAG,MAAM,WAAW;AAAA,MACpB,IAAI,KAAK,MAAM;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,OAAO,YAAqD;AAC1D,WAAO;AAAA,MACL,KAAK,CAAC,YAA4B;AAChC,YAAI,CAAC,QAAQ,aAAa,uBAAuB,GAAG;AAClD,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAA6B;AAC3B,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,aAAa,yBAAyB,KAAK,IAAI;AACvD,UAAM,OAAO,SAAS,eAAe,KAAK,eAAe,CAAC;AAC1D,YAAQ,OAAO,IAAI;AACnB,WAAO,EAAC,QAAO;AAAA,EACjB;AAAA,EAEA,YAAY,IAAY,QAA4B,KAAe;AACjE,UAAM,QAAQ,GAAG;AACjB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eACE,eACA,uBACQ;AACR,WAAO,8BAA8B,KAAK,IAAI;AAAA,EAChD;AAAA,EAEA,SAAS,QAAuB,QAAmC;AACjE,UAAM,kBAAkB,OAAO,MAAM,cAAc,CAAC;AACpD,UAAM,YAAY;AAAA,MAChB,MAAM,gBAAgB,QAAQ;AAAA,MAC9B,OAAO,gBAAgB,SAAS;AAAA,IAClC;AACA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,kBAAiB;AAAA,QACjB,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK;AAAA;AAAA,IAChB;AAAA,EAEJ;AACF;AAEO,SAAS,iBAAiB,SAA4B;AAC3D,SAAO,IAAI,UAAU,OAAO;AAC9B;AAEO,SAAS,aACd,MACmB;AACnB,SAAO,gBAAgB;AACzB;;;ADtKO,IAAM,KAAyB;AAAA,EACpC,cAAc,CAAC,kBAAkB;AAAA,EACjC,QAAQ,CAAC,SAAsB;AAC7B,WAAO,sBAAsB,IAAI,IAAI,QAAQ;AAAA,EAC/C;AAAA,EACA,QAAQ;AAAA,EACR,SAAS,CAAC,YAAY,IAAI,IAAI,aAAa;AACzC,UAAM,OAAO,0BAA0B;AAGvC,QAAI,YAAY,WAAW,eAAe,KAAK,MAAM;AACnD,iBAAW,QAAQ,IAAI;AAAA,IACzB,OAAO;AACL,iBAAW,aAAa,IAAI;AAAA,IAC9B;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EACA,MAAM;AACR;AAEO,IAAM,QAA8B;AAAA,EACzC,cAAc,CAAC,SAAS;AAAA,EACxB,QAAQ,CAAC,SAAS;AAChB,QAAI,CAAC,aAAa,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,KAAK,WAAW,CAAC,KAAK,KAAK,OAAO,CAAC;AAAA,EACjD;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS,CAAC,UAAU,UAAU;AAC5B,UAAM,CAAC,EAAE,SAAS,GAAG,IAAI;AACzB,UAAM,YAAY,iBAAiB;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD,aAAS,QAAQ,SAAS;AAAA,EAC5B;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AACR;AAEO,IAAM,QAA8B;AAAA,EACzC,cAAc,CAAC;AAAA,EACf,QAAQ,MAAM;AAAA,EACd,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,MAAM;AAC/B,UAAM,QAAQ,mBAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,SAAS,IAAI,CAAC,GAAG;AAC/D,QAAI,OAAO;AACT,eAAS,QAAQ,gBAAgB,KAAK,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AACR;AAEO,IAAM,WAAiC;AAAA,EAC5C,cAAc,CAAC,YAAY;AAAA,EAC3B,QAAQ,CAAC,SAAS;AAChB,QAAI,CAAC,gBAAgB,IAAI,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO,IAAI,KAAK,YAAY,CAAC;AAAA,EAC/B;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS,CAAC,UAAU,UAAU;AAC5B,UAAM,CAAC,EAAE,QAAQ,IAAI;AACrB,UAAM,eAAe,oBAAoB,UAAU,IAAI;AACvD,aAAS,QAAQ,YAAY;AAAA,EAC/B;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AACR;AAEO,IAAM,QAA4B;AAAA,EACvC,cAAc,CAAC,SAAS;AAAA,EACxB,QAAQ,CAAC,SAAS;AAChB,QAAI,CAAC,aAAa,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,cAAc,KAAK,MAAM,CAAC;AAAA,EACnC;AAAA,EACA,QAAQ;AAAA,EACR,SAAS,CAAC,UAAU,IAAI,UAAU;AAChC,UAAM,CAAC,EAAE,EAAE,IAAI;AACf,UAAM,YAAY,iBAAiB,EAAE;AACrC,aAAS,QAAQ,SAAS;AAAA,EAC5B;AAAA,EACA,MAAM;AACR;AAGA,IAAM,oBAAoB;AAC1B,IAAM,4BAA4B;AAE3B,IAAM,QAA4B;AAAA,EACvC,cAAc,CAAC,WAAW,cAAc,aAAa;AAAA,EACrD,QAAQ,CAAC,SAAsB;AAC7B,QAAI,CAAC,aAAa,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,SAAmB,CAAC;AAE1B,eAAW,OAAO,KAAK,YAAY,GAAG;AACpC,YAAM,YAAY,CAAC;AACnB,UAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB;AAAA,MACF;AAEA,UAAI,cAAc;AAClB,iBAAW,QAAQ,IAAI,YAAY,GAAG;AAEpC,YAAI,iBAAiB,IAAI,GAAG;AAC1B,oBAAU;AAAA,YACR,yBAAyB,yBAAyB,IAAI,EACnD,QAAQ,OAAO,KAAK,EACpB,KAAK;AAAA,UACV;AACA,cAAI,KAAK,kBAAkB,sBAAsB,KAAK;AACpD,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAEA,aAAO,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI;AAC1C,UAAI,aAAa;AACf,eAAO,KAAK,KAAK,UAAU,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,IAAI;AAAA,EACzB;AAAA,EACA,QAAQ;AAAA,EACR,SAAS,CAAC,YAAY,IAAI,UAAU;AAElC,QAAI,0BAA0B,KAAK,MAAM,CAAC,CAAC,GAAG;AAC5C,YAAMC,SAAQ,WAAW,mBAAmB;AAC5C,UAAI,CAACA,UAAS,CAAC,aAAaA,MAAK,GAAG;AAClC;AAAA,MACF;AAEA,YAAMC,QAAOD,OAAM,YAAY;AAC/B,YAAM,UAAUC,MAAKA,MAAK,SAAS,CAAC;AACpC,UAAI,CAAC,WAAW,CAAC,gBAAgB,OAAO,GAAG;AACzC;AAAA,MACF;AAGA,cAAQ,YAAY,EAAE,QAAQ,CAAC,SAAS;AACtC,YAAI,CAAC,iBAAiB,IAAI,GAAG;AAC3B;AAAA,QACF;AACA,aAAK;AAAA,UACH,sBAAsB;AAAA,UACtB,sBAAsB;AAAA,QACxB;AAAA,MACF,CAAC;AAGD,iBAAW,OAAO;AAClB;AAAA,IACF;AAEA,UAAM,aAAa,gBAAgB,MAAM,CAAC,CAAC;AAE3C,QAAI,cAAc,MAAM;AACtB;AAAA,IACF;AAEA,UAAM,OAAO,CAAC,UAAU;AACxB,QAAI,UAAU,WAAW,mBAAmB;AAC5C,QAAI,WAAW,WAAW;AAE1B,WAAO,SAAS;AACd,UAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B;AAAA,MACF;AAEA,UAAI,QAAQ,gBAAgB,MAAM,GAAG;AACnC;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,cAAc;AAEzC,UAAI,CAAC,YAAY,UAAU,GAAG;AAC5B;AAAA,MACF;AAEA,YAAM,QAAQ,gBAAgB,WAAW,eAAe,CAAC;AAEzD,UAAI,SAAS,MAAM;AACjB;AAAA,MACF;AAEA,iBAAW,KAAK,IAAI,UAAU,MAAM,MAAM;AAC1C,WAAK,QAAQ,KAAK;AAClB,YAAMC,mBAAkB,QAAQ,mBAAmB;AACnD,cAAQ,OAAO;AACf,gBAAUA;AAAA,IACZ;AAEA,UAAM,QAAQ,iBAAiB;AAE/B,eAAW,SAAS,MAAM;AACxB,YAAM,WAAW,oBAAoB;AACrC,YAAM,OAAO,QAAQ;AAErB,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,iBAAS,OAAO,IAAI,MAAM,SAAS,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,kBAAkB,WAAW,mBAAmB;AACtD,QACE,aAAa,eAAe,KAC5B,oBAAoB,eAAe,MAAM,UACzC;AACA,sBAAgB,OAAO,GAAG,MAAM,YAAY,CAAC;AAC7C,iBAAW,OAAO;AAAA,IACpB,OAAO;AACL,iBAAW,QAAQ,KAAK;AAAA,IAC1B;AAEA,UAAM,UAAU;AAAA,EAClB;AAAA,EACA,MAAM;AACR;AAEA,SAAS,oBAAoB,OAAkB;AAC7C,QAAM,MAAM,MAAM,cAAc;AAChC,SAAO,gBAAgB,GAAG,IAAI,IAAI,gBAAgB,IAAI;AACxD;AAEA,IAAM,mBAAmB,CAAC,gBAAuC;AAC/D,gBAAc,YAAY,QAAQ,QAAQ,IAAI;AAC9C,QAAM,OAAO,qBAAqB,sBAAsB,SAAS;AACjE,6BAA2B,aAAa,yBAAyB,IAAI;AACrE,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,gBAAqD;AAC5E,QAAM,QAAQ,YAAY,MAAM,iBAAiB;AACjD,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,iBAAiB,IAAI,CAAC;AACjE;AAEO,IAAM,0BAA8C;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;AEvTA,SAAQ,iCAAgC;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAQ,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAe;;;ACX1C,SAAQ,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAa;AAE7C,IAAM,aAAa,MAAmB;AACpC,MAAI,UAAU,SAAS,eAAe,kBAAkB;AAExD,MAAI,YAAY,MAAM;AACpB,cAAU,SAAS,cAAc,KAAK;AACtC,YAAQ,KAAK;AACb,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,MAAM;AACpB,YAAQ,MAAM,OAAO;AACrB,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,YAAY;AAC1B,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAC3B,YAAQ,MAAM,eAAe;AAE7B,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,YAAY,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAEe,SAAR,YAE4B;AACjC,QAAM,QAAQA,QAA6C,IAAI;AAC/D,QAAM,UAAUF,aAAY,MAAM;AAChC,QAAI,MAAM,YAAY,MAAM;AAC1B,mBAAa,MAAM,OAAO;AAC1B,YAAM,UAAU;AAAA,IAClB;AAEA,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,YAAY,WAAW,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAOD;AAAA,IACL,CAAC,YAAY;AAEX,cAAQ,IAAI,OAAO;AACnB,YAAM,UAAU,WAAW;AAC3B,UAAI,MAAM,YAAY,MAAM;AAC1B,qBAAa,MAAM,OAAO;AAAA,MAC5B;AACA,cAAQ,YAAY;AACpB,YAAM,UAAU,WAAW,SAAS,GAAI;AACxC,aAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;;;AD3CO,IAAM,yBAAkD;AAAA,EAC7D;AACF;AAEA,IAAM,iBAKF;AAAA,EACF,MAAM,CAAC,EAAC,UAAS,MAAM;AACrB,cAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,MAAM,CAAC,EAAC,OAAM,MAAM;AAClB,WAAO,gBAAgB,cAAc,MAAS;AAAA,EAChD;AAAA,EACA,MAAM,CAAC,EAAC,OAAM,MAAM;AAClB,WAAO,gBAAgB,cAAc,MAAS;AAAA,EAChD;AACF;AAEO,IAAM,6BACX,uBAAuB,UAAU,6BAA6B;AAEhE,SAAS,qBAA2B;AAClC,QAAM,CAAC,MAAM,IAAI,0BAA0B;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIG,UAAkB,KAAK;AACzD,QAAM;AAAA;AAAA,IAEJ,OAAO,qBAAqB,OAAO;AAAA;AACrC,QAAM,cAAcC,QAAwC,IAAI;AAChE,QAAM,SAAS,UAAU;AAEzB,EAAAC,WAAU,MAAM;AACd,QAAI,aAAa,YAAY,YAAY,MAAM;AAC7C,kBAAY,UAAU,IAAI,kBAAkB;AAC5C,kBAAY,QAAQ,aAAa;AACjC,kBAAY,QAAQ,iBAAiB;AACrC,kBAAY,QAAQ;AAAA,QAClB;AAAA,QACA,CAAC,UAAoC;AACnC,gBAAM,aAAa,MAAM,QAAQ,KAAK,MAAM,WAAW;AACvD,gBAAM,EAAC,WAAU,IAAI,WAAW,KAAK,CAAC;AACtC,iBAAO,UAAU;AAEjB,cAAI,CAAC,WAAW,SAAS;AACvB;AAAA,UACF;AAEA,iBAAO,OAAO,MAAM;AAClB,kBAAM,YAAY,cAAc;AAEhC,gBAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAM,UAAU,eAAe,WAAW,YAAY,EAAE,KAAK,CAAC;AAE9D,kBAAI,SAAS;AACX,wBAAQ;AAAA,kBACN;AAAA,kBACA;AAAA,gBACF,CAAC;AAAA,cACH,WAAW,WAAW,MAAM,UAAU,GAAG;AACvC,0BAAU,gBAAgB;AAAA,cAC5B,OAAO;AACL,0BAAU,WAAW,UAAU;AAAA,cACjC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,SAAS;AACvB,UAAI,WAAW;AACb,oBAAY,QAAQ,MAAM;AAAA,MAC5B,OAAO;AACL,oBAAY,QAAQ,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO,MAAM;AACX,UAAI,YAAY,YAAY,MAAM;AAChC,oBAAY,QAAQ,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,mBAAmB,QAAQ,WAAW,MAAM,CAAC;AACjD,EAAAA,WAAU,MAAM;AACd,WAAO,OAAO;AAAA,MACZ;AAAA,MACA,CAAC,eAAwB;AACvB,qBAAa,UAAU;AACvB,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;AAEA,IAAO,6BAAS,6BACZ,qBACA,MAAM;;;ALoGN,SAyEA,UAnEI,OAAAC,MANJ,QAAAC,aAAA;AAzLJ,eAAe,gBAAgB,QAAsC;AACnE,QAAM,yBAAyB,KAAK,UAAU,OAAO,eAAe,CAAC;AACrE,MAAI;AACF,UAAM,MAAM,wCAAwC;AAAA,MAClD,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,oBAAoB,QAAsC;AACvE,QAAM,yBAAyB,KAAK,UAAU,OAAO,eAAe,CAAC;AACrE,MAAI,WAAW;AACf,MAAI;AACF,eAAW,MAAM,MAAM,6CAA6C;AAAA,MAClE,MAAM;AAAA,MACN,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACA,MAAI,aAAa,QAAQ,SAAS,WAAW,KAAK;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEe,SAAR,cAA+B;AAAA,EACpC;AACF,GAEgB;AACd,QAAM,CAAC,MAAM,IAAIC,2BAA0B;AAC3C,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,MAAM,OAAO,WAAW,CAAC;AACtE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,IAAI;AACvD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,OAAO,SAAS,IAAI,SAAS;AACpC,QAAM,EAAC,cAAc,iBAAgB,IAAI,cAAc;AAEvD,EAAAC,WAAU,MAAM;AACd,WAAO;AAAA,MACL,OAAO,yBAAyB,CAAC,aAAa;AAC5C,sBAAc,QAAQ;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,WAAO,OAAO;AAAA,MACZ,CAAC,EAAC,eAAe,KAAI,MAAM;AACzB,YACE,CAAC,cACD,cAAc,OAAO,KACrB,CAAC,KAAK,IAAI,YAAY,GACtB;AACA,8BAAoB,MAAM;AAAA,QAC5B;AACA,eAAO,eAAe,EAAE,KAAK,MAAM;AACjC,gBAAM,OAAO,SAAS;AACtB,gBAAM,WAAW,KAAK,YAAY;AAClC,gBAAM,aAAa,SAAS,CAAC;AAG7B;AAAA,YACE,SAAS,WAAW,KACpB,YAAY,UAAU,KACtB,WAAW,YAAY,MAAM;AAAA,UAC/B;AAEA,cAAI,SAAS,SAAS,GAAG;AACvB,6BAAiB,KAAK;AAAA,UACxB,OAAO;AACL,gBAAIC,kBAAiB,UAAU,GAAG;AAChC,oBAAM,oBAAoB,WAAW,YAAY;AACjD,+BAAiB,kBAAkB,WAAW,CAAC;AAAA,YACjD,OAAO;AACL,+BAAiB,KAAK;AAAA,YACxB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,QAAM,uBAAuBC,aAAY,MAAM;AAC7C,QAAI,aAAc;AAGlB,UAAM,oBAAoB,OAAO,eAAe,EAAE,KAAK,MAAM;AAC3D,YAAM,OAAO,SAAS;AACtB,YAAM,aAAa,KAAK,cAAc;AACtC,aAAO,YAAY,UAAU,KAAK,WAAW,YAAY,MAAM;AAAA,IACjE,CAAC;AAED,QAAI,mBAAmB;AAErB,sBAAgB,IAAI;AAIpB,4BAAsB,MAAM;AAC1B,8BAAsB,MAAM;AAC1B,cAAI;AAEF,kBAAM,eAAe,OAAO,eAAe,EAAE,KAAK,MAAM;AACtD,oBAAM,OAAO,SAAS;AACtB,oBAAM,aAAa,KAAK,cAAc;AACtC,qBAAO,YAAY,UAAU,IAAI,WAAW,eAAe,IAAI;AAAA,YACjE,CAAC;AAED,mBAAO;AAAA,cACL,MAAM;AACJ,sBAAM,OAAO,SAAS;AACtB,qBAAK,MAAM;AACX,gBAAAC;AAAA,kBACE;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,kBACA;AAAA,gBACF;AAEA,yBAAS,EAAE,UAAU;AAAA,cACvB;AAAA,cACA,EAAE,KAAK,WAAW;AAAA,YACpB;AAEA,mBAAO,gBAAgB,0BAA0B,MAAS;AAAA,UAC5D,UAAE;AACA,4BAAgB,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,OAAO;AAEL,sBAAgB,IAAI;AAIpB,4BAAsB,MAAM;AAC1B,8BAAsB,MAAM;AAC1B,cAAI;AAEF,kBAAM,WAAW,OAAO,eAAe,EAAE;AAAA,cAAK,MAC5CC;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAGA,mBAAO;AAAA,cACL,MAAM;AACJ,sBAAM,OAAO,SAAS;AACtB,sBAAM,WAAW,gBAAgB,UAAU;AAC3C,yBAAS,OAAOC,iBAAgB,QAAQ,CAAC;AACzC,qBAAK,MAAM,EAAE,OAAO,QAAQ;AAC5B,yBAAS,OAAO;AAAA,cAClB;AAAA,cACA,EAAE,KAAK,WAAW;AAAA,YACpB;AAEA,mBAAO,gBAAgB,0BAA0B,MAAS;AAAA,UAC5D,UAAE;AACA,4BAAgB,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,kCAAkC,YAAY,CAAC;AAE3D,SACE,gBAAAR,MAAC,SAAI,WAAU,WACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QAAO,MAAK;AAAA,QACX,WAAW,iBAAiB,eAAe,WAAW,EAAE;AAAA,QACxD,SAAS;AAAA,QACT,OAAO,eAAe,oBAAoB;AAAA,QAC1C,cAAY,eAAe,oBAAoB;AAAA,QAC/C,0BAAAA,KAAC,OAAE,WAAW,eAAe,oBAAoB,cAAc;AAAA;AAAA,IACjE;AAAA,IACC,8BACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAAO,MAAK;AAAA,QACX,SAAS,MAAM;AACb,iBAAO,gBAAgB,wBAAwB,CAAC,cAAc;AAC9D,4BAAkB,CAAC,cAAc;AAAA,QACnC;AAAA,QACA,WACE,sCACC,iBAAiB,WAAW;AAAA,QAE/B,OAAM;AAAA,QACN,cAAY,GACV,iBAAiB,WAAW,SAC9B;AAAA,QACA,0BAAAA,KAAC,OAAE,WAAU,OAAM;AAAA;AAAA,IACrB;AAAA,IAEF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAAO,MAAK;AAAA,QACX,WAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,MAAM;AACb,oBAAU,gBAAgB,CAAC,YACzB,gBAAAA,KAAC,mBAAgB,QAAgB,SAAkB,CACpD;AAAA,QACH;AAAA,QACA,OAAM;AAAA,QACN,cAAW;AAAA,QACX,0BAAAA,KAAC,OAAE,WAAU,SAAQ;AAAA;AAAA,IACvB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAAO,MAAK;AAAA,QACX,WAAW,iBAAiB,CAAC,aAAa,WAAW,MAAM;AAAA,QAC3D,SAAS,MAAM;AACb,cAAI,YAAY;AACd,4BAAgB,MAAM;AAAA,UACxB;AACA,iBAAO,YAAY,CAAC,OAAO,WAAW,CAAC;AAAA,QACzC;AAAA,QACA,OAAM;AAAA,QACN,cAAY,GAAG,CAAC,aAAa,WAAW,MAAM;AAAA,QAC9C,0BAAAA,KAAC,OAAE,WAAW,CAAC,aAAa,WAAW,QAAQ;AAAA;AAAA,IACjD;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAAO,MAAK;AAAA,QACX,WAAW,iBAAiB,aAAa,WAAW,EAAE;AAAA,QACtD,SAAS;AAAA,QACT,OAAO,aAAa,yBAAyB;AAAA,QAC7C,cAAY,aAAa,yBAAyB;AAAA,QACjD,yBACC,gBAAAA,KAAC,UAAK,WAAU,yBAAwB,IAExC,gBAAAA,KAAC,OAAE,WAAU,YAAW;AAAA;AAAA,IAE5B;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGgB;AACd,SACE,gBAAAC,MAAA,YAAE;AAAA;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM;AACb,mBAAO,gBAAgB,sBAAsB,MAAS;AACtD,mBAAO,MAAM;AACb,oBAAQ;AAAA,UACV;AAAA,UAAG;AAAA;AAAA,MAEL;AAAA,MAAU;AAAA,MACV,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM;AACb,mBAAO,MAAM;AACb,oBAAQ;AAAA,UACV;AAAA,UAAG;AAAA;AAAA,MAEL;AAAA,OACF;AAAA,KACF;AAEJ;;;AOnTA,SAAQ,6BAAAU,kCAAgC;AACxC,SAAQ,oBAAmB;AAC3B,SAAQ,iBAAAC,sBAAoB;AAC5B;AAAA,EACE;AAAA,EACA,mBAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAQ,eAAAC,cAAa,aAAAC,kBAAgB;;;AChBrC;AAAA,EACE,iBAAAC;AAAA,EAEA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AA0GE,gBAAAC,YAAA;AAxGF,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAQ1B,IAAM,uBAAuB;AAAA,EAClC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT;AAIA,IAAM,wBAAwB;AAAA,EAC5B,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA;AAAA,EAEZ,UAAU,GAAG,iBAAiB;AAAA;AAAA,EAE9B,oBAAoB,GAAG,iBAAiB;AAAA,EACxC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,UAAU;AAAA,EACV,iBAAiB;AACnB;AAgBA,IAAM,UAAUC,eAAwC,MAAS;AAE1D,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AACF,MAEmB;AACjB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,qBAAqB;AACtE,QAAM,oBAAoB,aAAa;AAEvC,QAAM,qBAAqBC;AAAA,IACzB,CAA8B,KAAU,UAAkC;AACxE,sBAAgB,CAAC,UAAU;AAAA,QACzB,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,MACT,EAAE;AAAA,IACJ;AAAA,IACA,CAAC;AAAA,EACH;AAEA,EAAAC,WAAU,MAAM;AACd,uBAAmB,sBAAsB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AAAA,EACzE,GAAG,CAAC,mBAAmB,kBAAkB,CAAC;AAE1C,QAAM,eAAeC,SAAQ,MAAM;AACjC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,kBAAkB,CAAC;AAErC,SAAO,gBAAAC,KAAC,QAAQ,UAAR,EAAiB,OAAO,cAAe,UAAS;AAC1D;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,UAAUC,YAAW,OAAO;AAElC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,SAAO;AACT;;;ACvHA,SAAQ,gBAAe;AAWhB,IAAM,mBAAN,MAAM,0BAAyB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7C;AAAA,EAEA,OAAO,MAAM,MAA0C;AACrD,WAAO,IAAI,kBAAiB,KAAK,QAAQ,KAAK,QAAQ,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,OAAO,UAA0B;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAY;AAEjB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WACL,gBACkB;AAClB,WAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAe;AAAA,IACjB,EAAE,eAAe,cAAc;AAAA,EACjC;AAAA,EAEA,aAAyC;AACvC,WAAO;AAAA,MACL,GAAG,MAAM,WAAW;AAAA,MACpB,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,YAAY,MAAcC,OAAc,KAAe;AACrD,UAAM,MAAM,GAAG;AACf,SAAK,SAASA;AAAA,EAChB;AAAA,EAEA,UAAU,UAAgB,KAAkB,QAA+B;AACzE,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,GAAmC;AAC3C,WAAO,EAAC,SAAS,KAAI;AAAA,EACvB;AAAA,EAEA,kBAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAAmC;AAC3C,UAAM,MAAM,MAAM,UAAU,MAAM;AAClC,QAAI,UAAU,IAAI,OAAO,MAAM,YAAY;AAC3C,QAAI,KAAK,WAAW,MAAM;AACxB,UAAI,MAAM,UAAU;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBACd,MACAA,OACkB;AAClB,SAAO,IAAI,iBAAiB,MAAMA,KAAI,EAAE,QAAQ,OAAO;AACzD;;;ACnFA,IAAM,WAAW,oBAAI,QAAoC;AAEzD,SAAS,UAAU,GAAwC;AACzD,QAAM,QAAQ,EAAE,eAAe,CAAC;AAChC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO,CAAC,MAAM,SAAS,MAAM,OAAO;AACtC;AAEA,SAAS,YAAY,SAAsB,IAA0B;AACnE,MAAI,gBAAgB,SAAS,IAAI,OAAO;AACxC,MAAI,kBAAkB,QAAW;AAC/B,UAAM,YAAY,oBAAI,IAAc;AACpC,UAAM,mBAAmB,CAAC,MAAkB;AAC1C,UAAI,kBAAkB,QAAW;AAC/B,sBAAc,QAAQ,UAAU,CAAC;AAAA,MACnC;AAAA,IACF;AACA,UAAM,iBAAiB,CAAC,MAAkB;AACxC,UAAI,kBAAkB,QAAW;AAC/B;AAAA,MACF;AACA,YAAM,QAAQ,cAAc;AAC5B,UAAI,UAAU,MAAM;AAClB;AAAA,MACF;AACA,YAAM,MAAM,UAAU,CAAC;AACvB,iBAAW,YAAY,WAAW;AAChC,YAAI,QAAQ,MAAM;AAChB,mBAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AACA,YAAQ,iBAAiB,cAAc,gBAAgB;AACvD,YAAQ,iBAAiB,YAAY,cAAc;AAEnD,oBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,aAAS,IAAI,SAAS,aAAa;AAAA,EACrC;AACA,gBAAc,UAAU,IAAI,EAAE;AAC9B,SAAO,MAAM,eAAe,SAAS,EAAE;AACzC;AAEA,SAAS,eAAe,SAAsB,IAAoB;AAChE,QAAM,gBAAgB,SAAS,IAAI,OAAO;AAC1C,MAAI,kBAAkB,QAAW;AAC/B;AAAA,EACF;AACA,QAAM,YAAY,cAAc;AAChC,YAAU,OAAO,EAAE;AACnB,MAAI,UAAU,SAAS,GAAG;AACxB,aAAS,OAAO,OAAO;AACvB,YAAQ,oBAAoB,cAAc,cAAc,gBAAgB;AACxE,YAAQ,oBAAoB,YAAY,cAAc,cAAc;AAAA,EACtE;AACF;AAcO,SAAS,sBACd,SACA,IACA;AACA,SAAO,YAAY,SAAS,CAAC,OAAO,MAAM;AACxC,UAAM,CAAC,GAAG,CAAC,IAAI;AACf,QAAI,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG;AAC5B,SAAG,GAAG,CAAC;AAAA,IACT;AAAA,EACF,CAAC;AACH;;;AHlEA,IAAM,gBAAgB,EAAC,KAAK,kBAAiB;AAetC,IAAM,OAAO,KAAK,OAAO,EAC7B,SAAS,EAAE,EACX,QAAQ,YAAY,EAAE,EACtB,UAAU,GAAG,CAAC;AAGjB,SAAS,QAAQ,WAAoD;AACnE,MAAI,CAACC,mBAAkB,SAAS,KAAK,CAAC,UAAU,YAAY,GAAG;AAC7D,WAAO,CAAC,OAAO,EAAE;AAAA,EACnB;AACA,QAAM,OAAO,UAAU,SAAS,EAAE,CAAC;AACnC,QAAM,SAAS,UAAU;AAEzB,MAAI,CAACC,aAAY,IAAI,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,aAAa,MAAM,GAAG;AACvE,WAAO,CAAC,OAAO,EAAE;AAAA,EACnB;AACA,QAAM,OAAO,CAAC;AACd,QAAM,OAAO,KAAK,eAAe;AACjC,MAAI,IAAI,KAAK,mBAAmB;AAChC,MAAI;AACJ,SAAO,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK;AAC7C,SAAK,KAAK,CAAC;AAAA,EACb;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC,OAAO,EAAE;AAAA,EACnB;AACA,SAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,KAAK,EAAE,CAAC;AACvC;AAGA,SAAS,WAAkD;AACzD,SAAOC,aAAY,CAAC,eAAuB;AACzC,UAAM,SAAS,IAAI,mBAAmB;AACtC,YAAQ,KAAK,OAAO;AACpB,UAAM,WAAW,OAAO,MAAM,UAAU;AACxC,YAAQ,QAAQ,OAAO;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEA,SAAS,qBAAqB,YAA4B;AACxD,QAAM,gBAAgB,OAAO,UAAU;AACvC,QAAM,WACJ,kBAAkB,SACd,cAAc,SACd,OAAO,cAAc,OAAO,OAAO,eAAe;AAExD,SAAO,GAAG,UAAU,IAAI,WAAW,mBAAmB,OAAO;AAC/D;AAEe,SAAR,qBAA0D;AAC/D,QAAM,CAAC,MAAM,IAAIC,2BAA0B;AAC3C,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAC,aAAY,IAAI,gBAAgB;AAEvC,EAAAC,WAAU,MAAM;AACd,QAAI,sBAAsC;AAC1C,QAAI,YAA2B;AAC/B,QAAI,iBAAgC;AACpC,QAAI,gBAAsC;AAC1C,QAAI,iBAAyB;AAC7B,aAAS,mBAAmB;AAC1B,YAAM,mBACJ,wBAAwB,OACpB,cAAc,mBAAmB,IACjC;AACN,UAAI,qBAAqB,QAAQ,iBAAiB,WAAW,GAAG;AAC9D,yBAAiB,OAAO;AACxB,8BAAsB;AAAA,MACxB;AACA,UAAI,kBAAkB,MAAM;AAC1B,sBAAc,QAAQ;AACtB,wBAAgB;AAAA,MAClB;AACA,kBAAY;AACZ,uBAAiB;AACjB,uBAAiB;AAAA,IACnB;AACA,aAAS,sBACP,kBACA,eACA;AACA,UAAI,kBAAkB,oBAAoB,kBAAkB,MAAM;AAEhE;AAAA,MACF;AACA,aAAO,OAAO,MAAM;AAClB,cAAM,YAAYC,eAAc;AAChC,cAAM,CAAC,UAAU,KAAK,IAAI,QAAQ,SAAS;AAC3C,YAAI,CAAC,YAAY,UAAU,aAAa,CAACL,mBAAkB,SAAS,GAAG;AAErE;AAAA,QACF;AACA,cAAM,gBAAgB,UAAU,MAAM;AACtC,cAAM,WAAW,UAAU,SAAS,EAAE,CAAC;AACvC,yBAAiB,SAAS,UAAU;AACpC,cAAM,OAAO;AAAA,UACX,qBAAqB,aAAa;AAAA,UAClC;AAAA,QACF,EACG,UAAU,cAAc,EACxB,SAAS,cAAc,aAAa,QAAQ,EAAE;AACjD,8BAAsB,KAAK,OAAO;AAClC,kBAAU,YAAY,CAAC,IAAI,CAAC;AAC5B,sBAAc,aAAa;AAC3B,yBAAiB;AAAA,MACnB,GAAG,aAAa;AAAA,IAClB;AAEA,aAAS,iCAAiC,MAAwB;AAChE,YAAM,MAAM,KAAK,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ,QAAQ,qBAAqB;AAEvD,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,aAAS,eAAe;AACtB,aAAO,OAAO,MAAM;AAClB,cAAM,YAAYK,eAAc;AAChC,cAAM,CAAC,UAAU,KAAK,IAAI,QAAQ,SAAS;AAC3C,YAAI,CAAC,UAAU;AACb,2BAAiB;AACjB;AAAA,QACF;AACA,YAAI,UAAU,WAAW;AACvB;AAAA,QACF;AACA,yBAAiB;AACjB,wBAAgB,MAAM,KAAK;AAC3B,sBAAc,QACX,KAAK,CAAC,kBAAkB;AACvB,cAAI,kBAAkB,MAAM;AAC1B,kCAAsB,eAAe,aAAa;AAAA,UACpD;AAAA,QACF,CAAC,EACA,MAAM,CAAC,MAAM;AACZ,cAAI,MAAM,aAAa;AACrB,oBAAQ,MAAM,CAAC;AAAA,UACjB;AAAA,QACF,CAAC;AACH,oBAAY;AAAA,MACd,GAAG,aAAa;AAAA,IAClB;AACA,aAAS,4BAAqC;AAC5C,UAAI,mBAAmB,QAAQ,wBAAwB,MAAM;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,mBAAmB,cAAc,mBAAmB;AAC1D,UAAI,qBAAqB,MAAM;AAC7B,eAAO;AAAA,MACT;AACA,YAAM,WAAWC,iBAAgB,cAAc,EAC5C,UAAU,cAAc,EACxB,SAAS,cAAc,aAAa,QAAQ,EAAE;AACjD,uBAAiB,QAAQ,QAAQ;AACjC,eAAS,WAAW;AACpB,uBAAiB;AACjB,aAAO;AAAA,IACT;AACA,aAAS,uBAAuB,GAAU;AACxC,UAAI,0BAA0B,GAAG;AAC/B,UAAE,eAAe;AACjB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,aAAS,iBAAiB,QAAgB,GAAe;AACvD,aAAO,OAAO,MAAM;AAClB,YAAI,0BAA0B,GAAG;AAC/B,YAAE,eAAe;AAAA,QACnB,OAAO;AACL,wBAAc,cAAc,GAAG;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH;AACA,aAAS,oBAAoB;AAC3B,aAAO,OAAO,MAAM;AAClB,yBAAiB;AAAA,MACnB,GAAG,aAAa;AAAA,IAClB;AAEA,UAAM,WAAW,OAAO,eAAe;AAEvC,WAAOC;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,uBAAuB,YAAY;AAAA,MAC1C,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,GAAI,aAAa,OACb,CAAC,sBAAsB,UAAU,gBAAgB,CAAC,IAClD,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,aAAa,QAAQ,CAAC;AAEzC,SAAO;AACT;AAMA,IAAM,qBAAN,MAAyB;AAAA,EACvB,WAAW;AAAA,EACX,UAAU;AAAA,EAEV,QAAQ,CAAC,eAAsC;AAC7C,QAAI,cAAc;AAElB,UAAM,UAAU,MAAM;AACpB,oBAAc;AAAA,IAChB;AACA,UAAM,UAAkC,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvE,iBAAW,MAAM;AACf,YAAI,aAAa;AAEf,iBAAO,OAAO,WAAW;AAAA,QAC3B;AACA,cAAM,mBAAmB,WAAW;AACpC,YAAI,eAAe,MAAM,mBAAmB,GAAG;AAC7C,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,cAAM,QAAQ,WAAW,WAAW,CAAC;AACrC,cAAM,gBAAgB,SAAS,MAAM,SAAS;AAC9C,cAAM,4BAA4B,gBAC9B,OAAO,aAAa,QAAQ,EAAE,IAAI,WAAW,UAAU,CAAC,IACxD;AACJ,cAAM,QAAQ,KAAK,SAAS;AAAA,UAC1B,CAAC,mBACC,eAAe,WAAW,yBAAyB,KAAK;AAAA,QAC5D;AACA,YAAI,UAAU,QAAW;AACvB,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,cAAM,mBAAmB,gBACrB,OAAO,aAAa,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,MAAM,UAAU,CAAC,IACjE;AACJ,cAAM,oBAAoB,iBAAiB,UAAU,gBAAgB;AACrE,YAAI,sBAAsB,IAAI;AAC5B,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,eAAO,QAAQ,iBAAiB;AAAA,MAClC,GAAG,KAAK,OAAO;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":["useCallback","useEffect","useMemo","useRef","useState","LexicalComposer","OnChangePlugin","useLexicalComposerContext","$createParagraphNode","$getRoot","$insertNodes","$setSelection","COMMAND_PRIORITY_LOW","FOCUS_COMMAND","ClearEditorPlugin","useLexicalComposerContext","LexicalErrorBoundary","HistoryPlugin","PlainTextPlugin","useLexicalEditable","useEffect","useState","$convertFromMarkdownString","$convertToMarkdownString","useLexicalComposerContext","$createTextNode","$isParagraphNode","useCallback","useEffect","useState","useCallback","useState","jsx","table","rows","previousSibling","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useRef","useEffect","jsx","jsxs","useLexicalComposerContext","useState","useEffect","$isParagraphNode","useCallback","$convertFromMarkdownString","$convertToMarkdownString","$createTextNode","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isRangeSelection","$isTextNode","useCallback","useEffect","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","createContext","useState","useCallback","useEffect","useMemo","jsx","useContext","uuid","$isRangeSelection","$isTextNode","useCallback","useLexicalComposerContext","useEffect","$getSelection","$createTextNode","mergeRegister","useLexicalComposerContext","useMemo","useState","jsx","useLexicalComposerContext","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","BlockWithAlignableContents","DecoratorBlockNode","jsx","createCommand","useLexicalComposerContext","useEffect","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","BlockWithAlignableContents","DecoratorBlockNode","jsx","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","Fragment","jsx","jsxs","useState","useLexicalComposerContext","useMemo","$isCodeNode","jsx","$isCodeNode","useLexicalComposerContext","$getNearestNodeFromDOMNode","useEffect","useRef","useState","createPortal","$isCodeNode","$getSelection","$setSelection","useState","debounce","useMemo","useRef","jsx","useState","$isCodeNode","$getSelection","$setSelection","$isCodeNode","$getNearestNodeFromDOMNode","useState","jsx","jsxs","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useRef","$getNearestNodeFromDOMNode","$isCodeNode","useEffect","createPortal","useLexicalComposerContext","useEffect","useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","$createParagraphNode","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_RIGHT_COMMAND","useEffect","isHTMLElement","isHTMLElement","IS_CHROME","ElementNode","ElementNode","IS_CHROME","IS_CHROME","$isElementNode","ElementNode","ElementNode","IS_CHROME","$isElementNode","createCommand","useLexicalComposerContext","useEffect","$getSelection","$isRangeSelection","$createParagraphNode","mergeRegister","COMMAND_PRIORITY_LOW","KEY_ARROW_RIGHT_COMMAND","$insertNodeToNearestRoot","useLexicalComposerContext","mergeRegister","$getNodeByKey","$getSelection","$isRangeSelection","$isTextNode","CLEAR_EDITOR_COMMAND","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useRef","useState","createPortal","COMMAND_PRIORITY_LOW","useEffect","useState","offset","Fragment","jsx","jsxs","createCommand","useRef","useCallback","useEffect","useLexicalComposerContext","useState","useMemo","$getSelection","$isRangeSelection","elements","CLEAR_EDITOR_COMMAND","$getNodeByKey","mergeRegister","$isTextNode","COMMAND_PRIORITY_EDITOR","createPortal","$createCodeNode","useLexicalComposerContext","INSERT_TABLE_COMMAND","$createParagraphNode","$getSelection","$isRangeSelection","useCallback","useMemo","useState","ReactDOM","useLexicalComposerContext","mergeRegister","$createParagraphNode","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","createCommand","useLexicalComposerContext","useEffect","mergeRegister","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useLexicalComposerContext","useCallback","useState","Fragment","jsx","jsxs","useLexicalComposerContext","useState","useCallback","jsx","createCommand","useCallback","useLexicalComposerContext","useEffect","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useState","jsx","createCommand","useLexicalComposerContext","useState","useEffect","COMMAND_PRIORITY_EDITOR","elements","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","useLexicalComposerContext","$findMatchingParent","$wrapNodeInElement","mergeRegister","$createParagraphNode","$getSelection","$insertNodes","$isRootOrShadowRoot","$setSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","isHTMLElement","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","createCommand","useState","useRef","useEffect","useLexicalComposerContext","mergeRegister","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","$findMatchingParent","$setSelection","$getSelection","isHTMLElement","useState","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","Fragment","jsx","jsxs","useRef","useEffect","useState","useCallback","useMemo","createPortal","useLexicalComposerContext","$findMatchingParent","$insertNodeToNearestRoot","mergeRegister","$createParagraphNode","$getNodeByKey","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_LEFT_COMMAND","KEY_ARROW_RIGHT_COMMAND","KEY_ARROW_UP_COMMAND","useEffect","ElementNode","addClassNamesToElement","$isParagraphNode","ElementNode","createCommand","useLexicalComposerContext","useEffect","$getSelection","$isRangeSelection","$findMatchingParent","$createParagraphNode","mergeRegister","KEY_ARROW_DOWN_COMMAND","COMMAND_PRIORITY_LOW","KEY_ARROW_RIGHT_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ARROW_LEFT_COMMAND","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","$getNodeByKey","Fragment","jsx","jsxs","useState","useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useLexicalComposerContext","mergeRegister","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","useEffect","jsx","createCommand","useLexicalComposerContext","useEffect","mergeRegister","$getSelection","$isRangeSelection","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","$wrapNodeInElement","$createParagraphNode","$insertNodes","$isRootOrShadowRoot","COMMAND_PRIORITY_EDITOR","createCommand","useEffect","useState","Fragment","jsx","jsxs","createCommand","useState","useLexicalComposerContext","useEffect","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DATA_ATTR","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","createCommand","useCallback","useEffect","useMemo","useState","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useMemo","useState","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","useState","useCallback","useMemo","$getNodeByKey","BlockWithAlignableContents","DATA_ATTR","DecoratorBlockNode","jsx","jsxs","createCommand","useLexicalComposerContext","useEffect","$insertNodeToNearestRoot","COMMAND_PRIORITY_EDITOR","useState","useMemo","useCallback","useLexicalComposerContext","TableCellNode","TableNode","TableRowNode","createContext","useContext","useEffect","useMemo","useState","Fragment","jsx","jsxs","createContext","useState","useEffect","jsxs","Fragment","jsx","Fragment","jsx","jsxs","INSERT_TABLE_COMMAND","$getSelection","$isRangeSelection","$createParagraphNode","$createCodeNode","useLexicalComposerContext","useState","useMemo","useCallback","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","$getSelection","$isNodeSelection","$isRangeSelection","useMemo","jsx","useLexicalComposerContext","COMMAND_PRIORITY_LOW","useEffect","useLexicalComposerContext","useEffect","COMMAND_PRIORITY_LOW","useLexicalComposerContext","$createParagraphNode","$createTextNode","$getNearestNodeFromDOMNode","$getNodeByKey","$isParagraphNode","$isTextNode","useCallback","useEffect","useMemo","useRef","useState","ReactDOM","Fragment","jsx","jsxs","useLexicalComposerContext","useRef","useState","useMemo","useEffect","useCallback","$getNodeByKey","$createParagraphNode","$createTextNode","$isParagraphNode","$isTextNode","$getNearestNodeFromDOMNode","useLexicalComposerContext","LexicalTypeaheadMenuPlugin","MenuOption","useBasicTypeaheadTriggerMatch","$createTextNode","$getSelection","$isRangeSelection","useCallback","useEffect","useMemo","useState","ReactDOM","jsx","jsxs","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","$findMatchingParent","mergeRegister","$getSelection","$isNodeSelection","$isRangeSelection","CLICK_COMMAND","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","$isAtNodeEnd","Fragment","jsx","jsxs","useRef","useState","useCallback","$getSelection","$isRangeSelection","$findMatchingParent","$isLinkNode","$isNodeSelection","getDOMSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","$isAutoLinkNode","CLICK_COMMAND","createPortal","useLexicalComposerContext","$isLinkNode","TOGGLE_LINK_COMMAND","useLexicalComposerContext","mergeRegister","$getSelection","$isParagraphNode","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","getDOMSelection","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","VERTICAL_GAP","HORIZONTAL_OFFSET","Fragment","jsx","jsxs","isUppercase","isLowercase","isCapitalize","isSubscript","isSuperscript","useRef","useCallback","TOGGLE_LINK_COMMAND","useEffect","$getSelection","getDOMSelection","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","useState","$isRangeSelection","$isLinkNode","$isTextNode","$isParagraphNode","createPortal","useLexicalComposerContext","jsx","useLexicalComposerContext","$getSelection","$isRangeSelection","useEffect","TOGGLE_LINK_COMMAND","COMMAND_PRIORITY_NORMAL","FORMAT_ELEMENT_COMMAND","FORMAT_TEXT_COMMAND","isModifierMatch","useEffect","$createCodeNode","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","$createHeadingNode","$createQuoteNode","$setBlocksType","$addUpdateTag","$createParagraphNode","$createRangeSelection","$getSelection","$isElementNode","$isLineBreakNode","$isParagraphNode","$isRangeSelection","$isTextNode","$setSelection","$addUpdateTag","$getSelection","$setBlocksType","$createParagraphNode","$createHeadingNode","INSERT_UNORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","$createQuoteNode","$isParagraphNode","$isLineBreakNode","$createRangeSelection","$setSelection","$isElementNode","$isRangeSelection","$createCodeNode","$isTextNode","useEffect","isModifierMatch","FORMAT_TEXT_COMMAND","FORMAT_ELEMENT_COMMAND","TOGGLE_LINK_COMMAND","COMMAND_PRIORITY_NORMAL","useLexicalComposerContext","TextNode","useEffect","addClassNamesToElement","TextNode","useEffect","TextNode","useLexicalComposerContext","useLexicalComposerContext","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","useEffect","useLexicalComposerContext","useLexicalEditable","$isTableCellNode","$isTableSelection","TableCellHeaderStates","TableCellNode","mergeRegister","$getSelection","$isElementNode","$isRangeSelection","$isTextNode","$setSelection","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useRef","useState","createPortal","calculateZoomLevel","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useMemo","jsxs","jsx","calculateZoomLevel","Fragment","jsx","jsxs","$getSelection","$isRangeSelection","$isTableSelection","$isTextNode","$isElementNode","$isTableCellNode","useLexicalComposerContext","useRef","useState","useEffect","TableCellNode","isDOMNode","useCallback","$setSelection","TableCellHeaderStates","createPortal","getDOMSelection","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","useLexicalEditable","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","useCallback","useEffect","useMemo","useRef","useState","createPortal","Fragment","jsx","jsxs","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableNode","$isTableRowNode","$getNearestNodeFromDOMNode","$getSiblingCaret","isHTMLElement","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","isHTMLElement","useLexicalComposerContext","useLexicalEditable","useState","useRef","useEffect","$getNearestNodeFromDOMNode","$isTableNode","$isTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableRowNode","$computeTableMapSkipCellCheck","$getSiblingCaret","createPortal","useLexicalComposerContext","useEffect","useRef","useState","jsx","jsxs","useLexicalComposerContext","useEffect","wrappers","$isCodeNode","$isLinkNode","TOGGLE_LINK_COMMAND","INSERT_EMBED_COMMAND","INSERT_HORIZONTAL_RULE_COMMAND","$isHeadingNode","$patchStyleText","$isTableNode","$isTableSelection","$findMatchingParent","IS_APPLE","mergeRegister","$addUpdateTag","$getNodeByKey","$getRoot","$getSelection","$isElementNode","$isNodeSelection","$isRangeSelection","$isRootOrShadowRoot","COMMAND_PRIORITY_CRITICAL","FORMAT_ELEMENT_COMMAND","FORMAT_TEXT_COMMAND","HISTORIC_TAG","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","REDO_COMMAND","SELECTION_CHANGE_COMMAND","SKIP_DOM_SELECTION_TAG","SKIP_SELECTION_FOCUS_TAG","UNDO_COMMAND","useCallback","useEffect","useState","jsx","React","Fragment","jsx","jsxs","jsxs","Fragment","jsx","Fragment","jsx","jsxs","jsxs","jsx","useCallback","$addUpdateTag","SKIP_SELECTION_FOCUS_TAG","$getSelection","$patchStyleText","FORMAT_ELEMENT_COMMAND","OUTDENT_CONTENT_COMMAND","INDENT_CONTENT_COMMAND","$findMatchingParent","$isRootOrShadowRoot","useState","SKIP_DOM_SELECTION_TAG","FORMAT_TEXT_COMMAND","$isHeadingNode","$isCodeNode","theme","$isRangeSelection","$isLinkNode","$isTableNode","$isElementNode","$isTableSelection","$isNodeSelection","useEffect","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","mergeRegister","HISTORIC_TAG","TOGGLE_LINK_COMMAND","$getNodeByKey","UNDO_COMMAND","IS_APPLE","REDO_COMMAND","Fragment","INSERT_HORIZONTAL_RULE_COMMAND","$getRoot","INSERT_EMBED_COMMAND","useLexicalComposerContext","useEffect","useLexicalComposerContext","useEffect","Fragment","jsx","jsxs","useLexicalEditable","useState","useLexicalComposerContext","useEffect","ClearEditorPlugin","HistoryPlugin","LexicalErrorBoundary","PlainTextPlugin","CodeNode","LinkNode","ListNode","MarkNode","HorizontalRuleNode","TableCellNode","TableNode","TableRowNode","$getNodeByKey","BlockWithAlignableContents","DecoratorBlockNode","useLexicalComposerContext","useLexicalEditable","useCallback","useRef","useState","jsx","jsxs","DATA_ATTR","ListNode","CodeNode","TableNode","TableCellNode","TableRowNode","LinkNode","HorizontalRuleNode","MarkNode","jsx","jsxs","useLexicalComposerContext","useRef","useEffect","FOCUS_COMMAND","$getRoot","COMMAND_PRIORITY_LOW","$createParagraphNode","$setSelection","$insertNodes","useCallback","OnChangePlugin","LexicalEditor","useState","useMemo","LexicalComposer"]}