@tarviks/lexical-rich-editor 1.0.2 → 1.0.3
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 +10 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Utils/ImageResizer.tsx","../src/Nodes/Image.css","../src/Nodes/ImageComponent.tsx","../src/Nodes/ImageNode.tsx","../src/Nodes/InlineImage.css","../src/Nodes/InlineImageComponent.tsx","../src/Nodes/InlineImageNode.tsx","../src/ContentEditorComponent.types.ts","../src/Nodes/AutoCompleteNode.tsx","../src/Nodes/HtmlBlockNode.ts","../src/ContentEditorComponent.tsx","../src/Nodes/PageBreakNode.tsx","../src/Nodes/SpellErrorNode.tsx","../src/Nodes/YoutubeNode.tsx","../src/Plugins/AutoComplete.tsx","../src/Plugins/CharacterStylesPopupPlugin.tsx","../src/Plugins/CustomOnChange.tsx","../src/Plugins/FloatLinkEditor.tsx","../src/Plugins/ImagePlugin.tsx","../src/Plugins/InlineImage.tsx","../src/Plugins/PageBreak.tsx","../src/Utils/Helper.ts","../src/Plugins/RefApiPlugin.tsx","../src/Plugins/Spellcheckplugin.tsx","../src/Plugins/TableActionMenuPlugin.tsx","../src/Plugins/TableCellResizer.tsx","../src/Types/EditorType.tsx","../src/Utils/editorLevel.ts","../src/Utils/Index.tsx","../src/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Plugins/FontSize.tsx","../src/Plugins/InsertLink.tsx","../src/Plugins/Table.tsx","../src/Plugins/Youtube.tsx","../src/Plugins/ToolBar.tsx","../src/Plugins/YoutubeDeletePlugin.tsx","../src/Theme/index.ts"],"names":["useRef","calculateZoomLevel","jsxs","jsx","createCommand","img","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","useCallback","$getSelection","$isNodeSelection","$setSelection","$isRangeSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","$getNodeByKey","Suspense","Fragment","ImageComponent","React","DecoratorNode","createEditor","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","InlineImageComponent","React2","isHTMLElement","ContentEditorLevel","TextNode","ElementNode","COMMAND_PRIORITY_HIGH","React3","width","height","BlockWithAlignableContents","DecoratorBlockNode","$getRoot","React4","$createTextNode","KEY_DOWN_COMMAND","clamp","useTheme","FORMAT_TEXT_COMMAND","TOGGLE_LINK_COMMAND","Button","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","CodeFilled","LinkFilled","selection","$isAtNodeEnd","$isLinkNode","$isCodeHighlightNode","$isTextNode","createPortal","$generateNodesFromDOM","$generateHtmlFromNodes","OnChangePlugin","getSelectedNode","$findMatchingParent","getDOMSelection","$isAutoLinkNode","$createLinkNode","COMMAND_PRIORITY_CRITICAL","Stack","Field","Input","Popover","PopoverTrigger","ImageAddRegular","PopoverSurface","AttachFilled","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","PASTE_COMMAND","DRAGOVER_COMMAND","DROP_COMMAND","$createRangeSelection","getDOMSelectionFromTarget","makeStyles","ImageEditRegular","Dropdown","Option","$onDragStart","$onDragover","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","canDropImage","getDragImageData","getDragSelection","$insertNodeToNearestRoot","html","useImperativeHandle","$isElementNode","React6","React7","$isTableSelection","$isTableNode","$isTableCellNode","$insertTableRowAtSelection","$insertTableColumnAtSelection","$deleteTableRowAtSelection","$deleteTableColumnAtSelection","table","$getTableNodeFromLexicalNodeOrThrow","Menu","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuItem","RowTripleRegular","ArrowUpRegular","ArrowDownRegular","MenuDivider","ColumnTripleRegular","ArrowLeftRegular","ArrowRightRegular","DeleteRegular","getDOMCellFromTarget","getTableObserverFromTableElement","$getNearestNodeFromDOMNode","$getTableRowIndexFromTableCellNode","$isTableRowNode","$getTableColumnIndexFromTableCellNode","useMemo","$setBlocksType","r","g","b","React9","Callout","TextField","DefaultButton","$getSelectionStyleValueForProperty","$patchStyleText","TextColorRegular","PaintBucket16Filled","useStyles","fontSize","React11","link","text","LinkAddRegular","$createTableNodeWithDimensions","TableAddRegular","VideoClipRegular","$isListNode","$getNearestNodeOfType","ListNode","type","$isHeadingNode","$createQuoteNode","FORMAT_ELEMENT_COMMAND","UNDO_COMMAND","REDO_COMMAND","$createHeadingNode","ToolbarDivider","REMOVE_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","TextCaseUppercaseFilled","TextCaseLowercaseFilled","TextCaseTitleFilled","HighlightAccentFilled","TextBulletListLtrFilled","TextNumberListLtrFilled","DocumentPageBreakRegular","CommentQuoteRegular","TextAlignLeftFilled","TextAlignCenterFilled","TextAlignRightFilled","TextAlignJustifyFilled","$isDecoratorNode","createLinkMatcherWithRegExp","forwardRef","HeadingNode","QuoteNode","CodeHighlightNode","CodeNode","ListItemNode","LinkNode","AutoLinkNode","TableNode","TableRowNode","TableCellNode","mergeStyleSets","FluentProvider","webLightTheme","LexicalComposer","RichTextPlugin","LexicalErrorBoundary","ContentEditable","css","AutoFocusPlugin","HistoryPlugin","ListPlugin","LinkPlugin","AutoLinkPlugin","TablePlugin"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 { calculateZoomLevel } from '@lexical/utils';\r\nimport type { LexicalEditor } from 'lexical';\r\nimport type { JSX } from 'react';\r\nimport * as React from 'react';\r\nimport { useRef } from 'react';\r\n\r\n\r\nconst clamp = (value: number, min: number, max: number) => {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nconst Direction = {\r\n east: 1 << 0,\r\n north: 1 << 3,\r\n south: 1 << 1,\r\n west: 1 << 2,\r\n};\r\n\r\nconst ImageResizer = ({\r\n onResizeStart,\r\n onResizeEnd,\r\n buttonRef,\r\n imageRef,\r\n maxWidth,\r\n editor,\r\n showCaption,\r\n setShowCaption,\r\n captionsEnabled,\r\n}: {\r\n editor: LexicalEditor;\r\n buttonRef: {current: null | HTMLButtonElement};\r\n imageRef: {current: null | HTMLElement};\r\n maxWidth?: number;\r\n onResizeEnd: (width: 'inherit' | number, height: 'inherit' | number) => void;\r\n onResizeStart: () => void;\r\n setShowCaption: (show: boolean) => void;\r\n showCaption: boolean;\r\n captionsEnabled: boolean;\r\n}): JSX.Element => {\r\n const controlWrapperRef = useRef<HTMLDivElement>(null);\r\n const userSelect = useRef({\r\n priority: '',\r\n value: 'default',\r\n });\r\n const positioningRef = useRef<{\r\n currentHeight: 'inherit' | number;\r\n currentWidth: 'inherit' | number;\r\n direction: number;\r\n isResizing: boolean;\r\n ratio: number;\r\n startHeight: number;\r\n startWidth: number;\r\n startX: number;\r\n startY: number;\r\n }>({\r\n currentHeight: 0,\r\n currentWidth: 0,\r\n direction: 0,\r\n isResizing: false,\r\n ratio: 0,\r\n startHeight: 0,\r\n startWidth: 0,\r\n startX: 0,\r\n startY: 0,\r\n });\r\n const editorRootElement = editor.getRootElement();\r\n // Find max width, accounting for editor padding.\r\n const maxWidthContainer = maxWidth\r\n ? maxWidth\r\n : editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().width - 20\r\n : 100;\r\n const maxHeightContainer =\r\n editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().height - 20\r\n : 100;\r\n\r\n const minWidth = 100;\r\n const minHeight = 100;\r\n\r\n const setStartCursor = (direction: number) => {\r\n const ew = direction === Direction.east || direction === Direction.west;\r\n const ns = direction === Direction.north || direction === Direction.south;\r\n const nwse =\r\n (direction & Direction.north && direction & Direction.west) ||\r\n (direction & Direction.south && direction & Direction.east);\r\n\r\n const cursorDir = ew ? 'ew' : ns ? 'ns' : nwse ? 'nwse' : 'nesw';\r\n\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\r\n 'cursor',\r\n `${cursorDir}-resize`,\r\n 'important',\r\n );\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\r\n 'cursor',\r\n `${cursorDir}-resize`,\r\n 'important',\r\n );\r\n userSelect.current.value = document.body.style.getPropertyValue(\r\n '-webkit-user-select',\r\n );\r\n userSelect.current.priority = document.body.style.getPropertyPriority(\r\n '-webkit-user-select',\r\n );\r\n document.body.style.setProperty(\r\n '-webkit-user-select',\r\n `none`,\r\n 'important',\r\n );\r\n }\r\n };\r\n\r\n const setEndCursor = () => {\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty('cursor', 'text');\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty('cursor', 'default');\r\n document.body.style.setProperty(\r\n '-webkit-user-select',\r\n userSelect.current.value,\r\n userSelect.current.priority,\r\n );\r\n }\r\n };\r\n\r\n const handlePointerDown = (\r\n event: React.PointerEvent<HTMLDivElement>,\r\n direction: number,\r\n ) => {\r\n if (!editor.isEditable()) {\r\n return;\r\n }\r\n\r\n const image = imageRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n\r\n if (image !== null && controlWrapper !== null) {\r\n event.preventDefault();\r\n const {width, height} = image.getBoundingClientRect();\r\n const zoom = calculateZoomLevel(image);\r\n const positioning = positioningRef.current;\r\n positioning.startWidth = width;\r\n positioning.startHeight = height;\r\n positioning.ratio = width / height;\r\n positioning.currentWidth = width;\r\n positioning.currentHeight = height;\r\n positioning.startX = event.clientX / zoom;\r\n positioning.startY = event.clientY / zoom;\r\n positioning.isResizing = true;\r\n positioning.direction = direction;\r\n\r\n setStartCursor(direction);\r\n onResizeStart();\r\n\r\n controlWrapper.classList.add('image-control-wrapper--resizing');\r\n image.style.height = `${height}px`;\r\n image.style.width = `${width}px`;\r\n\r\n document.addEventListener('pointermove', handlePointerMove);\r\n document.addEventListener('pointerup', handlePointerUp);\r\n }\r\n };\r\n const handlePointerMove = (event: PointerEvent) => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n\r\n const isHorizontal =\r\n positioning.direction & (Direction.east | Direction.west);\r\n const isVertical =\r\n positioning.direction & (Direction.south | Direction.north);\r\n\r\n if (image !== null && positioning.isResizing) {\r\n const zoom = calculateZoomLevel(image);\r\n // Corner cursor\r\n if (isHorizontal && isVertical) {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer,\r\n );\r\n\r\n const height = width / positioning.ratio;\r\n image.style.width = `${width}px`;\r\n image.style.height = `${height}px`;\r\n positioning.currentHeight = height;\r\n positioning.currentWidth = width;\r\n } else if (isVertical) {\r\n let diff = Math.floor(positioning.startY - event.clientY / zoom);\r\n diff = positioning.direction & Direction.south ? -diff : diff;\r\n\r\n const height = clamp(\r\n positioning.startHeight + diff,\r\n minHeight,\r\n maxHeightContainer,\r\n );\r\n\r\n image.style.height = `${height}px`;\r\n positioning.currentHeight = height;\r\n } else {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer,\r\n );\r\n\r\n image.style.width = `${width}px`;\r\n positioning.currentWidth = width;\r\n }\r\n }\r\n };\r\n const handlePointerUp = () => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n if (image !== null && controlWrapper !== null && positioning.isResizing) {\r\n const width = positioning.currentWidth;\r\n const height = positioning.currentHeight;\r\n positioning.startWidth = 0;\r\n positioning.startHeight = 0;\r\n positioning.ratio = 0;\r\n positioning.startX = 0;\r\n positioning.startY = 0;\r\n positioning.currentWidth = 0;\r\n positioning.currentHeight = 0;\r\n positioning.isResizing = false;\r\n\r\n controlWrapper.classList.remove('image-control-wrapper--resizing');\r\n\r\n setEndCursor();\r\n onResizeEnd(width, height);\r\n\r\n document.removeEventListener('pointermove', handlePointerMove);\r\n document.removeEventListener('pointerup', handlePointerUp);\r\n }\r\n };\r\n return (\r\n <div ref={controlWrapperRef}>\r\n <div\r\n className=\"image-resizer image-resizer-n\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-ne\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-e\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-se\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-s\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-sw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-w\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-nw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.west);\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\nexport default ImageResizer;",".ImageNode__contentEditable {\r\n min-height: 20px;\r\n border: 0px;\r\n resize: none;\r\n cursor: text;\r\n caret-color: rgb(5, 5, 5);\r\n display: block;\r\n position: relative;\r\n outline: 0px;\r\n padding: 10px;\r\n user-select: text;\r\n font-size: 12px;\r\n width: calc(100% - 20px);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n.ImageNode__placeholder {\r\n font-size: 12px;\r\n color: #888;\r\n overflow: hidden;\r\n position: absolute;\r\n text-overflow: ellipsis;\r\n top: 10px;\r\n left: 10px;\r\n user-select: none;\r\n white-space: nowrap;\r\n display: inline-block;\r\n pointer-events: none;\r\n}\r\n\r\n.image-control-wrapper--resizing {\r\n touch-action: none;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport type {\r\n BaseSelection,\r\n LexicalCommand,\r\n LexicalEditor,\r\n NodeKey\r\n} from 'lexical';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND\r\n} from 'lexical';\r\nimport { Suspense, useCallback, useEffect, useRef, useState } from 'react';\r\nimport ImageResizer from '../Utils/ImageResizer';\r\nimport './Image.css';\r\nimport { $isImageNode } from './ImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nexport const RIGHT_CLICK_IMAGE_COMMAND: LexicalCommand<MouseEvent> =\r\n createCommand('RIGHT_CLICK_IMAGE_COMMAND');\r\n\r\nconst useSuspenseImage = (src: string) => {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n img.onerror = () => {\r\n imageCache.add(src);\r\n };\r\n });\r\n }\r\n}\r\ninterface ILazyImageProps{\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n maxWidth: number;\r\n src: string;\r\n width: 'inherit' | number;\r\n onError: () => void; \r\n}\r\nconst LazyImage = ({ altText, imageRef, className, src, width, height, maxWidth, onError }: ILazyImageProps) => { \r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n style={{\r\n height,\r\n maxWidth,\r\n width,\r\n }}\r\n onError={onError}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\n\r\nconst BrokenImage = () => {\r\n return (\r\n <img\r\n src={'#'}\r\n alt={'broken-image'} \r\n style={{\r\n height: 200,\r\n opacity: 0.2,\r\n width: 200,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\ninterface IImageComponent{\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n maxWidth: number;\r\n nodeKey: NodeKey;\r\n resizable: boolean;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n captionsEnabled: boolean;\r\n}\r\nconst ImageComponent =({src,altText,nodeKey,width, height,maxWidth, resizable, showCaption, caption, captionsEnabled}: IImageComponent) => {\r\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const [isLoadError, setIsLoadError] = useState<boolean>(false);\r\n const [isResizing, setIsResizing] = useState<boolean>(false);\r\n const [editor] = useLexicalComposerContext();\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const isEditable = useLexicalEditable();\r\n\r\n const $onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isImageNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\r\n\r\n const $onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const $onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n const onClick = useCallback(\r\n (payload: MouseEvent) => {\r\n const event = payload;\r\n\r\n if (isResizing) {\r\n return true;\r\n }\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n [isResizing, isSelected, setSelected, clearSelection],\r\n );\r\n\r\n const onRightClick = useCallback(\r\n (event: MouseEvent): void => {\r\n editor.getEditorState().read(() => {\r\n const latestSelection = $getSelection();\r\n const domElement = event.target as HTMLElement;\r\n if (\r\n domElement.tagName === 'IMG' &&\r\n $isRangeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n editor.dispatchCommand(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n event as MouseEvent,\r\n );\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n useEffect(() => {\r\n const rootElement = editor.getRootElement();\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n const updatedSelection = editorState.read(() => $getSelection());\r\n if ($isNodeSelection(updatedSelection)) {\r\n setSelection(updatedSelection);\r\n } else {\r\n setSelection(null);\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n $onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n\r\n rootElement?.addEventListener('contextmenu', onRightClick);\r\n\r\n return () => {\r\n unregister();\r\n rootElement?.removeEventListener('contextmenu', onRightClick);\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isResizing,\r\n isSelected,\r\n nodeKey,\r\n $onDelete,\r\n $onEnter,\r\n $onEscape,\r\n onClick,\r\n onRightClick,\r\n setSelected,\r\n ]);\r\n\r\n const setShowCaption = () => {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setShowCaption(true);\r\n }\r\n });\r\n };\r\n\r\n const onResizeEnd = (\r\n nextWidth: 'inherit' | number,\r\n nextHeight: 'inherit' | number,\r\n ) => {\r\n // Delay hiding the resize bars for click case\r\n setTimeout(() => {\r\n setIsResizing(false);\r\n }, 200);\r\n\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setWidthAndHeight(nextWidth, nextHeight);\r\n }\r\n });\r\n };\r\n\r\n const onResizeStart = () => {\r\n setIsResizing(true);\r\n };\r\n\r\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n {isLoadError ? (\r\n <BrokenImage />\r\n ) : (\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n maxWidth={maxWidth}\r\n onError={() => setIsLoadError(true)}\r\n />\r\n )}\r\n </div>\r\n {resizable && $isNodeSelection(selection) && isFocused && (\r\n <ImageResizer\r\n showCaption={showCaption}\r\n setShowCaption={setShowCaption}\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n imageRef={imageRef}\r\n maxWidth={maxWidth}\r\n onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n captionsEnabled={!isLoadError && captionsEnabled}\r\n />\r\n )}\r\n </>\r\n </Suspense>\r\n );\r\n}\r\nexport default ImageComponent;\r\n","import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedEditor,\r\n SerializedLexicalNode,\r\n Spread,\r\n} from 'lexical';\r\nimport { $applyNodeReplacement, createEditor, DecoratorNode } from 'lexical';\r\nimport * as React from 'react';\r\n\r\nconst ImageComponent = React.lazy(() => import('./ImageComponent'));\r\n\r\nexport interface ImagePayload {\r\n altText: string;\r\n caption?: LexicalEditor;\r\n height?: number | 'inherit';\r\n key?: NodeKey;\r\n maxWidth?: number;\r\n showCaption?: boolean;\r\n src: string;\r\n width?: number | 'inherit';\r\n captionsEnabled?: boolean;\r\n}\r\n\r\nconst isGoogleDocCheckboxImg = (img: HTMLImageElement) => {\r\n return (\r\n img.parentElement != null &&\r\n img.parentElement.tagName === 'LI' &&\r\n img.previousSibling === null &&\r\n img.getAttribute('aria-roledescription') === 'checkbox'\r\n );\r\n};\r\n\r\nfunction parsePx(value: string | null | undefined): number | undefined {\r\n if (!value) return undefined;\r\n const v = value.trim();\r\n // \"120px\" -> 120, \"120\" -> 120\r\n const n = Number(v.replace(/px$/i, ''));\r\n return Number.isFinite(n) ? n : undefined;\r\n}\r\n\r\nfunction parseDimFromStyleOrAttr(img: HTMLImageElement): { width?: number; height?: number } {\r\n // Priority:\r\n // 1) width/height attributes\r\n // 2) inline style width/height\r\n // 3) DOM properties (img.width/img.height)\r\n const wAttr = parsePx(img.getAttribute('width'));\r\n const hAttr = parsePx(img.getAttribute('height'));\r\n\r\n const wStyle = parsePx(img.style?.width);\r\n const hStyle = parsePx(img.style?.height);\r\n\r\n // img.width/img.height are numbers but can be 0 before load; still useful sometimes\r\n const wProp = img.width || undefined;\r\n const hProp = img.height || undefined;\r\n\r\n return {\r\n width: wAttr ?? wStyle ?? wProp,\r\n height: hAttr ?? hStyle ?? hProp,\r\n };\r\n}\r\n\r\nconst $convertImageElement = (domNode: Node): null | DOMConversionOutput => {\r\n const img = domNode as HTMLImageElement;\r\n\r\n if (!img || img.tagName !== 'IMG') return null;\r\n if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {\r\n return null;\r\n }\r\n\r\n const altText = img.getAttribute('alt') ?? img.alt ?? '';\r\n const src = img.getAttribute('src') ?? img.src ?? '';\r\n\r\n // IMPORTANT: Preserve signature scaling.\r\n const { width, height } = parseDimFromStyleOrAttr(img);\r\n\r\n // Optional: support max-width from inline styles if present\r\n // e.g. style=\"max-width: 220px\"\r\n const maxWidth = parsePx(img.style?.maxWidth);\r\n\r\n const node = $createImageNode({\r\n altText,\r\n src,\r\n width: width ?? 'inherit',\r\n height: height ?? 'inherit',\r\n maxWidth: maxWidth ?? 500,\r\n });\r\n\r\n return { node };\r\n};\r\n\r\nexport type SerializedImageNode = Spread<\r\n {\r\n altText: string;\r\n caption: SerializedEditor;\r\n height?: number;\r\n maxWidth: number;\r\n showCaption: boolean;\r\n src: string;\r\n width?: number;\r\n captionsEnabled?: boolean;\r\n },\r\n SerializedLexicalNode\r\n>;\r\n\r\nexport class ImageNode extends DecoratorNode<JSX.Element> {\r\n __src: string;\r\n __altText: string;\r\n __width: 'inherit' | number;\r\n __height: 'inherit' | number;\r\n __maxWidth: number;\r\n __showCaption: boolean;\r\n __caption: LexicalEditor;\r\n // Captions cannot yet be used within editor cells\r\n __captionsEnabled: boolean;\r\n\r\n static getType(): string {\r\n return 'image';\r\n }\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(\r\n node.__src,\r\n node.__altText,\r\n node.__maxWidth,\r\n node.__width,\r\n node.__height,\r\n node.__showCaption,\r\n node.__caption,\r\n node.__captionsEnabled,\r\n node.__key\r\n );\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n const { altText, height, width, maxWidth, src, showCaption, captionsEnabled } = serializedNode;\r\n\r\n // Note: exportJSON stores 0 for inherit. Convert back.\r\n const normalizedWidth = width && width > 0 ? width : 'inherit';\r\n const normalizedHeight = height && height > 0 ? height : 'inherit';\r\n\r\n return $createImageNode({\r\n altText,\r\n height: normalizedHeight,\r\n width: normalizedWidth,\r\n maxWidth,\r\n showCaption,\r\n src,\r\n captionsEnabled,\r\n }).updateFromJSON(serializedNode);\r\n }\r\n\r\n updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedImageNode>): this {\r\n const node = super.updateFromJSON(serializedNode);\r\n const { caption } = serializedNode;\r\n\r\n const nestedEditor = node.__caption;\r\n const editorState = nestedEditor.parseEditorState(caption.editorState);\r\n if (!editorState.isEmpty()) {\r\n nestedEditor.setEditorState(editorState);\r\n }\r\n return node;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('img');\r\n element.setAttribute('src', this.__src);\r\n element.setAttribute('alt', this.__altText);\r\n\r\n // Preserve sizing for signatures: use width/height attributes + inline style\r\n if (this.__width !== 'inherit') {\r\n element.setAttribute('width', String(this.__width));\r\n element.style.width = `${this.__width}px`;\r\n }\r\n if (this.__height !== 'inherit') {\r\n element.setAttribute('height', String(this.__height));\r\n element.style.height = `${this.__height}px`;\r\n }\r\n\r\n // Preserve maxWidth behavior if set\r\n if (this.__maxWidth && this.__maxWidth > 0) {\r\n element.style.maxWidth = `${this.__maxWidth}px`;\r\n }\r\n\r\n return { element };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: () => ({\r\n conversion: $convertImageElement,\r\n priority: 2,\r\n }),\r\n };\r\n }\r\n\r\n constructor(\r\n src: string,\r\n altText: string,\r\n maxWidth: number,\r\n width?: 'inherit' | number,\r\n height?: 'inherit' | number,\r\n showCaption?: boolean,\r\n caption?: LexicalEditor,\r\n captionsEnabled?: boolean,\r\n key?: NodeKey\r\n ) {\r\n super(key);\r\n this.__src = src;\r\n this.__altText = altText;\r\n this.__maxWidth = maxWidth;\r\n this.__width = width ?? 'inherit';\r\n this.__height = height ?? 'inherit';\r\n this.__showCaption = showCaption ?? false;\r\n this.__caption =\r\n caption ||\r\n createEditor({\r\n nodes: [],\r\n });\r\n this.__captionsEnabled = captionsEnabled ?? true;\r\n }\r\n\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n altText: this.getAltText(),\r\n caption: this.__caption.toJSON(),\r\n height: this.__height === 'inherit' ? 0 : this.__height,\r\n maxWidth: this.__maxWidth,\r\n showCaption: this.__showCaption,\r\n src: this.getSrc(),\r\n width: this.__width === 'inherit' ? 0 : this.__width,\r\n captionsEnabled: this.__captionsEnabled,\r\n };\r\n }\r\n\r\n setWidthAndHeight(width: 'inherit' | number, height: 'inherit' | number): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\r\n }\r\n\r\n setShowCaption(showCaption: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__showCaption = showCaption;\r\n }\r\n\r\n // View\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const span = document.createElement('span');\r\n const theme = config.theme;\r\n const className = theme.image;\r\n if (className !== undefined) {\r\n span.className = className;\r\n } else {\r\n // fallback so your CSS `.editor-image ...` still applies even if theme.image isn't set\r\n span.className = 'editor-image';\r\n }\r\n return span;\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getSrc(): string {\r\n return this.__src;\r\n }\r\n\r\n getAltText(): string {\r\n return this.__altText;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return (\r\n <ImageComponent\r\n src={this.__src}\r\n altText={this.__altText}\r\n width={this.__width}\r\n height={this.__height}\r\n maxWidth={this.__maxWidth}\r\n nodeKey={this.getKey()}\r\n showCaption={this.__showCaption}\r\n caption={this.__caption}\r\n captionsEnabled={this.__captionsEnabled}\r\n resizable={true}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport const $createImageNode = ({\r\n altText,\r\n height,\r\n maxWidth = 500,\r\n captionsEnabled,\r\n src,\r\n width,\r\n showCaption,\r\n caption,\r\n key,\r\n}: ImagePayload): ImageNode => {\r\n return $applyNodeReplacement(\r\n new ImageNode(\r\n src,\r\n altText,\r\n maxWidth,\r\n (width as any) ?? 'inherit',\r\n (height as any) ?? 'inherit',\r\n showCaption,\r\n caption,\r\n captionsEnabled,\r\n key\r\n )\r\n );\r\n};\r\n\r\nexport const $isImageNode = (node: LexicalNode | null | undefined): node is ImageNode => {\r\n return node instanceof ImageNode;\r\n};\r\n",".InlineImageNode__contentEditable {\r\n min-height: 20px;\r\n border: 0px;\r\n resize: none;\r\n cursor: text;\r\n caret-color: rgb(5, 5, 5);\r\n display: block;\r\n position: relative;\r\n tab-size: 1;\r\n outline: 0px;\r\n padding: 10px;\r\n user-select: text;\r\n font-size: 14px;\r\n line-height: 1.4em;\r\n width: calc(100% - 20px);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n.InlineImageNode__placeholder {\r\n font-size: 12px;\r\n color: #888;\r\n overflow: hidden;\r\n position: absolute;\r\n text-overflow: ellipsis;\r\n bottom: 10px;\r\n left: 10px;\r\n user-select: none;\r\n white-space: nowrap;\r\n display: inline-block;\r\n pointer-events: none;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked,\r\n.InlineImageNode_Checkbox:not(:checked) {\r\n position: absolute;\r\n left: -9999px;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label,\r\n.InlineImageNode_Checkbox:not(:checked) + label {\r\n position: absolute;\r\n padding-right: 55px;\r\n cursor: pointer;\r\n line-height: 20px;\r\n display: inline-block;\r\n color: #666;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:before,\r\n.InlineImageNode_Checkbox:not(:checked) + label:before {\r\n content: '';\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n width: 18px;\r\n height: 18px;\r\n border: 1px solid #666;\r\n background: #fff;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:after,\r\n.InlineImageNode_Checkbox:not(:checked) + label:after {\r\n content: '';\r\n width: 8px;\r\n height: 8px;\r\n background: #222222;\r\n position: absolute;\r\n top: 6px;\r\n right: 6px;\r\n -webkit-transition: all 0.2s ease;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.InlineImageNode_Checkbox:not(:checked) + label:after {\r\n opacity: 0;\r\n -webkit-transform: scale(0);\r\n transform: scale(0);\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:after {\r\n opacity: 1;\r\n -webkit-transform: scale(1);\r\n transform: scale(1);\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport type { BaseSelection, LexicalEditor, NodeKey } from 'lexical';\r\nimport {\r\n $getSelection,\r\n $isNodeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND\r\n} from 'lexical';\r\nimport { Suspense, useCallback, useEffect, useRef, useState } from 'react';\r\nimport './InlineImage.css';\r\nimport type { Position } from './InlineImageNode';\r\nimport { $isInlineImageNode } from './InlineImageNode';\r\nconst imageCache = new Set();\r\n\r\nconst useSuspenseImage = (src: string) => {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n}\r\ninterface ILazyImageProps{\r\n src: string;\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n width: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n position: Position;\r\n}\r\nconst LazyImage = ({ altText, className, imageRef, src, width, height, position}:ILazyImageProps): JSX.Element => {\r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n data-position={position}\r\n style={{\r\n display: 'block',\r\n height,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\ninterface IInlineImageComponent{\r\n altText: string;\r\n src: string;\r\n caption: LexicalEditor;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n width: 'inherit' | number;\r\n height: 'inherit' | number;\r\n position: Position;\r\n}\r\nconst InlineImageComponent = ({ src, altText, nodeKey, width, height, showCaption, caption, position }: IInlineImageComponent): JSX.Element => {\r\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [editor] = useLexicalComposerContext();\r\n const isEditable = useLexicalEditable();\r\n\r\n const $onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\r\n\r\n const $onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const $onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n $onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n $onDelete,\r\n $onEnter,\r\n $onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n <span draggable={draggable}>\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n position={position}\r\n />\r\n </span>\r\n </Suspense>\r\n );\r\n}\r\nexport default InlineImageComponent;","import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedEditor,\r\n SerializedLexicalNode,\r\n Spread\r\n} from 'lexical';\r\nimport {\r\n $applyNodeReplacement,\r\n createEditor,\r\n DecoratorNode,\r\n isHTMLElement\r\n} from 'lexical';\r\nimport type { JSX } from 'react';\r\nimport * as React from 'react';\r\n\r\nconst InlineImageComponent = React.lazy(() => import('./InlineImageComponent'));\r\n\r\nexport type Position = 'left' | 'right' | 'full' | undefined;\r\n\r\nexport interface InlineImagePayload {\r\n altText: string;\r\n caption?: LexicalEditor;\r\n height?: number;\r\n key?: NodeKey;\r\n showCaption?: boolean;\r\n src: string;\r\n width?: number;\r\n position?: Position;\r\n}\r\n\r\nexport interface UpdateInlineImagePayload {\r\n altText?: string;\r\n showCaption?: boolean;\r\n position?: Position;\r\n}\r\n\r\nconst $convertInlineImageElement = (domNode: Node): null | DOMConversionOutput => {\r\n if (isHTMLElement(domNode) && domNode.nodeName === 'IMG') {\r\n const {alt: altText, src, width, height} = domNode as HTMLImageElement;\r\n const node = $createInlineImageNode({altText, height, src, width});\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport type SerializedInlineImageNode = Spread<\r\n {\r\n altText: string;\r\n caption: SerializedEditor;\r\n height?: number;\r\n showCaption: boolean;\r\n src: string;\r\n width?: number;\r\n position?: Position;\r\n },\r\n SerializedLexicalNode\r\n>;\r\n\r\nexport class InlineImageNode extends DecoratorNode<JSX.Element> {\r\n __src: string;\r\n __altText: string;\r\n __width: 'inherit' | number;\r\n __height: 'inherit' | number;\r\n __showCaption: boolean;\r\n __caption: LexicalEditor;\r\n __position: Position;\r\n\r\n static getType(): string {\r\n return 'inline-image';\r\n }\r\n\r\n static clone(node: InlineImageNode): InlineImageNode {\r\n return new InlineImageNode(\r\n node.__src,\r\n node.__altText,\r\n node.__position,\r\n node.__width,\r\n node.__height,\r\n node.__showCaption,\r\n node.__caption,\r\n node.__key,\r\n );\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedInlineImageNode,\r\n ): InlineImageNode {\r\n const {altText, height, width, src, showCaption, position} = serializedNode;\r\n return $createInlineImageNode({\r\n altText,\r\n height,\r\n position,\r\n showCaption,\r\n src,\r\n width,\r\n }).updateFromJSON(serializedNode);\r\n }\r\n\r\n updateFromJSON(\r\n serializedNode: LexicalUpdateJSON<SerializedInlineImageNode>,\r\n ): this {\r\n const {caption} = serializedNode;\r\n const node = super.updateFromJSON(serializedNode);\r\n const nestedEditor = node.__caption;\r\n const editorState = nestedEditor.parseEditorState(caption.editorState);\r\n if (!editorState.isEmpty()) {\r\n nestedEditor.setEditorState(editorState);\r\n }\r\n return node;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (node: Node) => ({\r\n conversion: $convertInlineImageElement,\r\n priority: 0,\r\n }),\r\n };\r\n }\r\n\r\n constructor(\r\n src: string,\r\n altText: string,\r\n position: Position,\r\n width?: 'inherit' | number,\r\n height?: 'inherit' | number,\r\n showCaption?: boolean,\r\n caption?: LexicalEditor,\r\n key?: NodeKey,\r\n ) {\r\n super(key);\r\n this.__src = src;\r\n this.__altText = altText;\r\n this.__width = width || 'inherit';\r\n this.__height = height || 'inherit';\r\n this.__showCaption = showCaption || false;\r\n this.__caption = caption || createEditor();\r\n this.__position = position;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('img');\r\n element.setAttribute('src', this.__src);\r\n element.setAttribute('alt', this.__altText);\r\n element.setAttribute('width', this.__width.toString());\r\n element.setAttribute('height', this.__height.toString());\r\n return {element};\r\n }\r\n\r\n exportJSON(): SerializedInlineImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n altText: this.getAltText(),\r\n caption: this.__caption.toJSON(),\r\n height: this.__height === 'inherit' ? 0 : this.__height,\r\n position: this.__position,\r\n showCaption: this.__showCaption,\r\n src: this.getSrc(),\r\n width: this.__width === 'inherit' ? 0 : this.__width,\r\n };\r\n }\r\n\r\n getSrc(): string {\r\n return this.__src;\r\n }\r\n\r\n getAltText(): string {\r\n return this.__altText;\r\n }\r\n\r\n setAltText(altText: string): void {\r\n const writable = this.getWritable();\r\n writable.__altText = altText;\r\n }\r\n\r\n setWidthAndHeight(\r\n width: 'inherit' | number,\r\n height: 'inherit' | number,\r\n ): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\r\n }\r\n\r\n getShowCaption(): boolean {\r\n return this.__showCaption;\r\n }\r\n\r\n setShowCaption(showCaption: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__showCaption = showCaption;\r\n }\r\n\r\n getPosition(): Position {\r\n return this.__position;\r\n }\r\n\r\n setPosition(position: Position): void {\r\n const writable = this.getWritable();\r\n writable.__position = position;\r\n }\r\n\r\n update(payload: UpdateInlineImagePayload): void {\r\n const writable = this.getWritable();\r\n const {altText, showCaption, position} = payload;\r\n if (altText !== undefined) {\r\n writable.__altText = altText;\r\n }\r\n if (showCaption !== undefined) {\r\n writable.__showCaption = showCaption;\r\n }\r\n if (position !== undefined) {\r\n writable.__position = position;\r\n }\r\n }\r\n\r\n // View\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const span = document.createElement('span');\r\n const className = `${config.theme.inlineImage} position-${this.__position}`;\r\n if (className !== undefined) {\r\n span.className = className;\r\n }\r\n return span;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): false {\r\n const position = this.__position;\r\n if (position !== prevNode.__position) {\r\n const className = `${config.theme.inlineImage} position-${position}`;\r\n if (className !== undefined) {\r\n dom.className = className;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return (\r\n <InlineImageComponent\r\n src={this.__src}\r\n altText={this.__altText}\r\n width={this.__width}\r\n height={this.__height}\r\n nodeKey={this.getKey()}\r\n showCaption={this.__showCaption}\r\n caption={this.__caption}\r\n position={this.__position}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport const $createInlineImageNode = ({ altText, position, height, src, width, showCaption, caption, key }: InlineImagePayload): InlineImageNode => {\r\n return $applyNodeReplacement(\r\n new InlineImageNode( src, altText, position, width, height, showCaption, caption, key ),\r\n );\r\n}\r\n\r\nexport const $isInlineImageNode = ( node: LexicalNode | null | undefined): node is InlineImageNode => {\r\n return node instanceof InlineImageNode;\r\n}\r\n","/** How the suggestion was accepted */\r\n/**\r\n * How an inline suggestion was accepted/committed by the user.\r\n *\r\n * - 'tab': Accepted via the Tab key (or ArrowRight)\r\n * - 'enter': Accepted via the Enter key\r\n * - 'click': Accepted by clicking on a suggestion item\r\n */\r\nexport type AcceptMethod = 'tab' | 'enter' | 'click';\r\n/** What the consumer returns for autocomplete requests */\r\nexport type SearchPromise = {\r\n promise: Promise<string[] | null>;\r\n dismiss: () => void;\r\n};\r\n// ─── Spell / Grammar check types ────────────────────────────────────────────\r\n/**\r\n * A single spelling, grammar, or style issue returned by your API.\r\n *\r\n * `offset` and `length` are character positions in the plain-text\r\n * representation of the document (`editor.getRootElement().innerText`).\r\n */\r\nexport type SpellCheckIssue = {\r\n /** Character offset in the document's plain text */\r\n offset: number;\r\n /** Number of characters the issue spans */\r\n length: number;\r\n /** Human-readable description shown in the suggestion popover */\r\n message: string;\r\n /** Replacement candidates, best first */\r\n suggestions: string[];\r\n /** Visual style of the underline: red = spelling, blue = grammar, yellow = style */\r\n type?: 'spelling' | 'grammar' | 'style';\r\n /** Actual word as it appears in the text (set by adapter) */\r\n word?: string;\r\n};\r\n/**\r\n * Return value of `useSpellCheck`.\r\n *\r\n * `promise` resolves to an object containing:\r\n * - `issues` — individual misspelled words to underline\r\n * - `improvedText`— the fully corrected sentence (like Grammarly's \"Accept all\")\r\n */\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n// ─── Editor level ────────────────────────────────────────────────────────────\r\n/**\r\n * Editor capability levels controlling which toolbar features are enabled.\r\n *\r\n * - none: No toolbar shown\r\n * - basic: Minimal formatting (bold/italic/underline), lists, links\r\n * - standard: Common formatting plus media (images, tables, etc.)\r\n * - pro: Full feature set (advanced blocks and tools)\r\n */\r\nexport enum ContentEditorLevel {\r\n None = 'none',\r\n Basic = 'basic',\r\n Standard = 'standard',\r\n Pro = 'pro',\r\n}\r\n/**\r\n * INTERNAL: Block specification used by the ref API.\r\n *\r\n * Not exported from the package root to avoid locking\r\n * implementation details. Subject to change without notice.\r\n */\r\ntype BlockSpec = {\r\n kind: string;\r\n html: string;\r\n position?: 'start' | 'end';\r\n};\r\n/**\r\n * Public, imperative API exposed via the component ref.\r\n *\r\n * Allows programmatic read/write, focus control, and state checks.\r\n */\r\nexport type ContentEditorRef = {\r\n /** Replace the entire document content with the provided HTML. */\r\n setValue: (html: string) => void;\r\n /** Return the current document as HTML. */\r\n getValue: () => string;\r\n /** Clear the document to an empty state. */\r\n clear: () => void;\r\n /** Move focus to the editable area. */\r\n focus: () => void;\r\n /** Remove focus from the editable area. */\r\n blur: () => void;\r\n /** Whether the editor currently contains no user content. */\r\n isEmpty: () => boolean;\r\n /** Whether the editor currently has input focus. */\r\n isFocused: () => boolean;\r\n /**\r\n * Access the underlying Lexical editor instance for advanced usage.\r\n * Returned type is `any` to avoid leaking internal Lexical types.\r\n */\r\n getEditor: () => any;\r\n /**\r\n * Insert or update a block identified by `spec.kind`.\r\n *\r\n * If a block with the same `kind` exists, it will be updated;\r\n * otherwise a new block is inserted. `position` controls whether\r\n * the insertion occurs at the document 'start' or 'end'.\r\n */\r\n upsertBlock: (spec: BlockSpec) => void;\r\n /** Remove a previously inserted block by its `kind` identifier. */\r\n removeBlock: (kind: string) => void;\r\n /** Check whether a block with the given `kind` exists. */\r\n hasBlock: (kind: string) => boolean;\r\n};\r\n// ─── Component props ─────────────────────────────────────────────────────────\r\nexport interface ContentEditorProps {\r\n /** Optional editor namespace used by Lexical for scoping. */\r\n namespace?: string;\r\n /** Controlled HTML value rendered by the editor. */\r\n value: string;\r\n /** Outer container width (e.g., '100%', '600px'). */\r\n width?: string;\r\n /** Outer container height (e.g., '100%', '400px'). */\r\n height?: string;\r\n /** When true, focuses the editor on mount. */\r\n autoFocus?: boolean;\r\n /** CSS margin applied to the root container. */\r\n margin?: string | number;\r\n /** Placeholder text shown when the editor is empty. */\r\n placeholder?: string;\r\n /** Height of the editable content area inside the container. */\r\n contentHeight?: string;\r\n /** Feature level controlling which toolbar groups are enabled. */\r\n level?: ContentEditorLevel;\r\n /**\r\n * @deprecated Not used by the component. Prefer styling overrides instead.\r\n */\r\n topPlaceholderMargin?: string;\r\n /** Change handler returning the latest HTML value. */\r\n onChange: (value: string) => void;\r\n /** When true, the editor becomes read-only (non-interactive). */\r\n readOnly?: boolean;\r\n /**\r\n * @deprecated Legacy flag intended to show a clear button.\r\n * This is currently not wired in the UI.\r\n */\r\n clearEditorMode?: boolean;\r\n // ── Autocomplete ───────────────────────────────────────────────────────────\r\n /**\r\n * Simple autocomplete — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, and ghost-text\r\n * insertion internally. Return the raw API response — supported shapes:\r\n * - `{ generated_text: string }` — single suggestion\r\n * - `string[]` — list of suggestions\r\n * - `null / undefined` — no suggestion\r\n *\r\n * Example:\r\n * ```ts\r\n * suggestFn={async (text) => {\r\n * const res = await fetch('/api/suggest', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n suggestFn?: (text: string, cursorIndex?: number) => Promise<any>;\r\n /**\r\n * Advanced: full control over autocomplete with manual cancellation.\r\n * Use `suggestFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n /** Called when the editor gains focus. */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus. */\r\n onBlur?: () => void;\r\n /**\r\n * Fires when the user **accepts** an autocomplete suggestion (Tab / ArrowRight).\r\n *\r\n * Use this to send a reward signal to your backend so the model improves\r\n * over time. Example:\r\n * ```ts\r\n * onSuggestionAccept={({ suggestionText, triggerText, method }) => {\r\n * sendReward({ suggestionText, triggerText }); // hits your reward API\r\n * }}\r\n * ```\r\n */\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n /**\r\n * Fires when a suggestion is displayed to the user (optional analytics hook).\r\n */\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n // ── Spell / Grammar check ──────────────────────────────────────────────────\r\n /**\r\n * Simple spell/grammar check — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, response adaptation,\r\n * underlines, and popovers internally. Supported API response shapes:\r\n * - `{ misspelled_words: string[], suggestions: Record<string, string[]>, grammar_correction?: string }`\r\n * - `{ misspelled: string[], suggestions: Record<string, string[]>, improved_text?: string }`\r\n * - `SpellCheckIssue[]` (legacy — already-adapted array)\r\n *\r\n * Example:\r\n * ```ts\r\n * spellCheckFn={async (text) => {\r\n * const res = await fetch('/api/spellcheck', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n spellCheckFn?: (text: string) => Promise<any>;\r\n /**\r\n * Advanced: full control over spell check with manual cancellation.\r\n * Use `spellCheckFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /**\r\n * Fires when the user accepts a spell/grammar correction from the popover.\r\n *\r\n * Use this to POST a reward signal to your backend.\r\n * ```ts\r\n * onSpellCheckAccept={({ original, replacement, message, type }) => {\r\n * myApi.rewardSpellCheck({ original, replacement });\r\n * }}\r\n * ```\r\n */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the spell-check\r\n * API is called. Defaults to 1200ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n spellCheckIdleMs?: number;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the `suggestFn`\r\n * API is called. Defaults to 300ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n suggestIdleMs?: number;\r\n /** When false, spell checking is disabled without unmounting the plugin. */\r\n spellCheckEnabled?: boolean;\r\n // ── Floating toolbar ───────────────────────────────────────────────────────\r\n /** When true, shows the floating formatting toolbar near text selections. */\r\n showFloatingToolbar?: boolean;\r\n /**\r\n * Maximum word count allowed. When set, a live counter is shown\r\n * below the editor. Exceeding the limit turns the counter red.\r\n * Example: wordLimit={500}\r\n */\r\n wordLimit?: number;\r\n\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n *\r\n * - exceeded: true -> user just exceeded the limit\r\n * - exceeded: false -> user came back within the limit\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n}\r\n","import type { DOMExportOutput, EditorConfig, NodeKey, SerializedTextNode, Spread } from 'lexical';\r\nimport { TextNode } from 'lexical';\r\n\r\nexport type SerializedAutocompleteNode = Spread<{ uuid: string }, SerializedTextNode>;\r\n\r\nexport class AutocompleteNode extends TextNode {\r\n __uuid: string;\r\n\r\n static getType(): 'autocomplete' {\r\n return 'autocomplete';\r\n }\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 importJSON(serializedNode: SerializedAutocompleteNode): AutocompleteNode {\r\n return new AutocompleteNode(serializedNode.text, serializedNode.uuid);\r\n }\r\n\r\n exportJSON(): SerializedAutocompleteNode {\r\n return { ...super.exportJSON(), uuid: this.__uuid };\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 createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config);\r\n dom.classList.add(config.theme?.autocomplete || 'autocomplete-node');\r\n dom.style.color = '#a79e9e';\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: AutocompleteNode): boolean {\r\n return this.__uuid !== prevNode.__uuid || this.__text !== prevNode.__text;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const dom = document.createElement('span');\r\n dom.textContent = this.__text;\r\n dom.style.color = '#a79e9e';\r\n return { element: dom };\r\n }\r\n\r\n excludeFromCopy() {\r\n return true;\r\n }\r\n}\r\n\r\nexport const $createAutocompleteNode = (text: string, uuid: string) =>\r\n new AutocompleteNode(text, uuid);\r\n","import {\r\n $applyNodeReplacement,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n ElementNode,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nexport type SerializedHtmlBlockNode = SerializedElementNode & {\r\n type: 'htmlblock';\r\n version: 1;\r\n kind: string;\r\n};\r\n\r\nfunction convertHtmlBlockDiv(domNode: HTMLElement): DOMConversionOutput {\r\n const kind = domNode.getAttribute('data-kind') || 'unknown';\r\n return { node: $createHtmlBlockNode(kind) };\r\n}\r\n\r\nexport class HtmlBlockNode extends ElementNode {\r\n __kind: string;\r\n\r\n static getType(): string {\r\n return 'htmlblock';\r\n }\r\n\r\n static clone(node: HtmlBlockNode): HtmlBlockNode {\r\n return new HtmlBlockNode(node.__kind, node.__key);\r\n }\r\n\r\n constructor(kind: string, key?: NodeKey) {\r\n super(key);\r\n this.__kind = kind;\r\n }\r\n\r\n getKind(): string {\r\n return this.getLatest().__kind;\r\n }\r\n\r\n setKind(kind: string) {\r\n const writable = this.getWritable();\r\n writable.__kind = kind;\r\n }\r\n\r\n createDOM(): HTMLElement {\r\n const el = document.createElement('div');\r\n el.setAttribute('data-lex-block', 'true');\r\n el.setAttribute('data-kind', this.__kind);\r\n return el;\r\n }\r\n\r\n updateDOM(prevNode: HtmlBlockNode, dom: HTMLElement): boolean {\r\n if (prevNode.__kind !== this.__kind) {\r\n dom.setAttribute('data-kind', this.__kind);\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: Node) => {\r\n if (domNode instanceof HTMLElement && domNode.getAttribute('data-lex-block') === 'true') {\r\n return {\r\n conversion: (node: Node) => convertHtmlBlockDiv(node as HTMLElement),\r\n priority: 2,\r\n };\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const el = document.createElement('div');\r\n el.setAttribute('data-lex-block', 'true');\r\n el.setAttribute('data-kind', this.__kind);\r\n return { element: el };\r\n }\r\n\r\n exportJSON(): SerializedHtmlBlockNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: 'htmlblock',\r\n version: 1,\r\n kind: this.__kind,\r\n };\r\n }\r\n\r\n static importJSON(serializedNode: SerializedHtmlBlockNode): HtmlBlockNode {\r\n return $createHtmlBlockNode(serializedNode.kind);\r\n }\r\n}\r\n\r\nexport function $createHtmlBlockNode(kind: string): HtmlBlockNode {\r\n return $applyNodeReplacement(new HtmlBlockNode(kind));\r\n}\r\n\r\nexport function $isHtmlBlockNode(node: LexicalNode | null | undefined): node is HtmlBlockNode {\r\n return node instanceof HtmlBlockNode;\r\n}\r\n","import { css, mergeStyleSets, Stack } from '@fluentui/react';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code';\r\nimport { AutoLinkNode, LinkNode } from '@lexical/link';\r\nimport { ListItemNode, ListNode } from '@lexical/list';\r\nimport { AutoFocusPlugin } from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport { AutoLinkPlugin, createLinkMatcherWithRegExp } from '@lexical/react/LexicalAutoLinkPlugin';\r\nimport { LexicalComposer } from '@lexical/react/LexicalComposer';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable';\r\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\r\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\r\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin';\r\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\r\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\r\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin';\r\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text';\r\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\r\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { $setSelection } from 'lexical';\r\n\r\nimport {\r\n ContentEditorLevel,\r\n ContentEditorProps,\r\n ContentEditorRef,\r\n SearchPromise,\r\n SpellCheckIssue,\r\n SpellCheckPayload,\r\n SpellCheckResult,\r\n} from './ContentEditorComponent.types';\r\n\r\nimport './Editor.css';\r\n\r\nimport { AutocompleteNode } from './Nodes/AutoCompleteNode';\r\nimport { HtmlBlockNode } from './Nodes/HtmlBlockNode';\r\nimport { ImageNode } from './Nodes/ImageNode';\r\nimport { InlineImageNode } from './Nodes/InlineImageNode';\r\nimport { PageBreakNode } from './Nodes/PageBreakNode';\r\nimport { SpellErrorNode } from './Nodes/SpellErrorNode';\r\nimport { YouTubeNode } from './Nodes/YoutubeNode';\r\n\r\nimport AutocompletePlugin from './Plugins/AutoComplete';\r\nimport CharacterStylesPopupPlugin from './Plugins/CharacterStylesPopupPlugin';\r\nimport { CustomOnChangePlugin } from './Plugins/CustomOnChange';\r\nimport { FloatingLinkEditorPlugin } from './Plugins/FloatLinkEditor';\r\nimport ImagesPlugin from './Plugins/ImagePlugin';\r\nimport InlineImagePlugin from './Plugins/InlineImage';\r\nimport PageBreakPlugin from './Plugins/PageBreak';\r\nimport RefApiPlugin from './Plugins/RefApiPlugin';\r\nimport SpellCheckPlugin from './Plugins/Spellcheckplugin';\r\nimport TableActionMenuPlugin from './Plugins/TableActionMenuPlugin';\r\nimport TableCellResizerPlugin from './Plugins/TableCellResizer';\r\nimport { ToolBarPlugins } from './Plugins/ToolBar';\r\nimport YoutubeDeletePlugin from './Plugins/YoutubeDeletePlugin';\r\nimport { theme } from './Theme';\r\n\r\nfunction ReadOnlyPlugin({ readonly }: { readonly: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n editor.setEditable(!readonly);\r\n }, [editor, readonly]);\r\n return null;\r\n}\r\n\r\nfunction BrowserSpellCheckPlugin({ enabled }: { enabled: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n const el = editor.getRootElement();\r\n if (!el) return;\r\n el.spellcheck = enabled;\r\n return editor.registerRootListener((nextRoot, prevRoot) => {\r\n if (prevRoot) prevRoot.spellcheck = false;\r\n if (nextRoot) nextRoot.spellcheck = enabled;\r\n });\r\n }, [editor, enabled]);\r\n return null;\r\n}\r\n\r\nfunction WordCountPlugin({ onCountChange }: { onCountChange: (count: number) => void }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n return editor.registerUpdateListener(() => {\r\n const text = editor.getRootElement()?.innerText ?? '';\r\n const words = text.trim() === '' ? 0 : text.trim().split(/\\s+/).length;\r\n onCountChange(words);\r\n });\r\n }, [editor, onCountChange]);\r\n return null;\r\n}\r\n\r\nfunction FocusEventsPlugin({\r\n onFocus,\r\n onBlur,\r\n setFocused,\r\n}: {\r\n onFocus?: () => void;\r\n onBlur?: () => void;\r\n setFocused: (focused: boolean) => void;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const handleFocusIn = () => {\r\n setFocused(true);\r\n onFocus?.();\r\n };\r\n\r\n const handleFocusOut = (e: FocusEvent) => {\r\n const next = e.relatedTarget as Node | null;\r\n const stillInside = !!next && root.contains(next);\r\n if (stillInside) return;\r\n\r\n editor.update(() => {\r\n $setSelection(null);\r\n });\r\n\r\n setFocused(false);\r\n onBlur?.();\r\n };\r\n\r\n root.addEventListener('focusin', handleFocusIn);\r\n root.addEventListener('focusout', handleFocusOut);\r\n\r\n return () => {\r\n root.removeEventListener('focusin', handleFocusIn);\r\n root.removeEventListener('focusout', handleFocusOut);\r\n };\r\n }, [editor, onBlur, onFocus, setFocused]);\r\n\r\n return null;\r\n}\r\n\r\nconst URL_REGEX =\r\n /(https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|www\\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9]+\\.[^\\s]{2,}|www\\.[a-zA-Z0-9]+\\.[^\\s]{2,})/;\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) => text),\r\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => `mailto:${text}`),\r\n];\r\n\r\n// ─── Internal adapters for spellCheckFn / suggestFn ──────────────────────────\r\n// These let consumers pass a plain async function instead of the full\r\n// SpellCheckResult / SearchPromise shape. The component wraps it internally.\r\n\r\nfunction _escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nfunction _matchFrom(\r\n text: string,\r\n regex: RegExp,\r\n from: number,\r\n): { offset: number; actualWord: string } | null {\r\n const m = text.slice(from).match(regex);\r\n if (!m || m.index == null) return null;\r\n return { offset: from + m.index, actualWord: m[0] };\r\n}\r\n\r\nfunction _adaptRawSpell(data: any, text: string): SpellCheckPayload | null {\r\n if (!data) return null;\r\n if (Array.isArray(data)) return { issues: data as SpellCheckIssue[] };\r\n\r\n const hasSpelling = !!(data.misspelled_words?.length || data.misspelled?.length);\r\n const hasGrammar = !!(data.grammar_correction || data.improved_text);\r\n if (!hasSpelling && !hasGrammar) return null;\r\n\r\n const words: string[] = data.misspelled_words ?? data.misspelled ?? [];\r\n const seen: Record<string, number> = {};\r\n const issues: SpellCheckIssue[] = [];\r\n\r\n for (const apiWord of words) {\r\n const from = seen[apiWord] ?? 0;\r\n const match =\r\n _matchFrom(text, new RegExp(`\\\\b${_escRx(apiWord)}\\\\b`, 'i'), from) ??\r\n _matchFrom(text, new RegExp(_escRx(apiWord), 'i'), from);\r\n if (!match) continue;\r\n seen[apiWord] = match.offset + match.actualWord.length;\r\n issues.push({\r\n offset: match.offset,\r\n length: match.actualWord.length,\r\n word: match.actualWord,\r\n message: `\"${match.actualWord}\" may be misspelled`,\r\n suggestions: data.suggestions?.[apiWord] ?? [],\r\n type: 'spelling',\r\n });\r\n }\r\n\r\n const rawGrammar: string | undefined = data.grammar_correction ?? data.improved_text;\r\n const grammarCorrection =\r\n rawGrammar && rawGrammar.trim() !== text.trim() ? rawGrammar.trim() : undefined;\r\n\r\n return { issues: issues.sort((a, b) => a.offset - b.offset), grammarCorrection };\r\n}\r\n\r\nfunction _adaptRawSuggest(data: any): string[] | null {\r\n if (!data) return null;\r\n // string[] directly\r\n if (Array.isArray(data)) return data.filter(Boolean);\r\n // { suggestions: string[] } — shape returned by AutoCompleteWorker / suggest API\r\n if (Array.isArray(data.suggestions) && data.suggestions.length > 0)\r\n return data.suggestions.filter(Boolean);\r\n // { generated_text: string } — alternate API shape\r\n if (typeof data.generated_text === 'string' && data.generated_text.trim())\r\n return [data.generated_text];\r\n // { improved_text: string } — fallback shape\r\n if (typeof data.improved_text === 'string' && data.improved_text.trim())\r\n return [data.improved_text];\r\n // bare string\r\n if (typeof data === 'string' && data.trim()) return [data];\r\n return null;\r\n}\r\n\r\n// These are module-level factory functions (not hooks) so the component\r\n// can call them conditionally without violating Rules of Hooks.\r\nfunction _makeSpellCheckFn(fn: (text: string) => Promise<any>): (text: string) => SpellCheckResult {\r\n return (text: string): SpellCheckResult => {\r\n let dismissed = false;\r\n const promise: Promise<SpellCheckPayload | null> = (async () => {\r\n try {\r\n const raw = await fn(text);\r\n if (dismissed) return null;\r\n return _adaptRawSpell(raw, text);\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n return {\r\n promise,\r\n dismiss: () => {\r\n dismissed = true;\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction _makeQueryFn(\r\n fn: (text: string, cursorIndex?: number) => Promise<any>,\r\n): (text?: string, cursorIndex?: number) => SearchPromise {\r\n return (text?: string, cursorIndex?: number): SearchPromise => {\r\n let dismissed = false;\r\n const promise: Promise<string[] | null> = (async () => {\r\n try {\r\n if (!text?.trim()) return null;\r\n const raw = await fn(text, cursorIndex);\r\n if (dismissed) return null;\r\n return _adaptRawSuggest(raw);\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n return {\r\n promise,\r\n dismiss: () => {\r\n dismissed = true;\r\n },\r\n };\r\n };\r\n}\r\n\r\nexport const ContentEditorComponent = forwardRef<ContentEditorRef, ContentEditorProps>(\r\n (props, ref) => {\r\n const isReadOnly = !!props.readOnly;\r\n\r\n // ── Resolve simple fn props → plugin format ────────────────────────────\r\n // spellCheckFn / suggestFn: simple API — just a plain async function.\r\n // useSpellCheck / useQuery: advanced API — manual cancellation control.\r\n // Simple props take precedence if both are provided.\r\n // useMemo ensures the wrapped functions are stable across renders so\r\n // plugins don't re-register on every keystroke.\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const resolvedSpellCheck = React.useMemo(\r\n () => (props.spellCheckFn ? _makeSpellCheckFn(props.spellCheckFn) : props.useSpellCheck),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [props.spellCheckFn, props.useSpellCheck],\r\n );\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const resolvedQuery = React.useMemo(\r\n () => (props.suggestFn ? _makeQueryFn(props.suggestFn) : props.useQuery),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [props.suggestFn, props.useQuery],\r\n );\r\n\r\n const [floatingAnchorElem, setFloatingAnchorElem] = useState<HTMLDivElement | null>(null);\r\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\r\n\r\n const [wordCount, setWordCount] = useState(0);\r\n const handleWordCount = useCallback((count: number) => setWordCount(count), []);\r\n\r\n const contentEditableDomRef = useRef<HTMLDivElement>(null);\r\n const previousOverLimitRef = useRef(false);\r\n\r\n const focusedRef = useRef(false);\r\n const setFocused = (focused: boolean) => {\r\n focusedRef.current = focused;\r\n };\r\n\r\n const onAnchorRef = (elem: HTMLDivElement | null) => {\r\n if (elem) setFloatingAnchorElem(elem);\r\n };\r\n\r\n const initialConfig: any = {\r\n namespace: props.namespace,\r\n theme,\r\n onError: () => { },\r\n nodes: [\r\n HeadingNode,\r\n QuoteNode,\r\n\r\n CodeHighlightNode,\r\n CodeNode,\r\n\r\n ListNode,\r\n ListItemNode,\r\n\r\n LinkNode,\r\n AutoLinkNode,\r\n\r\n TableNode,\r\n TableRowNode,\r\n TableCellNode,\r\n\r\n ImageNode,\r\n InlineImageNode,\r\n YouTubeNode,\r\n PageBreakNode,\r\n AutocompleteNode,\r\n SpellErrorNode,\r\n\r\n HtmlBlockNode,\r\n ],\r\n };\r\n\r\n const EditorStyles = mergeStyleSets({\r\n editorPlaceholder: {\r\n color: 'var(--colorNeutralForeground3, grey)',\r\n position: 'absolute',\r\n top: props.level !== ContentEditorLevel.None ? '17px' : '27px',\r\n left: 20,\r\n right: 20,\r\n fontSize: '14px',\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n },\r\n contentEditor: {\r\n zIndex: 0,\r\n flex: 'auto',\r\n outline: 'none',\r\n overflow: 'auto',\r\n marginTop: '0px',\r\n paddingLeft: '20px',\r\n paddingRight: '20px',\r\n position: 'relative',\r\n background: 'var(--colorNeutralBackground1, #ffffff)',\r\n justifyContent: 'center',\r\n height: props.contentHeight ?? '100%',\r\n ...(isReadOnly && {\r\n cursor: 'not-allowed',\r\n opacity: 0.75,\r\n userSelect: 'text',\r\n }),\r\n },\r\n });\r\n\r\n const urlRegExp = new RegExp(\r\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[\\w]*))?)/,\r\n );\r\n const validateUrl = (url: string) => url === 'https://' || urlRegExp.test(url);\r\n\r\n const handleReadOnlyClickCapture = (e: React.SyntheticEvent) => {\r\n if (!isReadOnly) return;\r\n const target = e.target as HTMLElement | null;\r\n const anchor = target?.closest?.('a');\r\n if (anchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const isOverLimit = props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n useEffect(() => {\r\n if (props.wordLimit === undefined || !props.onWordLimitExceeded) return;\r\n\r\n const wasOverLimit = previousOverLimitRef.current;\r\n\r\n if (isOverLimit !== wasOverLimit) {\r\n props.onWordLimitExceeded({\r\n wordCount,\r\n wordLimit: props.wordLimit,\r\n exceeded: isOverLimit,\r\n });\r\n\r\n previousOverLimitRef.current = isOverLimit;\r\n }\r\n }, [isOverLimit, wordCount, props.wordLimit, props.onWordLimitExceeded]);\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme} style={{ height: '100%' }}>\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <Stack\r\n style={{\r\n zIndex: 1000,\r\n background: '#fff',\r\n borderRadius: '2px',\r\n width: props.width ?? '100%',\r\n height: props.height ?? '100%',\r\n margin: props.margin ?? '5px auto',\r\n border: `1px solid ${isOverLimit ? '#c4272c' : 'var(--colorNeutralStroke1, #ccced1)'\r\n }`,\r\n transition: 'border-color 0.2s',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n }}>\r\n <div\r\n style={{\r\n pointerEvents: isReadOnly ? 'none' : 'auto',\r\n position: 'sticky',\r\n opacity: isReadOnly ? 0.85 : 1,\r\n }}>\r\n <ToolBarPlugins\r\n level={props.level ?? ContentEditorLevel.Basic}\r\n readOnly={props.readOnly}\r\n />\r\n </div>\r\n\r\n <div\r\n style={{\r\n position: 'relative',\r\n flexGrow: 1,\r\n padding: '15px 0px',\r\n overflowY: 'scroll',\r\n }}\r\n onClickCapture={handleReadOnlyClickCapture}>\r\n <RichTextPlugin\r\n ErrorBoundary={LexicalErrorBoundary}\r\n contentEditable={\r\n <div\r\n className='editor'\r\n style={{ height: '100%', position: 'relative' }}\r\n ref={onAnchorRef}>\r\n <ContentEditable\r\n ref={contentEditableDomRef}\r\n className={css(EditorStyles.contentEditor)}\r\n style={{ paddingTop: props.level !== ContentEditorLevel.None ? 0 : 10 }}\r\n // Disable browser's built-in spellcheck red squiggles when\r\n // our own SpellCheckPlugin is active — avoids double underlines.\r\n spellCheck={!resolvedSpellCheck}\r\n autoCorrect={resolvedSpellCheck ? 'off' : undefined}\r\n autoCapitalize={resolvedSpellCheck ? 'off' : undefined}\r\n />\r\n </div>\r\n }\r\n placeholder={\r\n <Stack className={css(EditorStyles.editorPlaceholder)}>{props.placeholder}</Stack>\r\n }\r\n />\r\n\r\n {/* ── Word count: sticky to the bottom-right of the scroll area ── */}\r\n {props.wordLimit !== undefined && (\r\n <div\r\n style={{\r\n position: 'sticky',\r\n bottom: 0,\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n paddingRight: 14,\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n }}>\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: isOverLimit ? '#c4272c' : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: isOverLimit ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {wordCount} / {props.wordLimit} words\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={props.onBlur}\r\n setFocused={setFocused}\r\n />\r\n\r\n {props.autoFocus && !isReadOnly && <AutoFocusPlugin />}\r\n\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin validateUrl={validateUrl} />\r\n <AutoLinkPlugin matchers={MATCHERS} />\r\n <TablePlugin hasCellMerge hasCellBackgroundColor />\r\n\r\n {!isReadOnly && <YoutubeDeletePlugin />}\r\n\r\n {!isReadOnly && floatingAnchorElem && <TableActionMenuPlugin />}\r\n {!isReadOnly && floatingAnchorElem && (\r\n <TableCellResizerPlugin anchorElem={floatingAnchorElem} />\r\n )}\r\n\r\n {!isReadOnly && (\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n\r\n {!isReadOnly && <ImagesPlugin />}\r\n {!isReadOnly && <InlineImagePlugin />}\r\n {!isReadOnly && <PageBreakPlugin />}\r\n\r\n {/* ── Autocomplete (optimised) ────────────────────────────── */}\r\n {!!resolvedQuery && !isReadOnly && (\r\n <AutocompletePlugin\r\n useQuery={resolvedQuery}\r\n isReadOnly={isReadOnly}\r\n onSuggestionShown={props.onSuggestionShown}\r\n onSuggestionAccept={props.onSuggestionAccept}\r\n idleMs={props.suggestIdleMs ?? 300}\r\n minWords={4}\r\n prefixWindow={300}\r\n />\r\n )}\r\n\r\n {/* ── Spell / grammar check (NEW) ─────────────────────────── */}\r\n {!!resolvedSpellCheck && !isReadOnly && (\r\n <SpellCheckPlugin\r\n useSpellCheck={resolvedSpellCheck}\r\n onSpellCheckAccept={props.onSpellCheckAccept}\r\n idleMs={props.spellCheckIdleMs ?? 1200}\r\n enabled={props.spellCheckEnabled !== false}\r\n />\r\n )}\r\n\r\n {!isReadOnly && props.showFloatingToolbar && <CharacterStylesPopupPlugin />}\r\n <CustomOnChangePlugin\r\n value={props.value}\r\n onChange={props.onChange}\r\n />\r\n\r\n {props.wordLimit !== undefined && <WordCountPlugin onCountChange={handleWordCount} />}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n />\r\n </Stack>\r\n </LexicalComposer>\r\n </FluentProvider>\r\n );\r\n },\r\n);\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isNodeSelection,\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 KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedLexicalNode\r\n} from 'lexical';\r\nimport { useCallback, useEffect } from 'react';\r\nimport './PageBreak.css';\r\n\r\nexport type SerializedPageBreakNode = SerializedLexicalNode;\r\n\r\nconst PageBreakComponent = ({nodeKey}: {nodeKey: NodeKey}) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n\r\n const $onDelete = useCallback(\r\n (event: KeyboardEvent) => {\r\n event.preventDefault();\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isPageBreakNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\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 editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, $onDelete, 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\nconst $convertPageBreakElement = (): DOMConversionOutput => {\r\n return {node: $createPageBreakNode()};\r\n}\r\n\r\nexport const $createPageBreakNode = (): PageBreakNode => {\r\n return new PageBreakNode();\r\n}\r\n\r\nexport const $isPageBreakNode = ( node: LexicalNode | null | undefined ): node is PageBreakNode => {\r\n return node instanceof PageBreakNode;\r\n}\r\n","import type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from 'lexical';\r\nimport { TextNode } from 'lexical';\r\n\r\nexport type SpellIssueType = 'spelling' | 'grammar' | 'style';\r\n\r\nexport type SpellErrorMeta = {\r\n message: string;\r\n suggestions: string[];\r\n type: SpellIssueType;\r\n /** Original character offset in the plain-text snapshot (used for reward API) */\r\n offset: number;\r\n /**\r\n * When set, this node represents the full sentence that has an AI-suggested\r\n * improvement. The popover will show an \"Improve sentence\" option that\r\n * replaces the sentence with this text.\r\n */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SerializedSpellErrorNode = Spread<{ meta: SpellErrorMeta }, SerializedTextNode>;\r\n\r\n// Inject CSS — always replace so hot-reload picks up changes\r\nconst STYLE_ID = '__spell_error_node_css__';\r\nfunction ensureCSS() {\r\n if (typeof document === 'undefined') return;\r\n // Remove existing tag first so stale cached styles never win\r\n document.getElementById(STYLE_ID)?.remove();\r\n const s = document.createElement('style');\r\n s.id = STYLE_ID;\r\n s.textContent = `\r\n /* SpellErrorNode underlines — thin, Grammarly-style */\r\n .sc-err-spelling,\r\n .sc-err-grammar,\r\n .sc-err-style {\r\n cursor: pointer;\r\n text-underline-offset: 3px;\r\n text-decoration-skip-ink: none;\r\n }\r\n\r\n /* Spelling — red dotted (classic spell-check look) */\r\n .sc-err-spelling {\r\n text-decoration: underline #e53e3e;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n\r\n /* Grammar — blue dotted */\r\n .sc-err-grammar {\r\n text-decoration: underline dotted #3182ce;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n\r\n /* Style — yellow/amber dotted */\r\n .sc-err-style {\r\n text-decoration: underline dotted #d97706;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\nfunction classForType(type: SpellIssueType): string {\r\n if (type === 'grammar') return 'sc-err-grammar';\r\n if (type === 'style') return 'sc-err-style';\r\n return 'sc-err-spelling';\r\n}\r\n\r\nexport class SpellErrorNode extends TextNode {\r\n __meta: SpellErrorMeta;\r\n\r\n static getType(): string {\r\n return 'spell-error';\r\n }\r\n\r\n static clone(node: SpellErrorNode): SpellErrorNode {\r\n return new SpellErrorNode(node.__text, node.__meta, node.__key);\r\n }\r\n\r\n static importJSON(s: SerializedSpellErrorNode): SpellErrorNode {\r\n return new SpellErrorNode(s.text, s.meta);\r\n }\r\n\r\n constructor(text: string, meta: SpellErrorMeta, key?: NodeKey) {\r\n super(text, key);\r\n this.__meta = meta;\r\n // NOTE: Do NOT call ensureCSS() here.\r\n // This constructor is called inside editor.update() callbacks, and any\r\n // DOM mutation (appendChild, remove) inside a Lexical update throws an\r\n // error that gets silently swallowed by the editor's onError handler.\r\n // CSS is injected once by SpellCheckPlugin's useEffect instead.\r\n }\r\n\r\n exportJSON(): SerializedSpellErrorNode {\r\n return { ...super.exportJSON(), type: 'spell-error', meta: this.__meta };\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config) as HTMLElement;\r\n dom.className = (dom.className + ' ' + classForType(this.__meta.type)).trim();\r\n dom.dataset.spellOffset = String(this.__meta.offset);\r\n return dom;\r\n }\r\n\r\n updateDOM(prev: SpellErrorNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n const base = super.updateDOM(prev as any, dom, config);\r\n // Reapply class if meta changed\r\n if (prev.__meta.type !== this.__meta.type) {\r\n dom.classList.remove('sc-err-spelling', 'sc-err-grammar', 'sc-err-style');\r\n dom.classList.add(classForType(this.__meta.type));\r\n }\r\n return base;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n // When copying/exporting, emit a plain span with no decoration\r\n const span = document.createElement('span');\r\n span.textContent = this.__text;\r\n return { element: span };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return null;\r\n }\r\n\r\n getMeta(): SpellErrorMeta {\r\n return this.getLatest().__meta;\r\n }\r\n\r\n setMeta(meta: SpellErrorMeta): SpellErrorNode {\r\n const writable = this.getWritable() as SpellErrorNode;\r\n writable.__meta = meta;\r\n return writable;\r\n }\r\n\r\n // Prevent the spell-error node from being copied as a SpellErrorNode\r\n excludeFromCopy() {\r\n return false;\r\n }\r\n}\r\n\r\nexport function $createSpellErrorNode(text: string, meta: SpellErrorMeta): SpellErrorNode {\r\n return new SpellErrorNode(text, meta);\r\n}\r\n\r\nexport function $isSpellErrorNode(node: LexicalNode | null | undefined): node is SpellErrorNode {\r\n return node instanceof SpellErrorNode;\r\n}\r\n","import 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\n\r\nimport { BlockWithAlignableContents } from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport { $getNodeByKey } from 'lexical';\r\nimport * as React from 'react';\r\n\r\nconst DEFAULT_WIDTH = 560;\r\nconst DEFAULT_HEIGHT = 315;\r\nconst MIN_WIDTH = 200;\r\nconst MIN_HEIGHT = 113;\r\n\r\n// ─── Resize handles ───────────────────────────────────────────────────────────\r\n\r\nconst handleBase: React.CSSProperties = {\r\n position: 'absolute',\r\n width: 10,\r\n height: 10,\r\n background: '#0078d4',\r\n border: '2px solid #fff',\r\n borderRadius: 2,\r\n zIndex: 10,\r\n boxShadow: '0 0 2px rgba(0,0,0,0.4)',\r\n};\r\n\r\ntype ResizeDir = 'se' | 'e' | 's';\r\n\r\ninterface ResizeState {\r\n startX: number;\r\n startY: number;\r\n startW: number;\r\n startH: number;\r\n ratio: number;\r\n dir: ResizeDir;\r\n}\r\n\r\nfunction VideoResizer({\r\n containerRef,\r\n onResizeStart,\r\n onResizeEnd,\r\n}: {\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n onResizeStart: () => void;\r\n onResizeEnd: (w: number, h: number) => void;\r\n}) {\r\n const resizeState = React.useRef<ResizeState | null>(null);\r\n\r\n const startResize = (e: React.PointerEvent<HTMLDivElement>, dir: ResizeDir) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const { width, height } = container.getBoundingClientRect();\r\n resizeState.current = {\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n startW: width,\r\n startH: height,\r\n ratio: width / height,\r\n dir,\r\n };\r\n onResizeStart();\r\n\r\n const onMove = (ev: PointerEvent) => {\r\n const rs = resizeState.current;\r\n if (!rs || !container) return;\r\n\r\n const dx = ev.clientX - rs.startX;\r\n const dy = ev.clientY - rs.startY;\r\n let newW = rs.startW;\r\n let newH = rs.startH;\r\n\r\n if (dir === 'se') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n newH = newW / rs.ratio;\r\n } else if (dir === 'e') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n } else if (dir === 's') {\r\n newH = Math.max(MIN_HEIGHT, rs.startH + dy);\r\n }\r\n\r\n container.style.width = `${newW}px`;\r\n container.style.height = `${newH}px`;\r\n };\r\n\r\n const onUp = () => {\r\n if (!container) return;\r\n const { width, height } = container.getBoundingClientRect();\r\n resizeState.current = null;\r\n onResizeEnd(width, height);\r\n document.removeEventListener('pointermove', onMove);\r\n document.removeEventListener('pointerup', onUp);\r\n };\r\n\r\n document.addEventListener('pointermove', onMove);\r\n document.addEventListener('pointerup', onUp);\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n style={{\r\n ...handleBase,\r\n top: '50%',\r\n right: -5,\r\n transform: 'translateY(-50%)',\r\n cursor: 'ew-resize',\r\n }}\r\n onPointerDown={(e) => startResize(e, 'e')}\r\n title='Resize width'\r\n />\r\n <div\r\n style={{\r\n ...handleBase,\r\n bottom: -5,\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n cursor: 'ns-resize',\r\n }}\r\n onPointerDown={(e) => startResize(e, 's')}\r\n title='Resize height'\r\n />\r\n <div\r\n style={{ ...handleBase, bottom: -5, right: -5, cursor: 'se-resize' }}\r\n onPointerDown={(e) => startResize(e, 'se')}\r\n title='Resize (proportional)'\r\n />\r\n </>\r\n );\r\n}\r\n\r\n// ─── YouTube component ────────────────────────────────────────────────────────\r\n\r\ntype YouTubeComponentProps = Readonly<{\r\n className: Readonly<{ base: string; focus: string }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n videoID: string;\r\n width: number;\r\n height: number;\r\n editor: LexicalEditor;\r\n}>;\r\n\r\nfunction YouTubeComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n videoID,\r\n width,\r\n height,\r\n editor,\r\n}: YouTubeComponentProps) {\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n const [isResizing, setIsResizing] = React.useState(false);\r\n\r\n const handleDelete = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n node?.remove();\r\n });\r\n };\r\n\r\n const handleResizeEnd = (w: number, h: number) => {\r\n setIsResizing(false);\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) {\r\n node.setSize(Math.round(w), Math.round(h));\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\r\n <div\r\n ref={containerRef}\r\n style={{ position: 'relative', display: 'inline-block', width, height, lineHeight: 0 }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => {\r\n if (!isResizing) setIsHovered(false);\r\n }}>\r\n <iframe\r\n width='100%'\r\n height='100%'\r\n src={`https://www.youtube.com/embed/${videoID}`}\r\n allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\r\n allowFullScreen={true}\r\n title='YouTube video'\r\n style={{ display: 'block', border: 'none', pointerEvents: isResizing ? 'none' : 'auto' }}\r\n />\r\n\r\n {isHovered && (\r\n <>\r\n <button\r\n type='button'\r\n onClick={handleDelete}\r\n title='Remove video'\r\n style={{\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n width: 28,\r\n height: 28,\r\n borderRadius: '50%',\r\n background: 'rgba(0,0,0,0.65)',\r\n color: '#fff',\r\n border: 'none',\r\n cursor: 'pointer',\r\n fontSize: 18,\r\n lineHeight: 1,\r\n padding: 0,\r\n zIndex: 10,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}>\r\n ×\r\n </button>\r\n\r\n <VideoResizer\r\n containerRef={containerRef}\r\n onResizeStart={() => setIsResizing(true)}\r\n onResizeEnd={handleResizeEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\n// ─── Serialized type ──────────────────────────────────────────────────────────\r\n\r\nexport type SerializedYouTubeNode = Spread<\r\n {\r\n videoID: string;\r\n width: number;\r\n height: number;\r\n type: 'youtube';\r\n version: 1;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\n// ─── DOM helpers ──────────────────────────────────────────────────────────────\r\n\r\nfunction extractYouTubeIdFromSrc(src: string): string | null {\r\n const m = src.match(/youtube\\.com\\/embed\\/([^?&/]+)/i);\r\n return m?.[1] ?? null;\r\n}\r\n\r\nfunction convertYouTubeIframe(domNode: Node): DOMConversionOutput | null {\r\n if (!(domNode instanceof HTMLIFrameElement)) return null;\r\n const src = domNode.getAttribute('src') || '';\r\n const id = extractYouTubeIdFromSrc(src);\r\n if (!id) return null;\r\n const w = parseInt(domNode.getAttribute('width') || '560', 10) || DEFAULT_WIDTH;\r\n const h = parseInt(domNode.getAttribute('height') || '315', 10) || DEFAULT_HEIGHT;\r\n return { node: $createYouTubeNode(id, w, h) };\r\n}\r\n\r\n// ─── Node class ───────────────────────────────────────────────────────────────\r\n\r\nexport class YouTubeNode extends DecoratorBlockNode {\r\n __id: string;\r\n __width: number;\r\n __height: number;\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.__width, node.__height, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\r\n const node = $createYouTubeNode(\r\n serializedNode.videoID,\r\n serializedNode.width ?? DEFAULT_WIDTH,\r\n serializedNode.height ?? DEFAULT_HEIGHT,\r\n );\r\n node.setFormat(serializedNode.format);\r\n return node;\r\n }\r\n\r\n exportJSON(): SerializedYouTubeNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: 'youtube',\r\n version: 1,\r\n videoID: this.__id,\r\n width: this.__width,\r\n height: this.__height,\r\n };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n iframe: () => ({\r\n conversion: convertYouTubeIframe,\r\n priority: 2,\r\n }),\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('width', String(this.__width));\r\n iframe.setAttribute('height', String(this.__height));\r\n iframe.style.border = 'none';\r\n iframe.setAttribute(\r\n 'allow',\r\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\r\n );\r\n iframe.setAttribute('allowfullscreen', 'true');\r\n iframe.setAttribute('title', 'YouTube video');\r\n iframe.setAttribute('src', `https://www.youtube.com/embed/${this.__id}`);\r\n iframe.setAttribute('data-lexical-youtube', this.__id);\r\n return { element: iframe };\r\n }\r\n\r\n constructor(\r\n id: string,\r\n width: number = DEFAULT_WIDTH,\r\n height: number = DEFAULT_HEIGHT,\r\n format?: ElementFormatType,\r\n key?: NodeKey,\r\n ) {\r\n super(format, key);\r\n this.__id = id;\r\n this.__width = width;\r\n this.__height = height;\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 setSize(width: number, height: number): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\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 width={this.__width}\r\n height={this.__height}\r\n editor={_editor}\r\n />\r\n );\r\n }\r\n\r\n isTopLevel(): true {\r\n return true;\r\n }\r\n}\r\n\r\n// ─── Factories / guards ───────────────────────────────────────────────────────\r\n\r\nexport function $createYouTubeNode(\r\n videoID: string,\r\n width = DEFAULT_WIDTH,\r\n height = DEFAULT_HEIGHT,\r\n): YouTubeNode {\r\n return new YouTubeNode(videoID, width, height);\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","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_DOWN_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\n\r\nimport type { AcceptMethod, SearchPromise } from '../ContentEditorComponent.types';\r\nimport { $createAutocompleteNode, AutocompleteNode } from '../Nodes/AutoCompleteNode';\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nconst normalize = (s?: string) => (s ?? '').replace(/\\s+/g, ' ').trim();\r\n\r\nfunction readContextWindow(maxChars = 300, cursorIndex?: number): string {\r\n const full = normalize($getRoot().getTextContent());\r\n const upTo = cursorIndex != null ? full.slice(0, cursorIndex) : full;\r\n return upTo.slice(Math.max(0, upTo.length - maxChars));\r\n}\r\n\r\nfunction readCursorIndex(): number {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return -1;\r\n\r\n const anchorNode = sel.anchor.getNode();\r\n const anchorOffset = sel.anchor.offset;\r\n if (anchorNode instanceof AutocompleteNode) return -1;\r\n\r\n const root = $getRoot();\r\n let index = 0;\r\n let found = false;\r\n\r\n const visitLeaves = (node: any): void => {\r\n if (found) return;\r\n if (node === anchorNode) {\r\n index += anchorOffset;\r\n found = true;\r\n return;\r\n }\r\n if (typeof node.getChildren !== 'function') {\r\n if (!(node instanceof AutocompleteNode)) index += node.getTextContent().length;\r\n return;\r\n }\r\n for (const child of node.getChildren()) {\r\n if (found) return;\r\n visitLeaves(child);\r\n }\r\n };\r\n\r\n const blocks = root.getChildren();\r\n for (let i = 0; i < blocks.length; i++) {\r\n if (found) break;\r\n if (i > 0) index += 1;\r\n visitLeaves(blocks[i]);\r\n }\r\n return found ? index : -1;\r\n}\r\n\r\n/** Text before caret in the current node — used for prefix-stripping */\r\nfunction readPrefixBeforeCaret(maxChars = 300): string {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return '';\r\n const node = sel.anchor.getNode();\r\n if (node instanceof AutocompleteNode) return '';\r\n const text = node.getTextContent();\r\n const upto = text.slice(0, sel.anchor.offset);\r\n return normalize(upto.slice(Math.max(0, upto.length - maxChars)));\r\n}\r\n\r\n/**\r\n * Pick the best suggestion from the list.\r\n * If the top suggestion starts with the current prefix, strip it to avoid duplication.\r\n */\r\nfunction selectBestSuggestion(list: string[] | null, prefix: string): string | null {\r\n if (!list?.length) return null;\r\n const sorted = list\r\n .map(normalize)\r\n .filter(Boolean)\r\n .sort((a, b) => b.length - a.length);\r\n if (!sorted.length) return null;\r\n const s0 = sorted[0];\r\n const p = prefix.toLowerCase();\r\n if (s0.toLowerCase().startsWith(p)) {\r\n const rest = normalize(s0.slice(p.length));\r\n return rest || null;\r\n }\r\n return s0;\r\n}\r\n\r\n// ─── Types ────────────────────────────────────────────────────────────────────\r\n\r\n/** Exported so ContentEditorComponent can disable browser spellcheck when active */\r\nexport const DISABLE_BROWSER_SPELLCHECK = true;\r\n\r\ntype InflightRequest = {\r\n id: number;\r\n sentContext: string;\r\n sentCursorIndex: number;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function AutocompletePlugin({\r\n useQuery,\r\n onSuggestionShown,\r\n onSuggestionAccept,\r\n isReadOnly = false,\r\n minWords = 4,\r\n idleMs = 800,\r\n prefixWindow = 300,\r\n}: {\r\n /**\r\n * Called with `(contextText, cursorIndex)`. Return `{ promise, dismiss }` where\r\n * `promise` resolves to `string[] | null`.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n isReadOnly?: boolean;\r\n\r\n minWords?: number;\r\n idleMs?: number;\r\n prefixWindow?: number;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const ghostKeyRef = React.useRef<string | null>(null);\r\n const idleTimerRef = React.useRef<number | null>(null);\r\n const inflightRef = React.useRef<InflightRequest | null>(null);\r\n const reqCounterRef = React.useRef(0);\r\n const lastTriggerRef = React.useRef<string>('');\r\n const lastShownCtxRef = React.useRef<string>('');\r\n\r\n // ── Ghost helpers ─────────────────────────────────────────────────────────\r\n\r\n const clearGhost = React.useCallback(() => {\r\n editor.update(\r\n () => {\r\n const key = ghostKeyRef.current;\r\n if (!key) return;\r\n const node = $getNodeByKey(key);\r\n if (node instanceof AutocompleteNode) node.remove();\r\n ghostKeyRef.current = null;\r\n },\r\n { tag: 'autocomplete-ghost' },\r\n );\r\n }, [editor]);\r\n\r\n /**\r\n * Insert (or update) ghost text at the given absolute char offset.\r\n * Walks the live tree at call time — immune to spell-check node splits.\r\n */\r\n const upsertGhost = React.useCallback(\r\n (text: string, insertAtCharOffset: number) => {\r\n editor.update(\r\n () => {\r\n // Update existing ghost if still present\r\n if (ghostKeyRef.current) {\r\n const existing = $getNodeByKey(ghostKeyRef.current);\r\n if (existing instanceof AutocompleteNode) {\r\n if (existing.getTextContent() !== text) existing.setTextContent(text);\r\n return;\r\n }\r\n ghostKeyRef.current = null;\r\n }\r\n\r\n // Find the node containing insertAtCharOffset\r\n const root = $getRoot();\r\n let pos = 0;\r\n let targetNode: any = null;\r\n let localOffset = 0;\r\n\r\n const findNode = (node: any): boolean => {\r\n if (node instanceof AutocompleteNode) return false;\r\n if (typeof node.getChildren !== 'function') {\r\n const len = node.getTextContent().length;\r\n if (insertAtCharOffset <= pos + len) {\r\n targetNode = node;\r\n localOffset = insertAtCharOffset - pos;\r\n return true;\r\n }\r\n pos += len;\r\n return false;\r\n }\r\n for (const child of node.getChildren()) {\r\n if (findNode(child)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n const blocks = root.getChildren();\r\n let found = false;\r\n for (let i = 0; i < blocks.length && !found; i++) {\r\n if (i > 0) pos += 1;\r\n found = findNode(blocks[i]);\r\n }\r\n\r\n if (!targetNode) return;\r\n\r\n const nodeText = targetNode.getTextContent();\r\n const before = nodeText.slice(0, localOffset);\r\n const after = nodeText.slice(localOffset);\r\n\r\n const charBefore = before ? before[before.length - 1] : '';\r\n const needsSpace = charBefore && charBefore !== ' ' && !text.startsWith(' ');\r\n const ghostText = needsSpace ? ' ' + text : text;\r\n const ghost = $createAutocompleteNode(\r\n ghostText,\r\n crypto?.randomUUID?.() ?? String(Date.now()),\r\n );\r\n ghostKeyRef.current = ghost.getKey();\r\n\r\n if (before) {\r\n targetNode.setTextContent(before);\r\n targetNode.insertAfter(ghost);\r\n ghost.insertAfter($createTextNode(after.length ? after : ''));\r\n } else {\r\n targetNode.insertBefore(ghost);\r\n }\r\n },\r\n { tag: 'autocomplete-ghost' },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Cancel inflight ───────────────────────────────────────────────────────\r\n\r\n const cancelInflight = React.useCallback(() => {\r\n if (!inflightRef.current) return;\r\n inflightRef.current.dismiss();\r\n inflightRef.current = null;\r\n }, []);\r\n\r\n // ── Idle timer reset ──────────────────────────────────────────────────────\r\n\r\n const resetIdleTimer = React.useCallback(\r\n (callback: () => void) => {\r\n if (idleTimerRef.current) {\r\n clearTimeout(idleTimerRef.current);\r\n idleTimerRef.current = null;\r\n }\r\n cancelInflight();\r\n clearGhost();\r\n idleTimerRef.current = window.setTimeout(() => {\r\n idleTimerRef.current = null;\r\n callback();\r\n }, idleMs);\r\n },\r\n [idleMs, cancelInflight, clearGhost],\r\n );\r\n\r\n // ── Fire API ──────────────────────────────────────────────────────────────\r\n\r\n const fireQuery = React.useCallback(() => {\r\n if (!useQuery || isReadOnly) return;\r\n\r\n let context = '';\r\n let prefix = '';\r\n let cursorIndex = -1;\r\n let wordCount = 0;\r\n\r\n editor.getEditorState().read(() => {\r\n cursorIndex = readCursorIndex();\r\n context = readContextWindow(prefixWindow, cursorIndex >= 0 ? cursorIndex : undefined);\r\n prefix = readPrefixBeforeCaret(prefixWindow);\r\n wordCount = context.trim().split(/\\s+/).filter(Boolean).length;\r\n });\r\n if (wordCount < minWords) return;\r\n if (cursorIndex === -1) return;\r\n if (context === lastShownCtxRef.current) return;\r\n\r\n cancelInflight();\r\n\r\n const myId = ++reqCounterRef.current;\r\n const sentContext = context;\r\n const sentPrefix = prefix;\r\n const sentCursorIndex = cursorIndex;\r\n\r\n const { promise, dismiss } = useQuery(sentContext, cursorIndex);\r\n inflightRef.current = { id: myId, sentContext, sentCursorIndex, dismiss };\r\n\r\n promise.then(\r\n (list) => {\r\n if (myId !== reqCounterRef.current) return; // superseded\r\n\r\n let currentContext = '';\r\n let currentCursorIndex = -1;\r\n let currentPrefix = '';\r\n\r\n editor.getEditorState().read(() => {\r\n currentCursorIndex = readCursorIndex();\r\n currentContext = readContextWindow(\r\n prefixWindow,\r\n currentCursorIndex >= 0 ? currentCursorIndex : undefined,\r\n );\r\n currentPrefix = readPrefixBeforeCaret(prefixWindow);\r\n });\r\n\r\n // Discard if text changed while in-flight\r\n if (normalize(currentContext) !== normalize(sentContext)) {\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n const CURSOR_TOLERANCE = 2;\r\n if (\r\n currentCursorIndex !== -1 &&\r\n Math.abs(currentCursorIndex - sentCursorIndex) > CURSOR_TOLERANCE\r\n ) {\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n const suggestion = selectBestSuggestion(list, currentPrefix || sentPrefix);\r\n if (!suggestion) {\r\n clearGhost();\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n inflightRef.current = null;\r\n lastTriggerRef.current = sentContext;\r\n lastShownCtxRef.current = sentContext;\r\n\r\n upsertGhost(suggestion, sentCursorIndex);\r\n onSuggestionShown?.({ suggestionText: suggestion, triggerText: sentContext });\r\n },\r\n () => {\r\n inflightRef.current = null;\r\n },\r\n );\r\n }, [\r\n editor,\r\n useQuery,\r\n isReadOnly,\r\n minWords,\r\n prefixWindow,\r\n cancelInflight,\r\n clearGhost,\r\n upsertGhost,\r\n onSuggestionShown,\r\n ]);\r\n\r\n // ── Update listener (typing) ──────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!useQuery || isReadOnly) return;\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (tags.has('history-merge') || tags.has('collaboration')) return;\r\n if (tags.has('autocomplete-ghost') || tags.has('spell-apply') || tags.has('spell-clear'))\r\n return;\r\n resetIdleTimer(fireQuery);\r\n });\r\n }, [editor, useQuery, isReadOnly, resetIdleTimer, fireQuery]);\r\n\r\n // ── Selection change listener (cursor moves, no typing) ───────────────────\r\n\r\n React.useEffect(() => {\r\n if (!useQuery || isReadOnly) return;\r\n return editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n // Don't clear ghost if cursor is inside or immediately after it\r\n let insideGhost = false;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const node = sel.anchor.getNode();\r\n if (node instanceof AutocompleteNode) {\r\n insideGhost = true;\r\n return;\r\n }\r\n const prev = (node as any).getPreviousSibling?.();\r\n if (prev instanceof AutocompleteNode) insideGhost = true;\r\n });\r\n if (insideGhost) return false;\r\n\r\n if (inflightRef.current || idleTimerRef.current) resetIdleTimer(fireQuery);\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor, useQuery, isReadOnly, resetIdleTimer, fireQuery]);\r\n\r\n // ── Keyboard: Tab = accept, Escape = dismiss ──────────────────────────────\r\n\r\n React.useEffect(() => {\r\n return editor.registerCommand<KeyboardEvent>(\r\n KEY_DOWN_COMMAND,\r\n (e) => {\r\n if (!ghostKeyRef.current) return false;\r\n\r\n if (e.key === 'Tab' || e.key === 'ArrowRight') {\r\n e.preventDefault();\r\n editor.update(() => {\r\n const node = $getNodeByKey(ghostKeyRef.current!);\r\n if (!(node instanceof AutocompleteNode)) return;\r\n const text = node.getTextContent();\r\n const replaced = $createTextNode(text);\r\n node.replace(replaced);\r\n // Move cursor to end of the accepted text\r\n replaced.select(text.length, text.length);\r\n ghostKeyRef.current = null;\r\n lastShownCtxRef.current = '';\r\n onSuggestionAccept?.({\r\n suggestionText: text.trimStart() || text,\r\n triggerText: lastTriggerRef.current,\r\n method: 'tab',\r\n });\r\n });\r\n return true;\r\n }\r\n\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n clearGhost();\r\n editor.getEditorState().read(() => {\r\n lastShownCtxRef.current = readContextWindow(prefixWindow);\r\n });\r\n return true;\r\n }\r\n\r\n // Printable key or delete — clear ghost, pass through\r\n if (e.key.length === 1 || e.key === 'Backspace' || e.key === 'Delete') {\r\n clearGhost();\r\n return false;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n );\r\n }, [editor, clearGhost, onSuggestionAccept, prefixWindow]);\r\n\r\n // ── Unmount cleanup ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n cancelInflight();\r\n if (idleTimerRef.current) clearTimeout(idleTimerRef.current);\r\n };\r\n }, [cancelInflight]);\r\n\r\n return null;\r\n}\r\n","// CharacterStylesPopupPlugin.tsx (RTP FIX: popup behind Fluent UI Panel)\r\n// Paste as-is. This version portals into the closest Panel/Layer and uses position: fixed.\r\n\r\nimport { useTheme } from '@fluentui/react';\r\nimport { Button } from '@fluentui/react-components';\r\nimport {\r\n CodeFilled,\r\n LinkFilled,\r\n TextBold24Regular,\r\n TextItalicFilled,\r\n TextStrikethroughFilled,\r\n TextSubscriptFilled,\r\n TextSuperscriptFilled,\r\n TextUnderlineFilled,\r\n} from '@fluentui/react-icons';\r\nimport { $isCodeHighlightNode } from '@lexical/code';\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $isAtNodeEnd } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n ElementNode,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n RangeSelection,\r\n SELECTION_CHANGE_COMMAND,\r\n TextNode,\r\n} from 'lexical';\r\nimport { JSX, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\ntype UseCharacterStylesPopupOptions = {\r\n /** Overrides editor.isEditable() */\r\n isEditable?: boolean;\r\n /** show popup but disable actions */\r\n readOnly?: boolean;\r\n};\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, n));\r\n}\r\n\r\n/**\r\n * FIX: Portal container mounted inside the closest Panel/Layer so z-index/stacking works.\r\n * It creates a fixed overlay host that does not block clicks (pointer-events: none).\r\n */\r\nfunction useFloatingPortalContainer(editor: LexicalEditor) {\r\n const [container, setContainer] = useState<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const panelOrLayer =\r\n (root.closest('.ms-Panel-main') as HTMLElement | null) ||\r\n (root.closest('.ms-Panel') as HTMLElement | null) ||\r\n (root.closest('.ms-Layer') as HTMLElement | null) ||\r\n document.body;\r\n\r\n const host = document.createElement('div');\r\n host.className = 'lexical-floating-ui-host';\r\n panelOrLayer.appendChild(host);\r\n setContainer(host);\r\n\r\n return () => {\r\n host.remove();\r\n setContainer(null);\r\n };\r\n }, [editor]);\r\n\r\n return container;\r\n}\r\n\r\nfunction setPopupPositionFixed(popupEl: HTMLElement, rect: DOMRect): void {\r\n const GAP = 8;\r\n const MARGIN = 8;\r\n\r\n // Prefer above selection, right-aligned\r\n let top = rect.top - popupEl.offsetHeight - GAP;\r\n let left = rect.left + rect.width - popupEl.offsetWidth;\r\n\r\n // If off top, show below\r\n if (top < MARGIN) top = rect.bottom + GAP;\r\n\r\n // Clamp to viewport\r\n left = clamp(left, MARGIN, window.innerWidth - popupEl.offsetWidth - MARGIN);\r\n\r\n popupEl.style.top = `${top}px`;\r\n popupEl.style.left = `${left}px`;\r\n}\r\n\r\ntype FloatingProps = {\r\n editor: LexicalEditor;\r\n isBold: boolean;\r\n isItalic: boolean;\r\n isUnderline: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isCode: boolean;\r\n isLink: boolean;\r\n isEditable?: boolean;\r\n readOnly?: boolean;\r\n};\r\n\r\nfunction FloatingCharacterStylesEditor({\r\n editor,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n isCode,\r\n isLink,\r\n isEditable,\r\n readOnly,\r\n}: FloatingProps): JSX.Element {\r\n const popupRef = useRef<HTMLDivElement | null>(null);\r\n const mouseDownRef = useRef(false);\r\n const theme = useTheme();\r\n\r\n const disabled = !(isEditable ?? editor.isEditable()) || !!readOnly;\r\n\r\n const format = useCallback(\r\n (\r\n type:\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'strikethrough'\r\n | 'subscript'\r\n | 'superscript'\r\n | 'code',\r\n ) => {\r\n if (disabled) return;\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, type);\r\n },\r\n [editor, disabled],\r\n );\r\n\r\n const toggleLink = useCallback(() => {\r\n if (disabled) return;\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, isLink ? null : 'https://');\r\n }, [editor, disabled, isLink]);\r\n\r\n const updatePosition = useCallback(() => {\r\n const popupEl = popupRef.current;\r\n if (!popupEl) return;\r\n\r\n const sel = window.getSelection();\r\n const root = editor.getRootElement();\r\n\r\n if (!sel || sel.isCollapsed || !root || !root.contains(sel.anchorNode)) {\r\n popupEl.classList.remove('is-open');\r\n return;\r\n }\r\n\r\n const range = sel.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (!mouseDownRef.current) {\r\n setPopupPositionFixed(popupEl, rect as DOMRect);\r\n }\r\n\r\n popupEl.classList.add('is-open');\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n const onResize = () => editor.getEditorState().read(updatePosition);\r\n const onScroll = () => editor.getEditorState().read(updatePosition);\r\n\r\n const root = editor.getRootElement();\r\n\r\n window.addEventListener('resize', onResize);\r\n window.addEventListener('scroll', onScroll, true);\r\n root?.addEventListener('scroll', onScroll, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n window.removeEventListener('scroll', onScroll, true);\r\n root?.removeEventListener('scroll', onScroll as any);\r\n };\r\n }, [editor, updatePosition]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(updatePosition);\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(updatePosition);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updatePosition();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updatePosition]);\r\n\r\n // Fluent v8 palette\r\n const p = theme.palette;\r\n const fg = p.neutralPrimary;\r\n const fgDisabled = p.neutralTertiary;\r\n const brand = p.themePrimary;\r\n\r\n const bgHover = p.neutralLighter;\r\n const bgPressed = p.neutralLight;\r\n const bgActive = p.neutralLighterAlt ?? p.neutralLighter;\r\n const stroke = p.neutralLight;\r\n\r\n const iconColor = (active?: boolean) => (disabled ? fgDisabled : active ? brand : fg);\r\n\r\n const btnStyle = (active?: boolean): React.CSSProperties => {\r\n const baseBg = active ? bgActive : 'transparent';\r\n return {\r\n border: '1px solid transparent',\r\n borderRadius: 8,\r\n minWidth: 32,\r\n height: 32,\r\n paddingInline: 6,\r\n background: baseBg,\r\n\r\n ['--fui-Button__backgroundColor' as any]: baseBg,\r\n ['--fui-Button__backgroundColorHover' as any]: bgHover,\r\n ['--fui-Button__backgroundColorPressed' as any]: bgPressed,\r\n ['--fui-Button__borderColorHover' as any]: stroke,\r\n ['--fui-Button__borderColorPressed' as any]: stroke,\r\n ['--fui-Button__iconColor' as any]: iconColor(active),\r\n };\r\n };\r\n\r\n return (\r\n <div\r\n ref={popupRef}\r\n className='character-style-popup'\r\n onMouseDown={(e) => {\r\n // RTP: prevents selection collapse when clicking toolbar\r\n e.preventDefault();\r\n mouseDownRef.current = true;\r\n }}\r\n onMouseUp={() => (mouseDownRef.current = false)}>\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Bold'\r\n aria-label='Bold'\r\n aria-pressed={isBold}\r\n icon={<TextBold24Regular style={{ color: iconColor(isBold) }} />}\r\n style={btnStyle(isBold)}\r\n onClick={() => format('bold')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Italic'\r\n aria-label='Italic'\r\n aria-pressed={isItalic}\r\n icon={<TextItalicFilled style={{ color: iconColor(isItalic) }} />}\r\n style={btnStyle(isItalic)}\r\n onClick={() => format('italic')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Underline'\r\n aria-label='Underline'\r\n aria-pressed={isUnderline}\r\n icon={<TextUnderlineFilled style={{ color: iconColor(isUnderline) }} />}\r\n style={btnStyle(isUnderline)}\r\n onClick={() => format('underline')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Strikethrough'\r\n aria-label='Strikethrough'\r\n aria-pressed={isStrikethrough}\r\n icon={<TextStrikethroughFilled style={{ color: iconColor(isStrikethrough) }} />}\r\n style={btnStyle(isStrikethrough)}\r\n onClick={() => format('strikethrough')}\r\n />\r\n\r\n <div className='divider' aria-hidden='true' />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Subscript'\r\n aria-label='Subscript'\r\n aria-pressed={isSubscript}\r\n icon={<TextSubscriptFilled style={{ color: iconColor(isSubscript) }} />}\r\n style={btnStyle(isSubscript)}\r\n onClick={() => format('subscript')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Superscript'\r\n aria-label='Superscript'\r\n aria-pressed={isSuperscript}\r\n icon={<TextSuperscriptFilled style={{ color: iconColor(isSuperscript) }} />}\r\n style={btnStyle(isSuperscript)}\r\n onClick={() => format('superscript')}\r\n />\r\n\r\n <div className='divider' aria-hidden='true' />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Code'\r\n aria-label='Code'\r\n aria-pressed={isCode}\r\n icon={<CodeFilled style={{ color: iconColor(isCode) }} />}\r\n style={btnStyle(isCode)}\r\n onClick={() => format('code')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Link'\r\n aria-label='Link'\r\n aria-pressed={isLink}\r\n icon={<LinkFilled style={{ color: iconColor(isLink) }} />}\r\n style={btnStyle(isLink)}\r\n onClick={toggleLink}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction getSelectedNode(selection: RangeSelection): TextNode | ElementNode {\r\n const anchorNode = selection.anchor.getNode();\r\n const focusNode = selection.focus.getNode();\r\n if (anchorNode === focusNode) return anchorNode;\r\n\r\n const isBackward = selection.isBackward();\r\n return isBackward\r\n ? $isAtNodeEnd(selection.focus)\r\n ? anchorNode\r\n : focusNode\r\n : $isAtNodeEnd(selection.anchor)\r\n ? focusNode\r\n : anchorNode;\r\n}\r\n\r\nfunction useCharacterStylesPopup(\r\n editor: LexicalEditor,\r\n opts?: UseCharacterStylesPopupOptions,\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 [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 isEditable = opts?.isEditable ?? editor.isEditable();\r\n const portalContainer = useFloatingPortalContainer(editor);\r\n\r\n const updatePopupState = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\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)) return;\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\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 const parent = node.getParent();\r\n setIsLink($isLinkNode(parent) || $isLinkNode(node));\r\n\r\n if (!$isCodeHighlightNode(selection.anchor.getNode()) && selection.getTextContent() !== '') {\r\n setIsText($isTextNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopupState);\r\n return () => document.removeEventListener('selectionchange', updatePopupState);\r\n }, [updatePopupState]);\r\n\r\n useEffect(() => editor.registerUpdateListener(updatePopupState), [editor, updatePopupState]);\r\n\r\n // Hide when not text selection or when in link selection state\r\n if (!portalContainer || !isText || isLink) return null;\r\n\r\n return createPortal(\r\n <FloatingCharacterStylesEditor\r\n editor={editor}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n isEditable={isEditable}\r\n readOnly={opts?.readOnly}\r\n />,\r\n portalContainer,\r\n );\r\n}\r\n\r\nexport default function CharacterStylesPopupPlugin(\r\n props: UseCharacterStylesPopupOptions,\r\n): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useCharacterStylesPopup(editor, props);\r\n}\r\n","import { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\r\nimport { $getRoot, $setSelection } from 'lexical';\r\nimport { useCallback, useEffect, useRef } from 'react';\r\n\r\ninterface ICustomOnChangePluginProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\nexport const CustomOnChangePlugin = ({ value, onChange }: ICustomOnChangePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const initializedRef = useRef(false);\r\n\r\n // Always-current ref so the stable handleChange below never goes stale.\r\n const onChangeRef = useRef(onChange);\r\n onChangeRef.current = onChange;\r\n\r\n useEffect(() => {\r\n if (!value || initializedRef.current) return;\r\n\r\n initializedRef.current = true;\r\n\r\n editor.update(() => {\r\n const root = $getRoot();\r\n root.clear();\r\n\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(value, 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n\r\n root.append(...nodes);\r\n\r\n // Prevent Lexical from placing a DOM cursor after this programmatic update.\r\n // Without this, Lexical's commitPendingUpdates tries to sync the selection\r\n // into the contenteditable, which causes some browsers to focus the element\r\n // even when the user is typing in another field (e.g. To / CC / BCC).\r\n $setSelection(null);\r\n });\r\n }, [editor, value]);\r\n\r\n // Stable reference — never changes across renders because it only depends on\r\n // `editor` (which is stable for the lifetime of the composer).\r\n // This prevents OnChangePlugin from re-registering its Lexical update listener\r\n // on every render. Without stability, each re-registration can flush Lexical's\r\n // pending selection state (the cursor from the user's last edit), which causes\r\n // the browser to re-focus the contenteditable even when the user has already\r\n // moved to another field (e.g. Subject).\r\n const handleChange = useCallback((editorState: any) => {\r\n editorState.read(() => {\r\n onChangeRef.current($generateHtmlFromNodes(editor));\r\n });\r\n }, [editor]);\r\n\r\n return (\r\n <OnChangePlugin\r\n onChange={handleChange}\r\n ignoreSelectionChange\r\n />\r\n );\r\n};\r\n","import {\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 { $isAtNodeEnd } from '@lexical/selection';\r\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection, $isRangeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW, ElementNode, getDOMSelection,\r\n KEY_ESCAPE_COMMAND,\r\n LexicalEditor, RangeSelection, SELECTION_CHANGE_COMMAND, TextNode\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { Dispatch, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './FloatLink.css';\r\n\r\nexport const getSelectedNode = ( selection: RangeSelection ): TextNode | ElementNode => {\r\n const anchor = selection.anchor;\r\n const anchorNode = selection.anchor.getNode();\r\n const focus = selection.focus;\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\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport const setFloatingElemPositionForLinkEditor = (targetRect: DOMRect | null, floatingElem: HTMLElement, anchorElem: HTMLElement, verticalGap: number = VERTICAL_GAP, horizontalOffset: number = HORIZONTAL_OFFSET): void => {\r\n \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\nconst SUPPORTED_URL_PROTOCOLS = new Set([\r\n 'http:',\r\n 'https:',\r\n 'mailto:',\r\n 'sms:',\r\n 'tel:',\r\n]);\r\n\r\nexport const sanitizeUrl = (url: string): string => {\r\n try {\r\n const parsedUrl = new URL(url);\r\n // eslint-disable-next-line no-script-url\r\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\r\n return 'about:blank';\r\n }\r\n } catch {\r\n return url;\r\n }\r\n return url;\r\n}\r\n\r\nconst preventDefault = ( event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>) : void => {\r\n event.preventDefault();\r\n}\r\n\r\ninterface IFloatingLinkEditor {\r\n isLink: boolean;\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nconst FloatingLinkEditor = ({editor, isLink, setIsLink, anchorElem, isLinkEditMode, setIsLinkEditMode}: IFloatingLinkEditor): JSX.Element => {\r\n const [editedLinkUrl, setEditedLinkUrl] = useState('https://');\r\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>( null);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const editorRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\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 }\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 (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode) &&\r\n editor.isEditable()\r\n ) {\r\n const domRect: DOMRect | undefined =\r\n nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\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 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\nconst useFloatingLinkEditorToolbar = (\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement | null,\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(focusNode, $isAutoLinkNode);\r\n if (!(focusLinkNode || focusAutoLinkNode)) {\r\n setIsLink(false);\r\n return;\r\n }\r\n setIsLink(true);\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 if (!anchorElem || !(anchorElem instanceof HTMLElement)) {\r\n return null; // Prevent rendering if anchorElem is invalid\r\n }\r\n\r\n return createPortal(\r\n <FloatingLinkEditor\r\n isLink={isLink}\r\n editor={activeEditor}\r\n setIsLink={setIsLink}\r\n anchorElem={anchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem\r\n );\r\n};\r\ninterface IFloatingLinkEditorPlugin {\r\n anchorElem?: HTMLElement | null;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nexport const FloatingLinkEditorPlugin = ({ anchorElem, isLinkEditMode, setIsLinkEditMode}: IFloatingLinkEditorPlugin): JSX.Element | null => {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n // Ensure anchorElem is a valid DOM element, otherwise fallback to document.body\r\n const validAnchorElem = anchorElem && anchorElem instanceof HTMLElement ? anchorElem : document.body;\r\n\r\n return useFloatingLinkEditorToolbar(\r\n editor,\r\n validAnchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n SelectTabData,\r\n SelectTabEvent,\r\n} from '@fluentui/react-components';\r\nimport { AttachFilled, ImageAddRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $wrapNodeInElement, mergeRegister } 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 PASTE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { $createImageNode, $isImageNode, ImageNode, ImagePayload } from '../Nodes/ImageNode';\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\nconst readClipboardImageAsDataURL = async (event: ClipboardEvent): Promise<string | null> => {\r\n const items = event.clipboardData?.items;\r\n if (!items) return null;\r\n\r\n for (const item of Array.from(items)) {\r\n if (item.type?.startsWith('image/')) {\r\n const file = item.getAsFile();\r\n if (!file) continue;\r\n\r\n return await new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : '');\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst InsertImageByURL = ({\r\n setIsOpen,\r\n onClick,\r\n disabled,\r\n}: {\r\n setIsOpen: (e: boolean) => void;\r\n onClick: (payload: InsertImagePayload) => void;\r\n disabled: boolean;\r\n}) => {\r\n const [altText, setAltText] = useState('');\r\n const [src, setSrc] = useState('');\r\n const isDisabled = disabled || src === '';\r\n\r\n return (\r\n <Stack tokens={{ childrenGap: 6, padding: '10px 0px 0px 0px' }}>\r\n <Field label='Enter URL' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n appearance='underline'\r\n placeholder='Add URL'\r\n disabled={disabled}\r\n onChange={(_, v) => setSrc(v.value)}\r\n value={src}\r\n />\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n key='alt-text-url'\r\n disabled={disabled}\r\n onChange={(_, v) => setAltText(v.value)}\r\n value={altText}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n key='url-confirm-btn'\r\n style={{ width: '150px' }}\r\n onClick={() => !disabled && onClick({ altText, src })}\r\n disabled={isDisabled}\r\n size='small'>\r\n Confirm\r\n </Button>\r\n <Button\r\n key='file-url-cancel'\r\n style={{ width: '150px' }}\r\n onClick={() => setIsOpen(false)}\r\n disabled={disabled}\r\n size='small'>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n );\r\n};\r\n\r\ntype TabValue = 'Upload' | 'URL';\r\n\r\nexport const InsertImageDialog = ({\r\n activeEditor,\r\n disabled,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n}) => {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [selectedValue, setSelectedValue] = useState<TabValue>('Upload');\r\n const [fileName, setFileName] = useState('');\r\n const hasModifier = useRef(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n const isDisabled = disabled || src === '';\r\n\r\n const onTabSelect = (_event: SelectTabEvent, data: SelectTabData) => {\r\n setSelectedValue(data.value as TabValue);\r\n };\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 () => document.removeEventListener('keydown', handler);\r\n }, [activeEditor]);\r\n\r\n const onClick = (payload: InsertImagePayload) => {\r\n if (disabled) return;\r\n\r\n activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload);\r\n setIsOpen(false);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n };\r\n\r\n const loadImage = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n const files = event.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n setFileName(files[0].name);\r\n }\r\n };\r\n reader.readAsDataURL(files[0]);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add Image'\r\n key='upload-image'\r\n disabled={disabled}\r\n icon={<ImageAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '320px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 6 }}>\r\n <Field label='Upload' orientation='horizontal' size='small'>\r\n <label\r\n style={{\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n opacity: disabled ? 0.75 : 1,\r\n }}>\r\n <input\r\n type='file'\r\n accept='image/*'\r\n key='inline-image-upload'\r\n style={{ display: 'none' }}\r\n disabled={disabled}\r\n onChange={loadImage}\r\n />\r\n\r\n <Stack horizontal>\r\n <AttachFilled\r\n style={{\r\n fontSize: '16px',\r\n color: disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#808080',\r\n marginTop: 2,\r\n }}\r\n />\r\n {!fileName && <span style={{ fontSize: 12, color: '#808080' }}>Upload File</span>}\r\n </Stack>\r\n\r\n {fileName && <span style={{ fontSize: 12, color: '#808080' }}>{fileName}</span>}\r\n </label>\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, d) => setAltText(d.value)}\r\n value={altText}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button size='small' disabled={isDisabled} onClick={() => onClick({ altText, src })}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n\r\n {selectedValue === 'URL' && (\r\n <InsertImageByURL\r\n disabled={disabled}\r\n setIsOpen={(open) => setIsOpen(open)}\r\n onClick={(payload) => onClick(payload)}\r\n />\r\n )}\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\nconst ImagesPlugin = ({ captionsEnabled }: { captionsEnabled?: boolean }) => {\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 return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n\r\n editor.registerCommand<ClipboardEvent>(\r\n PASTE_COMMAND,\r\n (event) => {\r\n if (!event.clipboardData) return false;\r\n\r\n const hasImage = Array.from(event.clipboardData.items).some((i) =>\r\n i.type?.startsWith('image/')\r\n );\r\n if (!hasImage) return false;\r\n\r\n event.preventDefault();\r\n\r\n (async () => {\r\n const src = await readClipboardImageAsDataURL(event);\r\n if (!src) return;\r\n\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\r\n src,\r\n altText: 'Screenshot',\r\n });\r\n })();\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n\r\n editor.registerCommand<DragEvent>(\r\n DRAGSTART_COMMAND,\r\n (event) => $onDragStart(event),\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => $onDragover(event),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => $onDrop(event, editor),\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n );\r\n }, [captionsEnabled, editor]);\r\n\r\n return null;\r\n};\r\n\r\nexport default ImagesPlugin;\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\nconst $onDragStart = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) 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\nconst $onDragover = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return true;\r\n};\r\n\r\nconst $onDrop = (event: DragEvent, editor: LexicalEditor): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n\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 }\r\n\r\n return true;\r\n};\r\n\r\nconst $getImageNodeInSelection = (): ImageNode | null => {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) 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\nconst getDragImageData = (event: DragEvent): null | InsertImagePayload => {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) return null;\r\n\r\n const { type, data } = JSON.parse(dragData);\r\n if (type !== 'image') return null;\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\nconst 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\nconst getDragSelection = (event: DragEvent): Range | null | undefined => {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if ((event as any).rangeParent && domSelection !== null) {\r\n domSelection.collapse((event as any).rangeParent, (event as any).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","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Dropdown,\r\n Field,\r\n Input,\r\n makeStyles,\r\n Option,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { AttachFilled, ImageEditRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $wrapNodeInElement, mergeRegister } 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 * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport '../Nodes/InlineImage.css';\r\nimport {\r\n $createInlineImageNode,\r\n $isInlineImageNode,\r\n InlineImageNode,\r\n InlineImagePayload,\r\n Position,\r\n} from '../Nodes/InlineImageNode';\r\n\r\nexport type InsertInlineImagePayload = Readonly<InlineImagePayload>;\r\n\r\nexport const INSERT_INLINE_IMAGE_COMMAND: LexicalCommand<InlineImagePayload> = createCommand(\r\n 'INSERT_INLINE_IMAGE_COMMAND'\r\n);\r\n\r\nconst useStyles = makeStyles({\r\n alignDropdown: {\r\n minInlineSize: '90px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n ':hover': {\r\n backgroundColor: '#eee',\r\n },\r\n },\r\n});\r\n\r\nexport const InsertInlineImageDialog = ({\r\n disabled,\r\n activeEditor,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n}): JSX.Element => {\r\n const hasModifier = useRef(false);\r\n const [src, setSrc] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [altText, setAltText] = useState('');\r\n const [fileName, setFileName] = useState('');\r\n const [position, setPosition] = useState<Position>('left');\r\n const styles = useStyles();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const isDisabled = disabled || src === '';\r\n\r\n const loadImage = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n const files = event.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n setFileName(files[0].name);\r\n }\r\n };\r\n reader.readAsDataURL(files[0]);\r\n };\r\n\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n hasModifier.current = e.altKey;\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [activeEditor]);\r\n\r\n const handleOnClick = () => {\r\n if (disabled) return;\r\n\r\n const payload = { altText, position, src };\r\n activeEditor.dispatchCommand(INSERT_INLINE_IMAGE_COMMAND, payload);\r\n\r\n setIsOpen(false);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n key='upload-inline-image'\r\n title='Add Inline Image'\r\n disabled={disabled}\r\n icon={<ImageEditRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '400px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 6, padding: '10px 0px 0px 0px' }}>\r\n <Field label='Upload' orientation='horizontal' size='small'>\r\n <label\r\n style={{\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n opacity: disabled ? 0.75 : 1,\r\n }}>\r\n <input\r\n type='file'\r\n accept='image/*'\r\n key='inline-image-upload'\r\n style={{ display: 'none' }}\r\n disabled={disabled}\r\n onChange={loadImage}\r\n />\r\n\r\n <Stack horizontal>\r\n <AttachFilled\r\n style={{\r\n fontSize: '16px',\r\n color: disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#808080',\r\n marginTop: 2,\r\n }}\r\n />\r\n {!fileName && <span style={{ fontSize: 12, color: '#808080' }}>Upload File</span>}\r\n </Stack>\r\n\r\n {fileName && <span style={{ fontSize: 12, color: '#808080' }}>{fileName}</span>}\r\n </label>\r\n </Field>\r\n\r\n <Field label='Position' orientation='horizontal' size='small'>\r\n <Dropdown\r\n placeholder='Left Align'\r\n className={styles.alignDropdown}\r\n disabled={disabled}\r\n listbox={{ style: { width: '120px' } }}\r\n root={{ style: { borderBottom: '1px solid black' } }}>\r\n <Option key='full' text='full' onClick={() => setPosition('full')}>\r\n Full\r\n </Option>\r\n <Option key='left' text='left' onClick={() => setPosition('left')}>\r\n Left\r\n </Option>\r\n <Option key='right' text='right' onClick={() => setPosition('right')}>\r\n Right\r\n </Option>\r\n </Dropdown>\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n appearance='underline'\r\n disabled={disabled}\r\n value={altText}\r\n onChange={(_, d) => setAltText(d.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n key='file-inline-upload-btn'\r\n disabled={isDisabled}\r\n onClick={handleOnClick}>\r\n Add\r\n </Button>\r\n <Button\r\n size='small'\r\n key='file-inline-upload-cancel'\r\n disabled={disabled}\r\n onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport const InlineImagePlugin = () => {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([InlineImageNode])) {\r\n throw new Error('ImagesPlugin: ImageNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<InsertInlineImagePayload>(\r\n INSERT_INLINE_IMAGE_COMMAND,\r\n (payload) => {\r\n const imageNode = $createInlineImageNode(payload);\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\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) => $onDragStart(event),\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => $onDragover(event),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => $onDrop(event, editor),\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n};\r\n\r\nexport default InlineImagePlugin;\r\n\r\n/* =================== drag/drop helpers unchanged =================== */\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) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) 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 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\nconst $onDragover = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return true;\r\n};\r\n\r\nconst $onDrop = (event: DragEvent, editor: LexicalEditor): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n\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_INLINE_IMAGE_COMMAND, data);\r\n }\r\n return true;\r\n};\r\n\r\nconst $getImageNodeInSelection = (): InlineImageNode | null => {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) return null;\r\n\r\n const nodes = selection.getNodes();\r\n const node = nodes[0];\r\n return $isInlineImageNode(node) ? node : null;\r\n};\r\n\r\nconst getDragImageData = (event: DragEvent): null | InsertInlineImagePayload => {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) return null;\r\n\r\n const { type, data } = JSON.parse(dragData);\r\n if (type !== 'image') return null;\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\nconst 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\nconst getDragSelection = (event: DragEvent): Range | null | undefined => {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if ((event as any).rangeParent && domSelection !== null) {\r\n domSelection.collapse((event as any).rangeParent, (event as any).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","import { 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\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","import { $generateNodesFromDOM } from '@lexical/html';\r\nimport { $getRoot } from 'lexical';\r\nimport { $createHtmlBlockNode, $isHtmlBlockNode, HtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\n\r\nexport type BlockSpec = {\r\n kind: string;\r\n html: string;\r\n position?: 'start' | 'end';\r\n};\r\n\r\nfunction findBlockByKind(kind: string): HtmlBlockNode | null {\r\n const root = $getRoot();\r\n for (const child of root.getChildren()) {\r\n if ($isHtmlBlockNode(child) && child.getKind() === kind) return child;\r\n }\r\n return null;\r\n}\r\n\r\nfunction importHtmlIntoBlock(editor: any, block: HtmlBlockNode, html: string) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, doc);\r\n\r\n block.clear();\r\n block.append(...nodes);\r\n}\r\n\r\nexport function upsertBlock(editor: any, spec: BlockSpec) {\r\n const { kind, html, position = 'end' } = spec;\r\n\r\n editor.update(() => {\r\n const root = $getRoot();\r\n let block = findBlockByKind(kind);\r\n\r\n if (!block) {\r\n block = $createHtmlBlockNode(kind);\r\n if (position === 'start') {\r\n root.splice(0, 0, [block]);\r\n } else {\r\n root.append(block);\r\n }\r\n }\r\n\r\n importHtmlIntoBlock(editor, block, html);\r\n });\r\n}\r\n\r\nexport function removeBlock(editor: any, kind: string) {\r\n editor.update(() => {\r\n const block = findBlockByKind(kind);\r\n block?.remove();\r\n });\r\n}\r\n\r\nexport function hasBlock(editor: any, kind: string): boolean {\r\n let found = false;\r\n editor.getEditorState().read(() => {\r\n found = !!findBlockByKind(kind);\r\n });\r\n return found;\r\n}\r\n","import { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getRoot } from 'lexical';\r\nimport React, { useImperativeHandle } from 'react';\r\nimport { ContentEditorRef } from '../ContentEditorComponent.types';\r\nimport { BlockSpec, hasBlock, removeBlock, upsertBlock } from '../Utils/Helper';\r\n\r\nexport default function RefApiPlugin({\r\n forwardedRef,\r\n contentEditableDomRef,\r\n focusedRef,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useImperativeHandle(\r\n forwardedRef,\r\n (): ContentEditorRef =>\r\n ({\r\n setValue: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(html || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n const root = $getRoot();\r\n root.clear();\r\n root.append(...nodes);\r\n });\r\n },\r\n\r\n getValue: () => {\r\n let html = '';\r\n editor.getEditorState().read(() => {\r\n html = $generateHtmlFromNodes(editor, null);\r\n });\r\n return html;\r\n },\r\n\r\n clear: () => {\r\n editor.update(() => {\r\n $getRoot().clear();\r\n });\r\n },\r\n\r\n focus: () => contentEditableDomRef.current?.focus(),\r\n blur: () => contentEditableDomRef.current?.blur(),\r\n\r\n isEmpty: () => {\r\n let empty = true;\r\n editor.getEditorState().read(() => {\r\n empty = $getRoot().getTextContent().trim().length === 0;\r\n });\r\n return empty;\r\n },\r\n\r\n isFocused: () => focusedRef.current,\r\n getEditor: () => editor,\r\n\r\n // Generic blocks (signature, footer, banner, etc.)\r\n upsertBlock: (spec: BlockSpec) => upsertBlock(editor, spec),\r\n removeBlock: (kind: string) => removeBlock(editor, kind),\r\n hasBlock: (kind: string) => hasBlock(editor, kind),\r\n }) as any,\r\n [editor, contentEditableDomRef, focusedRef],\r\n );\r\n\r\n return null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n LexicalNode,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n $createSpellErrorNode,\r\n $isSpellErrorNode,\r\n SpellErrorMeta,\r\n SpellErrorNode,\r\n SpellIssueType,\r\n} from '../Nodes/SpellErrorNode';\r\n\r\n// ─── Public types ─────────────────────────────────────────────────────────────\r\n\r\nexport type SpellCheckIssue = {\r\n offset: number;\r\n length: number;\r\n message: string;\r\n suggestions: string[];\r\n type?: SpellIssueType;\r\n word?: string;\r\n};\r\n\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── CSS (injected once, outside Lexical) ─────────────────────────────────────\r\n\r\nconst CSS_ID = '__sc_styles__';\r\n\r\nfunction injectCSS() {\r\n if (document.getElementById(CSS_ID)) return;\r\n const s = document.createElement('style');\r\n s.id = CSS_ID;\r\n s.textContent = `\r\n .sc-err-spelling { text-decoration: underline dotted #e53e3e 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-grammar { text-decoration: underline dotted #3182ce 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-style { text-decoration: underline dotted #d97706 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-popover {\r\n position:fixed; z-index:10000000; background:#fff; border:1px solid #e2e8f0;\r\n border-radius:10px; box-shadow:0 6px 24px rgba(0,0,0,.15);\r\n padding:6px 0 4px; min-width:200px; max-width:300px;\r\n font-family:system-ui,sans-serif; font-size:13px; user-select:none;\r\n }\r\n .sc-popover-header { display:flex; align-items:center; gap:6px; padding:4px 12px 6px; border-bottom:1px solid #f0f0f0; margin-bottom:2px; }\r\n .sc-popover-badge { font-size:10px; font-weight:700; text-transform:uppercase; padding:2px 6px; border-radius:4px; color:#fff; flex-shrink:0; }\r\n .sc-popover-badge-spelling { background:#e53e3e; }\r\n .sc-popover-badge-grammar { background:#3182ce; }\r\n .sc-popover-badge-style { background:#d69e2e; }\r\n .sc-popover-message { color:#4a5568; font-size:12px; flex:1; }\r\n .sc-popover-item { padding:7px 14px; cursor:pointer; color:#1a202c; display:flex; align-items:center; gap:8px; font-size:13.5px; font-weight:500; }\r\n .sc-popover-item:hover { background:#f0fff4; }\r\n .sc-popover-empty { padding:8px 14px; color:#a0aec0; font-style:italic; font-size:12px; }\r\n .sc-popover-footer { border-top:1px solid #f0f0f0; margin-top:2px; padding:5px 14px 2px; display:flex; gap:8px; }\r\n .sc-popover-action { cursor:pointer; font-size:11px; color:#a0aec0; padding:3px 0; }\r\n .sc-popover-action:hover { color:#e53e3e; }\r\n .sc-popover-improve { border-top:1px solid #f0f0f0; margin-top:2px; padding:8px 12px 6px; }\r\n .sc-popover-improve-label { font-size:10px; font-weight:700; text-transform:uppercase; color:#d69e2e; margin-bottom:6px; }\r\n .sc-popover-improve-text { font-size:12px; color:#4a5568; font-style:italic; margin-bottom:8px; line-height:1.45; }\r\n .sc-popover-improve-accept { background:#d69e2e; color:#fff; border:none; border-radius:6px; padding:5px 12px; font-size:12px; font-weight:600; cursor:pointer; width:100%; }\r\n .sc-popover-improve-accept:hover { background:#b7791f; }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\n// ─── Tree helpers ─────────────────────────────────────────────────────────────\r\n\r\nfunction escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\ntype Seg = { node: TextNode; start: number; end: number; text: string };\r\n\r\n/**\r\n * Walk the Lexical tree and return all wrappable TextNode segments with their\r\n * absolute character offsets. SpellErrorNodes are counted but not returned.\r\n * Block separators (\\n) are counted between top-level blocks, not after the last.\r\n */\r\nfunction getSegments(root: LexicalNode): Seg[] {\r\n const segs: Seg[] = [];\r\n let pos = 0;\r\n\r\n function walk(node: LexicalNode) {\r\n if ($isSpellErrorNode(node)) {\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isTextNode(node)) {\r\n const t = node.getTextContent();\r\n if (t.length > 0)\r\n segs.push({ node: node as TextNode, start: pos, end: pos + t.length, text: t });\r\n pos += t.length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(walk);\r\n }\r\n\r\n if (!$isElementNode(root)) return segs;\r\n root.getChildren().forEach((block, i) => {\r\n if (i > 0) pos += 1;\r\n walk(block);\r\n });\r\n return segs;\r\n}\r\n\r\nfunction removeAllSpellNodes(root: LexicalNode) {\r\n if ($isSpellErrorNode(root)) {\r\n (root as SpellErrorNode).replace($createTextNode(root.getTextContent()));\r\n return;\r\n }\r\n if ($isElementNode(root)) {\r\n [...root.getChildren()].forEach(removeAllSpellNodes);\r\n }\r\n}\r\n\r\n/** Split TextNode at [start, start+len) and wrap that slice with a SpellErrorNode */\r\nfunction wrapWord(node: TextNode, start: number, len: number, meta: SpellErrorMeta) {\r\n const full = node.getTextContent();\r\n const before = full.slice(0, start);\r\n const word = full.slice(start, start + len);\r\n const after = full.slice(start + len);\r\n if (!word) return;\r\n\r\n const err = $createSpellErrorNode(word, meta);\r\n if (before && after) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n err.insertAfter($createTextNode(after));\r\n } else if (before) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n } else if (after) {\r\n node.replace(err);\r\n err.insertAfter($createTextNode(after));\r\n } else {\r\n node.replace(err);\r\n }\r\n}\r\n\r\n/** Move caret to the very end of the last text node in the document */\r\nfunction moveCursorToEnd(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\r\n editor.update(\r\n () => {\r\n const root = $getRoot();\r\n const lastBlock = root.getLastChild();\r\n if (!lastBlock || !$isElementNode(lastBlock)) return;\r\n // Walk to the last leaf TextNode (skip SpellErrorNodes and element nodes)\r\n let lastTextNode: TextNode | null = null;\r\n const findLast = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node) || ($isTextNode(node) && !$isSpellErrorNode(node))) {\r\n lastTextNode = node as TextNode;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(findLast);\r\n };\r\n findLast(lastBlock);\r\n if (!lastTextNode) return;\r\n const sel = $createRangeSelection();\r\n const key = (lastTextNode as TextNode).getKey();\r\n const off = (lastTextNode as TextNode).getTextContent().length;\r\n sel.anchor.set(key, off, 'text');\r\n sel.focus.set(key, off, 'text');\r\n $setSelection(sel);\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n}\r\n\r\n/** Replace all content of the first paragraph with plain text */\r\nfunction replaceFirstParagraph(\r\n editor: ReturnType<typeof useLexicalComposerContext>[0],\r\n text: string,\r\n onUpdate?: () => void,\r\n) {\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n const first = $getRoot().getFirstChild();\r\n if (first && $isElementNode(first)) {\r\n first.getChildren().forEach((c) => c.remove());\r\n first.append($createTextNode(text));\r\n }\r\n },\r\n { tag: 'spell-clear', onUpdate },\r\n );\r\n}\r\n\r\n// ─── Popover component ────────────────────────────────────────────────────────\r\n\r\ntype PopoverState = {\r\n x: number;\r\n y: number;\r\n issue: SpellCheckIssue;\r\n nodeKey: string;\r\n improvedText?: string;\r\n grammarCorrection?: string;\r\n};\r\n\r\nfunction SpellPopover({\r\n state,\r\n onAccept,\r\n onDismiss,\r\n onClose,\r\n onImprove,\r\n onAcceptGrammar,\r\n}: {\r\n state: PopoverState;\r\n onAccept: (replacement: string, nodeKey: string) => void;\r\n onDismiss: (nodeKey: string) => void;\r\n onClose: () => void;\r\n onImprove?: (text: string, nodeKey: string) => void;\r\n onAcceptGrammar?: (corrected: string) => void;\r\n}) {\r\n const ref = React.useRef<HTMLDivElement>(null);\r\n const type = state.issue.type ?? 'spelling';\r\n\r\n // Viewport-aware position\r\n const [pos, setPos] = React.useState({ left: state.x, top: state.y });\r\n React.useEffect(() => {\r\n if (!ref.current) return;\r\n const { offsetHeight: h, offsetWidth: w } = ref.current;\r\n const top = state.y + h > window.innerHeight - 8 ? state.y - h - 32 : state.y;\r\n setPos({ left: Math.min(state.x, window.innerWidth - w - 8), top });\r\n }, [state.x, state.y]);\r\n\r\n // Close on outside click\r\n React.useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n };\r\n document.addEventListener('mousedown', h, true);\r\n return () => document.removeEventListener('mousedown', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = () => onClose();\r\n window.addEventListener('scroll', h, { capture: true, passive: true });\r\n return () => window.removeEventListener('scroll', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', h, true);\r\n return () => document.removeEventListener('keydown', h, true);\r\n }, [onClose]);\r\n\r\n // Grammar correction takes priority over legacy improvedText\r\n const grammar = state.grammarCorrection;\r\n const improved = !grammar ? state.improvedText : undefined;\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className='sc-popover'\r\n style={{ left: pos.left, top: pos.top }}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }}>\r\n {' '}\r\n <div className='sc-popover-header'>\r\n <span className={`sc-popover-badge sc-popover-badge-${type}`}>{type.toUpperCase()}</span>\r\n <span className='sc-popover-message'>{state.issue.message}</span>\r\n </div>\r\n {state.issue.suggestions.length > 0 ? (\r\n state.issue.suggestions.slice(0, 5).map((s) => (\r\n <div\r\n key={s}\r\n className='sc-popover-item'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAccept(s, state.nodeKey);\r\n }}>\r\n → {s}\r\n </div>\r\n ))\r\n ) : (\r\n <div className='sc-popover-empty'>No suggestions</div>\r\n )}\r\n <div className='sc-popover-footer'>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDismiss(state.nodeKey);\r\n }}>\r\n Ignore\r\n </span>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose();\r\n }}>\r\n Close\r\n </span>\r\n </div>\r\n {grammar && onAcceptGrammar && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Grammar Suggestion</div>\r\n <div className='sc-popover-improve-text'>\"{grammar}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAcceptGrammar(grammar);\r\n onClose();\r\n }}>\r\n Accept correction\r\n </button>\r\n </div>\r\n )}\r\n {improved && onImprove && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Suggested Improvement</div>\r\n <div className='sc-popover-improve-text'>\"{improved}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onImprove(improved, state.nodeKey);\r\n }}>\r\n Accept improvement\r\n </button>\r\n </div>\r\n )}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function SpellCheckPlugin({\r\n useSpellCheck,\r\n onSpellCheckAccept,\r\n idleMs = 1200,\r\n enabled = true,\r\n}: {\r\n /** Return `{ promise, dismiss }` for the given text. */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /** Called after the user accepts any suggestion or correction. */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /** Debounce delay in ms before calling the API. Default 1200. */\r\n idleMs?: number;\r\n /** Set false to disable without unmounting (clears existing underlines). Default true. */\r\n enabled?: boolean;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const timerRef = React.useRef<number | null>(null);\r\n const dismissRef = React.useRef<(() => void) | null>(null);\r\n const reqIdRef = React.useRef(0);\r\n const lastTextRef = React.useRef('');\r\n const applyingRef = React.useRef(false);\r\n const grammarCorrectionRef = React.useRef<string | undefined>(undefined);\r\n\r\n const [popover, setPopover] = React.useState<PopoverState | null>(null);\r\n\r\n React.useEffect(() => {\r\n injectCSS();\r\n }, []);\r\n\r\n // ── Clear all underlines ─────────────────────────────────────────────────\r\n\r\n const clearErrors = React.useCallback(() => {\r\n setPopover(null);\r\n grammarCorrectionRef.current = undefined;\r\n applyingRef.current = true;\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n },\r\n {\r\n tag: 'spell-clear',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n }, [editor]);\r\n\r\n // ── Apply issues ─────────────────────────────────────────────────────────\r\n\r\n const applyIssues = React.useCallback(\r\n (issues: SpellCheckIssue[], improvedText?: string, trimOffset = 0) => {\r\n // Capture cursor as absolute char offset — stable across node splits\r\n let savedCharOffset = -1;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const anchorKey = sel.anchor.key;\r\n const anchorOff = sel.anchor.offset;\r\n let pos = 0;\r\n let found = false;\r\n const visit = (node: LexicalNode): void => {\r\n if (found) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n if (node.getKey() === anchorKey) {\r\n savedCharOffset = pos + anchorOff;\r\n found = true;\r\n return;\r\n }\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n $getRoot()\r\n .getChildren()\r\n .forEach((block, i) => {\r\n if (found) return;\r\n if (i > 0) pos += 1;\r\n visit(block);\r\n });\r\n });\r\n\r\n applyingRef.current = true;\r\n\r\n editor.update(\r\n () => {\r\n try {\r\n const root = $getRoot();\r\n removeAllSpellNodes(root);\r\n\r\n const sorted = [...issues].sort((a, b) => a.offset - b.offset);\r\n\r\n for (const issue of sorted) {\r\n const word = issue.word ?? '';\r\n if (!word) continue;\r\n\r\n const meta: SpellErrorMeta = {\r\n message: issue.message,\r\n suggestions: issue.suggestions,\r\n type: issue.type ?? 'spelling',\r\n offset: issue.offset,\r\n };\r\n\r\n const absOffset = issue.offset + trimOffset;\r\n let segs = getSegments(root);\r\n let placed = false;\r\n\r\n // Pass 1: exact offset + text match, with per-segment regex fallback\r\n for (const seg of segs) {\r\n if (absOffset < seg.start || absOffset >= seg.end) continue;\r\n const local = absOffset - seg.start;\r\n const slice = seg.text.slice(local, local + word.length);\r\n if (slice.toLowerCase() === word.toLowerCase()) {\r\n wrapWord(seg.node, local, word.length, meta);\r\n placed = true;\r\n break;\r\n }\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n\r\n // Pass 2: full-tree regex scan (handles trimOffset drift)\r\n if (!placed) {\r\n segs = getSegments(root); // re-collect after any prior wraps\r\n for (const seg of segs) {\r\n if (!seg.text.trim()) continue;\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Grammar-only: no spelling issues but grammar correction exists.\r\n // We need a click target — underline the first word of text with\r\n // a 'grammar' style node so the popover can open and show the correction.\r\n if (issues.length === 0 && !improvedText) {\r\n // grammarCorrection is stored in grammarCorrectionRef by the caller —\r\n // we just need any node to be clickable. Wrap first word of first segment.\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n const firstWord = target.text.trim().match(/^\\S+/)?.[0] ?? target.text;\r\n const wordStart = target.text.indexOf(firstWord);\r\n wrapWord(target.node, wordStart, firstWord.length, {\r\n message: 'Grammar suggestion available — click to review',\r\n suggestions: [],\r\n type: 'grammar',\r\n offset: target.start + wordStart,\r\n });\r\n }\r\n }\r\n\r\n // Legacy: full-text style underline for improvedText\r\n if (improvedText) {\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n wrapWord(target.node, 0, target.text.length, {\r\n message: 'AI suggested improvement available',\r\n suggestions: [],\r\n type: 'style',\r\n offset: -1,\r\n improvedText,\r\n });\r\n }\r\n }\r\n\r\n // Restore cursor to saved absolute position in new tree\r\n if (savedCharOffset >= 0) {\r\n let pos = 0;\r\n let restored = false;\r\n const restoreVisit = (node: LexicalNode): void => {\r\n if (restored) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n const len = node.getTextContent().length;\r\n if (savedCharOffset <= pos + len) {\r\n const sel = $createRangeSelection();\r\n const off = savedCharOffset - pos;\r\n sel.anchor.set(node.getKey(), off, 'text');\r\n sel.focus.set(node.getKey(), off, 'text');\r\n $setSelection(sel);\r\n restored = true;\r\n return;\r\n }\r\n pos += len;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(restoreVisit);\r\n };\r\n root.getChildren().forEach((block, i) => {\r\n if (restored) return;\r\n if (i > 0) pos += 1;\r\n restoreVisit(block);\r\n });\r\n }\r\n } catch (err) {\r\n console.error('[SpellCheckPlugin] applyIssues error:', err);\r\n }\r\n },\r\n {\r\n tag: 'spell-apply',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Click → open popover ─────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n let currentRoot: HTMLElement | null = null;\r\n\r\n const onClick = (e: MouseEvent) => {\r\n const span = (e.target as HTMLElement).closest('[data-spell-offset]') as HTMLElement | null;\r\n if (!span) return;\r\n if (!currentRoot?.contains(span)) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const visit = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node)) {\r\n const meta = (node as SpellErrorNode).getMeta();\r\n if (String(meta.offset) === span.dataset.spellOffset) {\r\n const rect = span.getBoundingClientRect();\r\n setPopover({\r\n x: rect.left,\r\n y: rect.bottom + 8,\r\n issue: {\r\n offset: meta.offset,\r\n length: node.getTextContent().length,\r\n message: meta.message,\r\n suggestions: meta.suggestions,\r\n type: meta.type,\r\n },\r\n nodeKey: node.getKey(),\r\n improvedText: meta.improvedText,\r\n grammarCorrection: grammarCorrectionRef.current,\r\n });\r\n }\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n visit($getRoot());\r\n });\r\n };\r\n\r\n // registerRootListener fires immediately with current root, then again on\r\n // every root change (e.g. Panel mount gives a new contenteditable element).\r\n const unregister = editor.registerRootListener((nextRoot, prevRoot) => {\r\n // Detach from old root\r\n if (prevRoot) prevRoot.removeEventListener('click', onClick);\r\n // Attach to new root\r\n if (nextRoot) nextRoot.addEventListener('click', onClick);\r\n currentRoot = nextRoot;\r\n });\r\n\r\n return () => {\r\n unregister();\r\n if (currentRoot) currentRoot.removeEventListener('click', onClick);\r\n };\r\n }, [editor]);\r\n\r\n // ── Accept spelling suggestion ───────────────────────────────────────────\r\n\r\n const handleAccept = React.useCallback(\r\n (replacement: string, nodeKey: string) => {\r\n let original = '';\r\n editor.getEditorState().read(() => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) original = n.getTextContent();\r\n });\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) (n as SpellErrorNode).replace($createTextNode(replacement));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement,\r\n message: popover?.issue.message ?? '',\r\n type: popover?.issue.type,\r\n });\r\n },\r\n [editor, onSpellCheckAccept, popover],\r\n );\r\n\r\n // ── Ignore (remove underline, keep word) ────────────────────────────────\r\n\r\n const handleDismiss = React.useCallback(\r\n (nodeKey: string) => {\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n))\r\n (n as SpellErrorNode).replace($createTextNode(n.getTextContent()));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n setPopover(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Accept legacy improved text ──────────────────────────────────────────\r\n\r\n const handleImprove = React.useCallback(\r\n (text: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, text, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: text,\r\n message: 'Accepted improved text',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Accept grammar correction ────────────────────────────────────────────\r\n\r\n const handleAcceptGrammar = React.useCallback(\r\n (corrected: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, corrected, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: corrected,\r\n message: 'Accepted grammar correction',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Debounced API trigger ────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !useSpellCheck) return;\r\n\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (applyingRef.current) return;\r\n if (tags.has('spell-apply') || tags.has('spell-clear') || tags.has('autocomplete-ghost'))\r\n return;\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n\r\n timerRef.current = window.setTimeout(async () => {\r\n timerRef.current = null;\r\n\r\n let rawText = '';\r\n editor.getEditorState().read(() => {\r\n rawText = $getRoot().getTextContent();\r\n });\r\n const text = rawText.trim();\r\n\r\n if (!text || text === lastTextRef.current) return;\r\n\r\n dismissRef.current?.();\r\n const myId = ++reqIdRef.current;\r\n const { promise, dismiss } = useSpellCheck(text);\r\n dismissRef.current = dismiss;\r\n\r\n try {\r\n const payload = await promise;\r\n if (myId !== reqIdRef.current) return; // superseded\r\n\r\n lastTextRef.current = text;\r\n\r\n const hasContent =\r\n payload?.issues?.length || payload?.grammarCorrection || payload?.improvedText;\r\n if (!payload || !hasContent) {\r\n clearErrors();\r\n return;\r\n }\r\n\r\n grammarCorrectionRef.current = payload.grammarCorrection ?? undefined;\r\n\r\n const improved =\r\n payload.improvedText && payload.improvedText.trim() !== text\r\n ? payload.improvedText\r\n : undefined;\r\n\r\n applyIssues(payload.issues ?? [], improved, rawText.length - rawText.trimStart().length);\r\n } catch (e) {\r\n console.error('[SpellCheckPlugin] request failed:', e);\r\n lastTextRef.current = '';\r\n }\r\n }, idleMs);\r\n });\r\n }, [editor, useSpellCheck, enabled, idleMs, applyIssues, clearErrors]);\r\n\r\n // ── enabled toggle ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled) {\r\n clearErrors();\r\n lastTextRef.current = '';\r\n }\r\n }, [enabled, clearErrors]);\r\n\r\n // ── Unmount cleanup ──────────────────────────────────────────────────────\r\n\r\n React.useEffect(\r\n () => () => {\r\n dismissRef.current?.();\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n },\r\n [],\r\n );\r\n\r\n return popover ? (\r\n <SpellPopover\r\n state={popover}\r\n onAccept={handleAccept}\r\n onDismiss={handleDismiss}\r\n onClose={() => setPopover(null)}\r\n onImprove={handleImprove}\r\n onAcceptGrammar={handleAcceptGrammar}\r\n />\r\n ) : null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $insertTableColumnAtSelection,\r\n $insertTableRowAtSelection,\r\n $isTableCellNode,\r\n $isTableNode,\r\n $isTableSelection,\r\n} from '@lexical/table';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $findMatchingParent,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_DOWN_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n Menu,\r\n MenuDivider,\r\n MenuGroup,\r\n MenuGroupHeader,\r\n MenuItem,\r\n MenuList,\r\n MenuPopover,\r\n} from '@fluentui/react-components';\r\n\r\nimport {\r\n ArrowDownRegular,\r\n ArrowLeftRegular,\r\n ArrowRightRegular,\r\n ArrowUpRegular,\r\n ColumnTripleRegular,\r\n DeleteRegular,\r\n RowTripleRegular,\r\n} from '@fluentui/react-icons';\r\n\r\nimport './TableActionMenu.css';\r\n\r\nexport default function TableActionMenuPlugin({ disabled = false }: { disabled?: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const [isInTable, setIsInTable] = React.useState(false);\r\n const [open, setOpen] = React.useState(false);\r\n const [menuPos, setMenuPos] = React.useState<{ x: number; y: number } | null>(null);\r\n\r\n const updateFromSelection = React.useCallback(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isTableSelection(selection)) {\r\n const tableNode = selection.getNodes().find((n) => $isTableNode(n));\r\n if (tableNode) {\r\n setIsInTable(true);\r\n return;\r\n }\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n setIsInTable(false);\r\n return;\r\n }\r\n\r\n const anchorNode = selection.anchor.getNode();\r\n const cellNode = $isTableCellNode(anchorNode)\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (n) => $isTableCellNode(n));\r\n\r\n if (!cellNode || !$isTableCellNode(cellNode)) {\r\n setIsInTable(false);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n });\r\n }, [editor]);\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateFromSelection();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerUpdateListener(() => {\r\n updateFromSelection();\r\n }),\r\n );\r\n }, [editor, updateFromSelection]);\r\n\r\n React.useEffect(() => {\r\n return editor.registerCommand<KeyboardEvent>(\r\n KEY_DOWN_COMMAND,\r\n (event) => {\r\n if (disabled) return false;\r\n\r\n const selection = $getSelection();\r\n\r\n const inTable =\r\n $isTableSelection(selection) ||\r\n ($isRangeSelection(selection) &&\r\n (() => {\r\n const node = selection.anchor.getNode();\r\n const cellNode = $isTableCellNode(node)\r\n ? node\r\n : $findMatchingParent(node, (n) => $isTableCellNode(n));\r\n return !!cellNode;\r\n })());\r\n\r\n if (!inTable) return false;\r\n\r\n if (!(event.altKey && event.shiftKey)) return false;\r\n\r\n switch (event.key) {\r\n case 'ArrowUp': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableRowAtSelection(false));\r\n return true;\r\n }\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableRowAtSelection(true));\r\n return true;\r\n }\r\n case 'ArrowLeft': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableColumnAtSelection(false));\r\n return true;\r\n }\r\n case 'ArrowRight': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableColumnAtSelection(true));\r\n return true;\r\n }\r\n default:\r\n return false;\r\n }\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n );\r\n }, [editor, disabled]);\r\n\r\n React.useEffect(() => {\r\n if (!isInTable && open) setOpen(false);\r\n }, [isInTable, open]);\r\n\r\n React.useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const handleContextMenu = (e: MouseEvent) => {\r\n if (disabled) return;\r\n\r\n let inTable = false;\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n if ($isTableSelection(selection)) {\r\n inTable = true;\r\n return;\r\n }\r\n if ($isRangeSelection(selection)) {\r\n const node = selection.anchor.getNode();\r\n const cell = $isTableCellNode(node)\r\n ? node\r\n : $findMatchingParent(node, (n) => $isTableCellNode(n));\r\n if (cell) inTable = true;\r\n }\r\n });\r\n\r\n if (inTable) {\r\n e.preventDefault();\r\n setMenuPos({ x: e.clientX, y: e.clientY });\r\n setOpen(true);\r\n }\r\n };\r\n\r\n root.addEventListener('contextmenu', handleContextMenu);\r\n return () => root.removeEventListener('contextmenu', handleContextMenu);\r\n }, [editor, disabled]);\r\n\r\n const dangerStyle: React.CSSProperties = {\r\n color: 'var(--colorPaletteRedForeground1)',\r\n };\r\n\r\n const run = React.useCallback(\r\n (fn: () => void) => {\r\n if (disabled) return;\r\n editor.focus();\r\n editor.update(() => fn());\r\n setOpen(false);\r\n },\r\n [disabled, editor],\r\n );\r\n\r\n const insertRowBelow = () => run(() => $insertTableRowAtSelection(true));\r\n const insertRowAbove = () => run(() => $insertTableRowAtSelection(false));\r\n const insertColRight = () => run(() => $insertTableColumnAtSelection(true));\r\n const insertColLeft = () => run(() => $insertTableColumnAtSelection(false));\r\n const deleteRow = () => run(() => $deleteTableRowAtSelection());\r\n const deleteCol = () => run(() => $deleteTableColumnAtSelection());\r\n\r\n const deleteTable = () =>\r\n run(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isTableSelection(selection)) {\r\n const tableNode = selection.getNodes().find((n) => $isTableNode(n));\r\n if (tableNode) tableNode.remove();\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n const node = selection.anchor.getNode();\r\n const cell =\r\n $findMatchingParent(node, (n) => $isTableCellNode(n)) ??\r\n ($isTableCellNode(node) ? node : null);\r\n\r\n if (!cell) return;\r\n\r\n const table = $getTableNodeFromLexicalNodeOrThrow(cell);\r\n table.remove();\r\n });\r\n\r\n const virtualTarget = React.useMemo(() => {\r\n if (!menuPos) return undefined;\r\n return {\r\n getBoundingClientRect: () => new DOMRect(menuPos.x, menuPos.y, 0, 0),\r\n };\r\n }, [menuPos]);\r\n\r\n if (disabled) return null;\r\n\r\n return createPortal(\r\n <Menu open={open} onOpenChange={(_, data) => setOpen(data.open)} positioning={{ target: virtualTarget }}>\r\n <MenuPopover className='aoTableActionPopover'>\r\n <MenuList>\r\n <MenuGroup>\r\n <MenuGroupHeader>Insert</MenuGroupHeader>\r\n\r\n <MenuItem icon={<RowTripleRegular />} onClick={insertRowAbove}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowUpRegular /> Row above\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ↑</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuItem icon={<RowTripleRegular />} onClick={insertRowBelow}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowDownRegular /> Row below\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ↓</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuDivider />\r\n\r\n <MenuItem icon={<ColumnTripleRegular />} onClick={insertColLeft}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowLeftRegular /> Column left\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ←</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuItem icon={<ColumnTripleRegular />} onClick={insertColRight}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowRightRegular /> Column right\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ →</span>\r\n </span>\r\n </MenuItem>\r\n </MenuGroup>\r\n\r\n <MenuDivider />\r\n\r\n <MenuGroup>\r\n <MenuGroupHeader>Delete</MenuGroupHeader>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteRow} style={dangerStyle}>\r\n Delete row\r\n </MenuItem>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteCol} style={dangerStyle}>\r\n Delete column\r\n </MenuItem>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteTable} style={dangerStyle}>\r\n Delete table\r\n </MenuItem>\r\n </MenuGroup>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>,\r\n document.body,\r\n );\r\n}\r\n","// TableCellResizerPlugin.tsx (UPDATED)\r\n// - Adds anchorElem prop so the portal mounts INSIDE the editor wrapper (fixes bottom-left/position issues)\r\n// - Uses anchorElem for mousemove listener instead of document (scopes events, avoids weird positioning in Storybook)\r\n// - Avoids re-registering SELECTION_CHANGE_COMMAND every render (adds deps + cleanup correctly)\r\n\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getTableColumnIndexFromTableCellNode,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $isTableCellNode,\r\n $isTableRowNode,\r\n getDOMCellFromTarget,\r\n getTableObserverFromTableElement,\r\n} from '@lexical/table';\r\nimport type { LexicalEditor } from 'lexical';\r\nimport {\r\n $getNearestNodeFromDOMNode,\r\n COMMAND_PRIORITY_HIGH,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport type { MouseEvent as ReactMouseEvent } from 'react';\r\nimport React, { ReactPortal, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './TableCellResizer.css';\r\n\r\ntype MousePosition = { x: number; y: number };\r\ntype MouseDraggingDirection = 'right' | 'bottom';\r\n\r\nconst MIN_ROW_HEIGHT = 33;\r\nconst MIN_COLUMN_WIDTH = 50;\r\n\r\ntype DOMCell = { elem: HTMLElement };\r\n\r\nfunction TableCellResizer({\r\n editor,\r\n anchorElem,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n}): 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\r\n const mouseStartPosRef = useRef<MousePosition | null>(null);\r\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null);\r\n\r\n const [activeCell, updateActiveCell] = useState<DOMCell | null>(null);\r\n const [isSelectingGrid, updateIsSelectingGrid] = useState<boolean>(false);\r\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(\r\n null\r\n );\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n let isGridSelection = false;\r\n\r\n const nativeSelection = window.getSelection();\r\n const anchorNode = nativeSelection?.anchorNode || null;\r\n\r\n const anchorElement =\r\n (anchorNode as any) instanceof Element\r\n ? (anchorNode as Element)\r\n : (anchorNode as Node | null)?.parentElement || null;\r\n\r\n if (anchorElement) {\r\n const cell = getDOMCellFromTarget(anchorElement as HTMLElement) as DOMCell | null;\r\n const tableEl = (cell?.elem?.closest?.('table') as HTMLTableElement | null) || null;\r\n\r\n if (tableEl) {\r\n const observer = getTableObserverFromTableElement(tableEl) as any;\r\n const tableSelection =\r\n observer?.getTableSelection?.() ?? observer?.tableSelection ?? null;\r\n isGridSelection = !!tableSelection;\r\n }\r\n }\r\n\r\n updateIsSelectingGrid((prev) => (prev !== isGridSelection ? isGridSelection : prev));\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n const resetState = useCallback(() => {\r\n updateActiveCell(null);\r\n targetRef.current = null;\r\n updateDraggingDirection(null);\r\n mouseStartPosRef.current = null;\r\n tableRectRef.current = null;\r\n updateMouseCurrentPos(null);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const onMouseMove = (event: MouseEvent) => {\r\n // If user is dragging, just update current mouse position\r\n if (draggingDirection) {\r\n updateMouseCurrentPos({ x: event.clientX, y: event.clientY });\r\n return;\r\n }\r\n\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return;\r\n\r\n if (resizerRef.current && resizerRef.current.contains(target)) return;\r\n\r\n if (targetRef.current !== target) {\r\n targetRef.current = target;\r\n\r\n const cell = getDOMCellFromTarget(target) as DOMCell | null;\r\n\r\n if (cell && activeCell !== cell) {\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem);\r\n if (!tableCellNode) {\r\n resetState();\r\n return;\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = editor.getElementByKey(tableNode.getKey());\r\n\r\n if (!tableElement) {\r\n resetState();\r\n return;\r\n }\r\n\r\n tableRectRef.current = tableElement.getBoundingClientRect();\r\n updateActiveCell(cell);\r\n });\r\n } else if (cell == null) {\r\n resetState();\r\n }\r\n }\r\n };\r\n\r\n anchorElem.addEventListener('mousemove', onMouseMove);\r\n\r\n const onLeave = () => {\r\n if (!draggingDirection) resetState();\r\n };\r\n anchorElem.addEventListener('mouseleave', onLeave);\r\n\r\n return () => {\r\n anchorElem.removeEventListener('mousemove', onMouseMove);\r\n anchorElem.removeEventListener('mouseleave', onLeave);\r\n };\r\n }, [activeCell, draggingDirection, editor, resetState, anchorElem]);\r\n\r\n const isHeightChanging = (direction: MouseDraggingDirection) => direction === 'bottom';\r\n\r\n const updateRowHeight = useCallback(\r\n (newHeight: number) => {\r\n if (!activeCell) return;\r\n\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) return;\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) return;\r\n\r\n const tableRow = tableRows[tableRowIndex];\r\n if (!$isTableRowNode(tableRow)) return;\r\n\r\n tableRow.setHeight(newHeight);\r\n });\r\n },\r\n [activeCell, editor]\r\n );\r\n\r\n const updateColumnWidth = useCallback(\r\n (newWidth: number) => {\r\n if (!activeCell) return;\r\n\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) return;\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n for (let r = 0; r < tableRows.length; r++) {\r\n const tableRow = tableRows[r];\r\n if (!$isTableRowNode(tableRow)) continue;\r\n\r\n const tableCells = tableRow.getChildren();\r\n if (tableColumnIndex >= tableCells.length || tableColumnIndex < 0) continue;\r\n\r\n const tableCell = tableCells[tableColumnIndex];\r\n if (!$isTableCellNode(tableCell)) continue;\r\n\r\n tableCell.setWidth(newWidth);\r\n }\r\n });\r\n },\r\n [activeCell, editor]\r\n );\r\n\r\n const toggleResize = useCallback(\r\n (direction: MouseDraggingDirection) => (event: ReactMouseEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) return;\r\n\r\n if (draggingDirection === direction && mouseStartPosRef.current) {\r\n const { x, y } = mouseStartPosRef.current;\r\n const { height, width } = activeCell.elem.getBoundingClientRect();\r\n\r\n if (isHeightChanging(direction)) {\r\n const heightChange = Math.abs(event.clientY - y);\r\n const isShrinking = direction === 'bottom' && y > event.clientY;\r\n\r\n updateRowHeight(\r\n Math.max(isShrinking ? height - heightChange : height + heightChange, MIN_ROW_HEIGHT)\r\n );\r\n } else {\r\n const widthChange = Math.abs(event.clientX - x);\r\n const isShrinking = direction === 'right' && x > event.clientX;\r\n\r\n updateColumnWidth(\r\n Math.max(isShrinking ? width - widthChange : width + widthChange, MIN_COLUMN_WIDTH)\r\n );\r\n }\r\n\r\n resetState();\r\n return;\r\n }\r\n\r\n // start drag\r\n const start = { x: event.clientX, y: event.clientY };\r\n mouseStartPosRef.current = start;\r\n updateMouseCurrentPos(start);\r\n updateDraggingDirection(direction);\r\n },\r\n [activeCell, draggingDirection, resetState, updateColumnWidth, updateRowHeight]\r\n );\r\n\r\n const getResizers = useCallback(() => {\r\n type ResizerStyles = Record<MouseDraggingDirection, React.CSSProperties>;\r\n\r\n const empty: ResizerStyles = { bottom: {}, right: {} };\r\n\r\n if (!activeCell) return empty;\r\n\r\n const cellRect = activeCell.elem.getBoundingClientRect();\r\n const anchorRect = anchorElem.getBoundingClientRect();\r\n\r\n const baseTop = cellRect.top - anchorRect.top + anchorElem.scrollTop;\r\n const baseLeft = cellRect.left - anchorRect.left + anchorElem.scrollLeft;\r\n\r\n const styles: ResizerStyles = {\r\n bottom: {\r\n backgroundColor: 'transparent',\r\n cursor: 'row-resize',\r\n height: '10px',\r\n left: `${baseLeft}px`,\r\n top: `${baseTop + cellRect.height}px`,\r\n width: `${cellRect.width}px`,\r\n position: 'absolute',\r\n },\r\n right: {\r\n backgroundColor: 'transparent',\r\n cursor: 'col-resize',\r\n height: `${cellRect.height}px`,\r\n left: `${baseLeft + cellRect.width}px`,\r\n top: `${baseTop}px`,\r\n width: '10px',\r\n position: 'absolute',\r\n },\r\n };\r\n\r\n const tableRect = tableRectRef.current;\r\n\r\n if (draggingDirection && mouseCurrentPos && tableRect) {\r\n const mouseX = mouseCurrentPos.x - anchorRect.left + anchorElem.scrollLeft;\r\n const mouseY = mouseCurrentPos.y - anchorRect.top + anchorElem.scrollTop;\r\n\r\n const tableLeft = tableRect.left - anchorRect.left + anchorElem.scrollLeft;\r\n const tableTop = tableRect.top - anchorRect.top + anchorElem.scrollTop;\r\n\r\n if (isHeightChanging(draggingDirection)) {\r\n styles.bottom.left = `${tableLeft}px`;\r\n styles.bottom.top = `${mouseY}px`;\r\n styles.bottom.height = '3px';\r\n styles.bottom.width = `${tableRect.width}px`;\r\n styles.bottom.backgroundColor = '#adf';\r\n } else {\r\n styles.right.top = `${tableTop}px`;\r\n styles.right.left = `${mouseX}px`;\r\n styles.right.width = '3px';\r\n styles.right.height = `${tableRect.height}px`;\r\n styles.right.backgroundColor = '#adf';\r\n }\r\n }\r\n\r\n return styles;\r\n }, [activeCell, draggingDirection, mouseCurrentPos, anchorElem]);\r\n\r\n const resizerStyles = getResizers();\r\n\r\n return (\r\n <div ref={resizerRef}>\r\n {activeCell != null && !isSelectingGrid && (\r\n <>\r\n <div\r\n className='TableCellResizer__resizer TableCellResizer__ui'\r\n style={resizerStyles.right}\r\n onMouseDown={toggleResize('right')}\r\n onMouseUp={toggleResize('right')}\r\n />\r\n <div\r\n className='TableCellResizer__resizer TableCellResizer__ui'\r\n style={resizerStyles.bottom}\r\n onMouseDown={toggleResize('bottom')}\r\n onMouseUp={toggleResize('bottom')}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableCellResizerPlugin({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement;\r\n}): ReactPortal {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n return useMemo(\r\n () => createPortal(<TableCellResizer editor={editor} anchorElem={anchorElem} />, anchorElem),\r\n [editor, anchorElem]\r\n );\r\n}\r\n","import { ContentEditorLevel } from '../ContentEditorComponent.types';\r\n\r\nexport enum RichTextPluginsType {\r\n Undo = 'undo', //\r\n Redo = 'redo', //\r\n Bold = 'bold',\r\n Italic = 'italic',\r\n Underline = 'underline',\r\n Link = 'link',\r\n Strikethrough = 'strike',\r\n Superscript = 'superscript',\r\n Subscript = 'subscript',\r\n Highlight = 'highlight',\r\n Code = 'code', //\r\n LeftAlign = 'leftAlign',\r\n CenterAlign = 'centerAlign',\r\n RightAlign = 'rightAlign',\r\n JustifyAlign = 'justifyAlign',\r\n Divider = 'divider', //\r\n Lowercase = 'lowercase',\r\n Uppercase = 'uppercase',\r\n Capitalize = 'capitalize',\r\n}\r\n\r\nexport const HEADING_OPTION = [\r\n { key: 'h1', text: 'Heading 1' },\r\n { key: 'h2', text: 'Heading 2' },\r\n { key: 'h3', text: 'Heading 3' },\r\n { key: 'h4', text: 'Heading 4' },\r\n { key: 'h5', text: 'Heading 5' },\r\n { key: 'h6', text: 'Heading 6' },\r\n];\r\n\r\nexport const LOW_PRIORIRTY = 1;\r\n\r\nexport interface IEditorProps {\r\n readOnly?: boolean;\r\n level: ContentEditorLevel;\r\n}\r\n","import { ContentEditorLevel } from '../ContentEditorComponent.types';\r\n\r\nexport function getToolbarGroupsByLevel(level: ContentEditorLevel): string[][] {\r\n switch (level) {\r\n case ContentEditorLevel.None:\r\n return [];\r\n\r\n case ContentEditorLevel.Basic:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Link', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n\r\n case ContentEditorLevel.Standard:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Link', 'Table', '|'],\r\n // ['Image', 'Youtube', 'InlineImage', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n\r\n case ContentEditorLevel.Pro:\r\n default:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Link', 'Table', '|'],\r\n // ['CodeBlock', '|'],\r\n ['Image', 'Youtube', 'InlineImage', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n }\r\n}","import { $setBlocksType } from '@lexical/selection';\r\nimport { $createParagraphNode, $getSelection, LexicalEditor } from \"lexical\";\r\n\r\nexport const getSelectedBtnProps = (isSelected: boolean) =>\r\n isSelected\r\n ? {\r\n colorScheme: \"blue\",\r\n variant: \"solid\",\r\n }\r\n : { color: \"#444\" };\r\n\r\nexport enum UpdateFontSizeType {\r\n increment = 1,\r\n decrement,\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\nexport const fontSize = `${DEFAULT_FONT_SIZE}px`;\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\nconst addListener = (element: HTMLElement, cb: Listener): () => void => {\r\n let elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n const listeners: any = 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\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n });\r\n};","import { Callout, DefaultButton, Stack, TextField } from '@fluentui/react';\r\nimport { Button } from '@fluentui/react-components';\r\nimport * as React from 'react';\r\nimport './ColorPickerComponent.css';\r\n\r\ntype Props = {\r\n value: string;\r\n title: string;\r\n disabled?: boolean;\r\n icon: any;\r\n onChange: (hex: string) => void;\r\n};\r\n\r\nconst PRESET = [\r\n '#000000',\r\n '#434343',\r\n '#666666',\r\n '#999999',\r\n '#b7b7b7',\r\n '#cccccc',\r\n '#d9d9d9',\r\n '#ffffff',\r\n\r\n '#980000',\r\n '#ff0000',\r\n '#ff9900',\r\n '#ffff00',\r\n '#00ff00',\r\n '#00ffff',\r\n '#4a86e8',\r\n '#0000ff',\r\n '#9900ff',\r\n '#ff00ff',\r\n];\r\n\r\nconst clamp = (v: number, min: number, max: number) => Math.min(max, Math.max(min, v));\r\n\r\nconst normalizeHex = (v: string) => {\r\n let s = (v ?? '').trim();\r\n if (!s) return '#000000';\r\n if (!s.startsWith('#')) s = `#${s}`;\r\n if (s.length === 4 || s.length === 7) return s;\r\n return '#000000';\r\n};\r\n\r\nconst hexToRgb = (hex: string) => {\r\n const h = normalizeHex(hex).replace('#', '');\r\n if (h.length === 3) {\r\n const r = parseInt(h[0] + h[0], 16);\r\n const g = parseInt(h[1] + h[1], 16);\r\n const b = parseInt(h[2] + h[2], 16);\r\n return { r, g, b };\r\n }\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return { r, g, b };\r\n};\r\n\r\nconst rgbToHex = (r: number, g: number, b: number) =>\r\n `#${[r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('')}`;\r\n\r\nconst rgbToHsv = (r: number, g: number, b: number) => {\r\n const rr = r / 255,\r\n gg = g / 255,\r\n bb = b / 255;\r\n const max = Math.max(rr, gg, bb),\r\n min = Math.min(rr, gg, bb);\r\n const d = max - min;\r\n\r\n let h = 0;\r\n if (d !== 0) {\r\n if (max === rr) h = ((gg - bb) / d) % 6;\r\n else if (max === gg) h = (bb - rr) / d + 2;\r\n else h = (rr - gg) / d + 4;\r\n h *= 60;\r\n if (h < 0) h += 360;\r\n }\r\n\r\n const s = max === 0 ? 0 : d / max;\r\n const v = max;\r\n\r\n return { h, s, v };\r\n};\r\n\r\nconst hsvToRgb = (h: number, s: number, v: number) => {\r\n const c = v * s;\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\r\n const m = v - c;\r\n\r\n let rr = 0,\r\n gg = 0,\r\n bb = 0;\r\n if (h < 60) [rr, gg, bb] = [c, x, 0];\r\n else if (h < 120) [rr, gg, bb] = [x, c, 0];\r\n else if (h < 180) [rr, gg, bb] = [0, c, x];\r\n else if (h < 240) [rr, gg, bb] = [0, x, c];\r\n else if (h < 300) [rr, gg, bb] = [x, 0, c];\r\n else [rr, gg, bb] = [c, 0, x];\r\n\r\n return {\r\n r: Math.round((rr + m) * 255),\r\n g: Math.round((gg + m) * 255),\r\n b: Math.round((bb + m) * 255),\r\n };\r\n};\r\n\r\nfunction useDrag(onMove: (clientX: number, clientY: number) => void, onEnd?: () => void) {\r\n const draggingRef = React.useRef(false);\r\n\r\n const start = React.useCallback(\r\n (e: React.MouseEvent) => {\r\n draggingRef.current = true;\r\n onMove(e.clientX, e.clientY);\r\n\r\n const move = (ev: MouseEvent) => {\r\n if (!draggingRef.current) return;\r\n onMove(ev.clientX, ev.clientY);\r\n };\r\n const up = () => {\r\n draggingRef.current = false;\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n onEnd?.();\r\n };\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n },\r\n [onMove, onEnd],\r\n );\r\n\r\n return start;\r\n}\r\n\r\nexport const ColorPickerControl = ({ value, title, disabled, onChange, icon }: Props) => {\r\n const [open, setOpen] = React.useState(false);\r\n const btnRef = React.useRef<HTMLDivElement | null>(null);\r\n\r\n const [hex, setHex] = React.useState<string>(normalizeHex(value || '#000000'));\r\n\r\n const { r, g, b } = React.useMemo(() => hexToRgb(hex), [hex]);\r\n const hsv = React.useMemo(() => rgbToHsv(r, g, b), [r, g, b]);\r\n\r\n const [h, setH] = React.useState(hsv.h);\r\n const [s, setS] = React.useState(hsv.s);\r\n const [v, setV] = React.useState(hsv.v);\r\n\r\n React.useEffect(() => {\r\n const n = normalizeHex(value || '#000000');\r\n setHex(n);\r\n const rgb = hexToRgb(n);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n }, [value]);\r\n\r\n const commitHsv = React.useCallback(\r\n (hh: number, ss: number, vv: number, close?: boolean) => {\r\n const rgb = hsvToRgb(hh, ss, vv);\r\n const nextHex = rgbToHex(rgb.r, rgb.g, rgb.b);\r\n setHex(nextHex);\r\n onChange(nextHex);\r\n if (close) setOpen(false);\r\n },\r\n [onChange],\r\n );\r\n\r\n const svRef = React.useRef<HTMLDivElement | null>(null);\r\n const onSVMove = React.useCallback(\r\n (clientX: number, clientY: number) => {\r\n if (!svRef.current) return;\r\n const rect = svRef.current.getBoundingClientRect();\r\n const x = clamp(clientX - rect.left, 0, rect.width);\r\n const y = clamp(clientY - rect.top, 0, rect.height);\r\n const ss = rect.width === 0 ? 0 : x / rect.width;\r\n const vv = rect.height === 0 ? 0 : 1 - y / rect.height;\r\n setS(ss);\r\n setV(vv);\r\n commitHsv(h, ss, vv);\r\n },\r\n [h, commitHsv],\r\n );\r\n const startSV = useDrag(onSVMove);\r\n\r\n const hueRef = React.useRef<HTMLDivElement | null>(null);\r\n const onHueMove = React.useCallback(\r\n (clientX: number) => {\r\n if (!hueRef.current) return;\r\n const rect = hueRef.current.getBoundingClientRect();\r\n const x = clamp(clientX - rect.left, 0, rect.width);\r\n const hh = rect.width === 0 ? 0 : (x / rect.width) * 360;\r\n setH(hh);\r\n commitHsv(hh, s, v);\r\n },\r\n [s, v, commitHsv],\r\n );\r\n const startHue = useDrag((x) => onHueMove(x));\r\n\r\n const svThumb = React.useMemo(() => ({ left: `${s * 100}%`, top: `${(1 - v) * 100}%` }), [s, v]);\r\n const hueThumb = React.useMemo(() => ({ left: `${(h / 360) * 100}%` }), [h]);\r\n\r\n const hueColor = React.useMemo(() => {\r\n const { r, g, b } = hsvToRgb(h, 1, 1);\r\n return rgbToHex(r, g, b);\r\n }, [h]);\r\n\r\n return (\r\n <div ref={btnRef} style={{ position: 'relative', display: 'inline-block' }}>\r\n <Button\r\n size='small'\r\n icon={icon}\r\n value={title}\r\n title={title}\r\n disabled={disabled}\r\n style={{\r\n background: open ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n paddingBottom: 6,\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setOpen((p) => !p);\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n bottom: 5,\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n width: 14,\r\n height: 3,\r\n background: hex,\r\n borderRadius: 1,\r\n border: '0.5px solid rgba(0,0,0,0.18)',\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n\r\n {open && !disabled && (\r\n <Callout\r\n target={btnRef}\r\n onDismiss={() => setOpen(false)}\r\n setInitialFocus\r\n directionalHint={4}\r\n className='aoColorCallout'>\r\n <Stack tokens={{ childrenGap: 10 }} styles={{ root: { padding: 12, width: 320 } }}>\r\n <div className='aoLexRow'>\r\n <div className='aoLexSwatch' style={{ background: hex }} />\r\n <div className='aoLexTitle'>{title}</div>\r\n </div>\r\n\r\n <div className='aoLexRow'>\r\n <div className='aoLexLabel'>Hex</div>\r\n <TextField\r\n value={hex}\r\n onChange={(_, val) => setHex(normalizeHex(val || ''))}\r\n onBlur={() => {\r\n const n = normalizeHex(hex);\r\n setHex(n);\r\n const rgb = hexToRgb(n);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n onChange(n);\r\n }}\r\n />\r\n </div>\r\n\r\n <div className='aoLexSwatches'>\r\n {PRESET.map((c) => (\r\n <button\r\n key={c}\r\n type='button'\r\n className='aoLexSwatchBtn'\r\n style={{ background: c }}\r\n onClick={() => {\r\n setHex(c);\r\n const rgb = hexToRgb(c);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n onChange(c);\r\n }}\r\n title={c}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className='aoLexSV' ref={svRef} onMouseDown={startSV}>\r\n <div className='aoLexSVHue' style={{ background: hueColor }} />\r\n <div className='aoLexSVWhite' />\r\n <div className='aoLexSVBlack' />\r\n <div className='aoLexSVThumb' style={svThumb} />\r\n </div>\r\n\r\n <div className='aoLexHue' ref={hueRef} onMouseDown={startHue}>\r\n <div className='aoLexHueThumb' style={hueThumb} />\r\n </div>\r\n\r\n <div className='aoLexPreview' style={{ background: hex }} />\r\n\r\n <div className='aoLexActions'>\r\n <DefaultButton\r\n text='Apply'\r\n onClick={() => {\r\n commitHsv(h, s, v, true);\r\n }}\r\n />\r\n <DefaultButton text='Close' onClick={() => setOpen(false)} />\r\n </div>\r\n </Stack>\r\n </Callout>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { PaintBucket16Filled, TextColorRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n SELECTION_CHANGE_COMMAND,\r\n type RangeSelection,\r\n} from 'lexical';\r\nimport React from 'react';\r\nimport { ColorPickerControl } from '../Nodes/ColorPickerComponent';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\n\r\nexport const ColorPickerPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [{ color, bgColor }, setColors] = React.useState({ color: '#000000', bgColor: '#ffffff' });\r\n\r\n const lastRangeSelectionRef = React.useRef<RangeSelection | null>(null);\r\n\r\n const updateToolbar = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n lastRangeSelectionRef.current = selection.clone();\r\n\r\n const c = $getSelectionStyleValueForProperty(selection, 'color', '#000000');\r\n const bg = $getSelectionStyleValueForProperty(selection, 'background-color', '#ffffff');\r\n setColors({ color: c, bgColor: bg });\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar());\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbar();\r\n return false;\r\n },\r\n LOW_PRIORIRTY\r\n )\r\n );\r\n }, [editor]);\r\n\r\n const applyStyle = (args: { property: 'background-color' | 'color'; color: string }) => {\r\n if (disabled) return;\r\n\r\n editor.focus();\r\n\r\n editor.update(() => {\r\n const saved = lastRangeSelectionRef.current;\r\n if (saved) {\r\n $setSelection(saved.clone());\r\n }\r\n\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n $patchStyleText(selection, { [args.property]: args.color });\r\n }\r\n });\r\n };\r\n\r\n const containerStyle: React.CSSProperties = disabled\r\n ? {\r\n display: 'flex',\r\n gap: 6,\r\n alignItems: 'center',\r\n opacity: 0.55,\r\n cursor: 'not-allowed',\r\n pointerEvents: 'none',\r\n filter: 'grayscale(0.25)',\r\n }\r\n : {\r\n display: 'flex',\r\n gap: 6,\r\n alignItems: 'center',\r\n };\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n return (\r\n <Stack horizontal verticalAlign='center' style={containerStyle}>\r\n <ColorPickerControl\r\n value={color}\r\n title='Text color'\r\n disabled={disabled}\r\n icon={<TextColorRegular style={{ color: iconColor }} />}\r\n onChange={(c) => applyStyle({ property: 'color', color: c })}\r\n />\r\n\r\n <ColorPickerControl\r\n value={bgColor}\r\n title='Background color'\r\n disabled={disabled}\r\n icon={<PaintBucket16Filled style={{ color: iconColor }} />}\r\n onChange={(c) => applyStyle({ property: 'background-color', color: c })}\r\n />\r\n </Stack>\r\n );\r\n};\r\n","import { Dropdown, makeStyles, Option } from '@fluentui/react-components';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport { $getSelection, $isRangeSelection, SELECTION_CHANGE_COMMAND } from 'lexical';\r\nimport { useCallback, useEffect, useState } from 'react';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\n\r\nconst useStyles = makeStyles({\r\n fontFamily: {\r\n border: 'none',\r\n minInlineSize: '70px',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nconst FONT_FAMILY_OPTIONS: [string, string][] = [\r\n ['Arial', 'Arial'],\r\n ['Courier New', 'Courier'],\r\n ['Comic Sans MS', 'Comic'],\r\n ['Georgia', 'Georgia'],\r\n ['Times New Roman', 'Times'],\r\n ['Verdana', 'Verdana'],\r\n ['Lucida Serif', 'Lucida'],\r\n ['Trebuchet MS', 'Trebuchet'],\r\n ['Tahoma', 'Tahoma'],\r\n];\r\n\r\nexport const FontFamilyPlugin = ({ disabled = false }: { disabled?: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const styles = useStyles();\r\n\r\n const [fontFamily, setFontFamily] = useState<string>('');\r\n\r\n const fg = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n useEffect(() => {\r\n const readFontFamily = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const raw = $getSelectionStyleValueForProperty(selection, 'font-family', '');\r\n setFontFamily(raw.replace(/['\"]/g, '').trim());\r\n }\r\n };\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(readFontFamily);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n readFontFamily();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n const handleClick = useCallback(\r\n (option: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (selection) {\r\n $patchStyleText(selection, {\r\n ['font-family']: option,\r\n });\r\n }\r\n });\r\n },\r\n [editor, disabled],\r\n );\r\n\r\n return (\r\n <Dropdown\r\n disabled={disabled}\r\n key='font-family'\r\n id='font-family-option'\r\n placeholder='Style'\r\n value={fontFamily}\r\n selectedOptions={fontFamily ? [fontFamily] : []}\r\n className={styles.fontFamily}\r\n style={{\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n button={{\r\n style: {\r\n color: fg,\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n },\r\n }}\r\n expandIcon={{ style: { color: fg } }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as string;\r\n if (val) handleClick(val);\r\n }}>\r\n {FONT_FAMILY_OPTIONS.map(([option, text]) => (\r\n <Option key={option} value={option} text={option}>\r\n <span style={{ fontFamily: option }}>{option}</span>\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { Dropdown, makeStyles, Option } from '@fluentui/react-components';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport { $getSelection, $isRangeSelection, SELECTION_CHANGE_COMMAND } from 'lexical';\r\nimport * as React from 'react';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\nimport { DEFAULT_FONT_SIZE } from '../Utils/Index';\r\n\r\nconst FONT_SIZE_OPTIONS = [\r\n '8',\r\n '9',\r\n '10',\r\n '11',\r\n '12',\r\n '13',\r\n '14',\r\n '15',\r\n '16',\r\n '17',\r\n '18',\r\n '19',\r\n '20',\r\n '21',\r\n '22',\r\n '23',\r\n '24',\r\n '25',\r\n '26',\r\n '27',\r\n '28',\r\n '29',\r\n '30',\r\n '31',\r\n '32',\r\n '36',\r\n '40',\r\n '42',\r\n '46',\r\n '48',\r\n '50',\r\n '52',\r\n '54',\r\n '56',\r\n '58',\r\n '60',\r\n '62',\r\n '64',\r\n '66',\r\n '67',\r\n '68',\r\n '70',\r\n '72',\r\n '74',\r\n '76',\r\n];\r\n\r\nconst useStyles = makeStyles({\r\n dropdown: {\r\n minInlineSize: '50px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nexport const FontSizePlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const styles = useStyles();\r\n\r\n const [fontSize, setFontSize] = React.useState<string>(String(DEFAULT_FONT_SIZE));\r\n\r\n const fg = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n React.useEffect(() => {\r\n const readFontSize = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const raw = $getSelectionStyleValueForProperty(\r\n selection,\r\n 'font-size',\r\n `${DEFAULT_FONT_SIZE}px`,\r\n );\r\n const numeric = raw.replace('px', '').trim();\r\n if (numeric) setFontSize(numeric);\r\n }\r\n };\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(readFontSize);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n readFontSize();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n const updateFontSizeInSelection = (newFontSizePx: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (selection) {\r\n $patchStyleText(selection, { 'font-size': `${newFontSizePx}px` });\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <Stack horizontal tokens={{ childrenGap: 4 }}>\r\n <Dropdown\r\n key='fontsize'\r\n value={fontSize}\r\n selectedOptions={[fontSize]}\r\n disabled={disabled}\r\n className={styles.dropdown}\r\n style={{\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n button={{\r\n style: {\r\n color: fg,\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n },\r\n }}\r\n expandIcon={{ style: { color: fg } }}\r\n onOptionSelect={(_, o) => {\r\n if (disabled) return;\r\n const v = String(o.optionValue ?? '');\r\n if (!v) return;\r\n\r\n setFontSize(v);\r\n updateFontSizeInSelection(v);\r\n }}\r\n listbox={{\r\n style: {\r\n minInlineSize: '100px',\r\n color: '#707070',\r\n },\r\n }}>\r\n <Stack style={{ maxHeight: 250, overflowY: 'auto' }}>\r\n {FONT_SIZE_OPTIONS.map((size) => (\r\n <Option key={size} value={size} text={size}>\r\n {size} px\r\n </Option>\r\n ))}\r\n </Stack>\r\n </Dropdown>\r\n </Stack>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { LinkAddRegular } from '@fluentui/react-icons';\r\nimport { $createLinkNode } from '@lexical/link';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelection, $isRangeSelection, TextNode } from 'lexical';\r\nimport { useState } from 'react';\r\n\r\nexport const InsertLinkPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [text, setText] = useState('');\r\n const [link, setLink] = useState('');\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const insertLink = (text: string, link: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n setText('');\r\n setLink('');\r\n\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const textNode = new TextNode(text);\r\n const linkNode = $createLinkNode(link.startsWith('http') ? link : `https://${link}`);\r\n linkNode.append(textNode);\r\n selection.insertNodes([linkNode]);\r\n }\r\n\r\n setIsOpen(false);\r\n });\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add link'\r\n key='upload-link'\r\n disabled={disabled}\r\n icon={<LinkAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (!disabled) setIsOpen((prev) => !prev);\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='Text' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={text}\r\n appearance='underline'\r\n placeholder='Text'\r\n disabled={disabled}\r\n onChange={(_, v) => setText(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Link' orientation='horizontal' size='small'>\r\n <Input\r\n value={link}\r\n appearance='underline'\r\n placeholder='Link'\r\n disabled={disabled}\r\n onChange={(_, v) => setLink(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n disabled={disabled || !text || !link}\r\n onClick={() => insertLink(text, link)}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { TableAddRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $createTableNodeWithDimensions } from '@lexical/table';\r\nimport { $insertNodeToNearestRoot } from '@lexical/utils';\r\nimport { useState } from 'react';\r\n\r\nexport const TableItemPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [columns, setColumns] = useState('');\r\n const [rows, setRows] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const onAddTable = () => {\r\n if (disabled) return;\r\n\r\n const row = Number(rows);\r\n const col = Number(columns);\r\n if (!row || !col) return;\r\n\r\n editor.update(() => {\r\n const tableNode = $createTableNodeWithDimensions(row, col, true);\r\n $insertNodeToNearestRoot(tableNode);\r\n });\r\n\r\n setRows('');\r\n setColumns('');\r\n setIsOpen(false);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add table'\r\n disabled={disabled}\r\n key='insert-table-nodes'\r\n icon={<TableAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setRows('');\r\n setColumns('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='Rows' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setRows(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Columns' orientation='horizontal' size='small'>\r\n <Input\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setColumns(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n appearance='primary'\r\n disabled={disabled || !rows || !columns}\r\n onClick={onAddTable}>\r\n Add\r\n </Button>\r\n\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { VideoClipRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $insertNodes } from 'lexical';\r\nimport { useState } from 'react';\r\nimport { $createYouTubeNode } from '../Nodes/YoutubeNode';\r\n\r\nexport const YoutubeUploadPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [url, setURL] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#424242';\r\n\r\n const onHandleEmbeded = () => {\r\n if (disabled) return;\r\n if (!url) return;\r\n\r\n const match = /^.*(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;\r\n if (!id) return;\r\n\r\n editor.update(() => {\r\n const node = $createYouTubeNode(id);\r\n $insertNodes([node]);\r\n });\r\n\r\n setURL('');\r\n setIsOpen(false);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n key='upload-video'\r\n title='Add youtube URL'\r\n size='small'\r\n disabled={disabled}\r\n icon={<VideoClipRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setURL('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='URL' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n disabled={disabled}\r\n value={url}\r\n appearance='underline'\r\n placeholder='Add Youtube video URL'\r\n onChange={(_, v) => setURL(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button size='small' disabled={disabled || !url} onClick={onHandleEmbeded}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack, useTheme } from '@fluentui/react';\r\nimport { Button, Dropdown, makeStyles, Option, ToolbarDivider } from '@fluentui/react-components';\r\nimport {\r\n CommentQuoteRegular,\r\n DeleteRegular,\r\n DocumentPageBreakRegular,\r\n HighlightAccentFilled,\r\n TextAlignCenterFilled,\r\n TextAlignJustifyFilled,\r\n TextAlignLeftFilled,\r\n TextAlignRightFilled,\r\n TextBold24Regular,\r\n TextBulletListLtrFilled,\r\n TextCaseLowercaseFilled,\r\n TextCaseTitleFilled,\r\n TextCaseUppercaseFilled,\r\n TextItalicFilled,\r\n TextNumberListLtrFilled,\r\n TextStrikethroughFilled,\r\n TextSubscriptFilled,\r\n TextSuperscriptFilled,\r\n TextUnderlineFilled,\r\n} from '@fluentui/react-icons';\r\nimport {\r\n $isListNode,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n ListNode,\r\n REMOVE_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createHeadingNode,\r\n $createQuoteNode,\r\n $isHeadingNode,\r\n HeadingTagType,\r\n} from '@lexical/rich-text';\r\nimport { $setBlocksType } from '@lexical/selection';\r\nimport { $getNearestNodeOfType, mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n REDO_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport React, { useMemo, useState } from 'react';\r\nimport {\r\n HEADING_OPTION,\r\n IEditorProps,\r\n LOW_PRIORIRTY,\r\n RichTextPluginsType,\r\n} from '../Types/EditorType';\r\nimport { getToolbarGroupsByLevel } from '../Utils/editorLevel';\r\nimport { formatParagraph } from '../Utils/Index';\r\nimport { ColorPickerPlugin } from './ColorBar';\r\nimport { FontFamilyPlugin } from './FontFamily';\r\nimport { FontSizePlugin } from './FontSize';\r\nimport { InsertImageDialog } from './ImagePlugin';\r\nimport { InsertInlineImageDialog } from './InlineImage';\r\nimport { InsertLinkPlugin } from './InsertLink';\r\nimport { INSERT_PAGE_BREAK } from './PageBreak';\r\nimport { TableItemPlugin } from './Table';\r\nimport { YoutubeUploadPlugin } from './Youtube';\r\n\r\nconst useStyles = makeStyles({\r\n dropdown: {\r\n minInlineSize: '90px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n alignDropdown: {\r\n minInlineSize: '70px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\n/**\r\n * Toolbar token type = strings you already use in enabledPlugins.\r\n */\r\ntype ToolbarToken =\r\n | '|'\r\n | 'Bold'\r\n | 'Italic'\r\n | 'Underline'\r\n | 'ColorPicker'\r\n | 'Link'\r\n | 'Table'\r\n | 'Image'\r\n | 'InlineImage'\r\n | 'Youtube'\r\n | 'Heading'\r\n | 'FontFamily'\r\n | 'FontSize'\r\n | 'Decorators'\r\n | 'CodeBlock'\r\n | 'Align';\r\n\r\nconst ALLOWED_TOKENS: Record<ToolbarToken, true> = {\r\n '|': true,\r\n Bold: true,\r\n Italic: true,\r\n Underline: true,\r\n ColorPicker: true,\r\n Link: true,\r\n Table: true,\r\n Image: true,\r\n InlineImage: true,\r\n Youtube: true,\r\n Heading: true,\r\n FontFamily: true,\r\n FontSize: true,\r\n Decorators: true,\r\n CodeBlock: true,\r\n Align: true,\r\n};\r\n\r\n/**\r\n * Utility: sanitize pluginGroups to avoid unknown tokens, and normalize separators.\r\n */\r\nfunction sanitizePluginGroups(groups?: string[][]): ToolbarToken[][] {\r\n if (!groups || groups.length === 0) return [];\r\n return groups\r\n .map((g) =>\r\n (g || [])\r\n .map((t) => t.trim())\r\n .filter((t): t is ToolbarToken => (ALLOWED_TOKENS as any)[t] === true),\r\n )\r\n .filter((g) => g.length > 0);\r\n}\r\n\r\nexport const ToolBarPlugins = (props: IEditorProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const theme = useTheme();\r\n const styles = useStyles();\r\n\r\n const [selectNodeType, setSelectNodeType] = useState('paragraph');\r\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\r\n\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isHighlight, setIsHighlight] = 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 [alignment, setAlignment] = useState<string>('left');\r\n const [isInTable, setIsInTable] = useState(false);\r\n const [tableNodeKey, setTableNodeKey] = useState<string | null>(null);\r\n\r\n const presetGroups = getToolbarGroupsByLevel(props.level);\r\n\r\n const pluginGroups = useMemo(() => sanitizePluginGroups(presetGroups), [presetGroups]);\r\n\r\n const updateToolbarPlugins = () => {\r\n const selection: any = $getSelection();\r\n\r\n // reset when no range selection\r\n if (!$isRangeSelection(selection)) {\r\n setIsBold(false);\r\n setIsItalic(false);\r\n setIsUnderline(false);\r\n setIsStrikethrough(false);\r\n setIsSuperscript(false);\r\n setIsSubscript(false);\r\n setIsHighlight(false);\r\n setIsUppercase(false);\r\n setIsLowercase(false);\r\n setIsCapitalize(false);\r\n setSelectNodeType('paragraph');\r\n setIsInTable(false);\r\n setTableNodeKey(null);\r\n return;\r\n }\r\n\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsHighlight(selection.hasFormat('highlight'));\r\n setIsUppercase(selection.hasFormat('uppercase'));\r\n setIsLowercase(selection.hasFormat('lowercase'));\r\n setIsCapitalize(selection.hasFormat('capitalize'));\r\n\r\n const anchorNode = selection.anchor.getNode();\r\n\r\n // root selection -> paragraph\r\n if (anchorNode.getKey() === 'root') {\r\n setSelectNodeType('paragraph');\r\n setIsInTable(false);\r\n setTableNodeKey(null);\r\n return;\r\n }\r\n\r\n // ── Detect table ancestry by walking up the node tree ───────────────────\r\n // TableNode is a Lexical shadow root, so getTopLevelElementOrThrow()\r\n // returns the cell paragraph — we must climb ancestors to find the table.\r\n let tableAncestorKey: string | null = null;\r\n let cursor = anchorNode.getParent();\r\n while (cursor !== null) {\r\n if (cursor.getType() === 'table') {\r\n tableAncestorKey = cursor.getKey();\r\n break;\r\n }\r\n cursor = cursor.getParent();\r\n }\r\n setIsInTable(tableAncestorKey !== null);\r\n setTableNodeKey(tableAncestorKey);\r\n\r\n // element = the cell-level block (paragraph / heading inside the cell),\r\n // or the top-level block when not in a table — correct for all toolbar state.\r\n const element = anchorNode.getTopLevelElementOrThrow();\r\n setAlignment(\r\n typeof (element as any).getFormatType === 'function'\r\n ? (element as any).getFormatType() || 'left'\r\n : 'left',\r\n );\r\n\r\n // ✅ critical: if block is empty, UI should show Normal (paragraph)\r\n const blockText = element.getTextContent();\r\n if (!blockText || blockText.trim().length === 0) {\r\n setSelectNodeType('paragraph');\r\n return;\r\n }\r\n\r\n if ($isListNode(element)) {\r\n const parentList = $getNearestNodeOfType(anchorNode, ListNode);\r\n const type = parentList ? parentList.getTag() : element.getTag();\r\n setSelectNodeType(type);\r\n return;\r\n }\r\n\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n setSelectNodeType(\r\n ['paragraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'quote', 'code'].includes(type)\r\n ? type\r\n : 'paragraph',\r\n );\r\n };\r\n\r\n const formatQuote = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n if (selectNodeType === 'quote') {\r\n // toggle back to paragraph\r\n formatParagraph(editor);\r\n } else {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerEditableListener((editable) => {\r\n setIsEditable(editable);\r\n }),\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n updateToolbarPlugins();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbarPlugins();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n const onHandleSelectOption = (id: RichTextPluginsType) => {\r\n switch (id) {\r\n case RichTextPluginsType.Bold:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n break;\r\n case RichTextPluginsType.Italic:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n break;\r\n case RichTextPluginsType.Underline:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n break;\r\n case RichTextPluginsType.Strikethrough:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n break;\r\n case RichTextPluginsType.Superscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n break;\r\n case RichTextPluginsType.Subscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n break;\r\n case RichTextPluginsType.Highlight:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'highlight');\r\n break;\r\n case RichTextPluginsType.LeftAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\r\n break;\r\n case RichTextPluginsType.Undo:\r\n editor.dispatchCommand(UNDO_COMMAND, undefined);\r\n break;\r\n case RichTextPluginsType.Redo:\r\n editor.dispatchCommand(REDO_COMMAND, undefined);\r\n break;\r\n case RichTextPluginsType.Uppercase:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case RichTextPluginsType.Lowercase:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n break;\r\n case RichTextPluginsType.Capitalize:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n break;\r\n }\r\n };\r\n\r\n const updateHeading = (heading: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(heading));\r\n }\r\n });\r\n\r\n editor.getEditorState().read(() => {\r\n updateToolbarPlugins();\r\n });\r\n };\r\n\r\n /**\r\n * Token renderer registry\r\n * Each token returns a React element (button/plugin/divider).\r\n * If token should render nothing (e.g. unknown), return null.\r\n */\r\n const renderToken = (token: ToolbarToken, groupIndex: number, tokenIndex: number) => {\r\n const key = `${groupIndex}-${tokenIndex}-${token}`;\r\n\r\n // ---------- Fluent UI v8 theme.palette mapping ----------\r\n const palette = theme.palette;\r\n\r\n const fg = palette.neutralPrimary; // main icon/text\r\n const fgSubtle = palette.neutralSecondary; // subtle icons (chevrons)\r\n const fgDisabled = palette.neutralTertiary; // disabled\r\n\r\n const brand = palette.themePrimary; // active/toggled icon\r\n const brandHover = palette.themeDarkAlt ?? brand;\r\n const brandPressed = palette.themeDark ?? brand;\r\n\r\n const bgToolbar = palette.white; // toolbar background (you use white)\r\n const bgHover = palette.neutralLighter; // hover background\r\n const bgPressed = palette.neutralLight; // pressed background\r\n\r\n const bgActive = palette.neutralLighterAlt ?? palette.neutralLighter; // selected/toggled background\r\n const bgActiveHover = palette.neutralLighter ?? bgHover;\r\n const bgActivePressed = palette.neutralLight ?? bgPressed;\r\n\r\n const stroke = palette.neutralLight; // borders/divider\r\n\r\n // ---------- Shared button styling ----------\r\n const getIconColor = (active?: boolean) => {\r\n if (!isEditable) return fgDisabled;\r\n return active ? brand : fg;\r\n };\r\n\r\n const getButtonStyle = (active?: boolean): React.CSSProperties => {\r\n const baseBg = active ? bgActive : 'transparent';\r\n const hoverBg = active ? bgActiveHover : bgHover;\r\n const pressedBg = active ? bgActivePressed : bgPressed;\r\n\r\n return {\r\n border: '1px solid transparent',\r\n margin: 2,\r\n minWidth: 28,\r\n paddingInline: 6,\r\n background: baseBg,\r\n borderRadius: 4,\r\n\r\n // These CSS vars are used by Fluent v9 buttons in many builds.\r\n // If your version ignores them, the base `background` + icon styles still apply.\r\n ['--fui-Button__backgroundColor' as any]: baseBg,\r\n ['--fui-Button__backgroundColorHover' as any]: hoverBg,\r\n ['--fui-Button__backgroundColorPressed' as any]: pressedBg,\r\n ['--fui-Button__borderColorHover' as any]: stroke,\r\n ['--fui-Button__borderColorPressed' as any]: stroke,\r\n\r\n ['--fui-Button__iconColor' as any]: getIconColor(active),\r\n ['--fui-Button__iconColorHover' as any]: active ? brandHover : fg,\r\n ['--fui-Button__iconColorPressed' as any]: active ? brandPressed : fg,\r\n };\r\n };\r\n\r\n const dropdownButtonStyle: React.CSSProperties = {\r\n color: !isEditable || props.readOnly ? fgDisabled : fg,\r\n background: 'transparent',\r\n };\r\n\r\n const dropdownExpandIconStyle: React.CSSProperties = {\r\n color: isEditable ? fgSubtle : fgDisabled,\r\n };\r\n\r\n const optionIconStyle: React.CSSProperties = {\r\n fontSize: '20px',\r\n color: isEditable ? fg : fgDisabled,\r\n marginRight: 8,\r\n verticalAlign: 'middle',\r\n };\r\n\r\n switch (token) {\r\n case 'Bold':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextBold24Regular style={{ color: getIconColor(isBold) }} />}\r\n style={getButtonStyle(isBold)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Bold)}\r\n />\r\n );\r\n\r\n case 'Italic':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextItalicFilled style={{ color: getIconColor(isItalic) }} />}\r\n style={getButtonStyle(isItalic)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Italic)}\r\n />\r\n );\r\n\r\n case 'Underline':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextUnderlineFilled style={{ color: getIconColor(isUnderline) }} />}\r\n style={getButtonStyle(isUnderline)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Underline)}\r\n />\r\n );\r\n\r\n case 'ColorPicker':\r\n return <ColorPickerPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Link':\r\n return <InsertLinkPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Table':\r\n return <TableItemPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Image':\r\n return (\r\n <InsertImageDialog\r\n key={key}\r\n activeEditor={editor}\r\n disabled={!isEditable || props.readOnly!}\r\n />\r\n );\r\n\r\n case 'InlineImage':\r\n return (\r\n <InsertInlineImageDialog\r\n key={key}\r\n activeEditor={editor}\r\n disabled={!isEditable || props.readOnly!}\r\n />\r\n );\r\n\r\n case 'Youtube':\r\n return <YoutubeUploadPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Heading': {\r\n const headingLabel =\r\n selectNodeType === 'paragraph'\r\n ? 'Normal'\r\n : (HEADING_OPTION.find((h) => h.key === selectNodeType)?.text ?? selectNodeType);\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n title='Add heading'\r\n id={`heading-option-${groupIndex}`}\r\n placeholder='Format'\r\n disabled={!isEditable}\r\n style={{ minWidth: '100px' }}\r\n className={styles.dropdown}\r\n value={headingLabel}\r\n selectedOptions={[selectNodeType]}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as HeadingTagType | 'paragraph' | undefined;\r\n if (!val) return;\r\n\r\n if (val === 'paragraph') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading(val);\r\n setSelectNodeType(val);\r\n }\r\n }}>\r\n <Option value='paragraph'>Normal</Option>\r\n\r\n {HEADING_OPTION.map((option, idx) => (\r\n <Option key={`${option.key}-${idx}`} value={option.key as HeadingTagType}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n case 'FontFamily':\r\n return <FontFamilyPlugin key={key} disabled={!isEditable || props.readOnly} />;\r\n\r\n case 'FontSize':\r\n return <FontSizePlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case '|':\r\n return <ToolbarDivider key={key} />;\r\n\r\n case 'Decorators': {\r\n const activeDecorators: string[] = [\r\n ...(isUppercase ? ['uppercase'] : []),\r\n ...(isLowercase ? ['lowercase'] : []),\r\n ...(isCapitalize ? ['capitalize'] : []),\r\n ...(isStrikethrough ? ['strike'] : []),\r\n ...(isSubscript ? ['subscript'] : []),\r\n ...(isSuperscript ? ['superscript'] : []),\r\n ...(isHighlight ? ['highlight'] : []),\r\n ...(selectNodeType === 'ul' ? ['ul-list'] : []),\r\n ...(selectNodeType === 'ol' ? ['ol-list'] : []),\r\n ...(selectNodeType === 'quote' ? ['quote'] : []),\r\n ];\r\n\r\n const DECORATOR_LABEL: Record<string, string> = {\r\n uppercase: 'Uppercase',\r\n lowercase: 'Lowercase',\r\n capitalize: 'Capitalize',\r\n strike: 'Strikethrough',\r\n subscript: 'Subscript',\r\n superscript: 'Superscript',\r\n highlight: 'Highlight',\r\n 'ul-list': 'Bullet list',\r\n 'ol-list': 'Number list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0\r\n ? ''\r\n : activeDecorators.length === 1\r\n ? DECORATOR_LABEL[activeDecorators[0]]\r\n : `${DECORATOR_LABEL[activeDecorators[0]]} +${activeDecorators.length - 1}`;\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n multiselect\r\n id={`${groupIndex}-set-decorators`}\r\n placeholder='Text'\r\n value={decoratorValue}\r\n selectedOptions={activeDecorators}\r\n disabled={!isEditable}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '180px' } }}\r\n onOptionSelect={(_, data) => {\r\n switch (data.optionValue as string) {\r\n case 'uppercase':\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case 'lowercase':\r\n onHandleSelectOption(RichTextPluginsType.Lowercase);\r\n break;\r\n case 'capitalize':\r\n onHandleSelectOption(RichTextPluginsType.Capitalize);\r\n break;\r\n case 'strike':\r\n onHandleSelectOption(RichTextPluginsType.Strikethrough);\r\n break;\r\n case 'subscript':\r\n onHandleSelectOption(RichTextPluginsType.Subscript);\r\n break;\r\n case 'superscript':\r\n onHandleSelectOption(RichTextPluginsType.Superscript);\r\n break;\r\n case 'highlight':\r\n onHandleSelectOption(RichTextPluginsType.Highlight);\r\n break;\r\n case 'ul-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'page-break':\r\n editor.dispatchCommand(INSERT_PAGE_BREAK, undefined);\r\n break;\r\n case 'quote':\r\n formatQuote();\r\n break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />\r\n Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />\r\n Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />\r\n Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />\r\n Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />\r\n Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />\r\n Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled\r\n style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }}\r\n />\r\n Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />\r\n Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />\r\n Number list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />\r\n Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />\r\n Quote\r\n </Option>\r\n </Dropdown>\r\n );\r\n }\r\n\r\n // case 'CodeBlock':\r\n // return (\r\n // <CodeBlockPlugin\r\n // key={key}\r\n // codeLanguage={codeLanguage}\r\n // selectNodeType={selectNodeType}\r\n // selectedElementKey={selectedNodeKey}\r\n // disabled={!isEditable}\r\n // />\r\n // );\r\n\r\n case 'Align': {\r\n const ALIGN_OPTIONS = [\r\n {\r\n value: 'left',\r\n label: 'Left Align',\r\n icon: <TextAlignLeftFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.LeftAlign,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Center Align',\r\n icon: <TextAlignCenterFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.CenterAlign,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Right Align',\r\n icon: <TextAlignRightFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.RightAlign,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify Align',\r\n icon: <TextAlignJustifyFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.JustifyAlign,\r\n },\r\n ];\r\n const alignLabel = ALIGN_OPTIONS.find((o) => o.value === alignment)?.label ?? 'Left Align';\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n id='set-alignment'\r\n disabled={!isEditable}\r\n placeholder='Left Align'\r\n value={alignLabel}\r\n selectedOptions={[alignment]}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const opt = ALIGN_OPTIONS.find((o) => o.value === data.optionValue);\r\n if (opt) onHandleSelectOption(opt.action);\r\n }}>\r\n {ALIGN_OPTIONS.map((opt) => (\r\n <Option key={opt.value} value={opt.value} text={opt.label}>\r\n {opt.icon}\r\n {opt.label}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n if (!pluginGroups || pluginGroups.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Stack>\r\n <div\r\n role='toolbar'\r\n aria-label='Editor toolbar'\r\n style={{\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n borderBottom: '1px solid #ccced1',\r\n background: '#ffffff',\r\n padding: '0px',\r\n minHeight: 36,\r\n }}>\r\n {pluginGroups.map((group, groupIndex) => (\r\n <React.Fragment key={`group-${groupIndex}`}>\r\n {group.map((token, tokenIndex) => {\r\n try {\r\n return renderToken(token, groupIndex, tokenIndex);\r\n } catch {\r\n return null;\r\n }\r\n })}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n\r\n {isInTable && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '2px 8px',\r\n borderBottom: '1px solid #ccced1',\r\n background: '#fff8f8',\r\n }}>\r\n <span style={{ fontSize: 12, color: '#888', userSelect: 'none' }}>Table</span>\r\n <Button\r\n size='small'\r\n icon={<DeleteRegular style={{ color: '#c4272c' }} />}\r\n title='Delete table'\r\n style={{\r\n background: 'transparent',\r\n border: 'none',\r\n color: '#c4272c',\r\n fontWeight: 500,\r\n }}\r\n onClick={() => {\r\n editor.update(() => {\r\n if (!tableNodeKey) return;\r\n const node = $getNodeByKey(tableNodeKey);\r\n if (node?.getType() === 'table') node.remove();\r\n });\r\n }}>\r\n Delete Table\r\n </Button>\r\n </div>\r\n )}\r\n </Stack>\r\n );\r\n};\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isDecoratorNode,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n} from 'lexical';\r\nimport { useEffect } from 'react';\r\n\r\n// If you have an exported guard, use it instead of $isDecoratorNode:\r\n// import { $isYoutubeNode } from \"../Nodes/YoutubeNode\";\r\n\r\nfunction isYoutubeLikeNode(node: any) {\r\n // Prefer your node type check if available:\r\n // return $isYoutubeNode(node);\r\n\r\n // Fallback: check by type string (common for custom nodes)\r\n try {\r\n return node?.getType?.() === 'youtube';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport default function YoutubeDeletePlugin() {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const removeIfYoutubeAtCursor = (direction: 'backward' | 'forward') => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return false;\r\n\r\n const anchor = selection.anchor;\r\n\r\n // Only when caret selection (not text range)\r\n if (!selection.isCollapsed()) return false;\r\n\r\n const currentNode = anchor.getNode();\r\n\r\n // Case 1: selection is on the node itself (sometimes happens)\r\n if (isYoutubeLikeNode(currentNode)) {\r\n currentNode.remove();\r\n return true;\r\n }\r\n\r\n // Case 2: cursor is in a text node next to the youtube node\r\n const sibling =\r\n direction === 'backward' ? currentNode.getPreviousSibling() : currentNode.getNextSibling();\r\n\r\n if (\r\n sibling &&\r\n (isYoutubeLikeNode(sibling) || ($isDecoratorNode(sibling) && isYoutubeLikeNode(sibling)))\r\n ) {\r\n sibling.remove();\r\n return true;\r\n }\r\n\r\n // Case 3: cursor is inside a paragraph and youtube is outside paragraph\r\n const parent = currentNode.getParent();\r\n if (parent) {\r\n const parentSibling =\r\n direction === 'backward' ? parent.getPreviousSibling() : parent.getNextSibling();\r\n\r\n if (parentSibling && isYoutubeLikeNode(parentSibling)) {\r\n parentSibling.remove();\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n return editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n () => removeIfYoutubeAtCursor('backward'),\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n () => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) return false;\r\n const currentNode = selection.anchor.getNode();\r\n const next =\r\n currentNode.getNextSibling() ?? currentNode.getParent()?.getNextSibling() ?? null;\r\n if (next && next.getType?.() === 'youtube') {\r\n next.remove();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","import { EditorThemeClasses } from 'lexical';\r\nimport './codeEditor.css';\r\nimport './index.css';\r\nexport const theme: EditorThemeClasses = {\r\n text: {\r\n underline: 'underline',\r\n strikethrough: 'strikethrough',\r\n underlineStrikethrough: 'underlineStrikethrough',\r\n italic: 'italic',\r\n code: 'code',\r\n capitalize: 'capitalize',\r\n lowercase: 'lowercase',\r\n uppercase: 'uppercase',\r\n },\r\n // table: 'table',\r\n // tableCell: 'tableCell',\r\n // tableCellHeader: 'tableCellHeader',\r\n code: 'editorCode',\r\n image: 'editor-image',\r\n quote: 'quote',\r\n inlineImage: 'inline-editor-image',\r\n codeHighlight: {\r\n atrule: 'editorTokenAttr',\r\n attr: 'editorTokenAttr',\r\n boolean: 'editorTokenProperty',\r\n builtin: 'editorTokenSelector',\r\n cdata: 'editorTokenComment',\r\n char: 'editorTokenSelector',\r\n class: 'editorTokenFunction', // class constructor\r\n comment: 'editorTokenComment', // comment\r\n constant: 'editorTokenProperty',\r\n deleted: 'editorTokenProperty',\r\n doctype: 'editorTokenComment',\r\n entity: 'editorTokenOperator',\r\n function: 'editorTokenFunction', // es5 function\r\n important: 'editorTokenVariable',\r\n inserted: 'editorTokenSelector',\r\n keyword: 'editorTokenAttr', // variable keyword like const/let\r\n namespace: 'editorTokenVariable',\r\n number: 'editorTokenProperty', // number values\r\n operator: 'editorTokenOperator', // operator like +/*-\r\n prolog: 'editorTokenComment',\r\n property: 'editorTokenProperty',\r\n punctuation: 'editorTokenPunctuation', // brackets of array, object\r\n regex: 'editorTokenVariable',\r\n selector: 'editorTokenSelector',\r\n string: 'editorTokenSelector', // string values\r\n symbol: 'editorTokenProperty',\r\n tag: 'editorTokenProperty',\r\n url: 'editorTokenOperator',\r\n variable: 'editorTokenVariable',\r\n },\r\n table: 'lexical-table',\r\n tableRow: 'lexical-table-row',\r\n tableCell: 'lexical-table-cell',\r\n tableCellHeader: 'lexical-table-cell-header',\r\n\r\n tableCellSelected: 'lexical-table-cell-selected',\r\n tableCellPrimarySelected: 'lexical-table-cell-primary-selected',\r\n tableCellEditing: 'lexical-table-cell-editing',\r\n\r\n tableCellResizer: 'lexical-table-cell-resizer',\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Utils/ImageResizer.tsx","../src/Nodes/Image.css","../src/Nodes/ImageComponent.tsx","../src/Nodes/ImageNode.tsx","../src/Nodes/InlineImage.css","../src/Nodes/InlineImageComponent.tsx","../src/Nodes/InlineImageNode.tsx","../src/ContentEditorComponent.types.ts","../src/Nodes/AutoCompleteNode.tsx","../src/Nodes/HtmlBlockNode.ts","../src/ContentEditorComponent.tsx","../src/Nodes/PageBreakNode.tsx","../src/Nodes/SpellErrorNode.tsx","../src/Nodes/YoutubeNode.tsx","../src/Plugins/AutoComplete.tsx","../src/Plugins/CharacterStylesPopupPlugin.tsx","../src/Plugins/CustomOnChange.tsx","../src/Plugins/FloatLinkEditor.tsx","../src/Plugins/ImagePlugin.tsx","../src/Plugins/InlineImage.tsx","../src/Plugins/PageBreak.tsx","../src/Utils/Helper.ts","../src/Plugins/RefApiPlugin.tsx","../src/Plugins/Spellcheckplugin.tsx","../src/Plugins/TableActionMenuPlugin.tsx","../src/Plugins/TableCellResizer.tsx","../src/Types/EditorType.tsx","../src/Utils/editorLevel.ts","../src/Utils/Index.tsx","../src/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Plugins/FontSize.tsx","../src/Plugins/InsertLink.tsx","../src/Plugins/Table.tsx","../src/Plugins/Youtube.tsx","../src/Plugins/ToolBar.tsx","../src/Plugins/YoutubeDeletePlugin.tsx","../src/Theme/index.ts"],"names":["useRef","calculateZoomLevel","jsxs","jsx","createCommand","img","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","useCallback","$getSelection","$isNodeSelection","$setSelection","$isRangeSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","$getNodeByKey","Suspense","Fragment","ImageComponent","React","DecoratorNode","createEditor","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","InlineImageComponent","React2","isHTMLElement","ContentEditorLevel","TextNode","ElementNode","COMMAND_PRIORITY_HIGH","React3","width","height","BlockWithAlignableContents","DecoratorBlockNode","$getRoot","React4","$createTextNode","KEY_DOWN_COMMAND","clamp","useTheme","FORMAT_TEXT_COMMAND","TOGGLE_LINK_COMMAND","Button","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","CodeFilled","LinkFilled","selection","$isAtNodeEnd","$isLinkNode","$isCodeHighlightNode","$isTextNode","createPortal","$generateNodesFromDOM","$generateHtmlFromNodes","OnChangePlugin","getSelectedNode","$findMatchingParent","getDOMSelection","$isAutoLinkNode","$createLinkNode","COMMAND_PRIORITY_CRITICAL","Stack","Field","Input","Popover","PopoverTrigger","ImageAddRegular","PopoverSurface","AttachFilled","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","PASTE_COMMAND","DRAGOVER_COMMAND","DROP_COMMAND","$createRangeSelection","getDOMSelectionFromTarget","makeStyles","ImageEditRegular","Dropdown","Option","$onDragStart","$onDragover","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","canDropImage","getDragImageData","getDragSelection","$insertNodeToNearestRoot","html","useImperativeHandle","$isElementNode","React6","React7","$isTableSelection","$isTableNode","$isTableCellNode","$insertTableRowAtSelection","$insertTableColumnAtSelection","$deleteTableRowAtSelection","$deleteTableColumnAtSelection","table","$getTableNodeFromLexicalNodeOrThrow","Menu","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuItem","RowTripleRegular","ArrowUpRegular","ArrowDownRegular","MenuDivider","ColumnTripleRegular","ArrowLeftRegular","ArrowRightRegular","DeleteRegular","getDOMCellFromTarget","getTableObserverFromTableElement","$getNearestNodeFromDOMNode","$getTableRowIndexFromTableCellNode","$isTableRowNode","$getTableColumnIndexFromTableCellNode","useMemo","$setBlocksType","r","g","b","React9","Callout","TextField","DefaultButton","$getSelectionStyleValueForProperty","$patchStyleText","TextColorRegular","PaintBucket16Filled","useStyles","fontSize","React11","link","text","LinkAddRegular","$createTableNodeWithDimensions","TableAddRegular","VideoClipRegular","$isListNode","$getNearestNodeOfType","ListNode","type","$isHeadingNode","$createQuoteNode","FORMAT_ELEMENT_COMMAND","UNDO_COMMAND","REDO_COMMAND","$createHeadingNode","ToolbarDivider","REMOVE_LIST_COMMAND","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","TextCaseUppercaseFilled","TextCaseLowercaseFilled","TextCaseTitleFilled","HighlightAccentFilled","TextBulletListLtrFilled","TextNumberListLtrFilled","DocumentPageBreakRegular","CommentQuoteRegular","TextAlignLeftFilled","TextAlignCenterFilled","TextAlignRightFilled","TextAlignJustifyFilled","$isDecoratorNode","createLinkMatcherWithRegExp","forwardRef","HeadingNode","QuoteNode","CodeHighlightNode","CodeNode","ListItemNode","LinkNode","AutoLinkNode","TableNode","TableRowNode","TableCellNode","mergeStyleSets","FluentProvider","webLightTheme","LexicalComposer","RichTextPlugin","LexicalErrorBoundary","ContentEditable","css","AutoFocusPlugin","HistoryPlugin","ListPlugin","LinkPlugin","AutoLinkPlugin","TablePlugin"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 { calculateZoomLevel } from '@lexical/utils';\r\nimport type { LexicalEditor } from 'lexical';\r\nimport type { JSX } from 'react';\r\nimport * as React from 'react';\r\nimport { useRef } from 'react';\r\n\r\n\r\nconst clamp = (value: number, min: number, max: number) => {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nconst Direction = {\r\n east: 1 << 0,\r\n north: 1 << 3,\r\n south: 1 << 1,\r\n west: 1 << 2,\r\n};\r\n\r\nconst ImageResizer = ({\r\n onResizeStart,\r\n onResizeEnd,\r\n buttonRef,\r\n imageRef,\r\n maxWidth,\r\n editor,\r\n showCaption,\r\n setShowCaption,\r\n captionsEnabled,\r\n}: {\r\n editor: LexicalEditor;\r\n buttonRef: {current: null | HTMLButtonElement};\r\n imageRef: {current: null | HTMLElement};\r\n maxWidth?: number;\r\n onResizeEnd: (width: 'inherit' | number, height: 'inherit' | number) => void;\r\n onResizeStart: () => void;\r\n setShowCaption: (show: boolean) => void;\r\n showCaption: boolean;\r\n captionsEnabled: boolean;\r\n}): JSX.Element => {\r\n const controlWrapperRef = useRef<HTMLDivElement>(null);\r\n const userSelect = useRef({\r\n priority: '',\r\n value: 'default',\r\n });\r\n const positioningRef = useRef<{\r\n currentHeight: 'inherit' | number;\r\n currentWidth: 'inherit' | number;\r\n direction: number;\r\n isResizing: boolean;\r\n ratio: number;\r\n startHeight: number;\r\n startWidth: number;\r\n startX: number;\r\n startY: number;\r\n }>({\r\n currentHeight: 0,\r\n currentWidth: 0,\r\n direction: 0,\r\n isResizing: false,\r\n ratio: 0,\r\n startHeight: 0,\r\n startWidth: 0,\r\n startX: 0,\r\n startY: 0,\r\n });\r\n const editorRootElement = editor.getRootElement();\r\n // Find max width, accounting for editor padding.\r\n const maxWidthContainer = maxWidth\r\n ? maxWidth\r\n : editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().width - 20\r\n : 100;\r\n const maxHeightContainer =\r\n editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().height - 20\r\n : 100;\r\n\r\n const minWidth = 100;\r\n const minHeight = 100;\r\n\r\n const setStartCursor = (direction: number) => {\r\n const ew = direction === Direction.east || direction === Direction.west;\r\n const ns = direction === Direction.north || direction === Direction.south;\r\n const nwse =\r\n (direction & Direction.north && direction & Direction.west) ||\r\n (direction & Direction.south && direction & Direction.east);\r\n\r\n const cursorDir = ew ? 'ew' : ns ? 'ns' : nwse ? 'nwse' : 'nesw';\r\n\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\r\n 'cursor',\r\n `${cursorDir}-resize`,\r\n 'important',\r\n );\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\r\n 'cursor',\r\n `${cursorDir}-resize`,\r\n 'important',\r\n );\r\n userSelect.current.value = document.body.style.getPropertyValue(\r\n '-webkit-user-select',\r\n );\r\n userSelect.current.priority = document.body.style.getPropertyPriority(\r\n '-webkit-user-select',\r\n );\r\n document.body.style.setProperty(\r\n '-webkit-user-select',\r\n `none`,\r\n 'important',\r\n );\r\n }\r\n };\r\n\r\n const setEndCursor = () => {\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty('cursor', 'text');\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty('cursor', 'default');\r\n document.body.style.setProperty(\r\n '-webkit-user-select',\r\n userSelect.current.value,\r\n userSelect.current.priority,\r\n );\r\n }\r\n };\r\n\r\n const handlePointerDown = (\r\n event: React.PointerEvent<HTMLDivElement>,\r\n direction: number,\r\n ) => {\r\n if (!editor.isEditable()) {\r\n return;\r\n }\r\n\r\n const image = imageRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n\r\n if (image !== null && controlWrapper !== null) {\r\n event.preventDefault();\r\n const {width, height} = image.getBoundingClientRect();\r\n const zoom = calculateZoomLevel(image);\r\n const positioning = positioningRef.current;\r\n positioning.startWidth = width;\r\n positioning.startHeight = height;\r\n positioning.ratio = width / height;\r\n positioning.currentWidth = width;\r\n positioning.currentHeight = height;\r\n positioning.startX = event.clientX / zoom;\r\n positioning.startY = event.clientY / zoom;\r\n positioning.isResizing = true;\r\n positioning.direction = direction;\r\n\r\n setStartCursor(direction);\r\n onResizeStart();\r\n\r\n controlWrapper.classList.add('image-control-wrapper--resizing');\r\n image.style.height = `${height}px`;\r\n image.style.width = `${width}px`;\r\n\r\n document.addEventListener('pointermove', handlePointerMove);\r\n document.addEventListener('pointerup', handlePointerUp);\r\n }\r\n };\r\n const handlePointerMove = (event: PointerEvent) => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n\r\n const isHorizontal =\r\n positioning.direction & (Direction.east | Direction.west);\r\n const isVertical =\r\n positioning.direction & (Direction.south | Direction.north);\r\n\r\n if (image !== null && positioning.isResizing) {\r\n const zoom = calculateZoomLevel(image);\r\n // Corner cursor\r\n if (isHorizontal && isVertical) {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer,\r\n );\r\n\r\n const height = width / positioning.ratio;\r\n image.style.width = `${width}px`;\r\n image.style.height = `${height}px`;\r\n positioning.currentHeight = height;\r\n positioning.currentWidth = width;\r\n } else if (isVertical) {\r\n let diff = Math.floor(positioning.startY - event.clientY / zoom);\r\n diff = positioning.direction & Direction.south ? -diff : diff;\r\n\r\n const height = clamp(\r\n positioning.startHeight + diff,\r\n minHeight,\r\n maxHeightContainer,\r\n );\r\n\r\n image.style.height = `${height}px`;\r\n positioning.currentHeight = height;\r\n } else {\r\n let diff = Math.floor(positioning.startX - event.clientX / zoom);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer,\r\n );\r\n\r\n image.style.width = `${width}px`;\r\n positioning.currentWidth = width;\r\n }\r\n }\r\n };\r\n const handlePointerUp = () => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n if (image !== null && controlWrapper !== null && positioning.isResizing) {\r\n const width = positioning.currentWidth;\r\n const height = positioning.currentHeight;\r\n positioning.startWidth = 0;\r\n positioning.startHeight = 0;\r\n positioning.ratio = 0;\r\n positioning.startX = 0;\r\n positioning.startY = 0;\r\n positioning.currentWidth = 0;\r\n positioning.currentHeight = 0;\r\n positioning.isResizing = false;\r\n\r\n controlWrapper.classList.remove('image-control-wrapper--resizing');\r\n\r\n setEndCursor();\r\n onResizeEnd(width, height);\r\n\r\n document.removeEventListener('pointermove', handlePointerMove);\r\n document.removeEventListener('pointerup', handlePointerUp);\r\n }\r\n };\r\n return (\r\n <div ref={controlWrapperRef}>\r\n <div\r\n className=\"image-resizer image-resizer-n\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-ne\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-e\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-se\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-s\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-sw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-w\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-nw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.west);\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\nexport default ImageResizer;",".ImageNode__contentEditable {\r\n min-height: 20px;\r\n border: 0px;\r\n resize: none;\r\n cursor: text;\r\n caret-color: rgb(5, 5, 5);\r\n display: block;\r\n position: relative;\r\n outline: 0px;\r\n padding: 10px;\r\n user-select: text;\r\n font-size: 12px;\r\n width: calc(100% - 20px);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n.ImageNode__placeholder {\r\n font-size: 12px;\r\n color: #888;\r\n overflow: hidden;\r\n position: absolute;\r\n text-overflow: ellipsis;\r\n top: 10px;\r\n left: 10px;\r\n user-select: none;\r\n white-space: nowrap;\r\n display: inline-block;\r\n pointer-events: none;\r\n}\r\n\r\n.image-control-wrapper--resizing {\r\n touch-action: none;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport type {\r\n BaseSelection,\r\n LexicalCommand,\r\n LexicalEditor,\r\n NodeKey\r\n} from 'lexical';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND\r\n} from 'lexical';\r\nimport { Suspense, useCallback, useEffect, useRef, useState } from 'react';\r\nimport ImageResizer from '../Utils/ImageResizer';\r\nimport './Image.css';\r\nimport { $isImageNode } from './ImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nexport const RIGHT_CLICK_IMAGE_COMMAND: LexicalCommand<MouseEvent> =\r\n createCommand('RIGHT_CLICK_IMAGE_COMMAND');\r\n\r\nconst useSuspenseImage = (src: string) => {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n img.onerror = () => {\r\n imageCache.add(src);\r\n };\r\n });\r\n }\r\n}\r\ninterface ILazyImageProps{\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n maxWidth: number;\r\n src: string;\r\n width: 'inherit' | number;\r\n onError: () => void; \r\n}\r\nconst LazyImage = ({ altText, imageRef, className, src, width, height, maxWidth, onError }: ILazyImageProps) => { \r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n style={{\r\n height,\r\n maxWidth,\r\n width,\r\n }}\r\n onError={onError}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\n\r\nconst BrokenImage = () => {\r\n return (\r\n <img\r\n src={'#'}\r\n alt={'broken-image'} \r\n style={{\r\n height: 200,\r\n opacity: 0.2,\r\n width: 200,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\ninterface IImageComponent{\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n maxWidth: number;\r\n nodeKey: NodeKey;\r\n resizable: boolean;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n captionsEnabled: boolean;\r\n}\r\nconst ImageComponent =({src,altText,nodeKey,width, height,maxWidth, resizable, showCaption, caption, captionsEnabled}: IImageComponent) => {\r\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const [isLoadError, setIsLoadError] = useState<boolean>(false);\r\n const [isResizing, setIsResizing] = useState<boolean>(false);\r\n const [editor] = useLexicalComposerContext();\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const isEditable = useLexicalEditable();\r\n\r\n const $onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isImageNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\r\n\r\n const $onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const $onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n const onClick = useCallback(\r\n (payload: MouseEvent) => {\r\n const event = payload;\r\n\r\n if (isResizing) {\r\n return true;\r\n }\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n [isResizing, isSelected, setSelected, clearSelection],\r\n );\r\n\r\n const onRightClick = useCallback(\r\n (event: MouseEvent): void => {\r\n editor.getEditorState().read(() => {\r\n const latestSelection = $getSelection();\r\n const domElement = event.target as HTMLElement;\r\n if (\r\n domElement.tagName === 'IMG' &&\r\n $isRangeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n editor.dispatchCommand(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n event as MouseEvent,\r\n );\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n useEffect(() => {\r\n const rootElement = editor.getRootElement();\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n const updatedSelection = editorState.read(() => $getSelection());\r\n if ($isNodeSelection(updatedSelection)) {\r\n setSelection(updatedSelection);\r\n } else {\r\n setSelection(null);\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n $onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n\r\n rootElement?.addEventListener('contextmenu', onRightClick);\r\n\r\n return () => {\r\n unregister();\r\n rootElement?.removeEventListener('contextmenu', onRightClick);\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isResizing,\r\n isSelected,\r\n nodeKey,\r\n $onDelete,\r\n $onEnter,\r\n $onEscape,\r\n onClick,\r\n onRightClick,\r\n setSelected,\r\n ]);\r\n\r\n const setShowCaption = () => {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setShowCaption(true);\r\n }\r\n });\r\n };\r\n\r\n const onResizeEnd = (\r\n nextWidth: 'inherit' | number,\r\n nextHeight: 'inherit' | number,\r\n ) => {\r\n // Delay hiding the resize bars for click case\r\n setTimeout(() => {\r\n setIsResizing(false);\r\n }, 200);\r\n\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setWidthAndHeight(nextWidth, nextHeight);\r\n }\r\n });\r\n };\r\n\r\n const onResizeStart = () => {\r\n setIsResizing(true);\r\n };\r\n\r\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n {isLoadError ? (\r\n <BrokenImage />\r\n ) : (\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n maxWidth={maxWidth}\r\n onError={() => setIsLoadError(true)}\r\n />\r\n )}\r\n </div>\r\n {resizable && $isNodeSelection(selection) && isFocused && (\r\n <ImageResizer\r\n showCaption={showCaption}\r\n setShowCaption={setShowCaption}\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n imageRef={imageRef}\r\n maxWidth={maxWidth}\r\n onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n captionsEnabled={!isLoadError && captionsEnabled}\r\n />\r\n )}\r\n </>\r\n </Suspense>\r\n );\r\n}\r\nexport default ImageComponent;\r\n","import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedEditor,\r\n SerializedLexicalNode,\r\n Spread,\r\n} from 'lexical';\r\nimport { $applyNodeReplacement, createEditor, DecoratorNode } from 'lexical';\r\nimport * as React from 'react';\r\n\r\nconst ImageComponent = React.lazy(() => import('./ImageComponent'));\r\n\r\nexport interface ImagePayload {\r\n altText: string;\r\n caption?: LexicalEditor;\r\n height?: number | 'inherit';\r\n key?: NodeKey;\r\n maxWidth?: number;\r\n showCaption?: boolean;\r\n src: string;\r\n width?: number | 'inherit';\r\n captionsEnabled?: boolean;\r\n}\r\n\r\nconst isGoogleDocCheckboxImg = (img: HTMLImageElement) => {\r\n return (\r\n img.parentElement != null &&\r\n img.parentElement.tagName === 'LI' &&\r\n img.previousSibling === null &&\r\n img.getAttribute('aria-roledescription') === 'checkbox'\r\n );\r\n};\r\n\r\nfunction parsePx(value: string | null | undefined): number | undefined {\r\n if (!value) return undefined;\r\n const v = value.trim();\r\n // \"120px\" -> 120, \"120\" -> 120\r\n const n = Number(v.replace(/px$/i, ''));\r\n return Number.isFinite(n) ? n : undefined;\r\n}\r\n\r\nfunction parseDimFromStyleOrAttr(img: HTMLImageElement): { width?: number; height?: number } {\r\n // Priority:\r\n // 1) width/height attributes\r\n // 2) inline style width/height\r\n // 3) DOM properties (img.width/img.height)\r\n const wAttr = parsePx(img.getAttribute('width'));\r\n const hAttr = parsePx(img.getAttribute('height'));\r\n\r\n const wStyle = parsePx(img.style?.width);\r\n const hStyle = parsePx(img.style?.height);\r\n\r\n // img.width/img.height are numbers but can be 0 before load; still useful sometimes\r\n const wProp = img.width || undefined;\r\n const hProp = img.height || undefined;\r\n\r\n return {\r\n width: wAttr ?? wStyle ?? wProp,\r\n height: hAttr ?? hStyle ?? hProp,\r\n };\r\n}\r\n\r\nconst $convertImageElement = (domNode: Node): null | DOMConversionOutput => {\r\n const img = domNode as HTMLImageElement;\r\n\r\n if (!img || img.tagName !== 'IMG') return null;\r\n if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {\r\n return null;\r\n }\r\n\r\n const altText = img.getAttribute('alt') ?? img.alt ?? '';\r\n const src = img.getAttribute('src') ?? img.src ?? '';\r\n\r\n // IMPORTANT: Preserve signature scaling.\r\n const { width, height } = parseDimFromStyleOrAttr(img);\r\n\r\n // Optional: support max-width from inline styles if present\r\n // e.g. style=\"max-width: 220px\"\r\n const maxWidth = parsePx(img.style?.maxWidth);\r\n\r\n const node = $createImageNode({\r\n altText,\r\n src,\r\n width: width ?? 'inherit',\r\n height: height ?? 'inherit',\r\n maxWidth: maxWidth ?? 500,\r\n });\r\n\r\n return { node };\r\n};\r\n\r\nexport type SerializedImageNode = Spread<\r\n {\r\n altText: string;\r\n caption: SerializedEditor;\r\n height?: number;\r\n maxWidth: number;\r\n showCaption: boolean;\r\n src: string;\r\n width?: number;\r\n captionsEnabled?: boolean;\r\n },\r\n SerializedLexicalNode\r\n>;\r\n\r\nexport class ImageNode extends DecoratorNode<JSX.Element> {\r\n __src: string;\r\n __altText: string;\r\n __width: 'inherit' | number;\r\n __height: 'inherit' | number;\r\n __maxWidth: number;\r\n __showCaption: boolean;\r\n __caption: LexicalEditor;\r\n // Captions cannot yet be used within editor cells\r\n __captionsEnabled: boolean;\r\n\r\n static getType(): string {\r\n return 'image';\r\n }\r\n\r\n static clone(node: ImageNode): ImageNode {\r\n return new ImageNode(\r\n node.__src,\r\n node.__altText,\r\n node.__maxWidth,\r\n node.__width,\r\n node.__height,\r\n node.__showCaption,\r\n node.__caption,\r\n node.__captionsEnabled,\r\n node.__key\r\n );\r\n }\r\n\r\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\r\n const { altText, height, width, maxWidth, src, showCaption, captionsEnabled } = serializedNode;\r\n\r\n // Note: exportJSON stores 0 for inherit. Convert back.\r\n const normalizedWidth = width && width > 0 ? width : 'inherit';\r\n const normalizedHeight = height && height > 0 ? height : 'inherit';\r\n\r\n return $createImageNode({\r\n altText,\r\n height: normalizedHeight,\r\n width: normalizedWidth,\r\n maxWidth,\r\n showCaption,\r\n src,\r\n captionsEnabled,\r\n }).updateFromJSON(serializedNode);\r\n }\r\n\r\n updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedImageNode>): this {\r\n const node = super.updateFromJSON(serializedNode);\r\n const { caption } = serializedNode;\r\n\r\n const nestedEditor = node.__caption;\r\n const editorState = nestedEditor.parseEditorState(caption.editorState);\r\n if (!editorState.isEmpty()) {\r\n nestedEditor.setEditorState(editorState);\r\n }\r\n return node;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('img');\r\n element.setAttribute('src', this.__src);\r\n element.setAttribute('alt', this.__altText);\r\n\r\n // Preserve sizing for signatures: use width/height attributes + inline style\r\n if (this.__width !== 'inherit') {\r\n element.setAttribute('width', String(this.__width));\r\n element.style.width = `${this.__width}px`;\r\n }\r\n if (this.__height !== 'inherit') {\r\n element.setAttribute('height', String(this.__height));\r\n element.style.height = `${this.__height}px`;\r\n }\r\n\r\n // Preserve maxWidth behavior if set\r\n if (this.__maxWidth && this.__maxWidth > 0) {\r\n element.style.maxWidth = `${this.__maxWidth}px`;\r\n }\r\n\r\n return { element };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: () => ({\r\n conversion: $convertImageElement,\r\n priority: 2,\r\n }),\r\n };\r\n }\r\n\r\n constructor(\r\n src: string,\r\n altText: string,\r\n maxWidth: number,\r\n width?: 'inherit' | number,\r\n height?: 'inherit' | number,\r\n showCaption?: boolean,\r\n caption?: LexicalEditor,\r\n captionsEnabled?: boolean,\r\n key?: NodeKey\r\n ) {\r\n super(key);\r\n this.__src = src;\r\n this.__altText = altText;\r\n this.__maxWidth = maxWidth;\r\n this.__width = width ?? 'inherit';\r\n this.__height = height ?? 'inherit';\r\n this.__showCaption = showCaption ?? false;\r\n this.__caption =\r\n caption ||\r\n createEditor({\r\n nodes: [],\r\n });\r\n this.__captionsEnabled = captionsEnabled ?? true;\r\n }\r\n\r\n exportJSON(): SerializedImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n altText: this.getAltText(),\r\n caption: this.__caption.toJSON(),\r\n height: this.__height === 'inherit' ? 0 : this.__height,\r\n maxWidth: this.__maxWidth,\r\n showCaption: this.__showCaption,\r\n src: this.getSrc(),\r\n width: this.__width === 'inherit' ? 0 : this.__width,\r\n captionsEnabled: this.__captionsEnabled,\r\n };\r\n }\r\n\r\n setWidthAndHeight(width: 'inherit' | number, height: 'inherit' | number): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\r\n }\r\n\r\n setShowCaption(showCaption: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__showCaption = showCaption;\r\n }\r\n\r\n // View\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const span = document.createElement('span');\r\n const theme = config.theme;\r\n const className = theme.image;\r\n if (className !== undefined) {\r\n span.className = className;\r\n } else {\r\n // fallback so your CSS `.editor-image ...` still applies even if theme.image isn't set\r\n span.className = 'editor-image';\r\n }\r\n return span;\r\n }\r\n\r\n updateDOM(): false {\r\n return false;\r\n }\r\n\r\n getSrc(): string {\r\n return this.__src;\r\n }\r\n\r\n getAltText(): string {\r\n return this.__altText;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return (\r\n <ImageComponent\r\n src={this.__src}\r\n altText={this.__altText}\r\n width={this.__width}\r\n height={this.__height}\r\n maxWidth={this.__maxWidth}\r\n nodeKey={this.getKey()}\r\n showCaption={this.__showCaption}\r\n caption={this.__caption}\r\n captionsEnabled={this.__captionsEnabled}\r\n resizable={true}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport const $createImageNode = ({\r\n altText,\r\n height,\r\n maxWidth = 500,\r\n captionsEnabled,\r\n src,\r\n width,\r\n showCaption,\r\n caption,\r\n key,\r\n}: ImagePayload): ImageNode => {\r\n return $applyNodeReplacement(\r\n new ImageNode(\r\n src,\r\n altText,\r\n maxWidth,\r\n (width as any) ?? 'inherit',\r\n (height as any) ?? 'inherit',\r\n showCaption,\r\n caption,\r\n captionsEnabled,\r\n key\r\n )\r\n );\r\n};\r\n\r\nexport const $isImageNode = (node: LexicalNode | null | undefined): node is ImageNode => {\r\n return node instanceof ImageNode;\r\n};\r\n",".InlineImageNode__contentEditable {\r\n min-height: 20px;\r\n border: 0px;\r\n resize: none;\r\n cursor: text;\r\n caret-color: rgb(5, 5, 5);\r\n display: block;\r\n position: relative;\r\n tab-size: 1;\r\n outline: 0px;\r\n padding: 10px;\r\n user-select: text;\r\n font-size: 14px;\r\n line-height: 1.4em;\r\n width: calc(100% - 20px);\r\n white-space: pre-wrap;\r\n word-break: break-word;\r\n}\r\n\r\n.InlineImageNode__placeholder {\r\n font-size: 12px;\r\n color: #888;\r\n overflow: hidden;\r\n position: absolute;\r\n text-overflow: ellipsis;\r\n bottom: 10px;\r\n left: 10px;\r\n user-select: none;\r\n white-space: nowrap;\r\n display: inline-block;\r\n pointer-events: none;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked,\r\n.InlineImageNode_Checkbox:not(:checked) {\r\n position: absolute;\r\n left: -9999px;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label,\r\n.InlineImageNode_Checkbox:not(:checked) + label {\r\n position: absolute;\r\n padding-right: 55px;\r\n cursor: pointer;\r\n line-height: 20px;\r\n display: inline-block;\r\n color: #666;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:before,\r\n.InlineImageNode_Checkbox:not(:checked) + label:before {\r\n content: '';\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n width: 18px;\r\n height: 18px;\r\n border: 1px solid #666;\r\n background: #fff;\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:after,\r\n.InlineImageNode_Checkbox:not(:checked) + label:after {\r\n content: '';\r\n width: 8px;\r\n height: 8px;\r\n background: #222222;\r\n position: absolute;\r\n top: 6px;\r\n right: 6px;\r\n -webkit-transition: all 0.2s ease;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.InlineImageNode_Checkbox:not(:checked) + label:after {\r\n opacity: 0;\r\n -webkit-transform: scale(0);\r\n transform: scale(0);\r\n}\r\n\r\n.InlineImageNode_Checkbox:checked + label:after {\r\n opacity: 1;\r\n -webkit-transform: scale(1);\r\n transform: scale(1);\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport type { BaseSelection, LexicalEditor, NodeKey } from 'lexical';\r\nimport {\r\n $getSelection,\r\n $isNodeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND\r\n} from 'lexical';\r\nimport { Suspense, useCallback, useEffect, useRef, useState } from 'react';\r\nimport './InlineImage.css';\r\nimport type { Position } from './InlineImageNode';\r\nimport { $isInlineImageNode } from './InlineImageNode';\r\nconst imageCache = new Set();\r\n\r\nconst useSuspenseImage = (src: string) => {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n}\r\ninterface ILazyImageProps{\r\n src: string;\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n width: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n position: Position;\r\n}\r\nconst LazyImage = ({ altText, className, imageRef, src, width, height, position}:ILazyImageProps): JSX.Element => {\r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n data-position={position}\r\n style={{\r\n display: 'block',\r\n height,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\ninterface IInlineImageComponent{\r\n altText: string;\r\n src: string;\r\n caption: LexicalEditor;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n width: 'inherit' | number;\r\n height: 'inherit' | number;\r\n position: Position;\r\n}\r\nconst InlineImageComponent = ({ src, altText, nodeKey, width, height, showCaption, caption, position }: IInlineImageComponent): JSX.Element => {\r\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [editor] = useLexicalComposerContext();\r\n const isEditable = useLexicalEditable();\r\n\r\n const $onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\r\n\r\n const $onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const $onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n $onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n $onDelete,\r\n $onEnter,\r\n $onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n <span draggable={draggable}>\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n position={position}\r\n />\r\n </span>\r\n </Suspense>\r\n );\r\n}\r\nexport default InlineImageComponent;","import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalEditor,\r\n LexicalNode,\r\n LexicalUpdateJSON,\r\n NodeKey,\r\n SerializedEditor,\r\n SerializedLexicalNode,\r\n Spread\r\n} from 'lexical';\r\nimport {\r\n $applyNodeReplacement,\r\n createEditor,\r\n DecoratorNode,\r\n isHTMLElement\r\n} from 'lexical';\r\nimport type { JSX } from 'react';\r\nimport * as React from 'react';\r\n\r\nconst InlineImageComponent = React.lazy(() => import('./InlineImageComponent'));\r\n\r\nexport type Position = 'left' | 'right' | 'full' | undefined;\r\n\r\nexport interface InlineImagePayload {\r\n altText: string;\r\n caption?: LexicalEditor;\r\n height?: number;\r\n key?: NodeKey;\r\n showCaption?: boolean;\r\n src: string;\r\n width?: number;\r\n position?: Position;\r\n}\r\n\r\nexport interface UpdateInlineImagePayload {\r\n altText?: string;\r\n showCaption?: boolean;\r\n position?: Position;\r\n}\r\n\r\nconst $convertInlineImageElement = (domNode: Node): null | DOMConversionOutput => {\r\n if (isHTMLElement(domNode) && domNode.nodeName === 'IMG') {\r\n const {alt: altText, src, width, height} = domNode as HTMLImageElement;\r\n const node = $createInlineImageNode({altText, height, src, width});\r\n return {node};\r\n }\r\n return null;\r\n}\r\n\r\nexport type SerializedInlineImageNode = Spread<\r\n {\r\n altText: string;\r\n caption: SerializedEditor;\r\n height?: number;\r\n showCaption: boolean;\r\n src: string;\r\n width?: number;\r\n position?: Position;\r\n },\r\n SerializedLexicalNode\r\n>;\r\n\r\nexport class InlineImageNode extends DecoratorNode<JSX.Element> {\r\n __src: string;\r\n __altText: string;\r\n __width: 'inherit' | number;\r\n __height: 'inherit' | number;\r\n __showCaption: boolean;\r\n __caption: LexicalEditor;\r\n __position: Position;\r\n\r\n static getType(): string {\r\n return 'inline-image';\r\n }\r\n\r\n static clone(node: InlineImageNode): InlineImageNode {\r\n return new InlineImageNode(\r\n node.__src,\r\n node.__altText,\r\n node.__position,\r\n node.__width,\r\n node.__height,\r\n node.__showCaption,\r\n node.__caption,\r\n node.__key,\r\n );\r\n }\r\n\r\n static importJSON(\r\n serializedNode: SerializedInlineImageNode,\r\n ): InlineImageNode {\r\n const {altText, height, width, src, showCaption, position} = serializedNode;\r\n return $createInlineImageNode({\r\n altText,\r\n height,\r\n position,\r\n showCaption,\r\n src,\r\n width,\r\n }).updateFromJSON(serializedNode);\r\n }\r\n\r\n updateFromJSON(\r\n serializedNode: LexicalUpdateJSON<SerializedInlineImageNode>,\r\n ): this {\r\n const {caption} = serializedNode;\r\n const node = super.updateFromJSON(serializedNode);\r\n const nestedEditor = node.__caption;\r\n const editorState = nestedEditor.parseEditorState(caption.editorState);\r\n if (!editorState.isEmpty()) {\r\n nestedEditor.setEditorState(editorState);\r\n }\r\n return node;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n img: (node: Node) => ({\r\n conversion: $convertInlineImageElement,\r\n priority: 0,\r\n }),\r\n };\r\n }\r\n\r\n constructor(\r\n src: string,\r\n altText: string,\r\n position: Position,\r\n width?: 'inherit' | number,\r\n height?: 'inherit' | number,\r\n showCaption?: boolean,\r\n caption?: LexicalEditor,\r\n key?: NodeKey,\r\n ) {\r\n super(key);\r\n this.__src = src;\r\n this.__altText = altText;\r\n this.__width = width || 'inherit';\r\n this.__height = height || 'inherit';\r\n this.__showCaption = showCaption || false;\r\n this.__caption = caption || createEditor();\r\n this.__position = position;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const element = document.createElement('img');\r\n element.setAttribute('src', this.__src);\r\n element.setAttribute('alt', this.__altText);\r\n element.setAttribute('width', this.__width.toString());\r\n element.setAttribute('height', this.__height.toString());\r\n return {element};\r\n }\r\n\r\n exportJSON(): SerializedInlineImageNode {\r\n return {\r\n ...super.exportJSON(),\r\n altText: this.getAltText(),\r\n caption: this.__caption.toJSON(),\r\n height: this.__height === 'inherit' ? 0 : this.__height,\r\n position: this.__position,\r\n showCaption: this.__showCaption,\r\n src: this.getSrc(),\r\n width: this.__width === 'inherit' ? 0 : this.__width,\r\n };\r\n }\r\n\r\n getSrc(): string {\r\n return this.__src;\r\n }\r\n\r\n getAltText(): string {\r\n return this.__altText;\r\n }\r\n\r\n setAltText(altText: string): void {\r\n const writable = this.getWritable();\r\n writable.__altText = altText;\r\n }\r\n\r\n setWidthAndHeight(\r\n width: 'inherit' | number,\r\n height: 'inherit' | number,\r\n ): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\r\n }\r\n\r\n getShowCaption(): boolean {\r\n return this.__showCaption;\r\n }\r\n\r\n setShowCaption(showCaption: boolean): void {\r\n const writable = this.getWritable();\r\n writable.__showCaption = showCaption;\r\n }\r\n\r\n getPosition(): Position {\r\n return this.__position;\r\n }\r\n\r\n setPosition(position: Position): void {\r\n const writable = this.getWritable();\r\n writable.__position = position;\r\n }\r\n\r\n update(payload: UpdateInlineImagePayload): void {\r\n const writable = this.getWritable();\r\n const {altText, showCaption, position} = payload;\r\n if (altText !== undefined) {\r\n writable.__altText = altText;\r\n }\r\n if (showCaption !== undefined) {\r\n writable.__showCaption = showCaption;\r\n }\r\n if (position !== undefined) {\r\n writable.__position = position;\r\n }\r\n }\r\n\r\n // View\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const span = document.createElement('span');\r\n const className = `${config.theme.inlineImage} position-${this.__position}`;\r\n if (className !== undefined) {\r\n span.className = className;\r\n }\r\n return span;\r\n }\r\n\r\n updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): false {\r\n const position = this.__position;\r\n if (position !== prevNode.__position) {\r\n const className = `${config.theme.inlineImage} position-${position}`;\r\n if (className !== undefined) {\r\n dom.className = className;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n decorate(): JSX.Element {\r\n return (\r\n <InlineImageComponent\r\n src={this.__src}\r\n altText={this.__altText}\r\n width={this.__width}\r\n height={this.__height}\r\n nodeKey={this.getKey()}\r\n showCaption={this.__showCaption}\r\n caption={this.__caption}\r\n position={this.__position}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport const $createInlineImageNode = ({ altText, position, height, src, width, showCaption, caption, key }: InlineImagePayload): InlineImageNode => {\r\n return $applyNodeReplacement(\r\n new InlineImageNode( src, altText, position, width, height, showCaption, caption, key ),\r\n );\r\n}\r\n\r\nexport const $isInlineImageNode = ( node: LexicalNode | null | undefined): node is InlineImageNode => {\r\n return node instanceof InlineImageNode;\r\n}\r\n","/** How the suggestion was accepted */\r\n/**\r\n * How an inline suggestion was accepted/committed by the user.\r\n *\r\n * - 'tab': Accepted via the Tab key (or ArrowRight)\r\n * - 'enter': Accepted via the Enter key\r\n * - 'click': Accepted by clicking on a suggestion item\r\n */\r\nexport type AcceptMethod = 'tab' | 'enter' | 'click';\r\n/** What the consumer returns for autocomplete requests */\r\nexport type SearchPromise = {\r\n promise: Promise<string[] | null>;\r\n dismiss: () => void;\r\n};\r\n// ─── Spell / Grammar check types ────────────────────────────────────────────\r\n/**\r\n * A single spelling, grammar, or style issue returned by your API.\r\n *\r\n * `offset` and `length` are character positions in the plain-text\r\n * representation of the document (`editor.getRootElement().innerText`).\r\n */\r\nexport type SpellCheckIssue = {\r\n /** Character offset in the document's plain text */\r\n offset: number;\r\n /** Number of characters the issue spans */\r\n length: number;\r\n /** Human-readable description shown in the suggestion popover */\r\n message: string;\r\n /** Replacement candidates, best first */\r\n suggestions: string[];\r\n /** Visual style of the underline: red = spelling, blue = grammar, yellow = style */\r\n type?: 'spelling' | 'grammar' | 'style';\r\n /** Actual word as it appears in the text (set by adapter) */\r\n word?: string;\r\n};\r\n/**\r\n * Return value of `useSpellCheck`.\r\n *\r\n * `promise` resolves to an object containing:\r\n * - `issues` — individual misspelled words to underline\r\n * - `improvedText`— the fully corrected sentence (like Grammarly's \"Accept all\")\r\n */\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n// ─── Editor level ────────────────────────────────────────────────────────────\r\n/**\r\n * Editor capability levels controlling which toolbar features are enabled.\r\n *\r\n * - none: No toolbar shown\r\n * - basic: Minimal formatting (bold/italic/underline), lists, links\r\n * - standard: Common formatting plus media (images, tables, etc.)\r\n * - pro: Full feature set (advanced blocks and tools)\r\n */\r\nexport enum ContentEditorLevel {\r\n None = 'none',\r\n Basic = 'basic',\r\n Standard = 'standard',\r\n Pro = 'pro',\r\n}\r\n/**\r\n * INTERNAL: Block specification used by the ref API.\r\n *\r\n * Not exported from the package root to avoid locking\r\n * implementation details. Subject to change without notice.\r\n */\r\ntype BlockSpec = {\r\n kind: string;\r\n html: string;\r\n position?: 'start' | 'end';\r\n};\r\n/**\r\n * Public, imperative API exposed via the component ref.\r\n *\r\n * Allows programmatic read/write, focus control, and state checks.\r\n */\r\nexport type ContentEditorRef = {\r\n /** Replace the entire document content with the provided HTML. */\r\n setValue: (html: string) => void;\r\n /** Return the current document as HTML. */\r\n getValue: () => string;\r\n /** Clear the document to an empty state. */\r\n clear: () => void;\r\n /** Move focus to the editable area. */\r\n focus: () => void;\r\n /** Remove focus from the editable area. */\r\n blur: () => void;\r\n /** Whether the editor currently contains no user content. */\r\n isEmpty: () => boolean;\r\n /** Whether the editor currently has input focus. */\r\n isFocused: () => boolean;\r\n /**\r\n * Access the underlying Lexical editor instance for advanced usage.\r\n * Returned type is `any` to avoid leaking internal Lexical types.\r\n */\r\n getEditor: () => any;\r\n /**\r\n * Insert or update a block identified by `spec.kind`.\r\n *\r\n * If a block with the same `kind` exists, it will be updated;\r\n * otherwise a new block is inserted. `position` controls whether\r\n * the insertion occurs at the document 'start' or 'end'.\r\n */\r\n upsertBlock: (spec: BlockSpec) => void;\r\n /** Remove a previously inserted block by its `kind` identifier. */\r\n removeBlock: (kind: string) => void;\r\n /** Check whether a block with the given `kind` exists. */\r\n hasBlock: (kind: string) => boolean;\r\n};\r\n// ─── Component props ─────────────────────────────────────────────────────────\r\nexport interface ContentEditorProps {\r\n /** Optional editor namespace used by Lexical for scoping. */\r\n namespace?: string;\r\n /** Controlled HTML value rendered by the editor. */\r\n value: string;\r\n /** Outer container width (e.g., '100%', '600px'). */\r\n width?: string;\r\n /** Outer container height (e.g., '100%', '400px'). */\r\n height?: string;\r\n /** When true, focuses the editor on mount. */\r\n autoFocus?: boolean;\r\n /** CSS margin applied to the root container. */\r\n margin?: string | number;\r\n /** Placeholder text shown when the editor is empty. */\r\n placeholder?: string;\r\n /** Height of the editable content area inside the container. */\r\n contentHeight?: string;\r\n /** Feature level controlling which toolbar groups are enabled. */\r\n level?: ContentEditorLevel;\r\n /**\r\n * @deprecated Not used by the component. Prefer styling overrides instead.\r\n */\r\n topPlaceholderMargin?: string;\r\n /** Change handler returning the latest HTML value. */\r\n onChange: (value: string) => void;\r\n /** When true, the editor becomes read-only (non-interactive). */\r\n readOnly?: boolean;\r\n /**\r\n * @deprecated Legacy flag intended to show a clear button.\r\n * This is currently not wired in the UI.\r\n */\r\n clearEditorMode?: boolean;\r\n // ── Autocomplete ───────────────────────────────────────────────────────────\r\n /**\r\n * Simple autocomplete — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, and ghost-text\r\n * insertion internally. Return the raw API response — supported shapes:\r\n * - `{ generated_text: string }` — single suggestion\r\n * - `string[]` — list of suggestions\r\n * - `null / undefined` — no suggestion\r\n *\r\n * Example:\r\n * ```ts\r\n * suggestFn={async (text) => {\r\n * const res = await fetch('/api/suggest', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n suggestFn?: (text: string, cursorIndex?: number) => Promise<any>;\r\n /**\r\n * Advanced: full control over autocomplete with manual cancellation.\r\n * Use `suggestFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n /** Called when the editor gains focus. */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus. */\r\n onBlur?: () => void;\r\n /**\r\n * Fires when the user **accepts** an autocomplete suggestion (Tab / ArrowRight).\r\n *\r\n * Use this to send a reward signal to your backend so the model improves\r\n * over time. Example:\r\n * ```ts\r\n * onSuggestionAccept={({ suggestionText, triggerText, method }) => {\r\n * sendReward({ suggestionText, triggerText }); // hits your reward API\r\n * }}\r\n * ```\r\n */\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n /**\r\n * Fires when a suggestion is displayed to the user (optional analytics hook).\r\n */\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n // ── Spell / Grammar check ──────────────────────────────────────────────────\r\n /**\r\n * Simple spell/grammar check — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, response adaptation,\r\n * underlines, and popovers internally. Supported API response shapes:\r\n * - `{ misspelled_words: string[], suggestions: Record<string, string[]>, grammar_correction?: string }`\r\n * - `{ misspelled: string[], suggestions: Record<string, string[]>, improved_text?: string }`\r\n * - `SpellCheckIssue[]` (legacy — already-adapted array)\r\n *\r\n * Example:\r\n * ```ts\r\n * spellCheckFn={async (text) => {\r\n * const res = await fetch('/api/spellcheck', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n spellCheckFn?: (text: string) => Promise<any>;\r\n /**\r\n * Advanced: full control over spell check with manual cancellation.\r\n * Use `spellCheckFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /**\r\n * Fires when the user accepts a spell/grammar correction from the popover.\r\n *\r\n * Use this to POST a reward signal to your backend.\r\n * ```ts\r\n * onSpellCheckAccept={({ original, replacement, message, type }) => {\r\n * myApi.rewardSpellCheck({ original, replacement });\r\n * }}\r\n * ```\r\n */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the spell-check\r\n * API is called. Defaults to 1200ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n spellCheckIdleMs?: number;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the `suggestFn`\r\n * API is called. Defaults to 300ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n suggestIdleMs?: number;\r\n /** When false, spell checking is disabled without unmounting the plugin. */\r\n spellCheckEnabled?: boolean;\r\n // ── Floating toolbar ───────────────────────────────────────────────────────\r\n /** When true, shows the floating formatting toolbar near text selections. */\r\n showFloatingToolbar?: boolean;\r\n /**\r\n * Maximum word count allowed. When set, a live counter is shown\r\n * below the editor. Exceeding the limit turns the counter red.\r\n * Example: wordLimit={500}\r\n */\r\n wordLimit?: number;\r\n\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n *\r\n * - exceeded: true -> user just exceeded the limit\r\n * - exceeded: false -> user came back within the limit\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n}\r\n","import type { DOMExportOutput, EditorConfig, NodeKey, SerializedTextNode, Spread } from 'lexical';\r\nimport { TextNode } from 'lexical';\r\n\r\nexport type SerializedAutocompleteNode = Spread<{ uuid: string }, SerializedTextNode>;\r\n\r\nexport class AutocompleteNode extends TextNode {\r\n __uuid: string;\r\n\r\n static getType(): 'autocomplete' {\r\n return 'autocomplete';\r\n }\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 importJSON(serializedNode: SerializedAutocompleteNode): AutocompleteNode {\r\n return new AutocompleteNode(serializedNode.text, serializedNode.uuid);\r\n }\r\n\r\n exportJSON(): SerializedAutocompleteNode {\r\n return { ...super.exportJSON(), uuid: this.__uuid };\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 createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config);\r\n dom.classList.add(config.theme?.autocomplete || 'autocomplete-node');\r\n dom.style.color = '#a79e9e';\r\n return dom;\r\n }\r\n\r\n updateDOM(prevNode: AutocompleteNode): boolean {\r\n return this.__uuid !== prevNode.__uuid || this.__text !== prevNode.__text;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const dom = document.createElement('span');\r\n dom.textContent = this.__text;\r\n dom.style.color = '#a79e9e';\r\n return { element: dom };\r\n }\r\n\r\n excludeFromCopy() {\r\n return true;\r\n }\r\n}\r\n\r\nexport const $createAutocompleteNode = (text: string, uuid: string) =>\r\n new AutocompleteNode(text, uuid);\r\n","import {\r\n $applyNodeReplacement,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n ElementNode,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedElementNode,\r\n} from 'lexical';\r\n\r\nexport type SerializedHtmlBlockNode = SerializedElementNode & {\r\n type: 'htmlblock';\r\n version: 1;\r\n kind: string;\r\n};\r\n\r\nfunction convertHtmlBlockDiv(domNode: HTMLElement): DOMConversionOutput {\r\n const kind = domNode.getAttribute('data-kind') || 'unknown';\r\n return { node: $createHtmlBlockNode(kind) };\r\n}\r\n\r\nexport class HtmlBlockNode extends ElementNode {\r\n __kind: string;\r\n\r\n static getType(): string {\r\n return 'htmlblock';\r\n }\r\n\r\n static clone(node: HtmlBlockNode): HtmlBlockNode {\r\n return new HtmlBlockNode(node.__kind, node.__key);\r\n }\r\n\r\n constructor(kind: string, key?: NodeKey) {\r\n super(key);\r\n this.__kind = kind;\r\n }\r\n\r\n getKind(): string {\r\n return this.getLatest().__kind;\r\n }\r\n\r\n setKind(kind: string) {\r\n const writable = this.getWritable();\r\n writable.__kind = kind;\r\n }\r\n\r\n createDOM(): HTMLElement {\r\n const el = document.createElement('div');\r\n el.setAttribute('data-lex-block', 'true');\r\n el.setAttribute('data-kind', this.__kind);\r\n return el;\r\n }\r\n\r\n updateDOM(prevNode: HtmlBlockNode, dom: HTMLElement): boolean {\r\n if (prevNode.__kind !== this.__kind) {\r\n dom.setAttribute('data-kind', this.__kind);\r\n }\r\n return false;\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n div: (domNode: Node) => {\r\n if (domNode instanceof HTMLElement && domNode.getAttribute('data-lex-block') === 'true') {\r\n return {\r\n conversion: (node: Node) => convertHtmlBlockDiv(node as HTMLElement),\r\n priority: 2,\r\n };\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const el = document.createElement('div');\r\n el.setAttribute('data-lex-block', 'true');\r\n el.setAttribute('data-kind', this.__kind);\r\n return { element: el };\r\n }\r\n\r\n exportJSON(): SerializedHtmlBlockNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: 'htmlblock',\r\n version: 1,\r\n kind: this.__kind,\r\n };\r\n }\r\n\r\n static importJSON(serializedNode: SerializedHtmlBlockNode): HtmlBlockNode {\r\n return $createHtmlBlockNode(serializedNode.kind);\r\n }\r\n}\r\n\r\nexport function $createHtmlBlockNode(kind: string): HtmlBlockNode {\r\n return $applyNodeReplacement(new HtmlBlockNode(kind));\r\n}\r\n\r\nexport function $isHtmlBlockNode(node: LexicalNode | null | undefined): node is HtmlBlockNode {\r\n return node instanceof HtmlBlockNode;\r\n}\r\n","import { css, mergeStyleSets, Stack } from '@fluentui/react';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { CodeHighlightNode, CodeNode } from '@lexical/code';\r\nimport { AutoLinkNode, LinkNode } from '@lexical/link';\r\nimport { ListItemNode, ListNode } from '@lexical/list';\r\nimport { AutoFocusPlugin } from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport { AutoLinkPlugin, createLinkMatcherWithRegExp } from '@lexical/react/LexicalAutoLinkPlugin';\r\nimport { LexicalComposer } from '@lexical/react/LexicalComposer';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable';\r\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary';\r\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\r\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin';\r\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\r\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';\r\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin';\r\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text';\r\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table';\r\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { $setSelection } from 'lexical';\r\n\r\nimport {\r\n ContentEditorLevel,\r\n ContentEditorProps,\r\n ContentEditorRef,\r\n SearchPromise,\r\n SpellCheckIssue,\r\n SpellCheckPayload,\r\n SpellCheckResult,\r\n} from './ContentEditorComponent.types';\r\n\r\nimport './Editor.css';\r\n\r\nimport { AutocompleteNode } from './Nodes/AutoCompleteNode';\r\nimport { HtmlBlockNode } from './Nodes/HtmlBlockNode';\r\nimport { ImageNode } from './Nodes/ImageNode';\r\nimport { InlineImageNode } from './Nodes/InlineImageNode';\r\nimport { PageBreakNode } from './Nodes/PageBreakNode';\r\nimport { SpellErrorNode } from './Nodes/SpellErrorNode';\r\nimport { YouTubeNode } from './Nodes/YoutubeNode';\r\n\r\nimport AutocompletePlugin from './Plugins/AutoComplete';\r\nimport CharacterStylesPopupPlugin from './Plugins/CharacterStylesPopupPlugin';\r\nimport { CustomOnChangePlugin } from './Plugins/CustomOnChange';\r\nimport { FloatingLinkEditorPlugin } from './Plugins/FloatLinkEditor';\r\nimport ImagesPlugin from './Plugins/ImagePlugin';\r\nimport InlineImagePlugin from './Plugins/InlineImage';\r\nimport PageBreakPlugin from './Plugins/PageBreak';\r\nimport RefApiPlugin from './Plugins/RefApiPlugin';\r\nimport SpellCheckPlugin from './Plugins/Spellcheckplugin';\r\nimport TableActionMenuPlugin from './Plugins/TableActionMenuPlugin';\r\nimport TableCellResizerPlugin from './Plugins/TableCellResizer';\r\nimport { ToolBarPlugins } from './Plugins/ToolBar';\r\nimport YoutubeDeletePlugin from './Plugins/YoutubeDeletePlugin';\r\nimport { theme } from './Theme';\r\n\r\nfunction ReadOnlyPlugin({ readonly }: { readonly: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n editor.setEditable(!readonly);\r\n }, [editor, readonly]);\r\n return null;\r\n}\r\n\r\nfunction BrowserSpellCheckPlugin({ enabled }: { enabled: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n const el = editor.getRootElement();\r\n if (!el) return;\r\n el.spellcheck = enabled;\r\n return editor.registerRootListener((nextRoot, prevRoot) => {\r\n if (prevRoot) prevRoot.spellcheck = false;\r\n if (nextRoot) nextRoot.spellcheck = enabled;\r\n });\r\n }, [editor, enabled]);\r\n return null;\r\n}\r\n\r\nfunction WordCountPlugin({ onCountChange }: { onCountChange: (count: number) => void }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n return editor.registerUpdateListener(() => {\r\n const text = editor.getRootElement()?.innerText ?? '';\r\n const words = text.trim() === '' ? 0 : text.trim().split(/\\s+/).length;\r\n onCountChange(words);\r\n });\r\n }, [editor, onCountChange]);\r\n return null;\r\n}\r\n\r\nfunction FocusEventsPlugin({\r\n onFocus,\r\n onBlur,\r\n setFocused,\r\n containerRef,\r\n}: {\r\n onFocus?: () => void;\r\n onBlur?: () => void;\r\n setFocused: (focused: boolean) => void;\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const handleFocusIn = () => {\r\n setFocused(true);\r\n onFocus?.();\r\n };\r\n\r\n const handleFocusOut = (e: FocusEvent) => {\r\n const next = e.relatedTarget as Node | null;\r\n // Stay active if focus moved anywhere inside the whole editor container\r\n // (e.g. toolbar buttons), not just within the ContentEditable root.\r\n const container = containerRef.current;\r\n const stillInside = !!next && (container ? container.contains(next) : root.contains(next));\r\n if (stillInside) return;\r\n\r\n editor.update(() => {\r\n $setSelection(null);\r\n });\r\n\r\n setFocused(false);\r\n onBlur?.();\r\n };\r\n\r\n root.addEventListener('focusin', handleFocusIn);\r\n root.addEventListener('focusout', handleFocusOut);\r\n\r\n return () => {\r\n root.removeEventListener('focusin', handleFocusIn);\r\n root.removeEventListener('focusout', handleFocusOut);\r\n };\r\n }, [editor, onBlur, onFocus, setFocused, containerRef]);\r\n\r\n return null;\r\n}\r\n\r\nconst URL_REGEX =\r\n /(https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|www\\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9]+\\.[^\\s]{2,}|www\\.[a-zA-Z0-9]+\\.[^\\s]{2,})/;\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) => text),\r\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => `mailto:${text}`),\r\n];\r\n\r\n// ─── Internal adapters for spellCheckFn / suggestFn ──────────────────────────\r\n// These let consumers pass a plain async function instead of the full\r\n// SpellCheckResult / SearchPromise shape. The component wraps it internally.\r\n\r\nfunction _escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nfunction _matchFrom(\r\n text: string,\r\n regex: RegExp,\r\n from: number,\r\n): { offset: number; actualWord: string } | null {\r\n const m = text.slice(from).match(regex);\r\n if (!m || m.index == null) return null;\r\n return { offset: from + m.index, actualWord: m[0] };\r\n}\r\n\r\nfunction _adaptRawSpell(data: any, text: string): SpellCheckPayload | null {\r\n if (!data) return null;\r\n if (Array.isArray(data)) return { issues: data as SpellCheckIssue[] };\r\n\r\n const hasSpelling = !!(data.misspelled_words?.length || data.misspelled?.length);\r\n const hasGrammar = !!(data.grammar_correction || data.improved_text);\r\n if (!hasSpelling && !hasGrammar) return null;\r\n\r\n const words: string[] = data.misspelled_words ?? data.misspelled ?? [];\r\n const seen: Record<string, number> = {};\r\n const issues: SpellCheckIssue[] = [];\r\n\r\n for (const apiWord of words) {\r\n const from = seen[apiWord] ?? 0;\r\n const match =\r\n _matchFrom(text, new RegExp(`\\\\b${_escRx(apiWord)}\\\\b`, 'i'), from) ??\r\n _matchFrom(text, new RegExp(_escRx(apiWord), 'i'), from);\r\n if (!match) continue;\r\n seen[apiWord] = match.offset + match.actualWord.length;\r\n issues.push({\r\n offset: match.offset,\r\n length: match.actualWord.length,\r\n word: match.actualWord,\r\n message: `\"${match.actualWord}\" may be misspelled`,\r\n suggestions: data.suggestions?.[apiWord] ?? [],\r\n type: 'spelling',\r\n });\r\n }\r\n\r\n const rawGrammar: string | undefined = data.grammar_correction ?? data.improved_text;\r\n const grammarCorrection =\r\n rawGrammar && rawGrammar.trim() !== text.trim() ? rawGrammar.trim() : undefined;\r\n\r\n return { issues: issues.sort((a, b) => a.offset - b.offset), grammarCorrection };\r\n}\r\n\r\nfunction _adaptRawSuggest(data: any): string[] | null {\r\n if (!data) return null;\r\n // string[] directly\r\n if (Array.isArray(data)) return data.filter(Boolean);\r\n // { suggestions: string[] } — shape returned by AutoCompleteWorker / suggest API\r\n if (Array.isArray(data.suggestions) && data.suggestions.length > 0)\r\n return data.suggestions.filter(Boolean);\r\n // { generated_text: string } — alternate API shape\r\n if (typeof data.generated_text === 'string' && data.generated_text.trim())\r\n return [data.generated_text];\r\n // { improved_text: string } — fallback shape\r\n if (typeof data.improved_text === 'string' && data.improved_text.trim())\r\n return [data.improved_text];\r\n // bare string\r\n if (typeof data === 'string' && data.trim()) return [data];\r\n return null;\r\n}\r\n\r\n// These are module-level factory functions (not hooks) so the component\r\n// can call them conditionally without violating Rules of Hooks.\r\nfunction _makeSpellCheckFn(fn: (text: string) => Promise<any>): (text: string) => SpellCheckResult {\r\n return (text: string): SpellCheckResult => {\r\n let dismissed = false;\r\n const promise: Promise<SpellCheckPayload | null> = (async () => {\r\n try {\r\n const raw = await fn(text);\r\n if (dismissed) return null;\r\n return _adaptRawSpell(raw, text);\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n return {\r\n promise,\r\n dismiss: () => {\r\n dismissed = true;\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction _makeQueryFn(\r\n fn: (text: string, cursorIndex?: number) => Promise<any>,\r\n): (text?: string, cursorIndex?: number) => SearchPromise {\r\n return (text?: string, cursorIndex?: number): SearchPromise => {\r\n let dismissed = false;\r\n const promise: Promise<string[] | null> = (async () => {\r\n try {\r\n if (!text?.trim()) return null;\r\n const raw = await fn(text, cursorIndex);\r\n if (dismissed) return null;\r\n return _adaptRawSuggest(raw);\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n return {\r\n promise,\r\n dismiss: () => {\r\n dismissed = true;\r\n },\r\n };\r\n };\r\n}\r\n\r\nexport const ContentEditorComponent = forwardRef<ContentEditorRef, ContentEditorProps>(\r\n (props, ref) => {\r\n const isReadOnly = !!props.readOnly;\r\n\r\n // ── Resolve simple fn props → plugin format ────────────────────────────\r\n // spellCheckFn / suggestFn: simple API — just a plain async function.\r\n // useSpellCheck / useQuery: advanced API — manual cancellation control.\r\n // Simple props take precedence if both are provided.\r\n // useMemo ensures the wrapped functions are stable across renders so\r\n // plugins don't re-register on every keystroke.\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const resolvedSpellCheck = React.useMemo(\r\n () => (props.spellCheckFn ? _makeSpellCheckFn(props.spellCheckFn) : props.useSpellCheck),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [props.spellCheckFn, props.useSpellCheck],\r\n );\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const resolvedQuery = React.useMemo(\r\n () => (props.suggestFn ? _makeQueryFn(props.suggestFn) : props.useQuery),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [props.suggestFn, props.useQuery],\r\n );\r\n\r\n const [floatingAnchorElem, setFloatingAnchorElem] = useState<HTMLDivElement | null>(null);\r\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\r\n\r\n const [wordCount, setWordCount] = useState(0);\r\n const handleWordCount = useCallback((count: number) => setWordCount(count), []);\r\n\r\n const contentEditableDomRef = useRef<HTMLDivElement>(null);\r\n const previousOverLimitRef = useRef(false);\r\n\r\n const focusedRef = useRef(false);\r\n const setFocused = (focused: boolean) => {\r\n focusedRef.current = focused;\r\n };\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const onAnchorRef = (elem: HTMLDivElement | null) => {\r\n if (elem) setFloatingAnchorElem(elem);\r\n };\r\n\r\n const initialConfig: any = {\r\n namespace: props.namespace,\r\n theme,\r\n onError: () => { },\r\n nodes: [\r\n HeadingNode,\r\n QuoteNode,\r\n\r\n CodeHighlightNode,\r\n CodeNode,\r\n\r\n ListNode,\r\n ListItemNode,\r\n\r\n LinkNode,\r\n AutoLinkNode,\r\n\r\n TableNode,\r\n TableRowNode,\r\n TableCellNode,\r\n\r\n ImageNode,\r\n InlineImageNode,\r\n YouTubeNode,\r\n PageBreakNode,\r\n AutocompleteNode,\r\n SpellErrorNode,\r\n\r\n HtmlBlockNode,\r\n ],\r\n };\r\n\r\n const EditorStyles = mergeStyleSets({\r\n editorPlaceholder: {\r\n color: 'var(--colorNeutralForeground3, grey)',\r\n position: 'absolute',\r\n top: props.level !== ContentEditorLevel.None ? '17px' : '27px',\r\n left: 20,\r\n right: 20,\r\n fontSize: '14px',\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n },\r\n contentEditor: {\r\n zIndex: 0,\r\n flex: 'auto',\r\n outline: 'none',\r\n overflow: 'auto',\r\n marginTop: '0px',\r\n paddingLeft: '20px',\r\n paddingRight: '20px',\r\n position: 'relative',\r\n background: 'var(--colorNeutralBackground1, #ffffff)',\r\n justifyContent: 'center',\r\n height: props.contentHeight ?? '100%',\r\n ...(isReadOnly && {\r\n cursor: 'not-allowed',\r\n opacity: 0.75,\r\n userSelect: 'text',\r\n }),\r\n },\r\n });\r\n\r\n const urlRegExp = new RegExp(\r\n /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[+~%/.\\w-_]*)?\\??(?:[-+=&;%@.\\w_]*)#?(?:[\\w]*))?)/,\r\n );\r\n const validateUrl = (url: string) => url === 'https://' || urlRegExp.test(url);\r\n\r\n const handleReadOnlyClickCapture = (e: React.SyntheticEvent) => {\r\n if (!isReadOnly) return;\r\n const target = e.target as HTMLElement | null;\r\n const anchor = target?.closest?.('a');\r\n if (anchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const isOverLimit = props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n useEffect(() => {\r\n if (props.wordLimit === undefined || !props.onWordLimitExceeded) return;\r\n\r\n const wasOverLimit = previousOverLimitRef.current;\r\n\r\n if (isOverLimit !== wasOverLimit) {\r\n props.onWordLimitExceeded({\r\n wordCount,\r\n wordLimit: props.wordLimit,\r\n exceeded: isOverLimit,\r\n });\r\n\r\n previousOverLimitRef.current = isOverLimit;\r\n }\r\n }, [isOverLimit, wordCount, props.wordLimit, props.onWordLimitExceeded]);\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme} style={{ height: '100%' }}>\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <div ref={containerRef} style={{ height: '100%' }}>\r\n <Stack\r\n style={{\r\n zIndex: 1000,\r\n background: '#fff',\r\n borderRadius: '2px',\r\n width: props.width ?? '100%',\r\n height: props.height ?? '100%',\r\n margin: props.margin ?? '5px auto',\r\n border: `1px solid ${isOverLimit ? '#c4272c' : 'var(--colorNeutralStroke1, #ccced1)'\r\n }`,\r\n transition: 'border-color 0.2s',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n }}>\r\n <div\r\n style={{\r\n pointerEvents: isReadOnly ? 'none' : 'auto',\r\n position: 'sticky',\r\n opacity: isReadOnly ? 0.85 : 1,\r\n }}>\r\n <ToolBarPlugins\r\n level={props.level ?? ContentEditorLevel.Basic}\r\n readOnly={props.readOnly}\r\n />\r\n </div>\r\n\r\n <div\r\n style={{\r\n position: 'relative',\r\n flexGrow: 1,\r\n padding: '15px 0px',\r\n overflowY: 'scroll',\r\n }}\r\n onClickCapture={handleReadOnlyClickCapture}>\r\n <RichTextPlugin\r\n ErrorBoundary={LexicalErrorBoundary}\r\n contentEditable={\r\n <div\r\n className='editor'\r\n style={{ height: '100%', position: 'relative' }}\r\n ref={onAnchorRef}>\r\n <ContentEditable\r\n ref={contentEditableDomRef}\r\n className={css(EditorStyles.contentEditor)}\r\n style={{ paddingTop: props.level !== ContentEditorLevel.None ? 0 : 10 }}\r\n // Disable browser's built-in spellcheck red squiggles when\r\n // our own SpellCheckPlugin is active — avoids double underlines.\r\n spellCheck={!resolvedSpellCheck}\r\n autoCorrect={resolvedSpellCheck ? 'off' : undefined}\r\n autoCapitalize={resolvedSpellCheck ? 'off' : undefined}\r\n />\r\n </div>\r\n }\r\n placeholder={\r\n <Stack className={css(EditorStyles.editorPlaceholder)}>{props.placeholder}</Stack>\r\n }\r\n />\r\n\r\n {/* ── Word count: sticky to the bottom-right of the scroll area ── */}\r\n {props.wordLimit !== undefined && (\r\n <div\r\n style={{\r\n position: 'sticky',\r\n bottom: 0,\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n paddingRight: 14,\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n }}>\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: isOverLimit ? '#c4272c' : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: isOverLimit ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {wordCount} / {props.wordLimit} words\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={props.onBlur}\r\n setFocused={setFocused}\r\n containerRef={containerRef}\r\n />\r\n\r\n {props.autoFocus && !isReadOnly && <AutoFocusPlugin />}\r\n\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin validateUrl={validateUrl} />\r\n <AutoLinkPlugin matchers={MATCHERS} />\r\n <TablePlugin hasCellMerge hasCellBackgroundColor />\r\n\r\n {!isReadOnly && <YoutubeDeletePlugin />}\r\n\r\n {!isReadOnly && floatingAnchorElem && <TableActionMenuPlugin />}\r\n {!isReadOnly && floatingAnchorElem && (\r\n <TableCellResizerPlugin anchorElem={floatingAnchorElem} />\r\n )}\r\n\r\n {!isReadOnly && (\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n\r\n {!isReadOnly && <ImagesPlugin />}\r\n {!isReadOnly && <InlineImagePlugin />}\r\n {!isReadOnly && <PageBreakPlugin />}\r\n\r\n {/* ── Autocomplete (optimised) ────────────────────────────── */}\r\n {!!resolvedQuery && !isReadOnly && (\r\n <AutocompletePlugin\r\n useQuery={resolvedQuery}\r\n isReadOnly={isReadOnly}\r\n onSuggestionShown={props.onSuggestionShown}\r\n onSuggestionAccept={props.onSuggestionAccept}\r\n idleMs={props.suggestIdleMs ?? 300}\r\n minWords={4}\r\n prefixWindow={300}\r\n />\r\n )}\r\n\r\n {/* ── Spell / grammar check (NEW) ─────────────────────────── */}\r\n {!!resolvedSpellCheck && !isReadOnly && (\r\n <SpellCheckPlugin\r\n useSpellCheck={resolvedSpellCheck}\r\n onSpellCheckAccept={props.onSpellCheckAccept}\r\n idleMs={props.spellCheckIdleMs ?? 1200}\r\n enabled={props.spellCheckEnabled !== false}\r\n />\r\n )}\r\n\r\n {!isReadOnly && props.showFloatingToolbar && <CharacterStylesPopupPlugin />}\r\n <CustomOnChangePlugin\r\n value={props.value}\r\n onChange={props.onChange}\r\n />\r\n\r\n {props.wordLimit !== undefined && <WordCountPlugin onCountChange={handleWordCount} />}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n />\r\n </Stack>\r\n </div>\r\n </LexicalComposer>\r\n </FluentProvider>\r\n );\r\n },\r\n);\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isNodeSelection,\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 KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedLexicalNode\r\n} from 'lexical';\r\nimport { useCallback, useEffect } from 'react';\r\nimport './PageBreak.css';\r\n\r\nexport type SerializedPageBreakNode = SerializedLexicalNode;\r\n\r\nconst PageBreakComponent = ({nodeKey}: {nodeKey: NodeKey}) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n\r\n const $onDelete = useCallback(\r\n (event: KeyboardEvent) => {\r\n event.preventDefault();\r\n const deleteSelection = $getSelection();\r\n if (isSelected && $isNodeSelection(deleteSelection)) {\r\n deleteSelection.getNodes().forEach((node) => {\r\n if ($isPageBreakNode(node)) {\r\n node.remove();\r\n }\r\n });\r\n }\r\n return false;\r\n },\r\n [isSelected],\r\n );\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 editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n $onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, $onDelete, 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\nconst $convertPageBreakElement = (): DOMConversionOutput => {\r\n return {node: $createPageBreakNode()};\r\n}\r\n\r\nexport const $createPageBreakNode = (): PageBreakNode => {\r\n return new PageBreakNode();\r\n}\r\n\r\nexport const $isPageBreakNode = ( node: LexicalNode | null | undefined ): node is PageBreakNode => {\r\n return node instanceof PageBreakNode;\r\n}\r\n","import type {\r\n DOMConversionMap,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedTextNode,\r\n Spread,\r\n} from 'lexical';\r\nimport { TextNode } from 'lexical';\r\n\r\nexport type SpellIssueType = 'spelling' | 'grammar' | 'style';\r\n\r\nexport type SpellErrorMeta = {\r\n message: string;\r\n suggestions: string[];\r\n type: SpellIssueType;\r\n /** Original character offset in the plain-text snapshot (used for reward API) */\r\n offset: number;\r\n /**\r\n * When set, this node represents the full sentence that has an AI-suggested\r\n * improvement. The popover will show an \"Improve sentence\" option that\r\n * replaces the sentence with this text.\r\n */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SerializedSpellErrorNode = Spread<{ meta: SpellErrorMeta }, SerializedTextNode>;\r\n\r\n// Inject CSS — always replace so hot-reload picks up changes\r\nconst STYLE_ID = '__spell_error_node_css__';\r\nfunction ensureCSS() {\r\n if (typeof document === 'undefined') return;\r\n // Remove existing tag first so stale cached styles never win\r\n document.getElementById(STYLE_ID)?.remove();\r\n const s = document.createElement('style');\r\n s.id = STYLE_ID;\r\n s.textContent = `\r\n /* SpellErrorNode underlines — thin, Grammarly-style */\r\n .sc-err-spelling,\r\n .sc-err-grammar,\r\n .sc-err-style {\r\n cursor: pointer;\r\n text-underline-offset: 3px;\r\n text-decoration-skip-ink: none;\r\n }\r\n\r\n /* Spelling — red dotted (classic spell-check look) */\r\n .sc-err-spelling {\r\n text-decoration: underline #e53e3e;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n\r\n /* Grammar — blue dotted */\r\n .sc-err-grammar {\r\n text-decoration: underline dotted #3182ce;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n\r\n /* Style — yellow/amber dotted */\r\n .sc-err-style {\r\n text-decoration: underline dotted #d97706;\r\n text-decoration-thickness: 1.5px;\r\n }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\nfunction classForType(type: SpellIssueType): string {\r\n if (type === 'grammar') return 'sc-err-grammar';\r\n if (type === 'style') return 'sc-err-style';\r\n return 'sc-err-spelling';\r\n}\r\n\r\nexport class SpellErrorNode extends TextNode {\r\n __meta: SpellErrorMeta;\r\n\r\n static getType(): string {\r\n return 'spell-error';\r\n }\r\n\r\n static clone(node: SpellErrorNode): SpellErrorNode {\r\n return new SpellErrorNode(node.__text, node.__meta, node.__key);\r\n }\r\n\r\n static importJSON(s: SerializedSpellErrorNode): SpellErrorNode {\r\n return new SpellErrorNode(s.text, s.meta);\r\n }\r\n\r\n constructor(text: string, meta: SpellErrorMeta, key?: NodeKey) {\r\n super(text, key);\r\n this.__meta = meta;\r\n // NOTE: Do NOT call ensureCSS() here.\r\n // This constructor is called inside editor.update() callbacks, and any\r\n // DOM mutation (appendChild, remove) inside a Lexical update throws an\r\n // error that gets silently swallowed by the editor's onError handler.\r\n // CSS is injected once by SpellCheckPlugin's useEffect instead.\r\n }\r\n\r\n exportJSON(): SerializedSpellErrorNode {\r\n return { ...super.exportJSON(), type: 'spell-error', meta: this.__meta };\r\n }\r\n\r\n createDOM(config: EditorConfig): HTMLElement {\r\n const dom = super.createDOM(config) as HTMLElement;\r\n dom.className = (dom.className + ' ' + classForType(this.__meta.type)).trim();\r\n dom.dataset.spellOffset = String(this.__meta.offset);\r\n return dom;\r\n }\r\n\r\n updateDOM(prev: SpellErrorNode, dom: HTMLElement, config: EditorConfig): boolean {\r\n const base = super.updateDOM(prev as any, dom, config);\r\n // Reapply class if meta changed\r\n if (prev.__meta.type !== this.__meta.type) {\r\n dom.classList.remove('sc-err-spelling', 'sc-err-grammar', 'sc-err-style');\r\n dom.classList.add(classForType(this.__meta.type));\r\n }\r\n return base;\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n // When copying/exporting, emit a plain span with no decoration\r\n const span = document.createElement('span');\r\n span.textContent = this.__text;\r\n return { element: span };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return null;\r\n }\r\n\r\n getMeta(): SpellErrorMeta {\r\n return this.getLatest().__meta;\r\n }\r\n\r\n setMeta(meta: SpellErrorMeta): SpellErrorNode {\r\n const writable = this.getWritable() as SpellErrorNode;\r\n writable.__meta = meta;\r\n return writable;\r\n }\r\n\r\n // Prevent the spell-error node from being copied as a SpellErrorNode\r\n excludeFromCopy() {\r\n return false;\r\n }\r\n}\r\n\r\nexport function $createSpellErrorNode(text: string, meta: SpellErrorMeta): SpellErrorNode {\r\n return new SpellErrorNode(text, meta);\r\n}\r\n\r\nexport function $isSpellErrorNode(node: LexicalNode | null | undefined): node is SpellErrorNode {\r\n return node instanceof SpellErrorNode;\r\n}\r\n","import 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\n\r\nimport { BlockWithAlignableContents } from '@lexical/react/LexicalBlockWithAlignableContents';\r\nimport {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport { $getNodeByKey } from 'lexical';\r\nimport * as React from 'react';\r\n\r\nconst DEFAULT_WIDTH = 560;\r\nconst DEFAULT_HEIGHT = 315;\r\nconst MIN_WIDTH = 200;\r\nconst MIN_HEIGHT = 113;\r\n\r\n// ─── Resize handles ───────────────────────────────────────────────────────────\r\n\r\nconst handleBase: React.CSSProperties = {\r\n position: 'absolute',\r\n width: 10,\r\n height: 10,\r\n background: '#0078d4',\r\n border: '2px solid #fff',\r\n borderRadius: 2,\r\n zIndex: 10,\r\n boxShadow: '0 0 2px rgba(0,0,0,0.4)',\r\n};\r\n\r\ntype ResizeDir = 'se' | 'e' | 's';\r\n\r\ninterface ResizeState {\r\n startX: number;\r\n startY: number;\r\n startW: number;\r\n startH: number;\r\n ratio: number;\r\n dir: ResizeDir;\r\n}\r\n\r\nfunction VideoResizer({\r\n containerRef,\r\n onResizeStart,\r\n onResizeEnd,\r\n}: {\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n onResizeStart: () => void;\r\n onResizeEnd: (w: number, h: number) => void;\r\n}) {\r\n const resizeState = React.useRef<ResizeState | null>(null);\r\n\r\n const startResize = (e: React.PointerEvent<HTMLDivElement>, dir: ResizeDir) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const { width, height } = container.getBoundingClientRect();\r\n resizeState.current = {\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n startW: width,\r\n startH: height,\r\n ratio: width / height,\r\n dir,\r\n };\r\n onResizeStart();\r\n\r\n const onMove = (ev: PointerEvent) => {\r\n const rs = resizeState.current;\r\n if (!rs || !container) return;\r\n\r\n const dx = ev.clientX - rs.startX;\r\n const dy = ev.clientY - rs.startY;\r\n let newW = rs.startW;\r\n let newH = rs.startH;\r\n\r\n if (dir === 'se') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n newH = newW / rs.ratio;\r\n } else if (dir === 'e') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n } else if (dir === 's') {\r\n newH = Math.max(MIN_HEIGHT, rs.startH + dy);\r\n }\r\n\r\n container.style.width = `${newW}px`;\r\n container.style.height = `${newH}px`;\r\n };\r\n\r\n const onUp = () => {\r\n if (!container) return;\r\n const { width, height } = container.getBoundingClientRect();\r\n resizeState.current = null;\r\n onResizeEnd(width, height);\r\n document.removeEventListener('pointermove', onMove);\r\n document.removeEventListener('pointerup', onUp);\r\n };\r\n\r\n document.addEventListener('pointermove', onMove);\r\n document.addEventListener('pointerup', onUp);\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n style={{\r\n ...handleBase,\r\n top: '50%',\r\n right: -5,\r\n transform: 'translateY(-50%)',\r\n cursor: 'ew-resize',\r\n }}\r\n onPointerDown={(e) => startResize(e, 'e')}\r\n title='Resize width'\r\n />\r\n <div\r\n style={{\r\n ...handleBase,\r\n bottom: -5,\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n cursor: 'ns-resize',\r\n }}\r\n onPointerDown={(e) => startResize(e, 's')}\r\n title='Resize height'\r\n />\r\n <div\r\n style={{ ...handleBase, bottom: -5, right: -5, cursor: 'se-resize' }}\r\n onPointerDown={(e) => startResize(e, 'se')}\r\n title='Resize (proportional)'\r\n />\r\n </>\r\n );\r\n}\r\n\r\n// ─── YouTube component ────────────────────────────────────────────────────────\r\n\r\ntype YouTubeComponentProps = Readonly<{\r\n className: Readonly<{ base: string; focus: string }>;\r\n format: ElementFormatType | null;\r\n nodeKey: NodeKey;\r\n videoID: string;\r\n width: number;\r\n height: number;\r\n editor: LexicalEditor;\r\n}>;\r\n\r\nfunction YouTubeComponent({\r\n className,\r\n format,\r\n nodeKey,\r\n videoID,\r\n width,\r\n height,\r\n editor,\r\n}: YouTubeComponentProps) {\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n const [isResizing, setIsResizing] = React.useState(false);\r\n\r\n const handleDelete = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n node?.remove();\r\n });\r\n };\r\n\r\n const handleResizeEnd = (w: number, h: number) => {\r\n setIsResizing(false);\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) {\r\n node.setSize(Math.round(w), Math.round(h));\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <BlockWithAlignableContents className={className} format={format} nodeKey={nodeKey}>\r\n <div\r\n ref={containerRef}\r\n style={{ position: 'relative', display: 'inline-block', width, height, lineHeight: 0 }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => {\r\n if (!isResizing) setIsHovered(false);\r\n }}>\r\n <iframe\r\n width='100%'\r\n height='100%'\r\n src={`https://www.youtube.com/embed/${videoID}`}\r\n allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\r\n allowFullScreen={true}\r\n title='YouTube video'\r\n style={{ display: 'block', border: 'none', pointerEvents: isResizing ? 'none' : 'auto' }}\r\n />\r\n\r\n {isHovered && (\r\n <>\r\n <button\r\n type='button'\r\n onClick={handleDelete}\r\n title='Remove video'\r\n style={{\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n width: 28,\r\n height: 28,\r\n borderRadius: '50%',\r\n background: 'rgba(0,0,0,0.65)',\r\n color: '#fff',\r\n border: 'none',\r\n cursor: 'pointer',\r\n fontSize: 18,\r\n lineHeight: 1,\r\n padding: 0,\r\n zIndex: 10,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}>\r\n ×\r\n </button>\r\n\r\n <VideoResizer\r\n containerRef={containerRef}\r\n onResizeStart={() => setIsResizing(true)}\r\n onResizeEnd={handleResizeEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </BlockWithAlignableContents>\r\n );\r\n}\r\n\r\n// ─── Serialized type ──────────────────────────────────────────────────────────\r\n\r\nexport type SerializedYouTubeNode = Spread<\r\n {\r\n videoID: string;\r\n width: number;\r\n height: number;\r\n type: 'youtube';\r\n version: 1;\r\n },\r\n SerializedDecoratorBlockNode\r\n>;\r\n\r\n// ─── DOM helpers ──────────────────────────────────────────────────────────────\r\n\r\nfunction extractYouTubeIdFromSrc(src: string): string | null {\r\n const m = src.match(/youtube\\.com\\/embed\\/([^?&/]+)/i);\r\n return m?.[1] ?? null;\r\n}\r\n\r\nfunction convertYouTubeIframe(domNode: Node): DOMConversionOutput | null {\r\n if (!(domNode instanceof HTMLIFrameElement)) return null;\r\n const src = domNode.getAttribute('src') || '';\r\n const id = extractYouTubeIdFromSrc(src);\r\n if (!id) return null;\r\n const w = parseInt(domNode.getAttribute('width') || '560', 10) || DEFAULT_WIDTH;\r\n const h = parseInt(domNode.getAttribute('height') || '315', 10) || DEFAULT_HEIGHT;\r\n return { node: $createYouTubeNode(id, w, h) };\r\n}\r\n\r\n// ─── Node class ───────────────────────────────────────────────────────────────\r\n\r\nexport class YouTubeNode extends DecoratorBlockNode {\r\n __id: string;\r\n __width: number;\r\n __height: number;\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.__width, node.__height, node.__format, node.__key);\r\n }\r\n\r\n static importJSON(serializedNode: SerializedYouTubeNode): YouTubeNode {\r\n const node = $createYouTubeNode(\r\n serializedNode.videoID,\r\n serializedNode.width ?? DEFAULT_WIDTH,\r\n serializedNode.height ?? DEFAULT_HEIGHT,\r\n );\r\n node.setFormat(serializedNode.format);\r\n return node;\r\n }\r\n\r\n exportJSON(): SerializedYouTubeNode {\r\n return {\r\n ...super.exportJSON(),\r\n type: 'youtube',\r\n version: 1,\r\n videoID: this.__id,\r\n width: this.__width,\r\n height: this.__height,\r\n };\r\n }\r\n\r\n static importDOM(): DOMConversionMap | null {\r\n return {\r\n iframe: () => ({\r\n conversion: convertYouTubeIframe,\r\n priority: 2,\r\n }),\r\n };\r\n }\r\n\r\n exportDOM(): DOMExportOutput {\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('width', String(this.__width));\r\n iframe.setAttribute('height', String(this.__height));\r\n iframe.style.border = 'none';\r\n iframe.setAttribute(\r\n 'allow',\r\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',\r\n );\r\n iframe.setAttribute('allowfullscreen', 'true');\r\n iframe.setAttribute('title', 'YouTube video');\r\n iframe.setAttribute('src', `https://www.youtube.com/embed/${this.__id}`);\r\n iframe.setAttribute('data-lexical-youtube', this.__id);\r\n return { element: iframe };\r\n }\r\n\r\n constructor(\r\n id: string,\r\n width: number = DEFAULT_WIDTH,\r\n height: number = DEFAULT_HEIGHT,\r\n format?: ElementFormatType,\r\n key?: NodeKey,\r\n ) {\r\n super(format, key);\r\n this.__id = id;\r\n this.__width = width;\r\n this.__height = height;\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 setSize(width: number, height: number): void {\r\n const writable = this.getWritable();\r\n writable.__width = width;\r\n writable.__height = height;\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 width={this.__width}\r\n height={this.__height}\r\n editor={_editor}\r\n />\r\n );\r\n }\r\n\r\n isTopLevel(): true {\r\n return true;\r\n }\r\n}\r\n\r\n// ─── Factories / guards ───────────────────────────────────────────────────────\r\n\r\nexport function $createYouTubeNode(\r\n videoID: string,\r\n width = DEFAULT_WIDTH,\r\n height = DEFAULT_HEIGHT,\r\n): YouTubeNode {\r\n return new YouTubeNode(videoID, width, height);\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","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_DOWN_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\n\r\nimport type { AcceptMethod, SearchPromise } from '../ContentEditorComponent.types';\r\nimport { $createAutocompleteNode, AutocompleteNode } from '../Nodes/AutoCompleteNode';\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nconst normalize = (s?: string) => (s ?? '').replace(/\\s+/g, ' ').trim();\r\n\r\nfunction readContextWindow(maxChars = 300, cursorIndex?: number): string {\r\n const full = normalize($getRoot().getTextContent());\r\n const upTo = cursorIndex != null ? full.slice(0, cursorIndex) : full;\r\n return upTo.slice(Math.max(0, upTo.length - maxChars));\r\n}\r\n\r\nfunction readCursorIndex(): number {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return -1;\r\n\r\n const anchorNode = sel.anchor.getNode();\r\n const anchorOffset = sel.anchor.offset;\r\n if (anchorNode instanceof AutocompleteNode) return -1;\r\n\r\n const root = $getRoot();\r\n let index = 0;\r\n let found = false;\r\n\r\n const visitLeaves = (node: any): void => {\r\n if (found) return;\r\n if (node === anchorNode) {\r\n index += anchorOffset;\r\n found = true;\r\n return;\r\n }\r\n if (typeof node.getChildren !== 'function') {\r\n if (!(node instanceof AutocompleteNode)) index += node.getTextContent().length;\r\n return;\r\n }\r\n for (const child of node.getChildren()) {\r\n if (found) return;\r\n visitLeaves(child);\r\n }\r\n };\r\n\r\n const blocks = root.getChildren();\r\n for (let i = 0; i < blocks.length; i++) {\r\n if (found) break;\r\n if (i > 0) index += 1;\r\n visitLeaves(blocks[i]);\r\n }\r\n return found ? index : -1;\r\n}\r\n\r\n/** Text before caret in the current node — used for prefix-stripping */\r\nfunction readPrefixBeforeCaret(maxChars = 300): string {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return '';\r\n const node = sel.anchor.getNode();\r\n if (node instanceof AutocompleteNode) return '';\r\n const text = node.getTextContent();\r\n const upto = text.slice(0, sel.anchor.offset);\r\n return normalize(upto.slice(Math.max(0, upto.length - maxChars)));\r\n}\r\n\r\n/**\r\n * Pick the best suggestion from the list.\r\n * If the top suggestion starts with the current prefix, strip it to avoid duplication.\r\n */\r\nfunction selectBestSuggestion(list: string[] | null, prefix: string): string | null {\r\n if (!list?.length) return null;\r\n const sorted = list\r\n .map(normalize)\r\n .filter(Boolean)\r\n .sort((a, b) => b.length - a.length);\r\n if (!sorted.length) return null;\r\n const s0 = sorted[0];\r\n const p = prefix.toLowerCase();\r\n if (s0.toLowerCase().startsWith(p)) {\r\n const rest = normalize(s0.slice(p.length));\r\n return rest || null;\r\n }\r\n return s0;\r\n}\r\n\r\n// ─── Types ────────────────────────────────────────────────────────────────────\r\n\r\n/** Exported so ContentEditorComponent can disable browser spellcheck when active */\r\nexport const DISABLE_BROWSER_SPELLCHECK = true;\r\n\r\ntype InflightRequest = {\r\n id: number;\r\n sentContext: string;\r\n sentCursorIndex: number;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function AutocompletePlugin({\r\n useQuery,\r\n onSuggestionShown,\r\n onSuggestionAccept,\r\n isReadOnly = false,\r\n minWords = 4,\r\n idleMs = 800,\r\n prefixWindow = 300,\r\n}: {\r\n /**\r\n * Called with `(contextText, cursorIndex)`. Return `{ promise, dismiss }` where\r\n * `promise` resolves to `string[] | null`.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n isReadOnly?: boolean;\r\n\r\n minWords?: number;\r\n idleMs?: number;\r\n prefixWindow?: number;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const ghostKeyRef = React.useRef<string | null>(null);\r\n const idleTimerRef = React.useRef<number | null>(null);\r\n const inflightRef = React.useRef<InflightRequest | null>(null);\r\n const reqCounterRef = React.useRef(0);\r\n const lastTriggerRef = React.useRef<string>('');\r\n const lastShownCtxRef = React.useRef<string>('');\r\n\r\n // ── Ghost helpers ─────────────────────────────────────────────────────────\r\n\r\n const clearGhost = React.useCallback(() => {\r\n editor.update(\r\n () => {\r\n const key = ghostKeyRef.current;\r\n if (!key) return;\r\n const node = $getNodeByKey(key);\r\n if (node instanceof AutocompleteNode) node.remove();\r\n ghostKeyRef.current = null;\r\n },\r\n { tag: 'autocomplete-ghost' },\r\n );\r\n }, [editor]);\r\n\r\n /**\r\n * Insert (or update) ghost text at the given absolute char offset.\r\n * Walks the live tree at call time — immune to spell-check node splits.\r\n */\r\n const upsertGhost = React.useCallback(\r\n (text: string, insertAtCharOffset: number) => {\r\n editor.update(\r\n () => {\r\n // Update existing ghost if still present\r\n if (ghostKeyRef.current) {\r\n const existing = $getNodeByKey(ghostKeyRef.current);\r\n if (existing instanceof AutocompleteNode) {\r\n if (existing.getTextContent() !== text) existing.setTextContent(text);\r\n return;\r\n }\r\n ghostKeyRef.current = null;\r\n }\r\n\r\n // Find the node containing insertAtCharOffset\r\n const root = $getRoot();\r\n let pos = 0;\r\n let targetNode: any = null;\r\n let localOffset = 0;\r\n\r\n const findNode = (node: any): boolean => {\r\n if (node instanceof AutocompleteNode) return false;\r\n if (typeof node.getChildren !== 'function') {\r\n const len = node.getTextContent().length;\r\n if (insertAtCharOffset <= pos + len) {\r\n targetNode = node;\r\n localOffset = insertAtCharOffset - pos;\r\n return true;\r\n }\r\n pos += len;\r\n return false;\r\n }\r\n for (const child of node.getChildren()) {\r\n if (findNode(child)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n const blocks = root.getChildren();\r\n let found = false;\r\n for (let i = 0; i < blocks.length && !found; i++) {\r\n if (i > 0) pos += 1;\r\n found = findNode(blocks[i]);\r\n }\r\n\r\n if (!targetNode) return;\r\n\r\n const nodeText = targetNode.getTextContent();\r\n const before = nodeText.slice(0, localOffset);\r\n const after = nodeText.slice(localOffset);\r\n\r\n const charBefore = before ? before[before.length - 1] : '';\r\n const needsSpace = charBefore && charBefore !== ' ' && !text.startsWith(' ');\r\n const ghostText = needsSpace ? ' ' + text : text;\r\n const ghost = $createAutocompleteNode(\r\n ghostText,\r\n crypto?.randomUUID?.() ?? String(Date.now()),\r\n );\r\n ghostKeyRef.current = ghost.getKey();\r\n\r\n if (before) {\r\n targetNode.setTextContent(before);\r\n targetNode.insertAfter(ghost);\r\n ghost.insertAfter($createTextNode(after.length ? after : ''));\r\n } else {\r\n targetNode.insertBefore(ghost);\r\n }\r\n },\r\n { tag: 'autocomplete-ghost' },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Cancel inflight ───────────────────────────────────────────────────────\r\n\r\n const cancelInflight = React.useCallback(() => {\r\n if (!inflightRef.current) return;\r\n inflightRef.current.dismiss();\r\n inflightRef.current = null;\r\n }, []);\r\n\r\n // ── Idle timer reset ──────────────────────────────────────────────────────\r\n\r\n const resetIdleTimer = React.useCallback(\r\n (callback: () => void) => {\r\n if (idleTimerRef.current) {\r\n clearTimeout(idleTimerRef.current);\r\n idleTimerRef.current = null;\r\n }\r\n cancelInflight();\r\n clearGhost();\r\n idleTimerRef.current = window.setTimeout(() => {\r\n idleTimerRef.current = null;\r\n callback();\r\n }, idleMs);\r\n },\r\n [idleMs, cancelInflight, clearGhost],\r\n );\r\n\r\n // ── Fire API ──────────────────────────────────────────────────────────────\r\n\r\n const fireQuery = React.useCallback(() => {\r\n if (!useQuery || isReadOnly) return;\r\n\r\n let context = '';\r\n let prefix = '';\r\n let cursorIndex = -1;\r\n let wordCount = 0;\r\n\r\n editor.getEditorState().read(() => {\r\n cursorIndex = readCursorIndex();\r\n context = readContextWindow(prefixWindow, cursorIndex >= 0 ? cursorIndex : undefined);\r\n prefix = readPrefixBeforeCaret(prefixWindow);\r\n wordCount = context.trim().split(/\\s+/).filter(Boolean).length;\r\n });\r\n if (wordCount < minWords) return;\r\n if (cursorIndex === -1) return;\r\n if (context === lastShownCtxRef.current) return;\r\n\r\n cancelInflight();\r\n\r\n const myId = ++reqCounterRef.current;\r\n const sentContext = context;\r\n const sentPrefix = prefix;\r\n const sentCursorIndex = cursorIndex;\r\n\r\n const { promise, dismiss } = useQuery(sentContext, cursorIndex);\r\n inflightRef.current = { id: myId, sentContext, sentCursorIndex, dismiss };\r\n\r\n promise.then(\r\n (list) => {\r\n if (myId !== reqCounterRef.current) return; // superseded\r\n\r\n let currentContext = '';\r\n let currentCursorIndex = -1;\r\n let currentPrefix = '';\r\n\r\n editor.getEditorState().read(() => {\r\n currentCursorIndex = readCursorIndex();\r\n currentContext = readContextWindow(\r\n prefixWindow,\r\n currentCursorIndex >= 0 ? currentCursorIndex : undefined,\r\n );\r\n currentPrefix = readPrefixBeforeCaret(prefixWindow);\r\n });\r\n\r\n // Discard if text changed while in-flight\r\n if (normalize(currentContext) !== normalize(sentContext)) {\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n const CURSOR_TOLERANCE = 2;\r\n if (\r\n currentCursorIndex !== -1 &&\r\n Math.abs(currentCursorIndex - sentCursorIndex) > CURSOR_TOLERANCE\r\n ) {\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n const suggestion = selectBestSuggestion(list, currentPrefix || sentPrefix);\r\n if (!suggestion) {\r\n clearGhost();\r\n inflightRef.current = null;\r\n return;\r\n }\r\n\r\n inflightRef.current = null;\r\n lastTriggerRef.current = sentContext;\r\n lastShownCtxRef.current = sentContext;\r\n\r\n upsertGhost(suggestion, sentCursorIndex);\r\n onSuggestionShown?.({ suggestionText: suggestion, triggerText: sentContext });\r\n },\r\n () => {\r\n inflightRef.current = null;\r\n },\r\n );\r\n }, [\r\n editor,\r\n useQuery,\r\n isReadOnly,\r\n minWords,\r\n prefixWindow,\r\n cancelInflight,\r\n clearGhost,\r\n upsertGhost,\r\n onSuggestionShown,\r\n ]);\r\n\r\n // ── Update listener (typing) ──────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!useQuery || isReadOnly) return;\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (tags.has('history-merge') || tags.has('collaboration')) return;\r\n if (tags.has('autocomplete-ghost') || tags.has('spell-apply') || tags.has('spell-clear'))\r\n return;\r\n resetIdleTimer(fireQuery);\r\n });\r\n }, [editor, useQuery, isReadOnly, resetIdleTimer, fireQuery]);\r\n\r\n // ── Selection change listener (cursor moves, no typing) ───────────────────\r\n\r\n React.useEffect(() => {\r\n if (!useQuery || isReadOnly) return;\r\n return editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n // Don't clear ghost if cursor is inside or immediately after it\r\n let insideGhost = false;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const node = sel.anchor.getNode();\r\n if (node instanceof AutocompleteNode) {\r\n insideGhost = true;\r\n return;\r\n }\r\n const prev = (node as any).getPreviousSibling?.();\r\n if (prev instanceof AutocompleteNode) insideGhost = true;\r\n });\r\n if (insideGhost) return false;\r\n\r\n if (inflightRef.current || idleTimerRef.current) resetIdleTimer(fireQuery);\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n );\r\n }, [editor, useQuery, isReadOnly, resetIdleTimer, fireQuery]);\r\n\r\n // ── Keyboard: Tab = accept, Escape = dismiss ──────────────────────────────\r\n\r\n React.useEffect(() => {\r\n return editor.registerCommand<KeyboardEvent>(\r\n KEY_DOWN_COMMAND,\r\n (e) => {\r\n if (!ghostKeyRef.current) return false;\r\n\r\n if (e.key === 'Tab' || e.key === 'ArrowRight') {\r\n e.preventDefault();\r\n editor.update(() => {\r\n const node = $getNodeByKey(ghostKeyRef.current!);\r\n if (!(node instanceof AutocompleteNode)) return;\r\n const text = node.getTextContent();\r\n const replaced = $createTextNode(text);\r\n node.replace(replaced);\r\n // Move cursor to end of the accepted text\r\n replaced.select(text.length, text.length);\r\n ghostKeyRef.current = null;\r\n lastShownCtxRef.current = '';\r\n onSuggestionAccept?.({\r\n suggestionText: text.trimStart() || text,\r\n triggerText: lastTriggerRef.current,\r\n method: 'tab',\r\n });\r\n });\r\n return true;\r\n }\r\n\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n clearGhost();\r\n editor.getEditorState().read(() => {\r\n lastShownCtxRef.current = readContextWindow(prefixWindow);\r\n });\r\n return true;\r\n }\r\n\r\n // Printable key or delete — clear ghost, pass through\r\n if (e.key.length === 1 || e.key === 'Backspace' || e.key === 'Delete') {\r\n clearGhost();\r\n return false;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n );\r\n }, [editor, clearGhost, onSuggestionAccept, prefixWindow]);\r\n\r\n // ── Unmount cleanup ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n cancelInflight();\r\n if (idleTimerRef.current) clearTimeout(idleTimerRef.current);\r\n };\r\n }, [cancelInflight]);\r\n\r\n return null;\r\n}\r\n","// CharacterStylesPopupPlugin.tsx (RTP FIX: popup behind Fluent UI Panel)\r\n// Paste as-is. This version portals into the closest Panel/Layer and uses position: fixed.\r\n\r\nimport { useTheme } from '@fluentui/react';\r\nimport { Button } from '@fluentui/react-components';\r\nimport {\r\n CodeFilled,\r\n LinkFilled,\r\n TextBold24Regular,\r\n TextItalicFilled,\r\n TextStrikethroughFilled,\r\n TextSubscriptFilled,\r\n TextSuperscriptFilled,\r\n TextUnderlineFilled,\r\n} from '@fluentui/react-icons';\r\nimport { $isCodeHighlightNode } from '@lexical/code';\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $isAtNodeEnd } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n ElementNode,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n RangeSelection,\r\n SELECTION_CHANGE_COMMAND,\r\n TextNode,\r\n} from 'lexical';\r\nimport { JSX, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\ntype UseCharacterStylesPopupOptions = {\r\n /** Overrides editor.isEditable() */\r\n isEditable?: boolean;\r\n /** show popup but disable actions */\r\n readOnly?: boolean;\r\n};\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, n));\r\n}\r\n\r\n/**\r\n * FIX: Portal container mounted inside the closest Panel/Layer so z-index/stacking works.\r\n * It creates a fixed overlay host that does not block clicks (pointer-events: none).\r\n */\r\nfunction useFloatingPortalContainer(editor: LexicalEditor) {\r\n const [container, setContainer] = useState<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const panelOrLayer =\r\n (root.closest('.ms-Panel-main') as HTMLElement | null) ||\r\n (root.closest('.ms-Panel') as HTMLElement | null) ||\r\n (root.closest('.ms-Layer') as HTMLElement | null) ||\r\n document.body;\r\n\r\n const host = document.createElement('div');\r\n host.className = 'lexical-floating-ui-host';\r\n panelOrLayer.appendChild(host);\r\n setContainer(host);\r\n\r\n return () => {\r\n host.remove();\r\n setContainer(null);\r\n };\r\n }, [editor]);\r\n\r\n return container;\r\n}\r\n\r\nfunction setPopupPositionFixed(popupEl: HTMLElement, rect: DOMRect): void {\r\n const GAP = 8;\r\n const MARGIN = 8;\r\n\r\n // Prefer above selection, right-aligned\r\n let top = rect.top - popupEl.offsetHeight - GAP;\r\n let left = rect.left + rect.width - popupEl.offsetWidth;\r\n\r\n // If off top, show below\r\n if (top < MARGIN) top = rect.bottom + GAP;\r\n\r\n // Clamp to viewport\r\n left = clamp(left, MARGIN, window.innerWidth - popupEl.offsetWidth - MARGIN);\r\n\r\n popupEl.style.top = `${top}px`;\r\n popupEl.style.left = `${left}px`;\r\n}\r\n\r\ntype FloatingProps = {\r\n editor: LexicalEditor;\r\n isBold: boolean;\r\n isItalic: boolean;\r\n isUnderline: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isCode: boolean;\r\n isLink: boolean;\r\n isEditable?: boolean;\r\n readOnly?: boolean;\r\n};\r\n\r\nfunction FloatingCharacterStylesEditor({\r\n editor,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n isCode,\r\n isLink,\r\n isEditable,\r\n readOnly,\r\n}: FloatingProps): JSX.Element {\r\n const popupRef = useRef<HTMLDivElement | null>(null);\r\n const mouseDownRef = useRef(false);\r\n const theme = useTheme();\r\n\r\n const disabled = !(isEditable ?? editor.isEditable()) || !!readOnly;\r\n\r\n const format = useCallback(\r\n (\r\n type:\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'strikethrough'\r\n | 'subscript'\r\n | 'superscript'\r\n | 'code',\r\n ) => {\r\n if (disabled) return;\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, type);\r\n },\r\n [editor, disabled],\r\n );\r\n\r\n const toggleLink = useCallback(() => {\r\n if (disabled) return;\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, isLink ? null : 'https://');\r\n }, [editor, disabled, isLink]);\r\n\r\n const updatePosition = useCallback(() => {\r\n const popupEl = popupRef.current;\r\n if (!popupEl) return;\r\n\r\n const sel = window.getSelection();\r\n const root = editor.getRootElement();\r\n\r\n if (!sel || sel.isCollapsed || !root || !root.contains(sel.anchorNode)) {\r\n popupEl.classList.remove('is-open');\r\n return;\r\n }\r\n\r\n const range = sel.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (!mouseDownRef.current) {\r\n setPopupPositionFixed(popupEl, rect as DOMRect);\r\n }\r\n\r\n popupEl.classList.add('is-open');\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n const onResize = () => editor.getEditorState().read(updatePosition);\r\n const onScroll = () => editor.getEditorState().read(updatePosition);\r\n\r\n const root = editor.getRootElement();\r\n\r\n window.addEventListener('resize', onResize);\r\n window.addEventListener('scroll', onScroll, true);\r\n root?.addEventListener('scroll', onScroll, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n window.removeEventListener('scroll', onScroll, true);\r\n root?.removeEventListener('scroll', onScroll as any);\r\n };\r\n }, [editor, updatePosition]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(updatePosition);\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(updatePosition);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updatePosition();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updatePosition]);\r\n\r\n // Fluent v8 palette\r\n const p = theme.palette;\r\n const fg = p.neutralPrimary;\r\n const fgDisabled = p.neutralTertiary;\r\n const brand = p.themePrimary;\r\n\r\n const bgHover = p.neutralLighter;\r\n const bgPressed = p.neutralLight;\r\n const bgActive = p.neutralLighterAlt ?? p.neutralLighter;\r\n const stroke = p.neutralLight;\r\n\r\n const iconColor = (active?: boolean) => (disabled ? fgDisabled : active ? brand : fg);\r\n\r\n const btnStyle = (active?: boolean): React.CSSProperties => {\r\n const baseBg = active ? bgActive : 'transparent';\r\n return {\r\n border: '1px solid transparent',\r\n borderRadius: 8,\r\n minWidth: 32,\r\n height: 32,\r\n paddingInline: 6,\r\n background: baseBg,\r\n\r\n ['--fui-Button__backgroundColor' as any]: baseBg,\r\n ['--fui-Button__backgroundColorHover' as any]: bgHover,\r\n ['--fui-Button__backgroundColorPressed' as any]: bgPressed,\r\n ['--fui-Button__borderColorHover' as any]: stroke,\r\n ['--fui-Button__borderColorPressed' as any]: stroke,\r\n ['--fui-Button__iconColor' as any]: iconColor(active),\r\n };\r\n };\r\n\r\n return (\r\n <div\r\n ref={popupRef}\r\n className='character-style-popup'\r\n onMouseDown={(e) => {\r\n // RTP: prevents selection collapse when clicking toolbar\r\n e.preventDefault();\r\n mouseDownRef.current = true;\r\n }}\r\n onMouseUp={() => (mouseDownRef.current = false)}>\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Bold'\r\n aria-label='Bold'\r\n aria-pressed={isBold}\r\n icon={<TextBold24Regular style={{ color: iconColor(isBold) }} />}\r\n style={btnStyle(isBold)}\r\n onClick={() => format('bold')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Italic'\r\n aria-label='Italic'\r\n aria-pressed={isItalic}\r\n icon={<TextItalicFilled style={{ color: iconColor(isItalic) }} />}\r\n style={btnStyle(isItalic)}\r\n onClick={() => format('italic')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Underline'\r\n aria-label='Underline'\r\n aria-pressed={isUnderline}\r\n icon={<TextUnderlineFilled style={{ color: iconColor(isUnderline) }} />}\r\n style={btnStyle(isUnderline)}\r\n onClick={() => format('underline')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Strikethrough'\r\n aria-label='Strikethrough'\r\n aria-pressed={isStrikethrough}\r\n icon={<TextStrikethroughFilled style={{ color: iconColor(isStrikethrough) }} />}\r\n style={btnStyle(isStrikethrough)}\r\n onClick={() => format('strikethrough')}\r\n />\r\n\r\n <div className='divider' aria-hidden='true' />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Subscript'\r\n aria-label='Subscript'\r\n aria-pressed={isSubscript}\r\n icon={<TextSubscriptFilled style={{ color: iconColor(isSubscript) }} />}\r\n style={btnStyle(isSubscript)}\r\n onClick={() => format('subscript')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Superscript'\r\n aria-label='Superscript'\r\n aria-pressed={isSuperscript}\r\n icon={<TextSuperscriptFilled style={{ color: iconColor(isSuperscript) }} />}\r\n style={btnStyle(isSuperscript)}\r\n onClick={() => format('superscript')}\r\n />\r\n\r\n <div className='divider' aria-hidden='true' />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Code'\r\n aria-label='Code'\r\n aria-pressed={isCode}\r\n icon={<CodeFilled style={{ color: iconColor(isCode) }} />}\r\n style={btnStyle(isCode)}\r\n onClick={() => format('code')}\r\n />\r\n\r\n <Button\r\n size='small'\r\n disabled={disabled}\r\n title='Link'\r\n aria-label='Link'\r\n aria-pressed={isLink}\r\n icon={<LinkFilled style={{ color: iconColor(isLink) }} />}\r\n style={btnStyle(isLink)}\r\n onClick={toggleLink}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction getSelectedNode(selection: RangeSelection): TextNode | ElementNode {\r\n const anchorNode = selection.anchor.getNode();\r\n const focusNode = selection.focus.getNode();\r\n if (anchorNode === focusNode) return anchorNode;\r\n\r\n const isBackward = selection.isBackward();\r\n return isBackward\r\n ? $isAtNodeEnd(selection.focus)\r\n ? anchorNode\r\n : focusNode\r\n : $isAtNodeEnd(selection.anchor)\r\n ? focusNode\r\n : anchorNode;\r\n}\r\n\r\nfunction useCharacterStylesPopup(\r\n editor: LexicalEditor,\r\n opts?: UseCharacterStylesPopupOptions,\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 [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 isEditable = opts?.isEditable ?? editor.isEditable();\r\n const portalContainer = useFloatingPortalContainer(editor);\r\n\r\n const updatePopupState = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\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)) return;\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\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 const parent = node.getParent();\r\n setIsLink($isLinkNode(parent) || $isLinkNode(node));\r\n\r\n if (!$isCodeHighlightNode(selection.anchor.getNode()) && selection.getTextContent() !== '') {\r\n setIsText($isTextNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopupState);\r\n return () => document.removeEventListener('selectionchange', updatePopupState);\r\n }, [updatePopupState]);\r\n\r\n useEffect(() => editor.registerUpdateListener(updatePopupState), [editor, updatePopupState]);\r\n\r\n // Hide when not text selection or when in link selection state\r\n if (!portalContainer || !isText || isLink) return null;\r\n\r\n return createPortal(\r\n <FloatingCharacterStylesEditor\r\n editor={editor}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n isEditable={isEditable}\r\n readOnly={opts?.readOnly}\r\n />,\r\n portalContainer,\r\n );\r\n}\r\n\r\nexport default function CharacterStylesPopupPlugin(\r\n props: UseCharacterStylesPopupOptions,\r\n): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useCharacterStylesPopup(editor, props);\r\n}\r\n","import { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\r\nimport { $getRoot, $setSelection } from 'lexical';\r\nimport { useCallback, useEffect, useRef } from 'react';\r\n\r\ninterface ICustomOnChangePluginProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\nexport const CustomOnChangePlugin = ({ value, onChange }: ICustomOnChangePluginProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const initializedRef = useRef(false);\r\n\r\n // Always-current ref so the stable handleChange below never goes stale.\r\n const onChangeRef = useRef(onChange);\r\n onChangeRef.current = onChange;\r\n\r\n useEffect(() => {\r\n if (!value || initializedRef.current) return;\r\n\r\n initializedRef.current = true;\r\n\r\n editor.update(() => {\r\n const root = $getRoot();\r\n root.clear();\r\n\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(value, 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n\r\n root.append(...nodes);\r\n\r\n // Prevent Lexical from placing a DOM cursor after this programmatic update.\r\n // Without this, Lexical's commitPendingUpdates tries to sync the selection\r\n // into the contenteditable, which causes some browsers to focus the element\r\n // even when the user is typing in another field (e.g. To / CC / BCC).\r\n $setSelection(null);\r\n });\r\n }, [editor, value]);\r\n\r\n // Stable reference — never changes across renders because it only depends on\r\n // `editor` (which is stable for the lifetime of the composer).\r\n // This prevents OnChangePlugin from re-registering its Lexical update listener\r\n // on every render. Without stability, each re-registration can flush Lexical's\r\n // pending selection state (the cursor from the user's last edit), which causes\r\n // the browser to re-focus the contenteditable even when the user has already\r\n // moved to another field (e.g. Subject).\r\n const handleChange = useCallback((editorState: any) => {\r\n editorState.read(() => {\r\n onChangeRef.current($generateHtmlFromNodes(editor));\r\n });\r\n }, [editor]);\r\n\r\n return (\r\n <OnChangePlugin\r\n onChange={handleChange}\r\n ignoreSelectionChange\r\n />\r\n );\r\n};\r\n","import {\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 { $isAtNodeEnd } from '@lexical/selection';\r\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection, $isRangeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW, ElementNode, getDOMSelection,\r\n KEY_ESCAPE_COMMAND,\r\n LexicalEditor, RangeSelection, SELECTION_CHANGE_COMMAND, TextNode\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { Dispatch, useCallback, useEffect, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './FloatLink.css';\r\n\r\nexport const getSelectedNode = ( selection: RangeSelection ): TextNode | ElementNode => {\r\n const anchor = selection.anchor;\r\n const anchorNode = selection.anchor.getNode();\r\n const focus = selection.focus;\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\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport const setFloatingElemPositionForLinkEditor = (targetRect: DOMRect | null, floatingElem: HTMLElement, anchorElem: HTMLElement, verticalGap: number = VERTICAL_GAP, horizontalOffset: number = HORIZONTAL_OFFSET): void => {\r\n \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\nconst SUPPORTED_URL_PROTOCOLS = new Set([\r\n 'http:',\r\n 'https:',\r\n 'mailto:',\r\n 'sms:',\r\n 'tel:',\r\n]);\r\n\r\nexport const sanitizeUrl = (url: string): string => {\r\n try {\r\n const parsedUrl = new URL(url);\r\n // eslint-disable-next-line no-script-url\r\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\r\n return 'about:blank';\r\n }\r\n } catch {\r\n return url;\r\n }\r\n return url;\r\n}\r\n\r\nconst preventDefault = ( event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>) : void => {\r\n event.preventDefault();\r\n}\r\n\r\ninterface IFloatingLinkEditor {\r\n isLink: boolean;\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isLinkEditMode: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nconst FloatingLinkEditor = ({editor, isLink, setIsLink, anchorElem, isLinkEditMode, setIsLinkEditMode}: IFloatingLinkEditor): JSX.Element => {\r\n const [editedLinkUrl, setEditedLinkUrl] = useState('https://');\r\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>( null);\r\n const [linkUrl, setLinkUrl] = useState('');\r\n const editorRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\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 }\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 (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode) &&\r\n editor.isEditable()\r\n ) {\r\n const domRect: DOMRect | undefined =\r\n nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\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 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\nconst useFloatingLinkEditorToolbar = (\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement | null,\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(focusNode, $isAutoLinkNode);\r\n if (!(focusLinkNode || focusAutoLinkNode)) {\r\n setIsLink(false);\r\n return;\r\n }\r\n setIsLink(true);\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 if (!anchorElem || !(anchorElem instanceof HTMLElement)) {\r\n return null; // Prevent rendering if anchorElem is invalid\r\n }\r\n\r\n return createPortal(\r\n <FloatingLinkEditor\r\n isLink={isLink}\r\n editor={activeEditor}\r\n setIsLink={setIsLink}\r\n anchorElem={anchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n anchorElem\r\n );\r\n};\r\ninterface IFloatingLinkEditorPlugin {\r\n anchorElem?: HTMLElement | null;\r\n isLinkEditMode: boolean;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nexport const FloatingLinkEditorPlugin = ({ anchorElem, isLinkEditMode, setIsLinkEditMode}: IFloatingLinkEditorPlugin): JSX.Element | null => {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n // Ensure anchorElem is a valid DOM element, otherwise fallback to document.body\r\n const validAnchorElem = anchorElem && anchorElem instanceof HTMLElement ? anchorElem : document.body;\r\n\r\n return useFloatingLinkEditorToolbar(\r\n editor,\r\n validAnchorElem,\r\n isLinkEditMode,\r\n setIsLinkEditMode\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n SelectTabData,\r\n SelectTabEvent,\r\n} from '@fluentui/react-components';\r\nimport { AttachFilled, ImageAddRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $wrapNodeInElement, mergeRegister } 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 PASTE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { $createImageNode, $isImageNode, ImageNode, ImagePayload } from '../Nodes/ImageNode';\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\nconst readClipboardImageAsDataURL = async (event: ClipboardEvent): Promise<string | null> => {\r\n const items = event.clipboardData?.items;\r\n if (!items) return null;\r\n\r\n for (const item of Array.from(items)) {\r\n if (item.type?.startsWith('image/')) {\r\n const file = item.getAsFile();\r\n if (!file) continue;\r\n\r\n return await new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : '');\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst InsertImageByURL = ({\r\n setIsOpen,\r\n onClick,\r\n disabled,\r\n}: {\r\n setIsOpen: (e: boolean) => void;\r\n onClick: (payload: InsertImagePayload) => void;\r\n disabled: boolean;\r\n}) => {\r\n const [altText, setAltText] = useState('');\r\n const [src, setSrc] = useState('');\r\n const isDisabled = disabled || src === '';\r\n\r\n return (\r\n <Stack tokens={{ childrenGap: 6, padding: '10px 0px 0px 0px' }}>\r\n <Field label='Enter URL' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n appearance='underline'\r\n placeholder='Add URL'\r\n disabled={disabled}\r\n onChange={(_, v) => setSrc(v.value)}\r\n value={src}\r\n />\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n key='alt-text-url'\r\n disabled={disabled}\r\n onChange={(_, v) => setAltText(v.value)}\r\n value={altText}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n key='url-confirm-btn'\r\n style={{ width: '150px' }}\r\n onClick={() => !disabled && onClick({ altText, src })}\r\n disabled={isDisabled}\r\n size='small'>\r\n Confirm\r\n </Button>\r\n <Button\r\n key='file-url-cancel'\r\n style={{ width: '150px' }}\r\n onClick={() => setIsOpen(false)}\r\n disabled={disabled}\r\n size='small'>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n );\r\n};\r\n\r\ntype TabValue = 'Upload' | 'URL';\r\n\r\nexport const InsertImageDialog = ({\r\n activeEditor,\r\n disabled,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n}) => {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [selectedValue, setSelectedValue] = useState<TabValue>('Upload');\r\n const [fileName, setFileName] = useState('');\r\n const hasModifier = useRef(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n const isDisabled = disabled || src === '';\r\n\r\n const onTabSelect = (_event: SelectTabEvent, data: SelectTabData) => {\r\n setSelectedValue(data.value as TabValue);\r\n };\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 () => document.removeEventListener('keydown', handler);\r\n }, [activeEditor]);\r\n\r\n const onClick = (payload: InsertImagePayload) => {\r\n if (disabled) return;\r\n\r\n activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload);\r\n setIsOpen(false);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n };\r\n\r\n const loadImage = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n const files = event.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n setFileName(files[0].name);\r\n }\r\n };\r\n reader.readAsDataURL(files[0]);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add Image'\r\n key='upload-image'\r\n disabled={disabled}\r\n icon={<ImageAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '320px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 6 }}>\r\n <Field label='Upload' orientation='horizontal' size='small'>\r\n <label\r\n style={{\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n opacity: disabled ? 0.75 : 1,\r\n }}>\r\n <input\r\n type='file'\r\n accept='image/*'\r\n key='inline-image-upload'\r\n style={{ display: 'none' }}\r\n disabled={disabled}\r\n onChange={loadImage}\r\n />\r\n\r\n <Stack horizontal>\r\n <AttachFilled\r\n style={{\r\n fontSize: '16px',\r\n color: disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#808080',\r\n marginTop: 2,\r\n }}\r\n />\r\n {!fileName && <span style={{ fontSize: 12, color: '#808080' }}>Upload File</span>}\r\n </Stack>\r\n\r\n {fileName && <span style={{ fontSize: 12, color: '#808080' }}>{fileName}</span>}\r\n </label>\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, d) => setAltText(d.value)}\r\n value={altText}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button size='small' disabled={isDisabled} onClick={() => onClick({ altText, src })}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n\r\n {selectedValue === 'URL' && (\r\n <InsertImageByURL\r\n disabled={disabled}\r\n setIsOpen={(open) => setIsOpen(open)}\r\n onClick={(payload) => onClick(payload)}\r\n />\r\n )}\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\nconst ImagesPlugin = ({ captionsEnabled }: { captionsEnabled?: boolean }) => {\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 return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n\r\n editor.registerCommand<ClipboardEvent>(\r\n PASTE_COMMAND,\r\n (event) => {\r\n if (!event.clipboardData) return false;\r\n\r\n const hasImage = Array.from(event.clipboardData.items).some((i) =>\r\n i.type?.startsWith('image/')\r\n );\r\n if (!hasImage) return false;\r\n\r\n event.preventDefault();\r\n\r\n (async () => {\r\n const src = await readClipboardImageAsDataURL(event);\r\n if (!src) return;\r\n\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\r\n src,\r\n altText: 'Screenshot',\r\n });\r\n })();\r\n\r\n return true;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n\r\n editor.registerCommand<DragEvent>(\r\n DRAGSTART_COMMAND,\r\n (event) => $onDragStart(event),\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => $onDragover(event),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => $onDrop(event, editor),\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n );\r\n }, [captionsEnabled, editor]);\r\n\r\n return null;\r\n};\r\n\r\nexport default ImagesPlugin;\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\nconst $onDragStart = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) 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\nconst $onDragover = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return true;\r\n};\r\n\r\nconst $onDrop = (event: DragEvent, editor: LexicalEditor): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n\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 }\r\n\r\n return true;\r\n};\r\n\r\nconst $getImageNodeInSelection = (): ImageNode | null => {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) 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\nconst getDragImageData = (event: DragEvent): null | InsertImagePayload => {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) return null;\r\n\r\n const { type, data } = JSON.parse(dragData);\r\n if (type !== 'image') return null;\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\nconst 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\nconst getDragSelection = (event: DragEvent): Range | null | undefined => {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if ((event as any).rangeParent && domSelection !== null) {\r\n domSelection.collapse((event as any).rangeParent, (event as any).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","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Dropdown,\r\n Field,\r\n Input,\r\n makeStyles,\r\n Option,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { AttachFilled, ImageEditRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $wrapNodeInElement, mergeRegister } 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 * as React from 'react';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport '../Nodes/InlineImage.css';\r\nimport {\r\n $createInlineImageNode,\r\n $isInlineImageNode,\r\n InlineImageNode,\r\n InlineImagePayload,\r\n Position,\r\n} from '../Nodes/InlineImageNode';\r\n\r\nexport type InsertInlineImagePayload = Readonly<InlineImagePayload>;\r\n\r\nexport const INSERT_INLINE_IMAGE_COMMAND: LexicalCommand<InlineImagePayload> = createCommand(\r\n 'INSERT_INLINE_IMAGE_COMMAND'\r\n);\r\n\r\nconst useStyles = makeStyles({\r\n alignDropdown: {\r\n minInlineSize: '90px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n ':hover': {\r\n backgroundColor: '#eee',\r\n },\r\n },\r\n});\r\n\r\nexport const InsertInlineImageDialog = ({\r\n disabled,\r\n activeEditor,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n}): JSX.Element => {\r\n const hasModifier = useRef(false);\r\n const [src, setSrc] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [altText, setAltText] = useState('');\r\n const [fileName, setFileName] = useState('');\r\n const [position, setPosition] = useState<Position>('left');\r\n const styles = useStyles();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const isDisabled = disabled || src === '';\r\n\r\n const loadImage = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (disabled) return;\r\n\r\n const files = event.target.files;\r\n if (!files || files.length === 0) return;\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (typeof reader.result === 'string') {\r\n setSrc(reader.result);\r\n setFileName(files[0].name);\r\n }\r\n };\r\n reader.readAsDataURL(files[0]);\r\n };\r\n\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n hasModifier.current = e.altKey;\r\n };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [activeEditor]);\r\n\r\n const handleOnClick = () => {\r\n if (disabled) return;\r\n\r\n const payload = { altText, position, src };\r\n activeEditor.dispatchCommand(INSERT_INLINE_IMAGE_COMMAND, payload);\r\n\r\n setIsOpen(false);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n key='upload-inline-image'\r\n title='Add Inline Image'\r\n disabled={disabled}\r\n icon={<ImageEditRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setAltText('');\r\n setSrc('');\r\n setFileName('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '400px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 6, padding: '10px 0px 0px 0px' }}>\r\n <Field label='Upload' orientation='horizontal' size='small'>\r\n <label\r\n style={{\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n opacity: disabled ? 0.75 : 1,\r\n }}>\r\n <input\r\n type='file'\r\n accept='image/*'\r\n key='inline-image-upload'\r\n style={{ display: 'none' }}\r\n disabled={disabled}\r\n onChange={loadImage}\r\n />\r\n\r\n <Stack horizontal>\r\n <AttachFilled\r\n style={{\r\n fontSize: '16px',\r\n color: disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#808080',\r\n marginTop: 2,\r\n }}\r\n />\r\n {!fileName && <span style={{ fontSize: 12, color: '#808080' }}>Upload File</span>}\r\n </Stack>\r\n\r\n {fileName && <span style={{ fontSize: 12, color: '#808080' }}>{fileName}</span>}\r\n </label>\r\n </Field>\r\n\r\n <Field label='Position' orientation='horizontal' size='small'>\r\n <Dropdown\r\n placeholder='Left Align'\r\n className={styles.alignDropdown}\r\n disabled={disabled}\r\n listbox={{ style: { width: '120px' } }}\r\n root={{ style: { borderBottom: '1px solid black' } }}>\r\n <Option key='full' text='full' onClick={() => setPosition('full')}>\r\n Full\r\n </Option>\r\n <Option key='left' text='left' onClick={() => setPosition('left')}>\r\n Left\r\n </Option>\r\n <Option key='right' text='right' onClick={() => setPosition('right')}>\r\n Right\r\n </Option>\r\n </Dropdown>\r\n </Field>\r\n\r\n <Field label='Alt Text' orientation='horizontal' size='small'>\r\n <Input\r\n placeholder='Alt text'\r\n appearance='underline'\r\n disabled={disabled}\r\n value={altText}\r\n onChange={(_, d) => setAltText(d.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n key='file-inline-upload-btn'\r\n disabled={isDisabled}\r\n onClick={handleOnClick}>\r\n Add\r\n </Button>\r\n <Button\r\n size='small'\r\n key='file-inline-upload-cancel'\r\n disabled={disabled}\r\n onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\nexport const InlineImagePlugin = () => {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n if (!editor.hasNodes([InlineImageNode])) {\r\n throw new Error('ImagesPlugin: ImageNode not registered on editor');\r\n }\r\n\r\n return mergeRegister(\r\n editor.registerCommand<InsertInlineImagePayload>(\r\n INSERT_INLINE_IMAGE_COMMAND,\r\n (payload) => {\r\n const imageNode = $createInlineImageNode(payload);\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\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) => $onDragStart(event),\r\n COMMAND_PRIORITY_HIGH\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DRAGOVER_COMMAND,\r\n (event) => $onDragover(event),\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<DragEvent>(\r\n DROP_COMMAND,\r\n (event) => $onDrop(event, editor),\r\n COMMAND_PRIORITY_HIGH\r\n )\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n};\r\n\r\nexport default InlineImagePlugin;\r\n\r\n/* =================== drag/drop helpers unchanged =================== */\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) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) 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 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\nconst $onDragover = (event: DragEvent): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n if (!canDropImage(event)) {\r\n event.preventDefault();\r\n }\r\n return true;\r\n};\r\n\r\nconst $onDrop = (event: DragEvent, editor: LexicalEditor): boolean => {\r\n const node = $getImageNodeInSelection();\r\n if (!node) return false;\r\n\r\n const data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n const range = getDragSelection(event);\r\n node.remove();\r\n\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_INLINE_IMAGE_COMMAND, data);\r\n }\r\n return true;\r\n};\r\n\r\nconst $getImageNodeInSelection = (): InlineImageNode | null => {\r\n const selection = $getSelection();\r\n if (!$isNodeSelection(selection)) return null;\r\n\r\n const nodes = selection.getNodes();\r\n const node = nodes[0];\r\n return $isInlineImageNode(node) ? node : null;\r\n};\r\n\r\nconst getDragImageData = (event: DragEvent): null | InsertInlineImagePayload => {\r\n const dragData = event.dataTransfer?.getData('application/x-lexical-drag');\r\n if (!dragData) return null;\r\n\r\n const { type, data } = JSON.parse(dragData);\r\n if (type !== 'image') return null;\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\nconst 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\nconst getDragSelection = (event: DragEvent): Range | null | undefined => {\r\n let range;\r\n const domSelection = getDOMSelectionFromTarget(event.target);\r\n\r\n if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(event.clientX, event.clientY);\r\n } else if ((event as any).rangeParent && domSelection !== null) {\r\n domSelection.collapse((event as any).rangeParent, (event as any).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","import { 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\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","import { $generateNodesFromDOM } from '@lexical/html';\r\nimport { $getRoot } from 'lexical';\r\nimport { $createHtmlBlockNode, $isHtmlBlockNode, HtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\n\r\nexport type BlockSpec = {\r\n kind: string;\r\n html: string;\r\n position?: 'start' | 'end';\r\n};\r\n\r\nfunction findBlockByKind(kind: string): HtmlBlockNode | null {\r\n const root = $getRoot();\r\n for (const child of root.getChildren()) {\r\n if ($isHtmlBlockNode(child) && child.getKind() === kind) return child;\r\n }\r\n return null;\r\n}\r\n\r\nfunction importHtmlIntoBlock(editor: any, block: HtmlBlockNode, html: string) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, doc);\r\n\r\n block.clear();\r\n block.append(...nodes);\r\n}\r\n\r\nexport function upsertBlock(editor: any, spec: BlockSpec) {\r\n const { kind, html, position = 'end' } = spec;\r\n\r\n editor.update(() => {\r\n const root = $getRoot();\r\n let block = findBlockByKind(kind);\r\n\r\n if (!block) {\r\n block = $createHtmlBlockNode(kind);\r\n if (position === 'start') {\r\n root.splice(0, 0, [block]);\r\n } else {\r\n root.append(block);\r\n }\r\n }\r\n\r\n importHtmlIntoBlock(editor, block, html);\r\n });\r\n}\r\n\r\nexport function removeBlock(editor: any, kind: string) {\r\n editor.update(() => {\r\n const block = findBlockByKind(kind);\r\n block?.remove();\r\n });\r\n}\r\n\r\nexport function hasBlock(editor: any, kind: string): boolean {\r\n let found = false;\r\n editor.getEditorState().read(() => {\r\n found = !!findBlockByKind(kind);\r\n });\r\n return found;\r\n}\r\n","import { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getRoot } from 'lexical';\r\nimport React, { useImperativeHandle } from 'react';\r\nimport { ContentEditorRef } from '../ContentEditorComponent.types';\r\nimport { BlockSpec, hasBlock, removeBlock, upsertBlock } from '../Utils/Helper';\r\n\r\nexport default function RefApiPlugin({\r\n forwardedRef,\r\n contentEditableDomRef,\r\n focusedRef,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useImperativeHandle(\r\n forwardedRef,\r\n (): ContentEditorRef =>\r\n ({\r\n setValue: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(html || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n const root = $getRoot();\r\n root.clear();\r\n root.append(...nodes);\r\n });\r\n },\r\n\r\n getValue: () => {\r\n let html = '';\r\n editor.getEditorState().read(() => {\r\n html = $generateHtmlFromNodes(editor, null);\r\n });\r\n return html;\r\n },\r\n\r\n clear: () => {\r\n editor.update(() => {\r\n $getRoot().clear();\r\n });\r\n },\r\n\r\n focus: () => contentEditableDomRef.current?.focus(),\r\n blur: () => contentEditableDomRef.current?.blur(),\r\n\r\n isEmpty: () => {\r\n let empty = true;\r\n editor.getEditorState().read(() => {\r\n empty = $getRoot().getTextContent().trim().length === 0;\r\n });\r\n return empty;\r\n },\r\n\r\n isFocused: () => focusedRef.current,\r\n getEditor: () => editor,\r\n\r\n // Generic blocks (signature, footer, banner, etc.)\r\n upsertBlock: (spec: BlockSpec) => upsertBlock(editor, spec),\r\n removeBlock: (kind: string) => removeBlock(editor, kind),\r\n hasBlock: (kind: string) => hasBlock(editor, kind),\r\n }) as any,\r\n [editor, contentEditableDomRef, focusedRef],\r\n );\r\n\r\n return null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n LexicalNode,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n $createSpellErrorNode,\r\n $isSpellErrorNode,\r\n SpellErrorMeta,\r\n SpellErrorNode,\r\n SpellIssueType,\r\n} from '../Nodes/SpellErrorNode';\r\n\r\n// ─── Public types ─────────────────────────────────────────────────────────────\r\n\r\nexport type SpellCheckIssue = {\r\n offset: number;\r\n length: number;\r\n message: string;\r\n suggestions: string[];\r\n type?: SpellIssueType;\r\n word?: string;\r\n};\r\n\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── CSS (injected once, outside Lexical) ─────────────────────────────────────\r\n\r\nconst CSS_ID = '__sc_styles__';\r\n\r\nfunction injectCSS() {\r\n if (document.getElementById(CSS_ID)) return;\r\n const s = document.createElement('style');\r\n s.id = CSS_ID;\r\n s.textContent = `\r\n .sc-err-spelling { text-decoration: underline dotted #e53e3e 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-grammar { text-decoration: underline dotted #3182ce 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-style { text-decoration: underline dotted #d97706 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-popover {\r\n position:fixed; z-index:10000000; background:#fff; border:1px solid #e2e8f0;\r\n border-radius:10px; box-shadow:0 6px 24px rgba(0,0,0,.15);\r\n padding:6px 0 4px; min-width:200px; max-width:300px;\r\n font-family:system-ui,sans-serif; font-size:13px; user-select:none;\r\n }\r\n .sc-popover-header { display:flex; align-items:center; gap:6px; padding:4px 12px 6px; border-bottom:1px solid #f0f0f0; margin-bottom:2px; }\r\n .sc-popover-badge { font-size:10px; font-weight:700; text-transform:uppercase; padding:2px 6px; border-radius:4px; color:#fff; flex-shrink:0; }\r\n .sc-popover-badge-spelling { background:#e53e3e; }\r\n .sc-popover-badge-grammar { background:#3182ce; }\r\n .sc-popover-badge-style { background:#d69e2e; }\r\n .sc-popover-message { color:#4a5568; font-size:12px; flex:1; }\r\n .sc-popover-item { padding:7px 14px; cursor:pointer; color:#1a202c; display:flex; align-items:center; gap:8px; font-size:13.5px; font-weight:500; }\r\n .sc-popover-item:hover { background:#f0fff4; }\r\n .sc-popover-empty { padding:8px 14px; color:#a0aec0; font-style:italic; font-size:12px; }\r\n .sc-popover-footer { border-top:1px solid #f0f0f0; margin-top:2px; padding:5px 14px 2px; display:flex; gap:8px; }\r\n .sc-popover-action { cursor:pointer; font-size:11px; color:#a0aec0; padding:3px 0; }\r\n .sc-popover-action:hover { color:#e53e3e; }\r\n .sc-popover-improve { border-top:1px solid #f0f0f0; margin-top:2px; padding:8px 12px 6px; }\r\n .sc-popover-improve-label { font-size:10px; font-weight:700; text-transform:uppercase; color:#d69e2e; margin-bottom:6px; }\r\n .sc-popover-improve-text { font-size:12px; color:#4a5568; font-style:italic; margin-bottom:8px; line-height:1.45; }\r\n .sc-popover-improve-accept { background:#d69e2e; color:#fff; border:none; border-radius:6px; padding:5px 12px; font-size:12px; font-weight:600; cursor:pointer; width:100%; }\r\n .sc-popover-improve-accept:hover { background:#b7791f; }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\n// ─── Tree helpers ─────────────────────────────────────────────────────────────\r\n\r\nfunction escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\ntype Seg = { node: TextNode; start: number; end: number; text: string };\r\n\r\n/**\r\n * Walk the Lexical tree and return all wrappable TextNode segments with their\r\n * absolute character offsets. SpellErrorNodes are counted but not returned.\r\n * Block separators (\\n) are counted between top-level blocks, not after the last.\r\n */\r\nfunction getSegments(root: LexicalNode): Seg[] {\r\n const segs: Seg[] = [];\r\n let pos = 0;\r\n\r\n function walk(node: LexicalNode) {\r\n if ($isSpellErrorNode(node)) {\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isTextNode(node)) {\r\n const t = node.getTextContent();\r\n if (t.length > 0)\r\n segs.push({ node: node as TextNode, start: pos, end: pos + t.length, text: t });\r\n pos += t.length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(walk);\r\n }\r\n\r\n if (!$isElementNode(root)) return segs;\r\n root.getChildren().forEach((block, i) => {\r\n if (i > 0) pos += 1;\r\n walk(block);\r\n });\r\n return segs;\r\n}\r\n\r\nfunction removeAllSpellNodes(root: LexicalNode) {\r\n if ($isSpellErrorNode(root)) {\r\n (root as SpellErrorNode).replace($createTextNode(root.getTextContent()));\r\n return;\r\n }\r\n if ($isElementNode(root)) {\r\n [...root.getChildren()].forEach(removeAllSpellNodes);\r\n }\r\n}\r\n\r\n/** Split TextNode at [start, start+len) and wrap that slice with a SpellErrorNode */\r\nfunction wrapWord(node: TextNode, start: number, len: number, meta: SpellErrorMeta) {\r\n const full = node.getTextContent();\r\n const before = full.slice(0, start);\r\n const word = full.slice(start, start + len);\r\n const after = full.slice(start + len);\r\n if (!word) return;\r\n\r\n const err = $createSpellErrorNode(word, meta);\r\n if (before && after) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n err.insertAfter($createTextNode(after));\r\n } else if (before) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n } else if (after) {\r\n node.replace(err);\r\n err.insertAfter($createTextNode(after));\r\n } else {\r\n node.replace(err);\r\n }\r\n}\r\n\r\n/** Move caret to the very end of the last text node in the document */\r\nfunction moveCursorToEnd(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\r\n editor.update(\r\n () => {\r\n const root = $getRoot();\r\n const lastBlock = root.getLastChild();\r\n if (!lastBlock || !$isElementNode(lastBlock)) return;\r\n // Walk to the last leaf TextNode (skip SpellErrorNodes and element nodes)\r\n let lastTextNode: TextNode | null = null;\r\n const findLast = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node) || ($isTextNode(node) && !$isSpellErrorNode(node))) {\r\n lastTextNode = node as TextNode;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(findLast);\r\n };\r\n findLast(lastBlock);\r\n if (!lastTextNode) return;\r\n const sel = $createRangeSelection();\r\n const key = (lastTextNode as TextNode).getKey();\r\n const off = (lastTextNode as TextNode).getTextContent().length;\r\n sel.anchor.set(key, off, 'text');\r\n sel.focus.set(key, off, 'text');\r\n $setSelection(sel);\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n}\r\n\r\n/** Replace all content of the first paragraph with plain text */\r\nfunction replaceFirstParagraph(\r\n editor: ReturnType<typeof useLexicalComposerContext>[0],\r\n text: string,\r\n onUpdate?: () => void,\r\n) {\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n const first = $getRoot().getFirstChild();\r\n if (first && $isElementNode(first)) {\r\n first.getChildren().forEach((c) => c.remove());\r\n first.append($createTextNode(text));\r\n }\r\n },\r\n { tag: 'spell-clear', onUpdate },\r\n );\r\n}\r\n\r\n// ─── Popover component ────────────────────────────────────────────────────────\r\n\r\ntype PopoverState = {\r\n x: number;\r\n y: number;\r\n issue: SpellCheckIssue;\r\n nodeKey: string;\r\n improvedText?: string;\r\n grammarCorrection?: string;\r\n};\r\n\r\nfunction SpellPopover({\r\n state,\r\n onAccept,\r\n onDismiss,\r\n onClose,\r\n onImprove,\r\n onAcceptGrammar,\r\n}: {\r\n state: PopoverState;\r\n onAccept: (replacement: string, nodeKey: string) => void;\r\n onDismiss: (nodeKey: string) => void;\r\n onClose: () => void;\r\n onImprove?: (text: string, nodeKey: string) => void;\r\n onAcceptGrammar?: (corrected: string) => void;\r\n}) {\r\n const ref = React.useRef<HTMLDivElement>(null);\r\n const type = state.issue.type ?? 'spelling';\r\n\r\n // Viewport-aware position\r\n const [pos, setPos] = React.useState({ left: state.x, top: state.y });\r\n React.useEffect(() => {\r\n if (!ref.current) return;\r\n const { offsetHeight: h, offsetWidth: w } = ref.current;\r\n const top = state.y + h > window.innerHeight - 8 ? state.y - h - 32 : state.y;\r\n setPos({ left: Math.min(state.x, window.innerWidth - w - 8), top });\r\n }, [state.x, state.y]);\r\n\r\n // Close on outside click\r\n React.useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n };\r\n document.addEventListener('mousedown', h, true);\r\n return () => document.removeEventListener('mousedown', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = () => onClose();\r\n window.addEventListener('scroll', h, { capture: true, passive: true });\r\n return () => window.removeEventListener('scroll', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', h, true);\r\n return () => document.removeEventListener('keydown', h, true);\r\n }, [onClose]);\r\n\r\n // Grammar correction takes priority over legacy improvedText\r\n const grammar = state.grammarCorrection;\r\n const improved = !grammar ? state.improvedText : undefined;\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className='sc-popover'\r\n style={{ left: pos.left, top: pos.top }}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }}>\r\n {' '}\r\n <div className='sc-popover-header'>\r\n <span className={`sc-popover-badge sc-popover-badge-${type}`}>{type.toUpperCase()}</span>\r\n <span className='sc-popover-message'>{state.issue.message}</span>\r\n </div>\r\n {state.issue.suggestions.length > 0 ? (\r\n state.issue.suggestions.slice(0, 5).map((s) => (\r\n <div\r\n key={s}\r\n className='sc-popover-item'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAccept(s, state.nodeKey);\r\n }}>\r\n → {s}\r\n </div>\r\n ))\r\n ) : (\r\n <div className='sc-popover-empty'>No suggestions</div>\r\n )}\r\n <div className='sc-popover-footer'>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDismiss(state.nodeKey);\r\n }}>\r\n Ignore\r\n </span>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose();\r\n }}>\r\n Close\r\n </span>\r\n </div>\r\n {grammar && onAcceptGrammar && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Grammar Suggestion</div>\r\n <div className='sc-popover-improve-text'>\"{grammar}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAcceptGrammar(grammar);\r\n onClose();\r\n }}>\r\n Accept correction\r\n </button>\r\n </div>\r\n )}\r\n {improved && onImprove && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Suggested Improvement</div>\r\n <div className='sc-popover-improve-text'>\"{improved}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onImprove(improved, state.nodeKey);\r\n }}>\r\n Accept improvement\r\n </button>\r\n </div>\r\n )}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function SpellCheckPlugin({\r\n useSpellCheck,\r\n onSpellCheckAccept,\r\n idleMs = 1200,\r\n enabled = true,\r\n}: {\r\n /** Return `{ promise, dismiss }` for the given text. */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /** Called after the user accepts any suggestion or correction. */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /** Debounce delay in ms before calling the API. Default 1200. */\r\n idleMs?: number;\r\n /** Set false to disable without unmounting (clears existing underlines). Default true. */\r\n enabled?: boolean;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const timerRef = React.useRef<number | null>(null);\r\n const dismissRef = React.useRef<(() => void) | null>(null);\r\n const reqIdRef = React.useRef(0);\r\n const lastTextRef = React.useRef('');\r\n const applyingRef = React.useRef(false);\r\n const grammarCorrectionRef = React.useRef<string | undefined>(undefined);\r\n\r\n const [popover, setPopover] = React.useState<PopoverState | null>(null);\r\n\r\n React.useEffect(() => {\r\n injectCSS();\r\n }, []);\r\n\r\n // ── Clear all underlines ─────────────────────────────────────────────────\r\n\r\n const clearErrors = React.useCallback(() => {\r\n setPopover(null);\r\n grammarCorrectionRef.current = undefined;\r\n applyingRef.current = true;\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n },\r\n {\r\n tag: 'spell-clear',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n }, [editor]);\r\n\r\n // ── Apply issues ─────────────────────────────────────────────────────────\r\n\r\n const applyIssues = React.useCallback(\r\n (issues: SpellCheckIssue[], improvedText?: string, trimOffset = 0) => {\r\n // Capture cursor as absolute char offset — stable across node splits\r\n let savedCharOffset = -1;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const anchorKey = sel.anchor.key;\r\n const anchorOff = sel.anchor.offset;\r\n let pos = 0;\r\n let found = false;\r\n const visit = (node: LexicalNode): void => {\r\n if (found) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n if (node.getKey() === anchorKey) {\r\n savedCharOffset = pos + anchorOff;\r\n found = true;\r\n return;\r\n }\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n $getRoot()\r\n .getChildren()\r\n .forEach((block, i) => {\r\n if (found) return;\r\n if (i > 0) pos += 1;\r\n visit(block);\r\n });\r\n });\r\n\r\n applyingRef.current = true;\r\n\r\n editor.update(\r\n () => {\r\n try {\r\n const root = $getRoot();\r\n removeAllSpellNodes(root);\r\n\r\n const sorted = [...issues].sort((a, b) => a.offset - b.offset);\r\n\r\n for (const issue of sorted) {\r\n const word = issue.word ?? '';\r\n if (!word) continue;\r\n\r\n const meta: SpellErrorMeta = {\r\n message: issue.message,\r\n suggestions: issue.suggestions,\r\n type: issue.type ?? 'spelling',\r\n offset: issue.offset,\r\n };\r\n\r\n const absOffset = issue.offset + trimOffset;\r\n let segs = getSegments(root);\r\n let placed = false;\r\n\r\n // Pass 1: exact offset + text match, with per-segment regex fallback\r\n for (const seg of segs) {\r\n if (absOffset < seg.start || absOffset >= seg.end) continue;\r\n const local = absOffset - seg.start;\r\n const slice = seg.text.slice(local, local + word.length);\r\n if (slice.toLowerCase() === word.toLowerCase()) {\r\n wrapWord(seg.node, local, word.length, meta);\r\n placed = true;\r\n break;\r\n }\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n\r\n // Pass 2: full-tree regex scan (handles trimOffset drift)\r\n if (!placed) {\r\n segs = getSegments(root); // re-collect after any prior wraps\r\n for (const seg of segs) {\r\n if (!seg.text.trim()) continue;\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Grammar-only: no spelling issues but grammar correction exists.\r\n // We need a click target — underline the first word of text with\r\n // a 'grammar' style node so the popover can open and show the correction.\r\n if (issues.length === 0 && !improvedText) {\r\n // grammarCorrection is stored in grammarCorrectionRef by the caller —\r\n // we just need any node to be clickable. Wrap first word of first segment.\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n const firstWord = target.text.trim().match(/^\\S+/)?.[0] ?? target.text;\r\n const wordStart = target.text.indexOf(firstWord);\r\n wrapWord(target.node, wordStart, firstWord.length, {\r\n message: 'Grammar suggestion available — click to review',\r\n suggestions: [],\r\n type: 'grammar',\r\n offset: target.start + wordStart,\r\n });\r\n }\r\n }\r\n\r\n // Legacy: full-text style underline for improvedText\r\n if (improvedText) {\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n wrapWord(target.node, 0, target.text.length, {\r\n message: 'AI suggested improvement available',\r\n suggestions: [],\r\n type: 'style',\r\n offset: -1,\r\n improvedText,\r\n });\r\n }\r\n }\r\n\r\n // Restore cursor to saved absolute position in new tree\r\n if (savedCharOffset >= 0) {\r\n let pos = 0;\r\n let restored = false;\r\n const restoreVisit = (node: LexicalNode): void => {\r\n if (restored) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n const len = node.getTextContent().length;\r\n if (savedCharOffset <= pos + len) {\r\n const sel = $createRangeSelection();\r\n const off = savedCharOffset - pos;\r\n sel.anchor.set(node.getKey(), off, 'text');\r\n sel.focus.set(node.getKey(), off, 'text');\r\n $setSelection(sel);\r\n restored = true;\r\n return;\r\n }\r\n pos += len;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(restoreVisit);\r\n };\r\n root.getChildren().forEach((block, i) => {\r\n if (restored) return;\r\n if (i > 0) pos += 1;\r\n restoreVisit(block);\r\n });\r\n }\r\n } catch (err) {\r\n console.error('[SpellCheckPlugin] applyIssues error:', err);\r\n }\r\n },\r\n {\r\n tag: 'spell-apply',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Click → open popover ─────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n let currentRoot: HTMLElement | null = null;\r\n\r\n const onClick = (e: MouseEvent) => {\r\n const span = (e.target as HTMLElement).closest('[data-spell-offset]') as HTMLElement | null;\r\n if (!span) return;\r\n if (!currentRoot?.contains(span)) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const visit = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node)) {\r\n const meta = (node as SpellErrorNode).getMeta();\r\n if (String(meta.offset) === span.dataset.spellOffset) {\r\n const rect = span.getBoundingClientRect();\r\n setPopover({\r\n x: rect.left,\r\n y: rect.bottom + 8,\r\n issue: {\r\n offset: meta.offset,\r\n length: node.getTextContent().length,\r\n message: meta.message,\r\n suggestions: meta.suggestions,\r\n type: meta.type,\r\n },\r\n nodeKey: node.getKey(),\r\n improvedText: meta.improvedText,\r\n grammarCorrection: grammarCorrectionRef.current,\r\n });\r\n }\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n visit($getRoot());\r\n });\r\n };\r\n\r\n // registerRootListener fires immediately with current root, then again on\r\n // every root change (e.g. Panel mount gives a new contenteditable element).\r\n const unregister = editor.registerRootListener((nextRoot, prevRoot) => {\r\n // Detach from old root\r\n if (prevRoot) prevRoot.removeEventListener('click', onClick);\r\n // Attach to new root\r\n if (nextRoot) nextRoot.addEventListener('click', onClick);\r\n currentRoot = nextRoot;\r\n });\r\n\r\n return () => {\r\n unregister();\r\n if (currentRoot) currentRoot.removeEventListener('click', onClick);\r\n };\r\n }, [editor]);\r\n\r\n // ── Accept spelling suggestion ───────────────────────────────────────────\r\n\r\n const handleAccept = React.useCallback(\r\n (replacement: string, nodeKey: string) => {\r\n let original = '';\r\n editor.getEditorState().read(() => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) original = n.getTextContent();\r\n });\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) (n as SpellErrorNode).replace($createTextNode(replacement));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement,\r\n message: popover?.issue.message ?? '',\r\n type: popover?.issue.type,\r\n });\r\n },\r\n [editor, onSpellCheckAccept, popover],\r\n );\r\n\r\n // ── Ignore (remove underline, keep word) ────────────────────────────────\r\n\r\n const handleDismiss = React.useCallback(\r\n (nodeKey: string) => {\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n))\r\n (n as SpellErrorNode).replace($createTextNode(n.getTextContent()));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n setPopover(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Accept legacy improved text ──────────────────────────────────────────\r\n\r\n const handleImprove = React.useCallback(\r\n (text: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, text, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: text,\r\n message: 'Accepted improved text',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Accept grammar correction ────────────────────────────────────────────\r\n\r\n const handleAcceptGrammar = React.useCallback(\r\n (corrected: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, corrected, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: corrected,\r\n message: 'Accepted grammar correction',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Debounced API trigger ────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !useSpellCheck) return;\r\n\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (applyingRef.current) return;\r\n if (tags.has('spell-apply') || tags.has('spell-clear') || tags.has('autocomplete-ghost'))\r\n return;\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n\r\n timerRef.current = window.setTimeout(async () => {\r\n timerRef.current = null;\r\n\r\n let rawText = '';\r\n editor.getEditorState().read(() => {\r\n rawText = $getRoot().getTextContent();\r\n });\r\n const text = rawText.trim();\r\n\r\n if (!text || text === lastTextRef.current) return;\r\n\r\n dismissRef.current?.();\r\n const myId = ++reqIdRef.current;\r\n const { promise, dismiss } = useSpellCheck(text);\r\n dismissRef.current = dismiss;\r\n\r\n try {\r\n const payload = await promise;\r\n if (myId !== reqIdRef.current) return; // superseded\r\n\r\n lastTextRef.current = text;\r\n\r\n const hasContent =\r\n payload?.issues?.length || payload?.grammarCorrection || payload?.improvedText;\r\n if (!payload || !hasContent) {\r\n clearErrors();\r\n return;\r\n }\r\n\r\n grammarCorrectionRef.current = payload.grammarCorrection ?? undefined;\r\n\r\n const improved =\r\n payload.improvedText && payload.improvedText.trim() !== text\r\n ? payload.improvedText\r\n : undefined;\r\n\r\n applyIssues(payload.issues ?? [], improved, rawText.length - rawText.trimStart().length);\r\n } catch (e) {\r\n console.error('[SpellCheckPlugin] request failed:', e);\r\n lastTextRef.current = '';\r\n }\r\n }, idleMs);\r\n });\r\n }, [editor, useSpellCheck, enabled, idleMs, applyIssues, clearErrors]);\r\n\r\n // ── enabled toggle ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled) {\r\n clearErrors();\r\n lastTextRef.current = '';\r\n }\r\n }, [enabled, clearErrors]);\r\n\r\n // ── Unmount cleanup ──────────────────────────────────────────────────────\r\n\r\n React.useEffect(\r\n () => () => {\r\n dismissRef.current?.();\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n },\r\n [],\r\n );\r\n\r\n return popover ? (\r\n <SpellPopover\r\n state={popover}\r\n onAccept={handleAccept}\r\n onDismiss={handleDismiss}\r\n onClose={() => setPopover(null)}\r\n onImprove={handleImprove}\r\n onAcceptGrammar={handleAcceptGrammar}\r\n />\r\n ) : null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $insertTableColumnAtSelection,\r\n $insertTableRowAtSelection,\r\n $isTableCellNode,\r\n $isTableNode,\r\n $isTableSelection,\r\n} from '@lexical/table';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $findMatchingParent,\r\n $getSelection,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_DOWN_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n Menu,\r\n MenuDivider,\r\n MenuGroup,\r\n MenuGroupHeader,\r\n MenuItem,\r\n MenuList,\r\n MenuPopover,\r\n} from '@fluentui/react-components';\r\n\r\nimport {\r\n ArrowDownRegular,\r\n ArrowLeftRegular,\r\n ArrowRightRegular,\r\n ArrowUpRegular,\r\n ColumnTripleRegular,\r\n DeleteRegular,\r\n RowTripleRegular,\r\n} from '@fluentui/react-icons';\r\n\r\nimport './TableActionMenu.css';\r\n\r\nexport default function TableActionMenuPlugin({ disabled = false }: { disabled?: boolean }) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const [isInTable, setIsInTable] = React.useState(false);\r\n const [open, setOpen] = React.useState(false);\r\n const [menuPos, setMenuPos] = React.useState<{ x: number; y: number } | null>(null);\r\n\r\n const updateFromSelection = React.useCallback(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isTableSelection(selection)) {\r\n const tableNode = selection.getNodes().find((n) => $isTableNode(n));\r\n if (tableNode) {\r\n setIsInTable(true);\r\n return;\r\n }\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n setIsInTable(false);\r\n return;\r\n }\r\n\r\n const anchorNode = selection.anchor.getNode();\r\n const cellNode = $isTableCellNode(anchorNode)\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (n) => $isTableCellNode(n));\r\n\r\n if (!cellNode || !$isTableCellNode(cellNode)) {\r\n setIsInTable(false);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n });\r\n }, [editor]);\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateFromSelection();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerUpdateListener(() => {\r\n updateFromSelection();\r\n }),\r\n );\r\n }, [editor, updateFromSelection]);\r\n\r\n React.useEffect(() => {\r\n return editor.registerCommand<KeyboardEvent>(\r\n KEY_DOWN_COMMAND,\r\n (event) => {\r\n if (disabled) return false;\r\n\r\n const selection = $getSelection();\r\n\r\n const inTable =\r\n $isTableSelection(selection) ||\r\n ($isRangeSelection(selection) &&\r\n (() => {\r\n const node = selection.anchor.getNode();\r\n const cellNode = $isTableCellNode(node)\r\n ? node\r\n : $findMatchingParent(node, (n) => $isTableCellNode(n));\r\n return !!cellNode;\r\n })());\r\n\r\n if (!inTable) return false;\r\n\r\n if (!(event.altKey && event.shiftKey)) return false;\r\n\r\n switch (event.key) {\r\n case 'ArrowUp': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableRowAtSelection(false));\r\n return true;\r\n }\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableRowAtSelection(true));\r\n return true;\r\n }\r\n case 'ArrowLeft': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableColumnAtSelection(false));\r\n return true;\r\n }\r\n case 'ArrowRight': {\r\n event.preventDefault();\r\n editor.update(() => $insertTableColumnAtSelection(true));\r\n return true;\r\n }\r\n default:\r\n return false;\r\n }\r\n },\r\n COMMAND_PRIORITY_HIGH,\r\n );\r\n }, [editor, disabled]);\r\n\r\n React.useEffect(() => {\r\n if (!isInTable && open) setOpen(false);\r\n }, [isInTable, open]);\r\n\r\n React.useEffect(() => {\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n\r\n const handleContextMenu = (e: MouseEvent) => {\r\n if (disabled) return;\r\n\r\n let inTable = false;\r\n editor.getEditorState().read(() => {\r\n const selection = $getSelection();\r\n if ($isTableSelection(selection)) {\r\n inTable = true;\r\n return;\r\n }\r\n if ($isRangeSelection(selection)) {\r\n const node = selection.anchor.getNode();\r\n const cell = $isTableCellNode(node)\r\n ? node\r\n : $findMatchingParent(node, (n) => $isTableCellNode(n));\r\n if (cell) inTable = true;\r\n }\r\n });\r\n\r\n if (inTable) {\r\n e.preventDefault();\r\n setMenuPos({ x: e.clientX, y: e.clientY });\r\n setOpen(true);\r\n }\r\n };\r\n\r\n root.addEventListener('contextmenu', handleContextMenu);\r\n return () => root.removeEventListener('contextmenu', handleContextMenu);\r\n }, [editor, disabled]);\r\n\r\n const dangerStyle: React.CSSProperties = {\r\n color: 'var(--colorPaletteRedForeground1)',\r\n };\r\n\r\n const run = React.useCallback(\r\n (fn: () => void) => {\r\n if (disabled) return;\r\n editor.focus();\r\n editor.update(() => fn());\r\n setOpen(false);\r\n },\r\n [disabled, editor],\r\n );\r\n\r\n const insertRowBelow = () => run(() => $insertTableRowAtSelection(true));\r\n const insertRowAbove = () => run(() => $insertTableRowAtSelection(false));\r\n const insertColRight = () => run(() => $insertTableColumnAtSelection(true));\r\n const insertColLeft = () => run(() => $insertTableColumnAtSelection(false));\r\n const deleteRow = () => run(() => $deleteTableRowAtSelection());\r\n const deleteCol = () => run(() => $deleteTableColumnAtSelection());\r\n\r\n const deleteTable = () =>\r\n run(() => {\r\n const selection = $getSelection();\r\n\r\n if ($isTableSelection(selection)) {\r\n const tableNode = selection.getNodes().find((n) => $isTableNode(n));\r\n if (tableNode) tableNode.remove();\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n const node = selection.anchor.getNode();\r\n const cell =\r\n $findMatchingParent(node, (n) => $isTableCellNode(n)) ??\r\n ($isTableCellNode(node) ? node : null);\r\n\r\n if (!cell) return;\r\n\r\n const table = $getTableNodeFromLexicalNodeOrThrow(cell);\r\n table.remove();\r\n });\r\n\r\n const virtualTarget = React.useMemo(() => {\r\n if (!menuPos) return undefined;\r\n return {\r\n getBoundingClientRect: () => new DOMRect(menuPos.x, menuPos.y, 0, 0),\r\n };\r\n }, [menuPos]);\r\n\r\n if (disabled) return null;\r\n\r\n return createPortal(\r\n <Menu open={open} onOpenChange={(_, data) => setOpen(data.open)} positioning={{ target: virtualTarget }}>\r\n <MenuPopover className='aoTableActionPopover'>\r\n <MenuList>\r\n <MenuGroup>\r\n <MenuGroupHeader>Insert</MenuGroupHeader>\r\n\r\n <MenuItem icon={<RowTripleRegular />} onClick={insertRowAbove}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowUpRegular /> Row above\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ↑</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuItem icon={<RowTripleRegular />} onClick={insertRowBelow}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowDownRegular /> Row below\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ↓</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuDivider />\r\n\r\n <MenuItem icon={<ColumnTripleRegular />} onClick={insertColLeft}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowLeftRegular /> Column left\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ ←</span>\r\n </span>\r\n </MenuItem>\r\n\r\n <MenuItem icon={<ColumnTripleRegular />} onClick={insertColRight}>\r\n <span className='aoMenuRow'>\r\n <span className='aoMenuLabel'>\r\n <ArrowRightRegular /> Column right\r\n </span>\r\n <span className='aoMenuShortcut'>Alt ⇧ →</span>\r\n </span>\r\n </MenuItem>\r\n </MenuGroup>\r\n\r\n <MenuDivider />\r\n\r\n <MenuGroup>\r\n <MenuGroupHeader>Delete</MenuGroupHeader>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteRow} style={dangerStyle}>\r\n Delete row\r\n </MenuItem>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteCol} style={dangerStyle}>\r\n Delete column\r\n </MenuItem>\r\n\r\n <MenuItem icon={<DeleteRegular />} onClick={deleteTable} style={dangerStyle}>\r\n Delete table\r\n </MenuItem>\r\n </MenuGroup>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>,\r\n document.body,\r\n );\r\n}\r\n","// TableCellResizerPlugin.tsx (UPDATED)\r\n// - Adds anchorElem prop so the portal mounts INSIDE the editor wrapper (fixes bottom-left/position issues)\r\n// - Uses anchorElem for mousemove listener instead of document (scopes events, avoids weird positioning in Storybook)\r\n// - Avoids re-registering SELECTION_CHANGE_COMMAND every render (adds deps + cleanup correctly)\r\n\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getTableColumnIndexFromTableCellNode,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n $getTableRowIndexFromTableCellNode,\r\n $isTableCellNode,\r\n $isTableRowNode,\r\n getDOMCellFromTarget,\r\n getTableObserverFromTableElement,\r\n} from '@lexical/table';\r\nimport type { LexicalEditor } from 'lexical';\r\nimport {\r\n $getNearestNodeFromDOMNode,\r\n COMMAND_PRIORITY_HIGH,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport type { MouseEvent as ReactMouseEvent } from 'react';\r\nimport React, { ReactPortal, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './TableCellResizer.css';\r\n\r\ntype MousePosition = { x: number; y: number };\r\ntype MouseDraggingDirection = 'right' | 'bottom';\r\n\r\nconst MIN_ROW_HEIGHT = 33;\r\nconst MIN_COLUMN_WIDTH = 50;\r\n\r\ntype DOMCell = { elem: HTMLElement };\r\n\r\nfunction TableCellResizer({\r\n editor,\r\n anchorElem,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n}): 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\r\n const mouseStartPosRef = useRef<MousePosition | null>(null);\r\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null);\r\n\r\n const [activeCell, updateActiveCell] = useState<DOMCell | null>(null);\r\n const [isSelectingGrid, updateIsSelectingGrid] = useState<boolean>(false);\r\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(\r\n null\r\n );\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n let isGridSelection = false;\r\n\r\n const nativeSelection = window.getSelection();\r\n const anchorNode = nativeSelection?.anchorNode || null;\r\n\r\n const anchorElement =\r\n (anchorNode as any) instanceof Element\r\n ? (anchorNode as Element)\r\n : (anchorNode as Node | null)?.parentElement || null;\r\n\r\n if (anchorElement) {\r\n const cell = getDOMCellFromTarget(anchorElement as HTMLElement) as DOMCell | null;\r\n const tableEl = (cell?.elem?.closest?.('table') as HTMLTableElement | null) || null;\r\n\r\n if (tableEl) {\r\n const observer = getTableObserverFromTableElement(tableEl) as any;\r\n const tableSelection =\r\n observer?.getTableSelection?.() ?? observer?.tableSelection ?? null;\r\n isGridSelection = !!tableSelection;\r\n }\r\n }\r\n\r\n updateIsSelectingGrid((prev) => (prev !== isGridSelection ? isGridSelection : prev));\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n const resetState = useCallback(() => {\r\n updateActiveCell(null);\r\n targetRef.current = null;\r\n updateDraggingDirection(null);\r\n mouseStartPosRef.current = null;\r\n tableRectRef.current = null;\r\n updateMouseCurrentPos(null);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const onMouseMove = (event: MouseEvent) => {\r\n // If user is dragging, just update current mouse position\r\n if (draggingDirection) {\r\n updateMouseCurrentPos({ x: event.clientX, y: event.clientY });\r\n return;\r\n }\r\n\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return;\r\n\r\n if (resizerRef.current && resizerRef.current.contains(target)) return;\r\n\r\n if (targetRef.current !== target) {\r\n targetRef.current = target;\r\n\r\n const cell = getDOMCellFromTarget(target) as DOMCell | null;\r\n\r\n if (cell && activeCell !== cell) {\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem);\r\n if (!tableCellNode) {\r\n resetState();\r\n return;\r\n }\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableElement = editor.getElementByKey(tableNode.getKey());\r\n\r\n if (!tableElement) {\r\n resetState();\r\n return;\r\n }\r\n\r\n tableRectRef.current = tableElement.getBoundingClientRect();\r\n updateActiveCell(cell);\r\n });\r\n } else if (cell == null) {\r\n resetState();\r\n }\r\n }\r\n };\r\n\r\n anchorElem.addEventListener('mousemove', onMouseMove);\r\n\r\n const onLeave = () => {\r\n if (!draggingDirection) resetState();\r\n };\r\n anchorElem.addEventListener('mouseleave', onLeave);\r\n\r\n return () => {\r\n anchorElem.removeEventListener('mousemove', onMouseMove);\r\n anchorElem.removeEventListener('mouseleave', onLeave);\r\n };\r\n }, [activeCell, draggingDirection, editor, resetState, anchorElem]);\r\n\r\n const isHeightChanging = (direction: MouseDraggingDirection) => direction === 'bottom';\r\n\r\n const updateRowHeight = useCallback(\r\n (newHeight: number) => {\r\n if (!activeCell) return;\r\n\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) return;\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) return;\r\n\r\n const tableRow = tableRows[tableRowIndex];\r\n if (!$isTableRowNode(tableRow)) return;\r\n\r\n tableRow.setHeight(newHeight);\r\n });\r\n },\r\n [activeCell, editor]\r\n );\r\n\r\n const updateColumnWidth = useCallback(\r\n (newWidth: number) => {\r\n if (!activeCell) return;\r\n\r\n editor.update(() => {\r\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem);\r\n if (!$isTableCellNode(tableCellNode)) return;\r\n\r\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\r\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode);\r\n const tableRows = tableNode.getChildren();\r\n\r\n for (let r = 0; r < tableRows.length; r++) {\r\n const tableRow = tableRows[r];\r\n if (!$isTableRowNode(tableRow)) continue;\r\n\r\n const tableCells = tableRow.getChildren();\r\n if (tableColumnIndex >= tableCells.length || tableColumnIndex < 0) continue;\r\n\r\n const tableCell = tableCells[tableColumnIndex];\r\n if (!$isTableCellNode(tableCell)) continue;\r\n\r\n tableCell.setWidth(newWidth);\r\n }\r\n });\r\n },\r\n [activeCell, editor]\r\n );\r\n\r\n const toggleResize = useCallback(\r\n (direction: MouseDraggingDirection) => (event: ReactMouseEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!activeCell) return;\r\n\r\n if (draggingDirection === direction && mouseStartPosRef.current) {\r\n const { x, y } = mouseStartPosRef.current;\r\n const { height, width } = activeCell.elem.getBoundingClientRect();\r\n\r\n if (isHeightChanging(direction)) {\r\n const heightChange = Math.abs(event.clientY - y);\r\n const isShrinking = direction === 'bottom' && y > event.clientY;\r\n\r\n updateRowHeight(\r\n Math.max(isShrinking ? height - heightChange : height + heightChange, MIN_ROW_HEIGHT)\r\n );\r\n } else {\r\n const widthChange = Math.abs(event.clientX - x);\r\n const isShrinking = direction === 'right' && x > event.clientX;\r\n\r\n updateColumnWidth(\r\n Math.max(isShrinking ? width - widthChange : width + widthChange, MIN_COLUMN_WIDTH)\r\n );\r\n }\r\n\r\n resetState();\r\n return;\r\n }\r\n\r\n // start drag\r\n const start = { x: event.clientX, y: event.clientY };\r\n mouseStartPosRef.current = start;\r\n updateMouseCurrentPos(start);\r\n updateDraggingDirection(direction);\r\n },\r\n [activeCell, draggingDirection, resetState, updateColumnWidth, updateRowHeight]\r\n );\r\n\r\n const getResizers = useCallback(() => {\r\n type ResizerStyles = Record<MouseDraggingDirection, React.CSSProperties>;\r\n\r\n const empty: ResizerStyles = { bottom: {}, right: {} };\r\n\r\n if (!activeCell) return empty;\r\n\r\n const cellRect = activeCell.elem.getBoundingClientRect();\r\n const anchorRect = anchorElem.getBoundingClientRect();\r\n\r\n const baseTop = cellRect.top - anchorRect.top + anchorElem.scrollTop;\r\n const baseLeft = cellRect.left - anchorRect.left + anchorElem.scrollLeft;\r\n\r\n const styles: ResizerStyles = {\r\n bottom: {\r\n backgroundColor: 'transparent',\r\n cursor: 'row-resize',\r\n height: '10px',\r\n left: `${baseLeft}px`,\r\n top: `${baseTop + cellRect.height}px`,\r\n width: `${cellRect.width}px`,\r\n position: 'absolute',\r\n },\r\n right: {\r\n backgroundColor: 'transparent',\r\n cursor: 'col-resize',\r\n height: `${cellRect.height}px`,\r\n left: `${baseLeft + cellRect.width}px`,\r\n top: `${baseTop}px`,\r\n width: '10px',\r\n position: 'absolute',\r\n },\r\n };\r\n\r\n const tableRect = tableRectRef.current;\r\n\r\n if (draggingDirection && mouseCurrentPos && tableRect) {\r\n const mouseX = mouseCurrentPos.x - anchorRect.left + anchorElem.scrollLeft;\r\n const mouseY = mouseCurrentPos.y - anchorRect.top + anchorElem.scrollTop;\r\n\r\n const tableLeft = tableRect.left - anchorRect.left + anchorElem.scrollLeft;\r\n const tableTop = tableRect.top - anchorRect.top + anchorElem.scrollTop;\r\n\r\n if (isHeightChanging(draggingDirection)) {\r\n styles.bottom.left = `${tableLeft}px`;\r\n styles.bottom.top = `${mouseY}px`;\r\n styles.bottom.height = '3px';\r\n styles.bottom.width = `${tableRect.width}px`;\r\n styles.bottom.backgroundColor = '#adf';\r\n } else {\r\n styles.right.top = `${tableTop}px`;\r\n styles.right.left = `${mouseX}px`;\r\n styles.right.width = '3px';\r\n styles.right.height = `${tableRect.height}px`;\r\n styles.right.backgroundColor = '#adf';\r\n }\r\n }\r\n\r\n return styles;\r\n }, [activeCell, draggingDirection, mouseCurrentPos, anchorElem]);\r\n\r\n const resizerStyles = getResizers();\r\n\r\n return (\r\n <div ref={resizerRef}>\r\n {activeCell != null && !isSelectingGrid && (\r\n <>\r\n <div\r\n className='TableCellResizer__resizer TableCellResizer__ui'\r\n style={resizerStyles.right}\r\n onMouseDown={toggleResize('right')}\r\n onMouseUp={toggleResize('right')}\r\n />\r\n <div\r\n className='TableCellResizer__resizer TableCellResizer__ui'\r\n style={resizerStyles.bottom}\r\n onMouseDown={toggleResize('bottom')}\r\n onMouseUp={toggleResize('bottom')}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function TableCellResizerPlugin({\r\n anchorElem,\r\n}: {\r\n anchorElem: HTMLElement;\r\n}): ReactPortal {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n return useMemo(\r\n () => createPortal(<TableCellResizer editor={editor} anchorElem={anchorElem} />, anchorElem),\r\n [editor, anchorElem]\r\n );\r\n}\r\n","import { ContentEditorLevel } from '../ContentEditorComponent.types';\r\n\r\nexport enum RichTextPluginsType {\r\n Undo = 'undo', //\r\n Redo = 'redo', //\r\n Bold = 'bold',\r\n Italic = 'italic',\r\n Underline = 'underline',\r\n Link = 'link',\r\n Strikethrough = 'strike',\r\n Superscript = 'superscript',\r\n Subscript = 'subscript',\r\n Highlight = 'highlight',\r\n Code = 'code', //\r\n LeftAlign = 'leftAlign',\r\n CenterAlign = 'centerAlign',\r\n RightAlign = 'rightAlign',\r\n JustifyAlign = 'justifyAlign',\r\n Divider = 'divider', //\r\n Lowercase = 'lowercase',\r\n Uppercase = 'uppercase',\r\n Capitalize = 'capitalize',\r\n}\r\n\r\nexport const HEADING_OPTION = [\r\n { key: 'h1', text: 'Heading 1' },\r\n { key: 'h2', text: 'Heading 2' },\r\n { key: 'h3', text: 'Heading 3' },\r\n { key: 'h4', text: 'Heading 4' },\r\n { key: 'h5', text: 'Heading 5' },\r\n { key: 'h6', text: 'Heading 6' },\r\n];\r\n\r\nexport const LOW_PRIORIRTY = 1;\r\n\r\nexport interface IEditorProps {\r\n readOnly?: boolean;\r\n level: ContentEditorLevel;\r\n}\r\n","import { ContentEditorLevel } from '../ContentEditorComponent.types';\r\n\r\nexport function getToolbarGroupsByLevel(level: ContentEditorLevel): string[][] {\r\n switch (level) {\r\n case ContentEditorLevel.None:\r\n return [];\r\n\r\n case ContentEditorLevel.Basic:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Link', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n\r\n case ContentEditorLevel.Standard:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Link', 'Table', '|'],\r\n // ['Image', 'Youtube', 'InlineImage', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n\r\n case ContentEditorLevel.Pro:\r\n default:\r\n return [\r\n // ['undo', 'redo', '|'],\r\n ['Bold', 'Italic', 'Underline', '|'],\r\n ['ColorPicker', '|'],\r\n ['Link', 'Table', '|'],\r\n // ['CodeBlock', '|'],\r\n ['Image', 'Youtube', 'InlineImage', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align'],\r\n ];\r\n }\r\n}","import { $setBlocksType } from '@lexical/selection';\r\nimport { $createParagraphNode, $getSelection, LexicalEditor } from \"lexical\";\r\n\r\nexport const getSelectedBtnProps = (isSelected: boolean) =>\r\n isSelected\r\n ? {\r\n colorScheme: \"blue\",\r\n variant: \"solid\",\r\n }\r\n : { color: \"#444\" };\r\n\r\nexport enum UpdateFontSizeType {\r\n increment = 1,\r\n decrement,\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\nexport const fontSize = `${DEFAULT_FONT_SIZE}px`;\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\nconst addListener = (element: HTMLElement, cb: Listener): () => void => {\r\n let elementValues = elements.get(element);\r\n if (elementValues === undefined) {\r\n const listeners: any = 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\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n });\r\n};","import { Callout, DefaultButton, Stack, TextField } from '@fluentui/react';\r\nimport { Button } from '@fluentui/react-components';\r\nimport * as React from 'react';\r\nimport './ColorPickerComponent.css';\r\n\r\ntype Props = {\r\n value: string;\r\n title: string;\r\n disabled?: boolean;\r\n icon: any;\r\n onChange: (hex: string) => void;\r\n};\r\n\r\nconst PRESET = [\r\n '#000000',\r\n '#434343',\r\n '#666666',\r\n '#999999',\r\n '#b7b7b7',\r\n '#cccccc',\r\n '#d9d9d9',\r\n '#ffffff',\r\n\r\n '#980000',\r\n '#ff0000',\r\n '#ff9900',\r\n '#ffff00',\r\n '#00ff00',\r\n '#00ffff',\r\n '#4a86e8',\r\n '#0000ff',\r\n '#9900ff',\r\n '#ff00ff',\r\n];\r\n\r\nconst clamp = (v: number, min: number, max: number) => Math.min(max, Math.max(min, v));\r\n\r\nconst normalizeHex = (v: string) => {\r\n let s = (v ?? '').trim();\r\n if (!s) return '#000000';\r\n if (!s.startsWith('#')) s = `#${s}`;\r\n if (s.length === 4 || s.length === 7) return s;\r\n return '#000000';\r\n};\r\n\r\nconst hexToRgb = (hex: string) => {\r\n const h = normalizeHex(hex).replace('#', '');\r\n if (h.length === 3) {\r\n const r = parseInt(h[0] + h[0], 16);\r\n const g = parseInt(h[1] + h[1], 16);\r\n const b = parseInt(h[2] + h[2], 16);\r\n return { r, g, b };\r\n }\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return { r, g, b };\r\n};\r\n\r\nconst rgbToHex = (r: number, g: number, b: number) =>\r\n `#${[r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('')}`;\r\n\r\nconst rgbToHsv = (r: number, g: number, b: number) => {\r\n const rr = r / 255,\r\n gg = g / 255,\r\n bb = b / 255;\r\n const max = Math.max(rr, gg, bb),\r\n min = Math.min(rr, gg, bb);\r\n const d = max - min;\r\n\r\n let h = 0;\r\n if (d !== 0) {\r\n if (max === rr) h = ((gg - bb) / d) % 6;\r\n else if (max === gg) h = (bb - rr) / d + 2;\r\n else h = (rr - gg) / d + 4;\r\n h *= 60;\r\n if (h < 0) h += 360;\r\n }\r\n\r\n const s = max === 0 ? 0 : d / max;\r\n const v = max;\r\n\r\n return { h, s, v };\r\n};\r\n\r\nconst hsvToRgb = (h: number, s: number, v: number) => {\r\n const c = v * s;\r\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\r\n const m = v - c;\r\n\r\n let rr = 0,\r\n gg = 0,\r\n bb = 0;\r\n if (h < 60) [rr, gg, bb] = [c, x, 0];\r\n else if (h < 120) [rr, gg, bb] = [x, c, 0];\r\n else if (h < 180) [rr, gg, bb] = [0, c, x];\r\n else if (h < 240) [rr, gg, bb] = [0, x, c];\r\n else if (h < 300) [rr, gg, bb] = [x, 0, c];\r\n else [rr, gg, bb] = [c, 0, x];\r\n\r\n return {\r\n r: Math.round((rr + m) * 255),\r\n g: Math.round((gg + m) * 255),\r\n b: Math.round((bb + m) * 255),\r\n };\r\n};\r\n\r\nfunction useDrag(onMove: (clientX: number, clientY: number) => void, onEnd?: () => void) {\r\n const draggingRef = React.useRef(false);\r\n\r\n const start = React.useCallback(\r\n (e: React.MouseEvent) => {\r\n draggingRef.current = true;\r\n onMove(e.clientX, e.clientY);\r\n\r\n const move = (ev: MouseEvent) => {\r\n if (!draggingRef.current) return;\r\n onMove(ev.clientX, ev.clientY);\r\n };\r\n const up = () => {\r\n draggingRef.current = false;\r\n window.removeEventListener('mousemove', move);\r\n window.removeEventListener('mouseup', up);\r\n onEnd?.();\r\n };\r\n\r\n window.addEventListener('mousemove', move);\r\n window.addEventListener('mouseup', up);\r\n },\r\n [onMove, onEnd],\r\n );\r\n\r\n return start;\r\n}\r\n\r\nexport const ColorPickerControl = ({ value, title, disabled, onChange, icon }: Props) => {\r\n const [open, setOpen] = React.useState(false);\r\n const btnRef = React.useRef<HTMLDivElement | null>(null);\r\n\r\n const [hex, setHex] = React.useState<string>(normalizeHex(value || '#000000'));\r\n\r\n const { r, g, b } = React.useMemo(() => hexToRgb(hex), [hex]);\r\n const hsv = React.useMemo(() => rgbToHsv(r, g, b), [r, g, b]);\r\n\r\n const [h, setH] = React.useState(hsv.h);\r\n const [s, setS] = React.useState(hsv.s);\r\n const [v, setV] = React.useState(hsv.v);\r\n\r\n React.useEffect(() => {\r\n const n = normalizeHex(value || '#000000');\r\n setHex(n);\r\n const rgb = hexToRgb(n);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n }, [value]);\r\n\r\n const commitHsv = React.useCallback(\r\n (hh: number, ss: number, vv: number, close?: boolean) => {\r\n const rgb = hsvToRgb(hh, ss, vv);\r\n const nextHex = rgbToHex(rgb.r, rgb.g, rgb.b);\r\n setHex(nextHex);\r\n onChange(nextHex);\r\n if (close) setOpen(false);\r\n },\r\n [onChange],\r\n );\r\n\r\n const svRef = React.useRef<HTMLDivElement | null>(null);\r\n const onSVMove = React.useCallback(\r\n (clientX: number, clientY: number) => {\r\n if (!svRef.current) return;\r\n const rect = svRef.current.getBoundingClientRect();\r\n const x = clamp(clientX - rect.left, 0, rect.width);\r\n const y = clamp(clientY - rect.top, 0, rect.height);\r\n const ss = rect.width === 0 ? 0 : x / rect.width;\r\n const vv = rect.height === 0 ? 0 : 1 - y / rect.height;\r\n setS(ss);\r\n setV(vv);\r\n commitHsv(h, ss, vv);\r\n },\r\n [h, commitHsv],\r\n );\r\n const startSV = useDrag(onSVMove);\r\n\r\n const hueRef = React.useRef<HTMLDivElement | null>(null);\r\n const onHueMove = React.useCallback(\r\n (clientX: number) => {\r\n if (!hueRef.current) return;\r\n const rect = hueRef.current.getBoundingClientRect();\r\n const x = clamp(clientX - rect.left, 0, rect.width);\r\n const hh = rect.width === 0 ? 0 : (x / rect.width) * 360;\r\n setH(hh);\r\n commitHsv(hh, s, v);\r\n },\r\n [s, v, commitHsv],\r\n );\r\n const startHue = useDrag((x) => onHueMove(x));\r\n\r\n const svThumb = React.useMemo(() => ({ left: `${s * 100}%`, top: `${(1 - v) * 100}%` }), [s, v]);\r\n const hueThumb = React.useMemo(() => ({ left: `${(h / 360) * 100}%` }), [h]);\r\n\r\n const hueColor = React.useMemo(() => {\r\n const { r, g, b } = hsvToRgb(h, 1, 1);\r\n return rgbToHex(r, g, b);\r\n }, [h]);\r\n\r\n return (\r\n <div ref={btnRef} style={{ position: 'relative', display: 'inline-block' }}>\r\n <Button\r\n size='small'\r\n icon={icon}\r\n value={title}\r\n title={title}\r\n disabled={disabled}\r\n style={{\r\n background: open ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n paddingBottom: 6,\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setOpen((p) => !p);\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n bottom: 5,\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n width: 14,\r\n height: 3,\r\n background: hex,\r\n borderRadius: 1,\r\n border: '0.5px solid rgba(0,0,0,0.18)',\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n\r\n {open && !disabled && (\r\n <Callout\r\n target={btnRef}\r\n onDismiss={() => setOpen(false)}\r\n setInitialFocus\r\n directionalHint={4}\r\n className='aoColorCallout'>\r\n <Stack tokens={{ childrenGap: 10 }} styles={{ root: { padding: 12, width: 320 } }}>\r\n <div className='aoLexRow'>\r\n <div className='aoLexSwatch' style={{ background: hex }} />\r\n <div className='aoLexTitle'>{title}</div>\r\n </div>\r\n\r\n <div className='aoLexRow'>\r\n <div className='aoLexLabel'>Hex</div>\r\n <TextField\r\n value={hex}\r\n onChange={(_, val) => setHex(normalizeHex(val || ''))}\r\n onBlur={() => {\r\n const n = normalizeHex(hex);\r\n setHex(n);\r\n const rgb = hexToRgb(n);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n onChange(n);\r\n }}\r\n />\r\n </div>\r\n\r\n <div className='aoLexSwatches'>\r\n {PRESET.map((c) => (\r\n <button\r\n key={c}\r\n type='button'\r\n className='aoLexSwatchBtn'\r\n style={{ background: c }}\r\n onClick={() => {\r\n setHex(c);\r\n const rgb = hexToRgb(c);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n onChange(c);\r\n }}\r\n title={c}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className='aoLexSV' ref={svRef} onMouseDown={startSV}>\r\n <div className='aoLexSVHue' style={{ background: hueColor }} />\r\n <div className='aoLexSVWhite' />\r\n <div className='aoLexSVBlack' />\r\n <div className='aoLexSVThumb' style={svThumb} />\r\n </div>\r\n\r\n <div className='aoLexHue' ref={hueRef} onMouseDown={startHue}>\r\n <div className='aoLexHueThumb' style={hueThumb} />\r\n </div>\r\n\r\n <div className='aoLexPreview' style={{ background: hex }} />\r\n\r\n <div className='aoLexActions'>\r\n <DefaultButton\r\n text='Apply'\r\n onClick={() => {\r\n commitHsv(h, s, v, true);\r\n }}\r\n />\r\n <DefaultButton text='Close' onClick={() => setOpen(false)} />\r\n </div>\r\n </Stack>\r\n </Callout>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { PaintBucket16Filled, TextColorRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n SELECTION_CHANGE_COMMAND,\r\n type RangeSelection,\r\n} from 'lexical';\r\nimport React from 'react';\r\nimport { ColorPickerControl } from '../Nodes/ColorPickerComponent';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\n\r\nexport const ColorPickerPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [{ color, bgColor }, setColors] = React.useState({ color: '#000000', bgColor: '#ffffff' });\r\n\r\n const lastRangeSelectionRef = React.useRef<RangeSelection | null>(null);\r\n\r\n const updateToolbar = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n lastRangeSelectionRef.current = selection.clone();\r\n\r\n const c = $getSelectionStyleValueForProperty(selection, 'color', '#000000');\r\n const bg = $getSelectionStyleValueForProperty(selection, 'background-color', '#ffffff');\r\n setColors({ color: c, bgColor: bg });\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar());\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbar();\r\n return false;\r\n },\r\n LOW_PRIORIRTY\r\n )\r\n );\r\n }, [editor]);\r\n\r\n const applyStyle = (args: { property: 'background-color' | 'color'; color: string }) => {\r\n if (disabled) return;\r\n\r\n editor.focus();\r\n\r\n editor.update(() => {\r\n const saved = lastRangeSelectionRef.current;\r\n if (saved) {\r\n $setSelection(saved.clone());\r\n }\r\n\r\n const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n $patchStyleText(selection, { [args.property]: args.color });\r\n }\r\n });\r\n };\r\n\r\n const containerStyle: React.CSSProperties = disabled\r\n ? {\r\n display: 'flex',\r\n gap: 6,\r\n alignItems: 'center',\r\n opacity: 0.55,\r\n cursor: 'not-allowed',\r\n pointerEvents: 'none',\r\n filter: 'grayscale(0.25)',\r\n }\r\n : {\r\n display: 'flex',\r\n gap: 6,\r\n alignItems: 'center',\r\n };\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n return (\r\n <Stack horizontal verticalAlign='center' style={containerStyle}>\r\n <ColorPickerControl\r\n value={color}\r\n title='Text color'\r\n disabled={disabled}\r\n icon={<TextColorRegular style={{ color: iconColor }} />}\r\n onChange={(c) => applyStyle({ property: 'color', color: c })}\r\n />\r\n\r\n <ColorPickerControl\r\n value={bgColor}\r\n title='Background color'\r\n disabled={disabled}\r\n icon={<PaintBucket16Filled style={{ color: iconColor }} />}\r\n onChange={(c) => applyStyle({ property: 'background-color', color: c })}\r\n />\r\n </Stack>\r\n );\r\n};\r\n","import { Dropdown, makeStyles, Option } from '@fluentui/react-components';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport { $getSelection, $isRangeSelection, SELECTION_CHANGE_COMMAND } from 'lexical';\r\nimport { useCallback, useEffect, useState } from 'react';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\n\r\nconst useStyles = makeStyles({\r\n fontFamily: {\r\n border: 'none',\r\n minInlineSize: '70px',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nconst FONT_FAMILY_OPTIONS: [string, string][] = [\r\n ['Arial', 'Arial'],\r\n ['Courier New', 'Courier'],\r\n ['Comic Sans MS', 'Comic'],\r\n ['Georgia', 'Georgia'],\r\n ['Times New Roman', 'Times'],\r\n ['Verdana', 'Verdana'],\r\n ['Lucida Serif', 'Lucida'],\r\n ['Trebuchet MS', 'Trebuchet'],\r\n ['Tahoma', 'Tahoma'],\r\n];\r\n\r\nexport const FontFamilyPlugin = ({ disabled = false }: { disabled?: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const styles = useStyles();\r\n\r\n const [fontFamily, setFontFamily] = useState<string>('');\r\n\r\n const fg = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n useEffect(() => {\r\n const readFontFamily = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const raw = $getSelectionStyleValueForProperty(selection, 'font-family', '');\r\n setFontFamily(raw.replace(/['\"]/g, '').trim());\r\n }\r\n };\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(readFontFamily);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n readFontFamily();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n const handleClick = useCallback(\r\n (option: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (selection) {\r\n $patchStyleText(selection, {\r\n ['font-family']: option,\r\n });\r\n }\r\n });\r\n },\r\n [editor, disabled],\r\n );\r\n\r\n return (\r\n <Dropdown\r\n disabled={disabled}\r\n key='font-family'\r\n id='font-family-option'\r\n placeholder='Style'\r\n value={fontFamily}\r\n selectedOptions={fontFamily ? [fontFamily] : []}\r\n className={styles.fontFamily}\r\n style={{\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n button={{\r\n style: {\r\n color: fg,\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n },\r\n }}\r\n expandIcon={{ style: { color: fg } }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as string;\r\n if (val) handleClick(val);\r\n }}>\r\n {FONT_FAMILY_OPTIONS.map(([option, text]) => (\r\n <Option key={option} value={option} text={option}>\r\n <span style={{ fontFamily: option }}>{option}</span>\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { Dropdown, makeStyles, Option } from '@fluentui/react-components';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport { $getSelection, $isRangeSelection, SELECTION_CHANGE_COMMAND } from 'lexical';\r\nimport * as React from 'react';\r\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\r\nimport { DEFAULT_FONT_SIZE } from '../Utils/Index';\r\n\r\nconst FONT_SIZE_OPTIONS = [\r\n '8',\r\n '9',\r\n '10',\r\n '11',\r\n '12',\r\n '13',\r\n '14',\r\n '15',\r\n '16',\r\n '17',\r\n '18',\r\n '19',\r\n '20',\r\n '21',\r\n '22',\r\n '23',\r\n '24',\r\n '25',\r\n '26',\r\n '27',\r\n '28',\r\n '29',\r\n '30',\r\n '31',\r\n '32',\r\n '36',\r\n '40',\r\n '42',\r\n '46',\r\n '48',\r\n '50',\r\n '52',\r\n '54',\r\n '56',\r\n '58',\r\n '60',\r\n '62',\r\n '64',\r\n '66',\r\n '67',\r\n '68',\r\n '70',\r\n '72',\r\n '74',\r\n '76',\r\n];\r\n\r\nconst useStyles = makeStyles({\r\n dropdown: {\r\n minInlineSize: '50px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\nexport const FontSizePlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const styles = useStyles();\r\n\r\n const [fontSize, setFontSize] = React.useState<string>(String(DEFAULT_FONT_SIZE));\r\n\r\n const fg = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n React.useEffect(() => {\r\n const readFontSize = () => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const raw = $getSelectionStyleValueForProperty(\r\n selection,\r\n 'font-size',\r\n `${DEFAULT_FONT_SIZE}px`,\r\n );\r\n const numeric = raw.replace('px', '').trim();\r\n if (numeric) setFontSize(numeric);\r\n }\r\n };\r\n\r\n return mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(readFontSize);\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n readFontSize();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n }, [editor]);\r\n\r\n const updateFontSizeInSelection = (newFontSizePx: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (selection) {\r\n $patchStyleText(selection, { 'font-size': `${newFontSizePx}px` });\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <Stack horizontal tokens={{ childrenGap: 4 }}>\r\n <Dropdown\r\n key='fontsize'\r\n value={fontSize}\r\n selectedOptions={[fontSize]}\r\n disabled={disabled}\r\n className={styles.dropdown}\r\n style={{\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n button={{\r\n style: {\r\n color: fg,\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n },\r\n }}\r\n expandIcon={{ style: { color: fg } }}\r\n onOptionSelect={(_, o) => {\r\n if (disabled) return;\r\n const v = String(o.optionValue ?? '');\r\n if (!v) return;\r\n\r\n setFontSize(v);\r\n updateFontSizeInSelection(v);\r\n }}\r\n listbox={{\r\n style: {\r\n minInlineSize: '100px',\r\n color: '#707070',\r\n },\r\n }}>\r\n <Stack style={{ maxHeight: 250, overflowY: 'auto' }}>\r\n {FONT_SIZE_OPTIONS.map((size) => (\r\n <Option key={size} value={size} text={size}>\r\n {size} px\r\n </Option>\r\n ))}\r\n </Stack>\r\n </Dropdown>\r\n </Stack>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { LinkAddRegular } from '@fluentui/react-icons';\r\nimport { $createLinkNode } from '@lexical/link';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $getSelection, $isRangeSelection, TextNode } from 'lexical';\r\nimport { useState } from 'react';\r\n\r\nexport const InsertLinkPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [text, setText] = useState('');\r\n const [link, setLink] = useState('');\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const insertLink = (text: string, link: string) => {\r\n if (disabled) return;\r\n\r\n editor.update(() => {\r\n setText('');\r\n setLink('');\r\n\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const textNode = new TextNode(text);\r\n const linkNode = $createLinkNode(link.startsWith('http') ? link : `https://${link}`);\r\n linkNode.append(textNode);\r\n selection.insertNodes([linkNode]);\r\n }\r\n\r\n setIsOpen(false);\r\n });\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add link'\r\n key='upload-link'\r\n disabled={disabled}\r\n icon={<LinkAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (!disabled) setIsOpen((prev) => !prev);\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='Text' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={text}\r\n appearance='underline'\r\n placeholder='Text'\r\n disabled={disabled}\r\n onChange={(_, v) => setText(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Link' orientation='horizontal' size='small'>\r\n <Input\r\n value={link}\r\n appearance='underline'\r\n placeholder='Link'\r\n disabled={disabled}\r\n onChange={(_, v) => setLink(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n disabled={disabled || !text || !link}\r\n onClick={() => insertLink(text, link)}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { TableAddRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $createTableNodeWithDimensions } from '@lexical/table';\r\nimport { $insertNodeToNearestRoot } from '@lexical/utils';\r\nimport { useState } from 'react';\r\n\r\nexport const TableItemPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [columns, setColumns] = useState('');\r\n const [rows, setRows] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const onAddTable = () => {\r\n if (disabled) return;\r\n\r\n const row = Number(rows);\r\n const col = Number(columns);\r\n if (!row || !col) return;\r\n\r\n editor.update(() => {\r\n const tableNode = $createTableNodeWithDimensions(row, col, true);\r\n $insertNodeToNearestRoot(tableNode);\r\n });\r\n\r\n setRows('');\r\n setColumns('');\r\n setIsOpen(false);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n title='Add table'\r\n disabled={disabled}\r\n key='insert-table-nodes'\r\n icon={<TableAddRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setRows('');\r\n setColumns('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='Rows' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setRows(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Columns' orientation='horizontal' size='small'>\r\n <Input\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setColumns(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button\r\n size='small'\r\n appearance='primary'\r\n disabled={disabled || !rows || !columns}\r\n onClick={onAddTable}>\r\n Add\r\n </Button>\r\n\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n} from '@fluentui/react-components';\r\nimport { VideoClipRegular } from '@fluentui/react-icons';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $insertNodes } from 'lexical';\r\nimport { useState } from 'react';\r\nimport { $createYouTubeNode } from '../Nodes/YoutubeNode';\r\n\r\nexport const YoutubeUploadPlugin = ({ disabled }: { disabled: boolean }) => {\r\n const [url, setURL] = useState('');\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#424242';\r\n\r\n const onHandleEmbeded = () => {\r\n if (disabled) return;\r\n if (!url) return;\r\n\r\n const match = /^.*(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;\r\n if (!id) return;\r\n\r\n editor.update(() => {\r\n const node = $createYouTubeNode(id);\r\n $insertNodes([node]);\r\n });\r\n\r\n setURL('');\r\n setIsOpen(false);\r\n };\r\n\r\n return (\r\n <Popover\r\n trapFocus\r\n withArrow\r\n open={disabled ? false : isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!disabled) setIsOpen(data.open);\r\n }}>\r\n <PopoverTrigger disableButtonEnhancement>\r\n <Button\r\n key='upload-video'\r\n title='Add youtube URL'\r\n size='small'\r\n disabled={disabled}\r\n icon={<VideoClipRegular style={{ color: iconColor }} />}\r\n style={{\r\n background: isOpen && !disabled ? '#ebebeb' : 'none',\r\n border: 'none',\r\n margin: 2,\r\n opacity: disabled ? 0.55 : 1,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n }}\r\n onClick={() => {\r\n if (disabled) return;\r\n setIsOpen((prev) => !prev);\r\n setURL('');\r\n }}\r\n />\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface\r\n style={{\r\n width: '270px',\r\n opacity: disabled ? 0.6 : 1,\r\n pointerEvents: disabled ? 'none' : 'auto',\r\n }}>\r\n <Stack tokens={{ childrenGap: 10 }}>\r\n <Field label='URL' orientation='horizontal' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n disabled={disabled}\r\n value={url}\r\n appearance='underline'\r\n placeholder='Add Youtube video URL'\r\n onChange={(_, v) => setURL(v.value)}\r\n />\r\n </Field>\r\n\r\n <Stack horizontal horizontalAlign='end' tokens={{ childrenGap: 6 }}>\r\n <Button size='small' disabled={disabled || !url} onClick={onHandleEmbeded}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={() => setIsOpen(false)}>\r\n Cancel\r\n </Button>\r\n </Stack>\r\n </Stack>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n","import { Stack, useTheme } from '@fluentui/react';\r\nimport { Button, Dropdown, makeStyles, Option, ToolbarDivider } from '@fluentui/react-components';\r\nimport {\r\n CommentQuoteRegular,\r\n DeleteRegular,\r\n DocumentPageBreakRegular,\r\n HighlightAccentFilled,\r\n TextAlignCenterFilled,\r\n TextAlignJustifyFilled,\r\n TextAlignLeftFilled,\r\n TextAlignRightFilled,\r\n TextBold24Regular,\r\n TextBulletListLtrFilled,\r\n TextCaseLowercaseFilled,\r\n TextCaseTitleFilled,\r\n TextCaseUppercaseFilled,\r\n TextItalicFilled,\r\n TextNumberListLtrFilled,\r\n TextStrikethroughFilled,\r\n TextSubscriptFilled,\r\n TextSuperscriptFilled,\r\n TextUnderlineFilled,\r\n} from '@fluentui/react-icons';\r\nimport {\r\n $isListNode,\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n ListNode,\r\n REMOVE_LIST_COMMAND,\r\n} from '@lexical/list';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createHeadingNode,\r\n $createQuoteNode,\r\n $isHeadingNode,\r\n HeadingTagType,\r\n} from '@lexical/rich-text';\r\nimport { $setBlocksType } from '@lexical/selection';\r\nimport { $getNearestNodeOfType, mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n REDO_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport React, { useMemo, useState } from 'react';\r\nimport {\r\n HEADING_OPTION,\r\n IEditorProps,\r\n LOW_PRIORIRTY,\r\n RichTextPluginsType,\r\n} from '../Types/EditorType';\r\nimport { getToolbarGroupsByLevel } from '../Utils/editorLevel';\r\nimport { formatParagraph } from '../Utils/Index';\r\nimport { ColorPickerPlugin } from './ColorBar';\r\nimport { FontFamilyPlugin } from './FontFamily';\r\nimport { FontSizePlugin } from './FontSize';\r\nimport { InsertImageDialog } from './ImagePlugin';\r\nimport { InsertInlineImageDialog } from './InlineImage';\r\nimport { InsertLinkPlugin } from './InsertLink';\r\nimport { INSERT_PAGE_BREAK } from './PageBreak';\r\nimport { TableItemPlugin } from './Table';\r\nimport { YoutubeUploadPlugin } from './Youtube';\r\n\r\nconst useStyles = makeStyles({\r\n dropdown: {\r\n minInlineSize: '90px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n alignDropdown: {\r\n minInlineSize: '70px',\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n },\r\n});\r\n\r\n/**\r\n * Toolbar token type = strings you already use in enabledPlugins.\r\n */\r\ntype ToolbarToken =\r\n | '|'\r\n | 'Bold'\r\n | 'Italic'\r\n | 'Underline'\r\n | 'ColorPicker'\r\n | 'Link'\r\n | 'Table'\r\n | 'Image'\r\n | 'InlineImage'\r\n | 'Youtube'\r\n | 'Heading'\r\n | 'FontFamily'\r\n | 'FontSize'\r\n | 'Decorators'\r\n | 'CodeBlock'\r\n | 'Align';\r\n\r\nconst ALLOWED_TOKENS: Record<ToolbarToken, true> = {\r\n '|': true,\r\n Bold: true,\r\n Italic: true,\r\n Underline: true,\r\n ColorPicker: true,\r\n Link: true,\r\n Table: true,\r\n Image: true,\r\n InlineImage: true,\r\n Youtube: true,\r\n Heading: true,\r\n FontFamily: true,\r\n FontSize: true,\r\n Decorators: true,\r\n CodeBlock: true,\r\n Align: true,\r\n};\r\n\r\n/**\r\n * Utility: sanitize pluginGroups to avoid unknown tokens, and normalize separators.\r\n */\r\nfunction sanitizePluginGroups(groups?: string[][]): ToolbarToken[][] {\r\n if (!groups || groups.length === 0) return [];\r\n return groups\r\n .map((g) =>\r\n (g || [])\r\n .map((t) => t.trim())\r\n .filter((t): t is ToolbarToken => (ALLOWED_TOKENS as any)[t] === true),\r\n )\r\n .filter((g) => g.length > 0);\r\n}\r\n\r\nexport const ToolBarPlugins = (props: IEditorProps) => {\r\n const [editor] = useLexicalComposerContext();\r\n const theme = useTheme();\r\n const styles = useStyles();\r\n\r\n const [selectNodeType, setSelectNodeType] = useState('paragraph');\r\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\r\n\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isHighlight, setIsHighlight] = 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 [alignment, setAlignment] = useState<string>('left');\r\n const [isInTable, setIsInTable] = useState(false);\r\n const [tableNodeKey, setTableNodeKey] = useState<string | null>(null);\r\n\r\n const presetGroups = getToolbarGroupsByLevel(props.level);\r\n\r\n const pluginGroups = useMemo(() => sanitizePluginGroups(presetGroups), [presetGroups]);\r\n\r\n const updateToolbarPlugins = () => {\r\n const selection: any = $getSelection();\r\n\r\n // reset when no range selection\r\n if (!$isRangeSelection(selection)) {\r\n setIsBold(false);\r\n setIsItalic(false);\r\n setIsUnderline(false);\r\n setIsStrikethrough(false);\r\n setIsSuperscript(false);\r\n setIsSubscript(false);\r\n setIsHighlight(false);\r\n setIsUppercase(false);\r\n setIsLowercase(false);\r\n setIsCapitalize(false);\r\n setSelectNodeType('paragraph');\r\n setIsInTable(false);\r\n setTableNodeKey(null);\r\n return;\r\n }\r\n\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsHighlight(selection.hasFormat('highlight'));\r\n setIsUppercase(selection.hasFormat('uppercase'));\r\n setIsLowercase(selection.hasFormat('lowercase'));\r\n setIsCapitalize(selection.hasFormat('capitalize'));\r\n\r\n const anchorNode = selection.anchor.getNode();\r\n\r\n // root selection -> paragraph\r\n if (anchorNode.getKey() === 'root') {\r\n setSelectNodeType('paragraph');\r\n setIsInTable(false);\r\n setTableNodeKey(null);\r\n return;\r\n }\r\n\r\n // ── Detect table ancestry by walking up the node tree ───────────────────\r\n // TableNode is a Lexical shadow root, so getTopLevelElementOrThrow()\r\n // returns the cell paragraph — we must climb ancestors to find the table.\r\n let tableAncestorKey: string | null = null;\r\n let cursor = anchorNode.getParent();\r\n while (cursor !== null) {\r\n if (cursor.getType() === 'table') {\r\n tableAncestorKey = cursor.getKey();\r\n break;\r\n }\r\n cursor = cursor.getParent();\r\n }\r\n setIsInTable(tableAncestorKey !== null);\r\n setTableNodeKey(tableAncestorKey);\r\n\r\n // element = the cell-level block (paragraph / heading inside the cell),\r\n // or the top-level block when not in a table — correct for all toolbar state.\r\n const element = anchorNode.getTopLevelElementOrThrow();\r\n setAlignment(\r\n typeof (element as any).getFormatType === 'function'\r\n ? (element as any).getFormatType() || 'left'\r\n : 'left',\r\n );\r\n\r\n // ✅ critical: if block is empty, UI should show Normal (paragraph)\r\n const blockText = element.getTextContent();\r\n if (!blockText || blockText.trim().length === 0) {\r\n setSelectNodeType('paragraph');\r\n return;\r\n }\r\n\r\n if ($isListNode(element)) {\r\n const parentList = $getNearestNodeOfType(anchorNode, ListNode);\r\n const type = parentList ? parentList.getTag() : element.getTag();\r\n setSelectNodeType(type);\r\n return;\r\n }\r\n\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n setSelectNodeType(\r\n ['paragraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'quote', 'code'].includes(type)\r\n ? type\r\n : 'paragraph',\r\n );\r\n };\r\n\r\n const formatQuote = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n if (selectNodeType === 'quote') {\r\n // toggle back to paragraph\r\n formatParagraph(editor);\r\n } else {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerEditableListener((editable) => {\r\n setIsEditable(editable);\r\n }),\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n updateToolbarPlugins();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbarPlugins();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n const onHandleSelectOption = (id: RichTextPluginsType) => {\r\n switch (id) {\r\n case RichTextPluginsType.Bold:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n break;\r\n case RichTextPluginsType.Italic:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n break;\r\n case RichTextPluginsType.Underline:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n break;\r\n case RichTextPluginsType.Strikethrough:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n break;\r\n case RichTextPluginsType.Superscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n break;\r\n case RichTextPluginsType.Subscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n break;\r\n case RichTextPluginsType.Highlight:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'highlight');\r\n break;\r\n case RichTextPluginsType.LeftAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\r\n break;\r\n case RichTextPluginsType.Undo:\r\n editor.dispatchCommand(UNDO_COMMAND, undefined);\r\n break;\r\n case RichTextPluginsType.Redo:\r\n editor.dispatchCommand(REDO_COMMAND, undefined);\r\n break;\r\n case RichTextPluginsType.Uppercase:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case RichTextPluginsType.Lowercase:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'lowercase');\r\n break;\r\n case RichTextPluginsType.Capitalize:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'capitalize');\r\n break;\r\n }\r\n };\r\n\r\n const updateHeading = (heading: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(heading));\r\n }\r\n });\r\n\r\n editor.getEditorState().read(() => {\r\n updateToolbarPlugins();\r\n });\r\n };\r\n\r\n /**\r\n * Token renderer registry\r\n * Each token returns a React element (button/plugin/divider).\r\n * If token should render nothing (e.g. unknown), return null.\r\n */\r\n const renderToken = (token: ToolbarToken, groupIndex: number, tokenIndex: number) => {\r\n const key = `${groupIndex}-${tokenIndex}-${token}`;\r\n\r\n // ---------- Fluent UI v8 theme.palette mapping ----------\r\n const palette = theme.palette;\r\n\r\n const fg = palette.neutralPrimary; // main icon/text\r\n const fgSubtle = palette.neutralSecondary; // subtle icons (chevrons)\r\n const fgDisabled = palette.neutralTertiary; // disabled\r\n\r\n const brand = palette.themePrimary; // active/toggled icon\r\n const brandHover = palette.themeDarkAlt ?? brand;\r\n const brandPressed = palette.themeDark ?? brand;\r\n\r\n const bgToolbar = palette.white; // toolbar background (you use white)\r\n const bgHover = palette.neutralLighter; // hover background\r\n const bgPressed = palette.neutralLight; // pressed background\r\n\r\n const bgActive = palette.neutralLighterAlt ?? palette.neutralLighter; // selected/toggled background\r\n const bgActiveHover = palette.neutralLighter ?? bgHover;\r\n const bgActivePressed = palette.neutralLight ?? bgPressed;\r\n\r\n const stroke = palette.neutralLight; // borders/divider\r\n\r\n // ---------- Shared button styling ----------\r\n const getIconColor = (active?: boolean) => {\r\n if (!isEditable) return fgDisabled;\r\n return active ? brand : fg;\r\n };\r\n\r\n const getButtonStyle = (active?: boolean): React.CSSProperties => {\r\n const baseBg = active ? bgActive : 'transparent';\r\n const hoverBg = active ? bgActiveHover : bgHover;\r\n const pressedBg = active ? bgActivePressed : bgPressed;\r\n\r\n return {\r\n border: '1px solid transparent',\r\n margin: 2,\r\n minWidth: 28,\r\n paddingInline: 6,\r\n background: baseBg,\r\n borderRadius: 4,\r\n\r\n // These CSS vars are used by Fluent v9 buttons in many builds.\r\n // If your version ignores them, the base `background` + icon styles still apply.\r\n ['--fui-Button__backgroundColor' as any]: baseBg,\r\n ['--fui-Button__backgroundColorHover' as any]: hoverBg,\r\n ['--fui-Button__backgroundColorPressed' as any]: pressedBg,\r\n ['--fui-Button__borderColorHover' as any]: stroke,\r\n ['--fui-Button__borderColorPressed' as any]: stroke,\r\n\r\n ['--fui-Button__iconColor' as any]: getIconColor(active),\r\n ['--fui-Button__iconColorHover' as any]: active ? brandHover : fg,\r\n ['--fui-Button__iconColorPressed' as any]: active ? brandPressed : fg,\r\n };\r\n };\r\n\r\n const dropdownButtonStyle: React.CSSProperties = {\r\n color: !isEditable || props.readOnly ? fgDisabled : fg,\r\n background: 'transparent',\r\n };\r\n\r\n const dropdownExpandIconStyle: React.CSSProperties = {\r\n color: isEditable ? fgSubtle : fgDisabled,\r\n };\r\n\r\n const optionIconStyle: React.CSSProperties = {\r\n fontSize: '20px',\r\n color: isEditable ? fg : fgDisabled,\r\n marginRight: 8,\r\n verticalAlign: 'middle',\r\n };\r\n\r\n switch (token) {\r\n case 'Bold':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextBold24Regular style={{ color: getIconColor(isBold) }} />}\r\n style={getButtonStyle(isBold)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Bold)}\r\n />\r\n );\r\n\r\n case 'Italic':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextItalicFilled style={{ color: getIconColor(isItalic) }} />}\r\n style={getButtonStyle(isItalic)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Italic)}\r\n />\r\n );\r\n\r\n case 'Underline':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextUnderlineFilled style={{ color: getIconColor(isUnderline) }} />}\r\n style={getButtonStyle(isUnderline)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Underline)}\r\n />\r\n );\r\n\r\n case 'ColorPicker':\r\n return <ColorPickerPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Link':\r\n return <InsertLinkPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Table':\r\n return <TableItemPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Image':\r\n return (\r\n <InsertImageDialog\r\n key={key}\r\n activeEditor={editor}\r\n disabled={!isEditable || props.readOnly!}\r\n />\r\n );\r\n\r\n case 'InlineImage':\r\n return (\r\n <InsertInlineImageDialog\r\n key={key}\r\n activeEditor={editor}\r\n disabled={!isEditable || props.readOnly!}\r\n />\r\n );\r\n\r\n case 'Youtube':\r\n return <YoutubeUploadPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Heading': {\r\n const headingLabel =\r\n selectNodeType === 'paragraph'\r\n ? 'Normal'\r\n : (HEADING_OPTION.find((h) => h.key === selectNodeType)?.text ?? selectNodeType);\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n title='Add heading'\r\n id={`heading-option-${groupIndex}`}\r\n placeholder='Format'\r\n disabled={!isEditable}\r\n style={{ minWidth: '100px' }}\r\n className={styles.dropdown}\r\n value={headingLabel}\r\n selectedOptions={[selectNodeType]}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as HeadingTagType | 'paragraph' | undefined;\r\n if (!val) return;\r\n\r\n if (val === 'paragraph') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading(val);\r\n setSelectNodeType(val);\r\n }\r\n }}>\r\n <Option value='paragraph'>Normal</Option>\r\n\r\n {HEADING_OPTION.map((option, idx) => (\r\n <Option key={`${option.key}-${idx}`} value={option.key as HeadingTagType}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n case 'FontFamily':\r\n return <FontFamilyPlugin key={key} disabled={!isEditable || props.readOnly} />;\r\n\r\n case 'FontSize':\r\n return <FontSizePlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case '|':\r\n return <ToolbarDivider key={key} />;\r\n\r\n case 'Decorators': {\r\n const activeDecorators: string[] = [\r\n ...(isUppercase ? ['uppercase'] : []),\r\n ...(isLowercase ? ['lowercase'] : []),\r\n ...(isCapitalize ? ['capitalize'] : []),\r\n ...(isStrikethrough ? ['strike'] : []),\r\n ...(isSubscript ? ['subscript'] : []),\r\n ...(isSuperscript ? ['superscript'] : []),\r\n ...(isHighlight ? ['highlight'] : []),\r\n ...(selectNodeType === 'ul' ? ['ul-list'] : []),\r\n ...(selectNodeType === 'ol' ? ['ol-list'] : []),\r\n ...(selectNodeType === 'quote' ? ['quote'] : []),\r\n ];\r\n\r\n const DECORATOR_LABEL: Record<string, string> = {\r\n uppercase: 'Uppercase',\r\n lowercase: 'Lowercase',\r\n capitalize: 'Capitalize',\r\n strike: 'Strikethrough',\r\n subscript: 'Subscript',\r\n superscript: 'Superscript',\r\n highlight: 'Highlight',\r\n 'ul-list': 'Bullet list',\r\n 'ol-list': 'Number list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0\r\n ? ''\r\n : activeDecorators.length === 1\r\n ? DECORATOR_LABEL[activeDecorators[0]]\r\n : `${DECORATOR_LABEL[activeDecorators[0]]} +${activeDecorators.length - 1}`;\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n multiselect\r\n id={`${groupIndex}-set-decorators`}\r\n placeholder='Text'\r\n value={decoratorValue}\r\n selectedOptions={activeDecorators}\r\n disabled={!isEditable}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '180px' } }}\r\n onOptionSelect={(_, data) => {\r\n switch (data.optionValue as string) {\r\n case 'uppercase':\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case 'lowercase':\r\n onHandleSelectOption(RichTextPluginsType.Lowercase);\r\n break;\r\n case 'capitalize':\r\n onHandleSelectOption(RichTextPluginsType.Capitalize);\r\n break;\r\n case 'strike':\r\n onHandleSelectOption(RichTextPluginsType.Strikethrough);\r\n break;\r\n case 'subscript':\r\n onHandleSelectOption(RichTextPluginsType.Subscript);\r\n break;\r\n case 'superscript':\r\n onHandleSelectOption(RichTextPluginsType.Superscript);\r\n break;\r\n case 'highlight':\r\n onHandleSelectOption(RichTextPluginsType.Highlight);\r\n break;\r\n case 'ul-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'page-break':\r\n editor.dispatchCommand(INSERT_PAGE_BREAK, undefined);\r\n break;\r\n case 'quote':\r\n formatQuote();\r\n break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />\r\n Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />\r\n Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />\r\n Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />\r\n Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />\r\n Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />\r\n Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled\r\n style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }}\r\n />\r\n Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />\r\n Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />\r\n Number list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />\r\n Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />\r\n Quote\r\n </Option>\r\n </Dropdown>\r\n );\r\n }\r\n\r\n // case 'CodeBlock':\r\n // return (\r\n // <CodeBlockPlugin\r\n // key={key}\r\n // codeLanguage={codeLanguage}\r\n // selectNodeType={selectNodeType}\r\n // selectedElementKey={selectedNodeKey}\r\n // disabled={!isEditable}\r\n // />\r\n // );\r\n\r\n case 'Align': {\r\n const ALIGN_OPTIONS = [\r\n {\r\n value: 'left',\r\n label: 'Left Align',\r\n icon: <TextAlignLeftFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.LeftAlign,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Center Align',\r\n icon: <TextAlignCenterFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.CenterAlign,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Right Align',\r\n icon: <TextAlignRightFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.RightAlign,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify Align',\r\n icon: <TextAlignJustifyFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.JustifyAlign,\r\n },\r\n ];\r\n const alignLabel = ALIGN_OPTIONS.find((o) => o.value === alignment)?.label ?? 'Left Align';\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n id='set-alignment'\r\n disabled={!isEditable}\r\n placeholder='Left Align'\r\n value={alignLabel}\r\n selectedOptions={[alignment]}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const opt = ALIGN_OPTIONS.find((o) => o.value === data.optionValue);\r\n if (opt) onHandleSelectOption(opt.action);\r\n }}>\r\n {ALIGN_OPTIONS.map((opt) => (\r\n <Option key={opt.value} value={opt.value} text={opt.label}>\r\n {opt.icon}\r\n {opt.label}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n if (!pluginGroups || pluginGroups.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Stack>\r\n <div\r\n role='toolbar'\r\n aria-label='Editor toolbar'\r\n style={{\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n borderBottom: '1px solid #ccced1',\r\n background: '#ffffff',\r\n padding: '0px',\r\n minHeight: 36,\r\n }}>\r\n {pluginGroups.map((group, groupIndex) => (\r\n <React.Fragment key={`group-${groupIndex}`}>\r\n {group.map((token, tokenIndex) => {\r\n try {\r\n return renderToken(token, groupIndex, tokenIndex);\r\n } catch {\r\n return null;\r\n }\r\n })}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n\r\n {isInTable && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '2px 8px',\r\n borderBottom: '1px solid #ccced1',\r\n background: '#fff8f8',\r\n }}>\r\n <span style={{ fontSize: 12, color: '#888', userSelect: 'none' }}>Table</span>\r\n <Button\r\n size='small'\r\n icon={<DeleteRegular style={{ color: '#c4272c' }} />}\r\n title='Delete table'\r\n style={{\r\n background: 'transparent',\r\n border: 'none',\r\n color: '#c4272c',\r\n fontWeight: 500,\r\n }}\r\n onClick={() => {\r\n editor.update(() => {\r\n if (!tableNodeKey) return;\r\n const node = $getNodeByKey(tableNodeKey);\r\n if (node?.getType() === 'table') node.remove();\r\n });\r\n }}>\r\n Delete Table\r\n </Button>\r\n </div>\r\n )}\r\n </Stack>\r\n );\r\n};\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $getSelection,\r\n $isDecoratorNode,\r\n $isRangeSelection,\r\n COMMAND_PRIORITY_HIGH,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n} from 'lexical';\r\nimport { useEffect } from 'react';\r\n\r\n// If you have an exported guard, use it instead of $isDecoratorNode:\r\n// import { $isYoutubeNode } from \"../Nodes/YoutubeNode\";\r\n\r\nfunction isYoutubeLikeNode(node: any) {\r\n // Prefer your node type check if available:\r\n // return $isYoutubeNode(node);\r\n\r\n // Fallback: check by type string (common for custom nodes)\r\n try {\r\n return node?.getType?.() === 'youtube';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport default function YoutubeDeletePlugin() {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n useEffect(() => {\r\n const removeIfYoutubeAtCursor = (direction: 'backward' | 'forward') => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return false;\r\n\r\n const anchor = selection.anchor;\r\n\r\n // Only when caret selection (not text range)\r\n if (!selection.isCollapsed()) return false;\r\n\r\n const currentNode = anchor.getNode();\r\n\r\n // Case 1: selection is on the node itself (sometimes happens)\r\n if (isYoutubeLikeNode(currentNode)) {\r\n currentNode.remove();\r\n return true;\r\n }\r\n\r\n // Case 2: cursor is in a text node next to the youtube node\r\n const sibling =\r\n direction === 'backward' ? currentNode.getPreviousSibling() : currentNode.getNextSibling();\r\n\r\n if (\r\n sibling &&\r\n (isYoutubeLikeNode(sibling) || ($isDecoratorNode(sibling) && isYoutubeLikeNode(sibling)))\r\n ) {\r\n sibling.remove();\r\n return true;\r\n }\r\n\r\n // Case 3: cursor is inside a paragraph and youtube is outside paragraph\r\n const parent = currentNode.getParent();\r\n if (parent) {\r\n const parentSibling =\r\n direction === 'backward' ? parent.getPreviousSibling() : parent.getNextSibling();\r\n\r\n if (parentSibling && isYoutubeLikeNode(parentSibling)) {\r\n parentSibling.remove();\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n return editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n () => removeIfYoutubeAtCursor('backward'),\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n () => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) return false;\r\n const currentNode = selection.anchor.getNode();\r\n const next =\r\n currentNode.getNextSibling() ?? currentNode.getParent()?.getNextSibling() ?? null;\r\n if (next && next.getType?.() === 'youtube') {\r\n next.remove();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_HIGH\r\n );\r\n }, [editor]);\r\n\r\n return null;\r\n}\r\n","import { EditorThemeClasses } from 'lexical';\r\nimport './codeEditor.css';\r\nimport './index.css';\r\nexport const theme: EditorThemeClasses = {\r\n text: {\r\n underline: 'underline',\r\n strikethrough: 'strikethrough',\r\n underlineStrikethrough: 'underlineStrikethrough',\r\n italic: 'italic',\r\n code: 'code',\r\n capitalize: 'capitalize',\r\n lowercase: 'lowercase',\r\n uppercase: 'uppercase',\r\n },\r\n // table: 'table',\r\n // tableCell: 'tableCell',\r\n // tableCellHeader: 'tableCellHeader',\r\n code: 'editorCode',\r\n image: 'editor-image',\r\n quote: 'quote',\r\n inlineImage: 'inline-editor-image',\r\n codeHighlight: {\r\n atrule: 'editorTokenAttr',\r\n attr: 'editorTokenAttr',\r\n boolean: 'editorTokenProperty',\r\n builtin: 'editorTokenSelector',\r\n cdata: 'editorTokenComment',\r\n char: 'editorTokenSelector',\r\n class: 'editorTokenFunction', // class constructor\r\n comment: 'editorTokenComment', // comment\r\n constant: 'editorTokenProperty',\r\n deleted: 'editorTokenProperty',\r\n doctype: 'editorTokenComment',\r\n entity: 'editorTokenOperator',\r\n function: 'editorTokenFunction', // es5 function\r\n important: 'editorTokenVariable',\r\n inserted: 'editorTokenSelector',\r\n keyword: 'editorTokenAttr', // variable keyword like const/let\r\n namespace: 'editorTokenVariable',\r\n number: 'editorTokenProperty', // number values\r\n operator: 'editorTokenOperator', // operator like +/*-\r\n prolog: 'editorTokenComment',\r\n property: 'editorTokenProperty',\r\n punctuation: 'editorTokenPunctuation', // brackets of array, object\r\n regex: 'editorTokenVariable',\r\n selector: 'editorTokenSelector',\r\n string: 'editorTokenSelector', // string values\r\n symbol: 'editorTokenProperty',\r\n tag: 'editorTokenProperty',\r\n url: 'editorTokenOperator',\r\n variable: 'editorTokenVariable',\r\n },\r\n table: 'lexical-table',\r\n tableRow: 'lexical-table-row',\r\n tableCell: 'lexical-table-cell',\r\n tableCellHeader: 'lexical-table-cell-header',\r\n\r\n tableCellSelected: 'lexical-table-cell-selected',\r\n tableCellPrimarySelected: 'lexical-table-cell-primary-selected',\r\n tableCellEditing: 'lexical-table-cell-editing',\r\n\r\n tableCellResizer: 'lexical-table-cell-resizer',\r\n};\r\n"]}
|