@tarviks/lexical-rich-editor 1.1.0 → 1.2.1

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.
@@ -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/Sanitize.ts","../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/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Utils/Index.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":["img","jsx","useRef","jsxs","ImageComponent","React","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","useCallback","$getSelection","$isNodeSelection","$setSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","Suspense","InlineImageComponent","React2","DecoratorNode","createEditor","ContentEditorLevel","TextNode","React3","width","height","Fragment","$getNodeByKey","$isRangeSelection","React4","COMMAND_PRIORITY_HIGH","clamp","$getRoot","getSelectedNode","$isAtNodeEnd","$findMatchingParent","$isLinkNode","TOGGLE_LINK_COMMAND","createPortal","createCommand","Button","isHTMLElement","Popover","PopoverTrigger","PopoverSurface","Stack","Field","AttachFilled","Input","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","$onDragStart","DRAGOVER_COMMAND","$onDragover","DROP_COMMAND","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","canDropImage","getDragImageData","getDragSelection","$createRangeSelection","getDOMSelectionFromTarget","$generateNodesFromDOM","$generateHtmlFromNodes","$isTextNode","$createTextNode","React6","React7","KEY_DOWN_COMMAND","$getTableNodeFromLexicalNodeOrThrow","$isTableCellNode","useMemo","r","g","b","useStyles","makeStyles","$getSelectionStyleValueForProperty","$patchStyleText","Dropdown","Option","fontSize","React11","text","link","$createLinkNode","$insertNodeToNearestRoot","useTheme","type","$isHeadingNode","$setBlocksType","FORMAT_TEXT_COMMAND","$createHeadingNode","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","ListNode"],"mappings":"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","file":"index.mjs","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 // Overlay that exactly covers the image container (position:relative parent).\r\n // pointer-events:none lets clicks pass through to the image; each handle\r\n // re-enables pointer-events so drag-resize still works.\r\n <div\r\n ref={controlWrapperRef}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n <div\r\n className=\"image-resizer image-resizer-n\"\r\n style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 * Display one or more error messages inside the editor immediately.\r\n * These are shown alongside any prop-based `errors`.\r\n * Example: ref.current.setErrors(['Attachment too large', 'Subject is required'])\r\n */\r\n setErrors: (messages: string[]) => void;\r\n /** Remove all errors that were set via `setErrors`. */\r\n clearErrors: () => void;\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 // ── Word / character limits ────────────────────────────────────────────────\r\n /** Maximum words allowed. Shows a live counter; turns red when exceeded. */\r\n wordLimit?: number;\r\n /** Minimum words required. Error shown after blur if not met. */\r\n minWords?: number;\r\n /** Maximum characters allowed. Error shown when exceeded. */\r\n maxChars?: number;\r\n /** Minimum characters required. Error shown after blur if not met. */\r\n minChars?: number;\r\n\r\n // ── Required ───────────────────────────────────────────────────────────────\r\n /** When true, shows a required-field error after blur if the editor is empty. */\r\n required?: boolean;\r\n\r\n // ── Callbacks ─────────────────────────────────────────────────────────────\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n * exceeded: true → user just exceeded; false → came back within limit.\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n\r\n // ── External errors ────────────────────────────────────────────────────────\r\n /**\r\n * Extra error messages to display (on top of any built-in validation).\r\n * Use this for errors that originate outside the editor (e.g. file too large,\r\n * subject empty, API failure).\r\n *\r\n * Example: errors={['Attachment exceeds 5 MB', 'Subject is required']}\r\n */\r\n errors?: string[];\r\n\r\n // ── Custom error messages ──────────────────────────────────────────────────\r\n /**\r\n * Override the text of any built-in validation message.\r\n * Every key accepts a plain string OR a function receiving the live counts.\r\n *\r\n * Covered errors:\r\n * - wordLimitExceeded — fires when wordCount > wordLimit\r\n * - required — fires on blur when editor is empty and required=true\r\n * - minWords — fires on blur when wordCount < minWords\r\n * - maxCharsExceeded — fires when charCount > maxChars\r\n * - minCharsRequired — fires on blur when charCount < minChars\r\n *\r\n * Example:\r\n * ```tsx\r\n * errorMessages={{\r\n * wordLimitExceeded: (count, limit) => `Too long — ${count}/${limit} words used.`,\r\n * required: 'Email body cannot be empty.',\r\n * minWords: (count, min) => `Write at least ${min} words (${count} so far).`,\r\n * maxCharsExceeded: (count, max) => `${count}/${max} characters — please shorten.`,\r\n * minCharsRequired: (count, min) => `At least ${min} characters needed (${count} entered).`,\r\n * }}\r\n * ```\r\n */\r\n errorMessages?: {\r\n wordLimitExceeded?: string | ((wordCount: number, wordLimit: number) => string);\r\n required?: string;\r\n minWords?: string | ((wordCount: number, minWords: number) => string);\r\n maxCharsExceeded?: string | ((charCount: number, maxChars: number) => string);\r\n minCharsRequired?: string | ((charCount: number, minChars: number) => string);\r\n };\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 { ErrorCircleRegular } from '@fluentui/react-icons';\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 { $getRoot } from 'lexical';\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(({ editorState }) => {\r\n editorState.read(() => {\r\n const text = $getRoot().getTextContent();\r\n const words = text.trim() === '' ? 0 : text.trim().split(/\\s+/).length;\r\n onCountChange(words);\r\n });\r\n });\r\n }, [editor, onCountChange]);\r\n return null;\r\n}\r\n\r\nfunction CharCountPlugin({ onCountChange }: { onCountChange: (count: number) => void }) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n onCountChange($getRoot().getTextContent().length);\r\n });\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 [charCount, setCharCount] = useState(0);\r\n const handleCharCount = useCallback((count: number) => setCharCount(count), []);\r\n\r\n const [refErrors, setRefErrors] = useState<string[]>([]);\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 [touched, setTouched] = useState(false);\r\n\r\n const isOverLimit = props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n // Built-in validation messages generated automatically by the editor.\r\n const internalErrors: string[] = [];\r\n\r\n if (isOverLimit) {\r\n const m = props.errorMessages?.wordLimitExceeded;\r\n internalErrors.push(\r\n typeof m === 'function'\r\n ? m(wordCount, props.wordLimit!)\r\n : m ?? `Word limit exceeded (${wordCount} / ${props.wordLimit} words used)`,\r\n );\r\n }\r\n\r\n if (props.required && touched && wordCount === 0) {\r\n internalErrors.push(\r\n props.errorMessages?.required ?? 'This field is required',\r\n );\r\n }\r\n\r\n if (props.minWords !== undefined && touched && wordCount < props.minWords) {\r\n const m = props.errorMessages?.minWords;\r\n internalErrors.push(\r\n typeof m === 'function'\r\n ? m(wordCount, props.minWords)\r\n : m ?? `Minimum ${props.minWords} words required (${wordCount} entered)`,\r\n );\r\n }\r\n\r\n if (props.maxChars !== undefined && charCount > props.maxChars) {\r\n const m = props.errorMessages?.maxCharsExceeded;\r\n internalErrors.push(\r\n typeof m === 'function'\r\n ? m(charCount, props.maxChars)\r\n : m ?? `Character limit exceeded (${charCount} / ${props.maxChars} characters used)`,\r\n );\r\n }\r\n\r\n if (props.minChars !== undefined && touched && charCount < props.minChars && charCount > 0) {\r\n const m = props.errorMessages?.minCharsRequired;\r\n internalErrors.push(\r\n typeof m === 'function'\r\n ? m(charCount, props.minChars)\r\n : m ?? `Minimum ${props.minChars} characters required (${charCount} entered)`,\r\n );\r\n }\r\n\r\n const allErrors: string[] = [...internalErrors, ...(props.errors ?? []), ...refErrors];\r\n const hasErrors = allErrors.length > 0;\r\n const hasRedBorder = hasErrors;\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 ${\r\n hasRedBorder ? '#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 overflowX: 'auto',\r\n minWidth: 0,\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 {hasErrors && (\r\n <div\r\n style={{\r\n borderTop: '1px solid #fbd5d5',\r\n background: '#fff8f8',\r\n padding: '6px 12px 8px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n }}>\r\n {allErrors.map((err, i) => (\r\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\r\n <ErrorCircleRegular style={{ fontSize: 14, color: '#c4272c', flexShrink: 0 }} />\r\n <span style={{ fontSize: 12, color: '#c4272c' }}>{err}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={() => { setTouched(true); 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 value={props.value} onChange={props.onChange} />\r\n\r\n {(props.wordLimit !== undefined || props.required || props.minWords !== undefined) && (\r\n <WordCountPlugin onCountChange={handleWordCount} />\r\n )}\r\n\r\n {(props.maxChars !== undefined || props.minChars !== undefined) && (\r\n <CharCountPlugin onCountChange={handleCharCount} />\r\n )}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n setRefErrors={setRefErrors}\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","/**\r\n * sanitizeHtml — Custom allowlist-based HTML sanitizer.\r\n *\r\n * SECURITY: Every HTML string that enters the editor from an external source\r\n * (value prop, setValue(), upsertBlock()) MUST be passed through this function\r\n * before being handed to Lexical's $generateNodesFromDOM or DOMParser.\r\n *\r\n * Uses the browser's built-in DOMParser + attribute manipulation to strip\r\n * disallowed tags and dangerous patterns with zero external dependencies.\r\n *\r\n * Threat model:\r\n * - Strips unknown tags (unwraps children, does not silently drop them).\r\n * - Strips all event-handler attributes (onclick, onerror, onload, …).\r\n * - Strips javascript:/vbscript:/data: URI schemes from href and src.\r\n * - Sanitizes expression() and url(javascript:…) inside style attributes.\r\n */\r\n\r\n/**\r\n * Tags that must be deleted in their entirety — including all their children\r\n * and text content — because even the raw text they contain is executable\r\n * (script body) or exposes sensitive data (style, meta).\r\n *\r\n * These are checked BEFORE the allowlist so they can never slip through as\r\n * \"unknown tag → unwrap\" which would leave their text in the output.\r\n */\r\nconst DROP_ENTIRELY = new Set([\r\n 'script',\r\n 'noscript',\r\n 'style',\r\n 'object',\r\n 'embed',\r\n 'form',\r\n 'input',\r\n 'button',\r\n 'select',\r\n 'textarea',\r\n 'meta',\r\n 'link',\r\n 'base',\r\n]);\r\n\r\n/** Tags the editor legitimately produces and should round-trip safely. */\r\nconst ALLOWED_TAGS = new Set([\r\n // Block\r\n 'p',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'blockquote',\r\n 'pre',\r\n 'div',\r\n 'table',\r\n 'thead',\r\n 'tbody',\r\n 'tfoot',\r\n 'tr',\r\n 'td',\r\n 'th',\r\n // Inline\r\n 'span',\r\n 'a',\r\n 'strong',\r\n 'b',\r\n 'em',\r\n 'i',\r\n 'u',\r\n 's',\r\n 'del',\r\n 'strike',\r\n 'sub',\r\n 'sup',\r\n 'mark',\r\n 'code',\r\n 'br',\r\n 'hr',\r\n // Media / embeds\r\n 'img',\r\n 'iframe',\r\n]);\r\n\r\n/** Attributes the editor legitimately uses. Everything else is stripped. */\r\nconst ALLOWED_ATTRS = new Set([\r\n // Presentation\r\n 'class',\r\n 'style',\r\n 'dir',\r\n 'lang',\r\n // Anchors\r\n 'href',\r\n 'target',\r\n 'rel',\r\n // Images\r\n 'src',\r\n 'alt',\r\n 'width',\r\n 'height',\r\n // Tables\r\n 'colspan',\r\n 'rowspan',\r\n // Lists — <ol type=\"a\"> and <ol start=\"2\">\r\n 'start',\r\n 'type',\r\n // Lexical-internal data markers\r\n 'data-lex-block',\r\n 'data-kind',\r\n 'data-lexical-decorator',\r\n // Misc\r\n 'title',\r\n 'allowfullscreen',\r\n]);\r\n\r\n/** Schemes that are never safe inside href or src. */\r\nconst DANGEROUS_URL = /^\\s*(javascript|data\\s*:|vbscript)/i;\r\n\r\n/**\r\n * Sanitizes a single DOM element in-place (recursive, bottom-up).\r\n *\r\n * Disallowed tags are \"unwrapped\" — their child nodes are promoted to the\r\n * parent so text content is never silently lost.\r\n */\r\nfunction sanitizeElement(el: Element): void {\r\n // Process children first so indices don't shift under us during parent removal.\r\n for (const child of Array.from(el.children)) {\r\n sanitizeElement(child);\r\n }\r\n\r\n const tag = el.tagName.toLowerCase();\r\n\r\n // Completely remove dangerous tags — do NOT unwrap because even their\r\n // text content (e.g. a <script> body) is executable / sensitive.\r\n if (DROP_ENTIRELY.has(tag)) {\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n\r\n // Only allow iframes that match the editor's YouTube embed output.\r\n if (tag === 'iframe') {\r\n const src = el.getAttribute('src') ?? '';\r\n const isYouTube =\r\n /^\\s*https:\\/\\/(www\\.)?(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/[^?&/]+/i.test(src);\r\n if (!isYouTube) {\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n }\r\n\r\n if (!ALLOWED_TAGS.has(tag)) {\r\n // Unknown tag — unwrap: hoist all children (including text) before this\r\n // element so visible text is never silently discarded.\r\n while (el.firstChild) {\r\n el.parentNode?.insertBefore(el.firstChild, el);\r\n }\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n\r\n // Strip disallowed / dangerous attributes.\r\n for (const { name, value } of Array.from(el.attributes)) {\r\n const lname = name.toLowerCase();\r\n\r\n if (!ALLOWED_ATTRS.has(lname)) {\r\n // Covers all on* event handlers and unknown attributes.\r\n el.removeAttribute(name);\r\n continue;\r\n }\r\n\r\n if (lname === 'href' || lname === 'src') {\r\n if (DANGEROUS_URL.test(value)) {\r\n el.removeAttribute(name);\r\n }\r\n }\r\n\r\n if (lname === 'style') {\r\n const safe = value\r\n .replace(/expression\\s*\\(/gi, '(')\r\n .replace(/url\\s*\\(\\s*['\"]?\\s*javascript:/gi, 'url(');\r\n el.setAttribute('style', safe);\r\n }\r\n }\r\n\r\n // Prevent reverse tabnabbing for links that open in a new tab/window.\r\n if (tag === 'a' && (el.getAttribute('target') || '').toLowerCase() === '_blank') {\r\n const rel = (el.getAttribute('rel') || '').trim();\r\n const tokens = new Set(\r\n rel\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .map((t) => t.toLowerCase()),\r\n );\r\n tokens.add('noopener');\r\n tokens.add('noreferrer');\r\n el.setAttribute('rel', Array.from(tokens).join(' '));\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes an HTML string using a strict allowlist.\r\n *\r\n * @param html - Raw HTML from an untrusted source (value prop, API, clipboard).\r\n * @returns Sanitized HTML safe to import into the Lexical editor.\r\n *\r\n * @example\r\n * const clean = sanitizeHtml(rawHtmlFromDatabase);\r\n * editor.update(() => {\r\n * const nodes = $generateNodesFromDOM(editor, new DOMParser().parseFromString(clean, 'text/html'));\r\n * $getRoot().append(...nodes);\r\n * });\r\n */\r\nexport function sanitizeHtml(html: string): string {\r\n if (!html || typeof html !== 'string') return '';\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n for (const child of Array.from(doc.body.children)) {\r\n sanitizeElement(child);\r\n }\r\n return doc.body.innerHTML;\r\n}\r\n\r\n/**\r\n * Post-processes HTML output from Lexical before it is handed to consumers\r\n * (onChange / getValue).\r\n *\r\n * Fixes three known issues with Lexical 0.44 output:\r\n *\r\n * 1. Bold double-wrap — Lexical's createDOM uses <strong> as the semantic\r\n * inner element, then exportDOM wraps with <b> for email-client compat.\r\n * Result: <b><strong>text</strong></b>. Any CSS that uses font-weight:\r\n * bolder (e.g. CSS resets, email clients) renders this noticeably heavier.\r\n * Fix: unwrap <strong> from inside <b>, merging any attributes into <b>.\r\n *\r\n * 2. Italic double-wrap — same pattern: createDOM creates <em>, exportDOM\r\n * wraps with <i>. Result: <i><em>text</em></i>.\r\n * Fix: unwrap <em> from inside <i>.\r\n *\r\n * 3. <p> default margins — normalizeToBlockHtml wraps all content in <p>.\r\n * Inside the editor the theme CSS resets margins; but the stored HTML is\r\n * used outside (email body, preview) where those CSS rules don't apply.\r\n * Fix: add inline margin:0; line-height:1.25 to every <p> that lacks\r\n * an explicit margin declaration.\r\n */\r\nexport function postProcessOutput(html: string): string {\r\n if (!html) return html;\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n\r\n // ── 1. Collapse <b><strong> → <b> ─────────────────────────────────────────\r\n for (const inner of Array.from(doc.querySelectorAll('b > strong'))) {\r\n const outer = inner.parentElement!;\r\n _mergeAttributes(inner, outer);\r\n while (inner.firstChild) outer.insertBefore(inner.firstChild, inner);\r\n outer.removeChild(inner);\r\n }\r\n\r\n // ── 2. Collapse <i><em> → <i> ─────────────────────────────────────────────\r\n for (const inner of Array.from(doc.querySelectorAll('i > em'))) {\r\n const outer = inner.parentElement!;\r\n _mergeAttributes(inner, outer);\r\n while (inner.firstChild) outer.insertBefore(inner.firstChild, inner);\r\n outer.removeChild(inner);\r\n }\r\n\r\n // ── 3. Inline margin reset on <p> so output renders correctly everywhere ──\r\n for (const p of Array.from(doc.querySelectorAll('p'))) {\r\n const style = (p as HTMLElement).style;\r\n const hasMargin = !!(\r\n style.margin ||\r\n style.marginTop ||\r\n style.marginRight ||\r\n style.marginBottom ||\r\n style.marginLeft\r\n );\r\n if (!hasMargin) style.margin = '0';\r\n if (!style.lineHeight) style.lineHeight = '1.25';\r\n }\r\n\r\n return doc.body.innerHTML;\r\n}\r\n\r\n/** Moves style and class attributes from src element into dst, merging values. */\r\nfunction _mergeAttributes(src: Element, dst: Element): void {\r\n for (const { name, value } of Array.from(src.attributes)) {\r\n if (name === 'style') {\r\n const prev = dst.getAttribute('style') || '';\r\n dst.setAttribute('style', prev ? `${prev}; ${value}` : value);\r\n } else if (name === 'class') {\r\n const prev = dst.getAttribute('class') || '';\r\n dst.setAttribute('class', prev ? `${prev} ${value}` : value);\r\n }\r\n // other attributes (data-*, etc.) are intentionally not merged\r\n }\r\n}\r\n\r\nconst BLOCK_TAGS = new Set([\r\n 'p',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'div',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'table',\r\n 'blockquote',\r\n 'pre',\r\n 'hr',\r\n]);\r\n\r\n/**\r\n * Ensures every top-level node is a block element so the HTML can be safely\r\n * imported into Lexical's root node (which only accepts block children).\r\n *\r\n * Handles three cases:\r\n * - Pure plain text / inline-only → wraps everything in one <p>\r\n * - Mixed (some blocks + loose text/inline) → wraps each loose node in its own <p>\r\n * - Already all blocks → returns the string unchanged (fast path)\r\n *\r\n * The mixed case can arise after sanitizeHtml() unwraps unknown block tags\r\n * (e.g. <section>text<p>para</p></section> → text<p>para</p>).\r\n */\r\nexport function normalizeToBlockHtml(html: string): string {\r\n if (!html) return '';\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n const body = doc.body;\r\n const childNodes = Array.from(body.childNodes);\r\n\r\n // Fast path: every non-whitespace top-level node is already a block.\r\n const needsWrap = childNodes.some((node) => {\r\n if (node.nodeType === Node.TEXT_NODE) return !!node.nodeValue?.trim();\r\n if (node.nodeType === Node.ELEMENT_NODE)\r\n return !BLOCK_TAGS.has((node as Element).tagName.toLowerCase());\r\n return false;\r\n });\r\n if (!needsWrap) return html;\r\n\r\n // Detach all children first (the references in childNodes[] remain valid).\r\n while (body.firstChild) body.removeChild(body.firstChild);\r\n\r\n // Re-append: block nodes stay as-is; consecutive inline/text nodes are\r\n // grouped into a single <p> that is flushed when the next block arrives.\r\n let pendingP: HTMLParagraphElement | null = null;\r\n for (const node of childNodes) {\r\n const isBlock =\r\n node.nodeType === Node.ELEMENT_NODE &&\r\n BLOCK_TAGS.has((node as Element).tagName.toLowerCase());\r\n const isWhitespace = node.nodeType === Node.TEXT_NODE && !node.nodeValue?.trim();\r\n\r\n if (isBlock) {\r\n if (pendingP) {\r\n body.appendChild(pendingP);\r\n pendingP = null;\r\n }\r\n body.appendChild(node);\r\n } else if (!isWhitespace) {\r\n if (!pendingP) pendingP = doc.createElement('p');\r\n pendingP.appendChild(node);\r\n }\r\n }\r\n if (pendingP) body.appendChild(pendingP);\r\n\r\n return body.innerHTML;\r\n}\r\n","import { $generateNodesFromDOM } from '@lexical/html';\r\nimport { $getRoot } from 'lexical';\r\nimport type { LexicalEditor } from 'lexical';\r\nimport { $createHtmlBlockNode, $isHtmlBlockNode, HtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\nimport { normalizeToBlockHtml, sanitizeHtml } from './Sanitize';\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: LexicalEditor, block: HtmlBlockNode, html: string) {\r\n const safe = normalizeToBlockHtml(sanitizeHtml(html));\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(safe || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, doc);\r\n block.clear();\r\n block.append(...nodes);\r\n}\r\n\r\nexport function upsertBlock(editor: LexicalEditor, 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: LexicalEditor, 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: LexicalEditor, 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 setRefErrors,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n setRefErrors: React.Dispatch<React.SetStateAction<string[]>>;\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 setErrors: (messages: string[]) => setRefErrors(messages),\r\n clearErrors: () => setRefErrors([]),\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, setRefErrors],\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 MenuTrigger,\r\n} from '@fluentui/react-components';\r\n\r\nimport {\r\n ArrowDownRegular,\r\n ArrowLeftRegular,\r\n ArrowRightRegular,\r\n ArrowUpRegular,\r\n ChevronDown12Regular,\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 [anchorRect, setAnchorRect] = React.useState<DOMRect | null>(null);\r\n const [open, setOpen] = React.useState(false);\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 const dom = editor.getElementByKey(tableNode.getKey());\r\n if (dom) {\r\n setIsInTable(true);\r\n setAnchorRect(dom.getBoundingClientRect());\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n setIsInTable(false);\r\n setAnchorRect(null);\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 setAnchorRect(null);\r\n return;\r\n }\r\n\r\n const cellDom = editor.getElementByKey(cellNode.getKey());\r\n if (!cellDom) {\r\n setIsInTable(false);\r\n setAnchorRect(null);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n setAnchorRect(cellDom.getBoundingClientRect());\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 const canShow = isInTable && !!anchorRect && !disabled;\r\n\r\n const handleStyle: React.CSSProperties | undefined = React.useMemo(() => {\r\n if (!anchorRect) return undefined;\r\n\r\n const top = Math.max(8, anchorRect.top + 6);\r\n const left = Math.max(8, anchorRect.right - 34);\r\n\r\n return {\r\n position: 'fixed',\r\n top,\r\n left,\r\n zIndex: 9999,\r\n };\r\n }, [anchorRect]);\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\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\r\n const insertColRight = () => run(() => $insertTableColumnAtSelection(true));\r\n const insertColLeft = () => run(() => $insertTableColumnAtSelection(false));\r\n\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 if (!canShow || !handleStyle) return null;\r\n\r\n return createPortal(\r\n <div style={handleStyle} className='aoTableActionHandleRoot'>\r\n <Menu open={open} onOpenChange={(_, data) => setOpen(data.open)}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <button\r\n type='button'\r\n className='aoTableActionHandleBtn'\r\n aria-label='Table options'\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n }}>\r\n <ChevronDown12Regular />\r\n </button>\r\n </MenuTrigger>\r\n\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 </div>,\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 { Callout, DefaultButton, Stack, TextField } from '@fluentui/react';\nimport { Button } from '@fluentui/react-components';\nimport * as React from 'react';\nimport './ColorPickerComponent.css';\n\ntype Props = {\n value: string;\n title: string;\n disabled?: boolean;\n icon: any;\n onChange: (hex: string) => void;\n /**\n * Fires synchronously whenever the popover opens or closes — including the\n * trigger-button click, before Fluent's Callout has a chance to steal DOM\n * focus via setInitialFocus. Lets the host capture \"was the editor the\n * active surface right before this opened\" at the only moment that's\n * actually knowable, and restore focus once on close rather than fighting\n * for it while the popover is open.\n */\n onOpenChange?: (open: boolean) => void;\n};\n\nconst PRESET = [\n '#000000',\n '#434343',\n '#666666',\n '#999999',\n '#b7b7b7',\n '#cccccc',\n '#d9d9d9',\n '#ffffff',\n\n '#980000',\n '#ff0000',\n '#ff9900',\n '#ffff00',\n '#00ff00',\n '#00ffff',\n '#4a86e8',\n '#0000ff',\n '#9900ff',\n '#ff00ff',\n];\n\nconst clamp = (v: number, min: number, max: number) => Math.min(max, Math.max(min, v));\n\nconst normalizeHex = (v: string) => {\n const s = (v ?? '').trim();\n if (!s) return '#000000';\n\n // Selection style values aren't guaranteed to be hex — content pasted or\n // authored elsewhere (other editors, email clients) commonly carries\n // `rgb()`/`rgba()` inline colors. Without this, such a value would silently\n // fall through to the '#000000' default below, showing the wrong color.\n const rgbMatch = s.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i);\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch;\n return rgbToHex(clamp(+r, 0, 255), clamp(+g, 0, 255), clamp(+b, 0, 255));\n }\n\n let hex = s.startsWith('#') ? s : `#${s}`;\n if (hex.length === 9) hex = hex.slice(0, 7); // #rrggbbaa — drop alpha, picker has no alpha control\n if (hex.length === 4 || hex.length === 7) return hex.toLowerCase();\n return '#000000';\n};\n\nconst hexToRgb = (hex: string) => {\n const h = normalizeHex(hex).replace('#', '');\n if (h.length === 3) {\n const r = parseInt(h[0] + h[0], 16);\n const g = parseInt(h[1] + h[1], 16);\n const b = parseInt(h[2] + h[2], 16);\n return { r, g, b };\n }\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return { r, g, b };\n};\n\nconst rgbToHex = (r: number, g: number, b: number) =>\n `#${[r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('')}`;\n\nconst rgbToHsv = (r: number, g: number, b: number) => {\n const rr = r / 255,\n gg = g / 255,\n bb = b / 255;\n const max = Math.max(rr, gg, bb),\n min = Math.min(rr, gg, bb);\n const d = max - min;\n\n let h = 0;\n if (d !== 0) {\n if (max === rr) h = ((gg - bb) / d) % 6;\n else if (max === gg) h = (bb - rr) / d + 2;\n else h = (rr - gg) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n\n const s = max === 0 ? 0 : d / max;\n const v = max;\n\n return { h, s, v };\n};\n\nconst hsvToRgb = (h: number, s: number, v: number) => {\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n\n let rr = 0,\n gg = 0,\n bb = 0;\n if (h < 60) [rr, gg, bb] = [c, x, 0];\n else if (h < 120) [rr, gg, bb] = [x, c, 0];\n else if (h < 180) [rr, gg, bb] = [0, c, x];\n else if (h < 240) [rr, gg, bb] = [0, x, c];\n else if (h < 300) [rr, gg, bb] = [x, 0, c];\n else [rr, gg, bb] = [c, 0, x];\n\n return {\n r: Math.round((rr + m) * 255),\n g: Math.round((gg + m) * 255),\n b: Math.round((bb + m) * 255),\n };\n};\n\nexport const ColorPickerControl = ({ value, title, disabled, onChange, icon, onOpenChange }: Props) => {\n const [open, setOpen] = React.useState(false);\n const btnRef = React.useRef<HTMLDivElement | null>(null);\n const setOpenAndNotify = React.useCallback(\n (next: boolean) => {\n setOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const handleDismiss = React.useCallback(() => setOpenAndNotify(false), [setOpenAndNotify]);\n // Block every auto-dismiss trigger (scroll/resize/focus-shift) except a\n // genuine click — clicks on the picker's own controls are already inside\n // the Callout's DOM, so Fluent never treats them as an outside click in\n // the first place; nothing extra is needed for them here.\n const preventDismissOnEvent = React.useCallback(\n (ev: Event | React.FocusEvent | React.KeyboardEvent | React.MouseEvent) => ev.type !== 'click',\n [],\n );\n\n // Since scroll/resize no longer auto-close the callout, it must instead\n // actively follow the button as the page scrolls. Fluent recalculates the\n // Callout's position on every render of this component (its internal\n // effect depends on the whole `props` object, which is a new reference\n // each render), so forcing a re-render on scroll/resize is enough to keep\n // it correctly anchored — no manual position math needed.\n const [, forceReposition] = React.useState(0);\n React.useEffect(() => {\n if (!open) return;\n let rafId: number | null = null;\n const reposition = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n forceReposition((n) => n + 1);\n });\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n if (rafId != null) cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [open]);\n\n // The color actually applied to the editor right now — independent of\n // whatever the user may be experimenting with in the (unapplied) draft\n // below. Used for the small indicator under the trigger button so it\n // never shows a color the user picked but then discarded via Close.\n const appliedHex = React.useMemo(() => normalizeHex(value || '#000000'), [value]);\n\n // Draft state, local to this open session — nothing here touches the\n // editor. The picker no longer applies color live while the user is\n // experimenting (via drag or otherwise): only a single, deliberate Apply\n // click commits a color, so stray pointer activity can never silently\n // overwrite the document.\n const [hex, setHex] = React.useState<string>(appliedHex);\n const { r, g, b } = React.useMemo(() => hexToRgb(hex), [hex]);\n const hsv = React.useMemo(() => rgbToHsv(r, g, b), [r, g, b]);\n const [h, setH] = React.useState(hsv.h);\n const [s, setS] = React.useState(hsv.s);\n const [v, setV] = React.useState(hsv.v);\n\n const setDraft = React.useCallback((nextHex: string) => {\n setHex(nextHex);\n const rgb = hexToRgb(nextHex);\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\n setH(next.h);\n setS(next.s);\n setV(next.v);\n }, []);\n\n const setDraftFromHsv = React.useCallback((hh: number, ss: number, vv: number) => {\n const rgb = hsvToRgb(hh, ss, vv);\n setHex(rgbToHex(rgb.r, rgb.g, rgb.b));\n setH(hh);\n setS(ss);\n setV(vv);\n }, []);\n\n // Re-seed the draft from the editor's actual color only when the popover\n // freshly opens — never while it's open. The draft is the single source\n // of truth for the whole open session; there's no live round trip through\n // the editor to resync from anymore.\n const wasOpenRef = React.useRef(open);\n React.useEffect(() => {\n const justOpened = open && !wasOpenRef.current;\n wasOpenRef.current = open;\n if (!justOpened) return;\n setDraft(appliedHex);\n }, [appliedHex, open, setDraft]);\n\n const svRef = React.useRef<HTMLDivElement | null>(null);\n const handleSVClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (!svRef.current) return;\n const rect = svRef.current.getBoundingClientRect();\n const x = clamp(e.clientX - rect.left, 0, rect.width);\n const y = clamp(e.clientY - rect.top, 0, rect.height);\n const ss = rect.width === 0 ? 0 : x / rect.width;\n const vv = rect.height === 0 ? 0 : 1 - y / rect.height;\n setDraftFromHsv(h, ss, vv);\n },\n [h, setDraftFromHsv],\n );\n\n const hueRef = React.useRef<HTMLDivElement | null>(null);\n const handleHueClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (!hueRef.current) return;\n const rect = hueRef.current.getBoundingClientRect();\n const x = clamp(e.clientX - rect.left, 0, rect.width);\n const hh = rect.width === 0 ? 0 : (x / rect.width) * 360;\n setDraftFromHsv(hh, s, v);\n },\n [s, v, setDraftFromHsv],\n );\n\n const handleApply = React.useCallback(() => {\n onChange(hex);\n setOpenAndNotify(false);\n }, [onChange, hex, setOpenAndNotify]);\n\n const svThumb = React.useMemo(() => ({ left: `${s * 100}%`, top: `${(1 - v) * 100}%` }), [s, v]);\n const hueThumb = React.useMemo(() => ({ left: `${(h / 360) * 100}%` }), [h]);\n\n const hueColor = React.useMemo(() => {\n const { r, g, b } = hsvToRgb(h, 1, 1);\n return rgbToHex(r, g, b);\n }, [h]);\n\n return (\n <div ref={btnRef} style={{ position: 'relative', display: 'inline-block' }}>\n <Button\n type='button'\n size='small'\n icon={icon}\n value={title}\n title={title}\n disabled={disabled}\n style={{\n background: open ? '#ebebeb' : 'none',\n border: 'none',\n margin: 2,\n paddingBottom: 6,\n }}\n onClick={() => {\n if (disabled) return;\n setOpenAndNotify(!open);\n }}\n />\n <div\n style={{\n position: 'absolute',\n bottom: 5,\n left: '50%',\n transform: 'translateX(-50%)',\n width: 14,\n height: 3,\n background: appliedHex,\n borderRadius: 1,\n border: '0.5px solid rgba(0,0,0,0.18)',\n pointerEvents: 'none',\n }}\n />\n\n {open && !disabled && (\n <Callout\n target={btnRef}\n onDismiss={handleDismiss}\n setInitialFocus\n directionalHint={4}\n className='aoColorCallout'\n preventDismissOnEvent={preventDismissOnEvent}>\n <Stack tokens={{ childrenGap: 10 }} styles={{ root: { padding: 12, width: 320 } }}>\n <div className='aoLexRow'>\n <div className='aoLexSwatch' style={{ background: hex }} />\n <div className='aoLexTitle'>{title}</div>\n </div>\n\n <div className='aoLexRow'>\n <div className='aoLexLabel'>Hex</div>\n <TextField\n value={hex}\n onChange={(_, val) => setHex(normalizeHex(val || ''))}\n onBlur={() => setDraft(normalizeHex(hex))}\n />\n </div>\n\n <div className='aoLexSwatches'>\n {PRESET.map((c) => (\n <button\n key={c}\n type='button'\n className='aoLexSwatchBtn'\n style={{ background: c }}\n onClick={() => setDraft(c)}\n title={c}\n />\n ))}\n </div>\n\n <div className='aoLexSV' ref={svRef} onClick={handleSVClick}>\n <div className='aoLexSVHue' style={{ background: hueColor }} />\n <div className='aoLexSVWhite' />\n <div className='aoLexSVBlack' />\n <div className='aoLexSVThumb' style={svThumb} />\n </div>\n\n <div className='aoLexHue' ref={hueRef} onClick={handleHueClick}>\n <div className='aoLexHueThumb' style={hueThumb} />\n </div>\n\n <div className='aoLexPreview' style={{ background: hex }} />\n\n <div className='aoLexActions'>\n <DefaultButton type='button' text='Apply' onClick={handleApply} />\n <DefaultButton type='button' text='Close' onClick={() => setOpenAndNotify(false)} />\n </div>\n </Stack>\n </Callout>\n )}\n </div>\n );\n};\n","import { Stack } from '@fluentui/react';\nimport { PaintBucket16Filled, TextColorRegular } from '@fluentui/react-icons';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $getSelectionStyleValueForProperty, $patchStyleText } from '@lexical/selection';\nimport { mergeRegister } from '@lexical/utils';\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n SELECTION_CHANGE_COMMAND,\n SKIP_SELECTION_FOCUS_TAG,\n type RangeSelection,\n} from 'lexical';\nimport React from 'react';\nimport { ColorPickerControl } from '../Nodes/ColorPickerComponent';\nimport { LOW_PRIORIRTY } from '../Types/EditorType';\n\nexport const ColorPickerPlugin = ({ disabled }: { disabled: boolean }) => {\n const [editor] = useLexicalComposerContext();\n const [{ color, bgColor }, setColors] = React.useState({ color: '#000000', bgColor: '#ffffff' });\n\n const lastRangeSelectionRef = React.useRef<RangeSelection | null>(null);\n\n const updateToolbar = () => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n lastRangeSelectionRef.current = selection.clone();\n\n const c = $getSelectionStyleValueForProperty(selection, 'color', '#000000');\n const bg = $getSelectionStyleValueForProperty(selection, 'background-color', '#ffffff');\n setColors({ color: c, bgColor: bg });\n }\n };\n\n React.useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => updateToolbar());\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n LOW_PRIORIRTY\n )\n );\n }, [editor]);\n\n // Captured once, synchronously, the instant a picker's trigger button is\n // clicked — i.e. before Fluent's Callout (setInitialFocus) has a chance to\n // move DOM focus into the portaled popover. Checking \"is the editor the\n // active surface\" at any later point is meaningless, since by then focus\n // already belongs to the open popover.\n const wasEditorActiveRef = React.useRef(false);\n\n const handleOpenChange = (open: boolean) => {\n if (open) {\n const root = editor.getRootElement();\n wasEditorActiveRef.current =\n !!root && (document.activeElement === root || root.contains(document.activeElement as Node));\n } else if (wasEditorActiveRef.current) {\n // Restore focus once the popover closes, so the user can keep typing\n // immediately — but only if the editor actually owned focus before\n // the picker opened (don't steal focus from unrelated fields, e.g.\n // To/CC/BCC in an email form).\n editor.focus();\n }\n };\n\n const applyStyle = (args: { property: 'background-color' | 'color'; color: string }) => {\n if (disabled) return;\n\n editor.update(\n () => {\n const saved = lastRangeSelectionRef.current;\n if (saved) {\n $setSelection(saved.clone());\n }\n\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $patchStyleText(selection, { [args.property]: args.color });\n }\n },\n // Without this tag, Lexical's reconciler force-focuses the editor root\n // whenever this update's selection diff finds the root isn't already\n // focused — which it isn't while the color picker's Callout holds\n // focus. The picker now only calls applyStyle once, on Apply, so this\n // is no longer fighting for focus on every drag pixel, but there's no\n // reason to force a focus change here at all — handleOpenChange above\n // already does that deliberately, once, on close.\n { tag: SKIP_SELECTION_FOCUS_TAG },\n );\n };\n\n const containerStyle: React.CSSProperties = disabled\n ? {\n display: 'flex',\n gap: 6,\n alignItems: 'center',\n opacity: 0.55,\n cursor: 'not-allowed',\n pointerEvents: 'none',\n filter: 'grayscale(0.25)',\n }\n : {\n display: 'flex',\n gap: 6,\n alignItems: 'center',\n };\n\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\n\n return (\n <Stack horizontal verticalAlign='center' style={containerStyle}>\n <ColorPickerControl\n value={color}\n title='Text color'\n disabled={disabled}\n icon={<TextColorRegular style={{ color: iconColor }} />}\n onChange={(c) => applyStyle({ property: 'color', color: c })}\n onOpenChange={handleOpenChange}\n />\n\n <ColorPickerControl\n value={bgColor}\n title='Background color'\n disabled={disabled}\n icon={<PaintBucket16Filled style={{ color: iconColor }} />}\n onChange={(c) => applyStyle({ property: 'background-color', color: c })}\n onOpenChange={handleOpenChange}\n />\n </Stack>\n );\n};\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 { $isHeadingNode, $createHeadingNode } from '@lexical/rich-text';\r\nimport { $setBlocksType } from '@lexical/selection';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isRangeSelection,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n} 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\n/**\r\n * Splits block elements (paragraphs, headings …) that contain LineBreakNodes\r\n * (Shift+Enter) into individual same-type block elements, then restores a\r\n * valid selection.\r\n *\r\n * Must be called **inside** an `editor.update()` before any `$setBlocksType`.\r\n *\r\n * Problem: When the user presses Shift+Enter several times, multiple \"lines\"\r\n * live inside a single block element as LineBreakNodes. Calling $setBlocksType\r\n * then applies the new block type to the entire block — affecting ALL lines,\r\n * not just the one the user selected.\r\n *\r\n * Solution: Walk every block touched by the selection. If it contains any\r\n * LineBreakNodes, split it at each LineBreakNode boundary so every visual\r\n * \"line\" becomes its own independent block. $setBlocksType will then only\r\n * touch the block(s) that the selection actually covers.\r\n */\r\nexport function $splitBlocksAtLineBreaks(selection: RangeSelection): void {\r\n // Collect unique top-level blocks touched by the selection.\r\n const blocksToSplit = new Set<ElementNode>();\r\n for (const node of selection.getNodes()) {\r\n const block = node.getTopLevelElement();\r\n // DecoratorNodes (e.g. YouTube) are not ElementNodes and have no children.\r\n if (block && $isElementNode(block)) {\r\n const children = block.getChildren();\r\n if (children.some($isLineBreakNode)) {\r\n blocksToSplit.add(block);\r\n }\r\n }\r\n }\r\n\r\n for (const block of blocksToSplit) {\r\n const children = [...block.getChildren()];\r\n\r\n // Group children into segments at each LineBreakNode boundary.\r\n const groups: LexicalNode[][] = [[]];\r\n for (const child of children) {\r\n if ($isLineBreakNode(child)) {\r\n groups.push([]);\r\n } else {\r\n groups[groups.length - 1].push(child);\r\n }\r\n }\r\n\r\n // Only split if there is more than one non-empty segment.\r\n // We must NOT discard empty groups — they represent blank lines (visual\r\n // spacing) that the user explicitly inserted with Shift+Enter.\r\n const nonEmptyCount = groups.filter((g) => g.length > 0).length;\r\n if (nonEmptyCount <= 1) continue; // nothing to split\r\n\r\n // Insert new blocks in REVERSE order right after the original so the\r\n // DOM order ends up as: block[seg0] → newBlock[seg1] → newBlock[seg2] …\r\n //\r\n // Empty group → empty ParagraphNode (blank visual line).\r\n // Non-empty group → same-type block as original (heading keeps its tag).\r\n for (let i = groups.length - 1; i >= 1; i--) {\r\n const group = groups[i];\r\n const newBlock: ElementNode =\r\n group.length === 0\r\n ? $createParagraphNode() // blank line\r\n : $isHeadingNode(block)\r\n ? $createHeadingNode(block.getTag()) // heading content\r\n : $createParagraphNode(); // paragraph content\r\n\r\n // Appending moves nodes out of `block` automatically.\r\n group.forEach((child) => newBlock.append(child));\r\n block.insertAfter(newBlock);\r\n }\r\n\r\n // Remove any LineBreakNodes still left in the original block.\r\n // (groups[0] nodes are already there; only BRs need to go.)\r\n [...block.getChildren()]\r\n .filter($isLineBreakNode)\r\n .forEach((br) => br.remove());\r\n }\r\n}\r\n\r\n/**\r\n * If the selection is a non-collapsed partial selection within a **single**\r\n * block (not covering the entire block), splits that block at the selection\r\n * boundaries so the selected content becomes its own isolated paragraph.\r\n *\r\n * After the split, the editor selection is repositioned onto the new\r\n * isolated block so that a subsequent `$setBlocksType` call only converts\r\n * that block — leaving the text before and after as separate paragraphs.\r\n *\r\n * Returns `true` when a split occurred; `false` when no split was needed\r\n * (cursor-only selection, multi-block selection, or the whole block is\r\n * already selected).\r\n *\r\n * Only handles cases where all selected nodes are *direct* children of the\r\n * parent block (plain-text paragraphs). Content that is nested inside\r\n * inline-format nodes (bold, italic …) falls back gracefully to the\r\n * standard whole-block conversion so inline formatting is never broken.\r\n *\r\n * Must be called **inside** an `editor.update()`.\r\n */\r\nexport function $splitBlockAtPartialSelection(selection: RangeSelection): boolean {\r\n // Collapsed selections (cursor, no text selected) should not split the block.\r\n if (selection.isCollapsed()) return false;\r\n\r\n const anchorBlock = selection.anchor.getNode().getTopLevelElement();\r\n const focusBlock = selection.focus.getNode().getTopLevelElement();\r\n\r\n // Only handle same-block selections.\r\n if (!anchorBlock || !focusBlock || !anchorBlock.is(focusBlock)) return false;\r\n if (!$isElementNode(anchorBlock)) return false;\r\n\r\n const block = anchorBlock;\r\n\r\n // extract() splits TextNodes at the anchor/focus offsets so we get clean\r\n // node boundaries. After this call the selection anchor/focus point to\r\n // the split nodes; the returned array is the nodes *inside* the selection.\r\n const extractedNodes = selection.extract();\r\n if (!extractedNodes.length) return false;\r\n\r\n // Only split when every extracted node is a direct child of the block.\r\n // If any node is nested (e.g. TextNode inside <strong>), fall back to the\r\n // standard whole-block heading so we don't break inline formatting.\r\n const allDirect = extractedNodes.every((n) => {\r\n const parent = n.getParent();\r\n return parent !== null && parent.is(block);\r\n });\r\n if (!allDirect) return false;\r\n\r\n // Fetch FRESH children — extract() may have split TextNodes.\r\n const allChildren = [...block.getChildren()];\r\n\r\n const firstSelected = extractedNodes[0];\r\n const lastSelected = extractedNodes[extractedNodes.length - 1];\r\n const firstIdx = allChildren.findIndex((n) => n.is(firstSelected));\r\n const lastIdx = allChildren.findIndex((n) => n.is(lastSelected));\r\n\r\n if (firstIdx === -1 || lastIdx === -1) return false;\r\n // The whole block is already selected — no split needed.\r\n if (firstIdx === 0 && lastIdx === allChildren.length - 1) return false;\r\n\r\n const selectedNodes = allChildren.slice(firstIdx, lastIdx + 1);\r\n const afterNodes = allChildren.slice(lastIdx + 1);\r\n // Nodes at indices [0, firstIdx) stay in the original block unchanged.\r\n\r\n // Insert in an order that produces: original-block → selectedBlock → afterBlock\r\n // Strategy: each `insertAfter` places the new node *immediately* after block,\r\n // so we insert afterBlock first (pushed right by the next call), then selectedBlock.\r\n if (afterNodes.length > 0) {\r\n const afterBlock: ElementNode = $isHeadingNode(block)\r\n ? $createHeadingNode(block.getTag())\r\n : $createParagraphNode();\r\n afterNodes.forEach((n) => afterBlock.append(n)); // moves nodes out of original block\r\n block.insertAfter(afterBlock); // original → afterBlock\r\n }\r\n\r\n const selectedBlock = $createParagraphNode();\r\n selectedNodes.forEach((n) => selectedBlock.append(n)); // moves nodes out of original block\r\n block.insertAfter(selectedBlock); // original → selectedBlock → afterBlock\r\n\r\n // If nothing remained before the selection, the original block is now empty.\r\n if (block.getChildrenSize() === 0) {\r\n block.remove();\r\n }\r\n\r\n // Reposition the editor selection onto selectedBlock so the caller's\r\n // subsequent $setBlocksType converts only this block.\r\n selectedBlock.select();\r\n\r\n return true;\r\n}\r\n\r\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Split multi-line blocks first so only the selected line(s) become a paragraph.\r\n $splitBlocksAtLineBreaks(selection);\r\n }\r\n $setBlocksType($getSelection(), () => $createParagraphNode());\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 type='number'\r\n min={1}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n input={{ style: { textAlign: 'left' } }}\r\n onChange={(_, v) => setRows(v.value.replace(/\\D/g, ''))}\r\n />\r\n </Field>\r\n\r\n <Field label='Columns' orientation='horizontal' size='small'>\r\n <Input\r\n type='number'\r\n min={1}\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n input={{ style: { textAlign: 'left' } }}\r\n onChange={(_, v) => setColumns(v.value.replace(/\\D/g, ''))}\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 {\r\n Button,\r\n Dropdown,\r\n makeStyles,\r\n Option,\r\n ToolbarDivider,\r\n} from '@fluentui/react-components';\r\nimport {\r\n CommentQuoteRegular,\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 $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\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 type RangeSelection,\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 lastSelectionRef = React.useRef<RangeSelection | 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 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 return;\r\n }\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\r\n // Restores the last saved cursor/selection before applying any block-level\r\n // transform. Without this, clicking a toolbar dropdown loses the selection\r\n // and the transform applies to the wrong block (or the whole document).\r\n const applyToBlock = React.useCallback(\r\n (fn: (sel: RangeSelection) => void) => {\r\n editor.update(() => {\r\n const saved = lastSelectionRef.current;\r\n if (saved) $setSelection(saved.clone());\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) fn(sel);\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n const formatQuote = () => {\r\n applyToBlock((selection) => {\r\n if (selectNodeType === 'quote') {\r\n $setBlocksType(selection, () => $createParagraphNode());\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 const sel = $getSelection();\r\n if ($isRangeSelection(sel)) lastSelectionRef.current = sel.clone();\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 applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('left'); } }); });\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('right'); } }); });\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('center'); } }); });\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('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 applyToBlock((selection) => {\r\n $setBlocksType(selection, () => $createHeadingNode(heading));\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 applyToBlock((sel) => $setBlocksType(sel, () => $createParagraphNode()));\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', lowercase: 'Lowercase', capitalize: 'Capitalize',\r\n strike: 'Strikethrough', subscript: 'Subscript', superscript: 'Superscript',\r\n highlight: 'Highlight', 'ul-list': 'Bullet list', 'ol-list': 'Number list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0 ? '' :\r\n activeDecorators.length === 1 ? 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': editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase'); break;\r\n case 'lowercase': onHandleSelectOption(RichTextPluginsType.Lowercase); break;\r\n case 'capitalize': onHandleSelectOption(RichTextPluginsType.Capitalize); break;\r\n case 'strike': onHandleSelectOption(RichTextPluginsType.Strikethrough); break;\r\n case 'subscript': onHandleSelectOption(RichTextPluginsType.Subscript); break;\r\n case 'superscript': onHandleSelectOption(RichTextPluginsType.Superscript); break;\r\n case 'highlight': onHandleSelectOption(RichTextPluginsType.Highlight); break;\r\n case 'ul-list':\r\n editor.dispatchCommand(selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'page-break': editor.dispatchCommand(INSERT_PAGE_BREAK, undefined); break;\r\n case 'quote': formatQuote(); break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }} />Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />Number list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />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 { value: 'left', label: 'Left Align', icon: <TextAlignLeftFilled style={optionIconStyle} />, action: RichTextPluginsType.LeftAlign },\r\n { value: 'center', label: 'Center Align', icon: <TextAlignCenterFilled style={optionIconStyle} />, action: RichTextPluginsType.CenterAlign },\r\n { value: 'right', label: 'Right Align', icon: <TextAlignRightFilled style={optionIconStyle} />, action: RichTextPluginsType.RightAlign },\r\n { value: 'justify', label: 'Justify Align', icon: <TextAlignJustifyFilled style={optionIconStyle} />, action: RichTextPluginsType.JustifyAlign },\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 </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/Types/PageSetup.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/Utils/Sanitize.ts","../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/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Utils/Index.tsx","../src/Plugins/FontSize.tsx","../src/Plugins/InsertLink.tsx","../src/Plugins/PageSetup.tsx","../src/Plugins/Table.tsx","../src/Plugins/Youtube.tsx","../src/Plugins/ToolBar.tsx","../src/Plugins/YoutubeDeletePlugin.tsx","../src/Theme/index.ts"],"names":["img","jsx","useRef","jsxs","ImageComponent","React","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","$getNodeByKey","useCallback","$getSelection","$isNodeSelection","$setSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","Suspense","Fragment","InlineImageComponent","React2","DecoratorNode","createEditor","ContentEditorLevel","TextNode","React3","width","height","$isRangeSelection","React4","COMMAND_PRIORITY_HIGH","clamp","$getRoot","getSelectedNode","$isAtNodeEnd","$findMatchingParent","$isLinkNode","TOGGLE_LINK_COMMAND","createPortal","createCommand","Button","isHTMLElement","Dialog","DialogSurface","DialogBody","DialogTitle","DialogContent","Stack","Field","AttachFilled","Input","DialogActions","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","$onDragStart","DRAGOVER_COMMAND","$onDragover","DROP_COMMAND","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","canDropImage","getDragImageData","getDragSelection","$createRangeSelection","getDOMSelectionFromTarget","$generateNodesFromDOM","$generateHtmlFromNodes","$isTextNode","$createTextNode","React6","React7","KEY_DOWN_COMMAND","$getTableNodeFromLexicalNodeOrThrow","$isTableCellNode","useMemo","r","g","b","Dismiss16Regular","useStyles","makeStyles","$getSelectionStyleValueForProperty","$patchStyleText","Dropdown","Option","fontSize","React11","text","link","$createLinkNode","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuDivider","$insertNodeToNearestRoot","useTheme","type","$isHeadingNode","$setBlocksType","FORMAT_TEXT_COMMAND","$createHeadingNode","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","MenuItem","TableAddRegular","ImageAddRegular","ImageEditRegular","VideoClipRegular","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","ListNode"],"mappings":"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","file":"index.mjs","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 // Overlay that exactly covers the image container (position:relative parent).\r\n // pointer-events:none lets clicks pass through to the image; each handle\r\n // re-enables pointer-events so drag-resize still works.\r\n <div\r\n ref={controlWrapperRef}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n pointerEvents: 'none',\r\n }}\r\n >\r\n <div\r\n className=\"image-resizer image-resizer-n\"\r\n style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 style={{ pointerEvents: 'auto' }}\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 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 if (typeof width === 'number' && width > writable.__maxWidth) {\r\n writable.__maxWidth = width;\r\n }\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 $getNodeByKey,\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 ImageResizer from '../Utils/ImageResizer';\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 const [isResizing, setIsResizing] = useState<boolean>(false);\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 ($isInlineImageNode(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 setShowCaption = (show: boolean) => {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isInlineImageNode(node)) {\r\n node.setShowCaption(show);\r\n }\r\n });\r\n };\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 (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 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 isResizing,\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) && !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\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 {isFocused && $isNodeSelection(selection) && (\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 onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n captionsEnabled={false}\r\n />\r\n )}\r\n </>\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 * Display one or more error messages inside the editor immediately.\r\n * These are shown alongside any prop-based `errors`.\r\n * Example: ref.current.setErrors(['Attachment too large', 'Subject is required'])\r\n */\r\n setErrors: (messages: string[]) => void;\r\n /** Remove all errors that were set via `setErrors`. */\r\n clearErrors: () => void;\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 // ── Word / character limits ────────────────────────────────────────────────\r\n /** Maximum words allowed. Shows a live counter; turns red when exceeded. */\r\n wordLimit?: number;\r\n /** Minimum words required. Error shown after blur if not met. */\r\n minWords?: number;\r\n /** Maximum characters allowed. Error shown when exceeded. */\r\n maxChars?: number;\r\n /** Minimum characters required. Error shown after blur if not met. */\r\n minChars?: number;\r\n\r\n // ── Required ───────────────────────────────────────────────────────────────\r\n /** When true, shows a required-field error after blur if the editor is empty. */\r\n required?: boolean;\r\n\r\n // ── Callbacks ─────────────────────────────────────────────────────────────\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n * exceeded: true → user just exceeded; false → came back within limit.\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n\r\n // ── External errors ────────────────────────────────────────────────────────\r\n /**\r\n * Extra error messages to display (on top of any built-in validation).\r\n * Use this for errors that originate outside the editor (e.g. file too large,\r\n * subject empty, API failure).\r\n *\r\n * Example: errors={['Attachment exceeds 5 MB', 'Subject is required']}\r\n */\r\n errors?: string[];\r\n\r\n // ── Custom error messages ──────────────────────────────────────────────────\r\n /**\r\n * Override the text of any built-in validation message.\r\n * Every key accepts a plain string OR a function receiving the live counts.\r\n *\r\n * Covered errors:\r\n * - wordLimitExceeded — fires when wordCount > wordLimit\r\n * - required — fires on blur when editor is empty and required=true\r\n * - minWords — fires on blur when wordCount < minWords\r\n * - maxCharsExceeded — fires when charCount > maxChars\r\n * - minCharsRequired — fires on blur when charCount < minChars\r\n *\r\n * Example:\r\n * ```tsx\r\n * errorMessages={{\r\n * wordLimitExceeded: (count, limit) => `Too long — ${count}/${limit} words used.`,\r\n * required: 'Email body cannot be empty.',\r\n * minWords: (count, min) => `Write at least ${min} words (${count} so far).`,\r\n * maxCharsExceeded: (count, max) => `${count}/${max} characters — please shorten.`,\r\n * minCharsRequired: (count, min) => `At least ${min} characters needed (${count} entered).`,\r\n * }}\r\n * ```\r\n */\r\n errorMessages?: {\r\n wordLimitExceeded?: string | ((wordCount: number, wordLimit: number) => string);\r\n required?: string;\r\n minWords?: string | ((wordCount: number, minWords: number) => string);\r\n maxCharsExceeded?: string | ((charCount: number, maxChars: number) => string);\r\n minCharsRequired?: string | ((charCount: number, minChars: number) => string);\r\n };\r\n}\r\n","export type PageSize =\r\n | 'pageless'\r\n | 'a4'\r\n | 'letter'\r\n | 'legal'\r\n | 'tabloid'\r\n | 'a3'\r\n | 'a5'\r\n | 'b4'\r\n | 'b5'\r\n | 'statement'\r\n | 'executive'\r\n | 'folio';\r\n\r\nexport type PageOrientation = 'portrait' | 'landscape';\r\n\r\nexport type PageMargin = 'narrow' | 'normal' | 'moderate' | 'wide';\r\n\r\nexport interface PageSetupValue {\r\n size: PageSize;\r\n orientation: PageOrientation;\r\n margin: PageMargin;\r\n}\r\n\r\nexport const DEFAULT_PAGE_SETUP: PageSetupValue = {\r\n size: 'pageless',\r\n orientation: 'portrait',\r\n margin: 'normal',\r\n};\r\n\r\ninterface PageSizeOption {\r\n key: Exclude<PageSize, 'pageless'>;\r\n label: string;\r\n // Portrait dimensions in inches (widthIn is always the shorter edge).\r\n widthIn: number;\r\n heightIn: number;\r\n}\r\n\r\nexport const PAGE_SIZE_OPTIONS: PageSizeOption[] = [\r\n { key: 'a4', label: 'A4 (8.27\" x 11.69\")', widthIn: 8.27, heightIn: 11.69 },\r\n { key: 'letter', label: 'Letter (8.5\" x 11\")', widthIn: 8.5, heightIn: 11 },\r\n { key: 'legal', label: 'Legal (8.5\" x 14\")', widthIn: 8.5, heightIn: 14 },\r\n { key: 'tabloid', label: 'Tabloid (11\" x 17\")', widthIn: 11, heightIn: 17 },\r\n { key: 'a3', label: 'A3 (11.69\" x 16.54\")', widthIn: 11.69, heightIn: 16.54 },\r\n { key: 'a5', label: 'A5 (5.83\" x 8.27\")', widthIn: 5.83, heightIn: 8.27 },\r\n { key: 'b4', label: 'B4 (9.84\" x 13.90\")', widthIn: 9.84, heightIn: 13.9 },\r\n { key: 'b5', label: 'B5 (6.93\" x 9.84\")', widthIn: 6.93, heightIn: 9.84 },\r\n { key: 'statement', label: 'Statement (5.5\" x 8.5\")', widthIn: 5.5, heightIn: 8.5 },\r\n { key: 'executive', label: 'Executive (7.25\" x 10.5\")', widthIn: 7.25, heightIn: 10.5 },\r\n { key: 'folio', label: 'Folio (8.5\" x 13\")', widthIn: 8.5, heightIn: 13 },\r\n];\r\n\r\ninterface MarginOption {\r\n key: PageMargin;\r\n label: string;\r\n valueIn: number;\r\n}\r\n\r\nexport const MARGIN_OPTIONS: MarginOption[] = [\r\n { key: 'narrow', label: 'Narrow (0.25\")', valueIn: 0.25 },\r\n { key: 'normal', label: 'Normal (0.4\")', valueIn: 0.4 },\r\n { key: 'moderate', label: 'Moderate (0.75\")', valueIn: 0.75 },\r\n { key: 'wide', label: 'Wide (1\")', valueIn: 1 },\r\n];\r\n\r\nconst CSS_PX_PER_INCH = 96;\r\n\r\n/**\r\n * Resolves the on-screen canvas metrics for a page setup.\r\n * `widthPx` is `undefined` for Pageless (no width constraint — today's default look).\r\n */\r\nexport function resolvePageCanvasMetrics(value: PageSetupValue): {\r\n widthPx?: number;\r\n paddingPx: number;\r\n} {\r\n const margin = MARGIN_OPTIONS.find((o) => o.key === value.margin) ?? MARGIN_OPTIONS[1];\r\n\r\n if (value.size === 'pageless') {\r\n return { widthPx: undefined, paddingPx: 20 };\r\n }\r\n\r\n const size = PAGE_SIZE_OPTIONS.find((o) => o.key === value.size);\r\n if (!size) return { widthPx: undefined, paddingPx: 20 };\r\n\r\n const widthIn = value.orientation === 'landscape' ? size.heightIn : size.widthIn;\r\n\r\n return {\r\n widthPx: Math.round(widthIn * CSS_PX_PER_INCH),\r\n paddingPx: Math.round(margin.valueIn * CSS_PX_PER_INCH),\r\n };\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 { ErrorCircleRegular } from \"@fluentui/react-icons\";\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 {\r\n AutoLinkPlugin,\r\n createLinkMatcherWithRegExp,\r\n} 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, {\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} 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 { DEFAULT_PAGE_SETUP, PageSetupValue, resolvePageCanvasMetrics } from \"./Types/PageSetup\";\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 { $getRoot } from \"lexical\";\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({\r\n onCountChange,\r\n}: {\r\n onCountChange: (count: number) => void;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const text = $getRoot().getTextContent();\r\n const words = text.trim() === \"\" ? 0 : text.trim().split(/\\s+/).length;\r\n onCountChange(words);\r\n });\r\n });\r\n }, [editor, onCountChange]);\r\n return null;\r\n}\r\n\r\nfunction CharCountPlugin({\r\n onCountChange,\r\n}: {\r\n onCountChange: (count: number) => void;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n onCountChange($getRoot().getTextContent().length);\r\n });\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 =\r\n !!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 = !!(\r\n data.misspelled_words?.length || data.misspelled?.length\r\n );\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 =\r\n data.grammar_correction ?? data.improved_text;\r\n const grammarCorrection =\r\n rawGrammar && rawGrammar.trim() !== text.trim()\r\n ? rawGrammar.trim()\r\n : undefined;\r\n\r\n return {\r\n issues: issues.sort((a, b) => a.offset - b.offset),\r\n grammarCorrection,\r\n };\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(\r\n fn: (text: string) => Promise<any>,\r\n): (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<\r\n ContentEditorRef,\r\n 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 () =>\r\n props.spellCheckFn\r\n ? _makeSpellCheckFn(props.spellCheckFn)\r\n : 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] =\r\n 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(\r\n (count: number) => setWordCount(count),\r\n [],\r\n );\r\n\r\n const [charCount, setCharCount] = useState(0);\r\n const handleCharCount = useCallback(\r\n (count: number) => setCharCount(count),\r\n [],\r\n );\r\n\r\n const [refErrors, setRefErrors] = useState<string[]>([]);\r\n const [pageSetup, setPageSetup] = useState<PageSetupValue>(DEFAULT_PAGE_SETUP);\r\n const pageCanvas = resolvePageCanvasMetrics(pageSetup);\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: pageCanvas.paddingPx,\r\n right: pageCanvas.paddingPx,\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 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) =>\r\n 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 [touched, setTouched] = useState(false);\r\n\r\n const isOverLimit =\r\n props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n // Built-in validation messages generated automatically by the editor.\r\n const internalErrors: string[] = [];\r\n\r\n if (isOverLimit) {\r\n const m = props.errorMessages?.wordLimitExceeded;\r\n internalErrors.push(\r\n typeof m === \"function\"\r\n ? m(wordCount, props.wordLimit!)\r\n : (m ??\r\n `Word limit exceeded (${wordCount} / ${props.wordLimit} words used)`),\r\n );\r\n }\r\n\r\n if (props.required && touched && wordCount === 0) {\r\n internalErrors.push(\r\n props.errorMessages?.required ?? \"This field is required\",\r\n );\r\n }\r\n\r\n if (props.minWords !== undefined && touched && wordCount < props.minWords) {\r\n const m = props.errorMessages?.minWords;\r\n internalErrors.push(\r\n typeof m === \"function\"\r\n ? m(wordCount, props.minWords)\r\n : (m ??\r\n `Minimum ${props.minWords} words required (${wordCount} entered)`),\r\n );\r\n }\r\n\r\n if (props.maxChars !== undefined && charCount > props.maxChars) {\r\n const m = props.errorMessages?.maxCharsExceeded;\r\n internalErrors.push(\r\n typeof m === \"function\"\r\n ? m(charCount, props.maxChars)\r\n : (m ??\r\n `Character limit exceeded (${charCount} / ${props.maxChars} characters used)`),\r\n );\r\n }\r\n\r\n if (\r\n props.minChars !== undefined &&\r\n touched &&\r\n charCount < props.minChars &&\r\n charCount > 0\r\n ) {\r\n const m = props.errorMessages?.minCharsRequired;\r\n internalErrors.push(\r\n typeof m === \"function\"\r\n ? m(charCount, props.minChars)\r\n : (m ??\r\n `Minimum ${props.minChars} characters required (${charCount} entered)`),\r\n );\r\n }\r\n\r\n const allErrors: string[] = [\r\n ...internalErrors,\r\n ...(props.errors ?? []),\r\n ...refErrors,\r\n ];\r\n const hasErrors = allErrors.length > 0;\r\n const hasRedBorder = hasErrors;\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 ${\r\n hasRedBorder ? \"#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 >\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 pageSetup={pageSetup}\r\n onPageSetupChange={setPageSetup}\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 overflowX: 'auto',\r\n minWidth: 0,\r\n background: pageCanvas.widthPx !== undefined ? '#eef0f2' : undefined,\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={{\r\n paddingTop: props.level !== ContentEditorLevel.None ? 0 : 10,\r\n paddingLeft: pageCanvas.paddingPx,\r\n paddingRight: pageCanvas.paddingPx,\r\n maxWidth: pageCanvas.widthPx,\r\n marginLeft: pageCanvas.widthPx !== undefined ? 'auto' : undefined,\r\n marginRight: pageCanvas.widthPx !== undefined ? 'auto' : undefined,\r\n boxShadow:\r\n pageCanvas.widthPx !== undefined\r\n ? '0 0 0 1px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.08)'\r\n : undefined,\r\n }}\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 >\r\n <span\r\n style={{\r\n fontSize: \"11px\",\r\n color: isOverLimit\r\n ? \"#c4272c\"\r\n : \"var(--colorNeutralForeground3, #aaa)\",\r\n fontWeight: isOverLimit ? 600 : 400,\r\n transition: \"color 0.2s, font-weight 0.2s\",\r\n }}\r\n >\r\n {wordCount} / {props.wordLimit} words\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {hasErrors && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid #fbd5d5\",\r\n background: \"#fff8f8\",\r\n padding: \"6px 12px 8px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 4,\r\n }}\r\n >\r\n {allErrors.map((err, i) => (\r\n <div\r\n key={i}\r\n style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}\r\n >\r\n <ErrorCircleRegular\r\n style={{ fontSize: 14, color: \"#c4272c\", flexShrink: 0 }}\r\n />\r\n <span style={{ fontSize: 12, color: \"#c4272c\" }}>\r\n {err}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={() => {\r\n setTouched(true);\r\n props.onBlur?.();\r\n }}\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 && (\r\n <CharacterStylesPopupPlugin />\r\n )}\r\n <CustomOnChangePlugin\r\n value={props.value}\r\n onChange={props.onChange}\r\n />\r\n\r\n {(props.wordLimit !== undefined ||\r\n props.required ||\r\n props.minWords !== undefined) && (\r\n <WordCountPlugin onCountChange={handleWordCount} />\r\n )}\r\n\r\n {(props.maxChars !== undefined || props.minChars !== undefined) && (\r\n <CharCountPlugin onCountChange={handleCharCount} />\r\n )}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n setRefErrors={setRefErrors}\r\n />\r\n </Stack>\r\n </div>\r\n </LexicalComposer>\r\n </FluentProvider>\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","/**\r\n * sanitizeHtml — Custom allowlist-based HTML sanitizer.\r\n *\r\n * SECURITY: Every HTML string that enters the editor from an external source\r\n * (value prop, setValue(), upsertBlock()) MUST be passed through this function\r\n * before being handed to Lexical's $generateNodesFromDOM or DOMParser.\r\n *\r\n * Uses the browser's built-in DOMParser + attribute manipulation to strip\r\n * disallowed tags and dangerous patterns with zero external dependencies.\r\n *\r\n * Threat model:\r\n * - Strips unknown tags (unwraps children, does not silently drop them).\r\n * - Strips all event-handler attributes (onclick, onerror, onload, …).\r\n * - Strips javascript:/vbscript:/data: URI schemes from href and src.\r\n * - Sanitizes expression() and url(javascript:…) inside style attributes.\r\n */\r\n\r\n/**\r\n * Tags that must be deleted in their entirety — including all their children\r\n * and text content — because even the raw text they contain is executable\r\n * (script body) or exposes sensitive data (style, meta).\r\n *\r\n * These are checked BEFORE the allowlist so they can never slip through as\r\n * \"unknown tag → unwrap\" which would leave their text in the output.\r\n */\r\nconst DROP_ENTIRELY = new Set([\r\n 'script',\r\n 'noscript',\r\n 'style',\r\n 'object',\r\n 'embed',\r\n 'form',\r\n 'input',\r\n 'button',\r\n 'select',\r\n 'textarea',\r\n 'meta',\r\n 'link',\r\n 'base',\r\n]);\r\n\r\n/** Tags the editor legitimately produces and should round-trip safely. */\r\nconst ALLOWED_TAGS = new Set([\r\n // Block\r\n 'p',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'blockquote',\r\n 'pre',\r\n 'div',\r\n 'table',\r\n 'thead',\r\n 'tbody',\r\n 'tfoot',\r\n 'tr',\r\n 'td',\r\n 'th',\r\n // Inline\r\n 'span',\r\n 'a',\r\n 'strong',\r\n 'b',\r\n 'em',\r\n 'i',\r\n 'u',\r\n 's',\r\n 'del',\r\n 'strike',\r\n 'sub',\r\n 'sup',\r\n 'mark',\r\n 'code',\r\n 'br',\r\n 'hr',\r\n // Media / embeds\r\n 'img',\r\n 'iframe',\r\n]);\r\n\r\n/** Attributes the editor legitimately uses. Everything else is stripped. */\r\nconst ALLOWED_ATTRS = new Set([\r\n // Presentation\r\n 'class',\r\n 'style',\r\n 'dir',\r\n 'lang',\r\n // Anchors\r\n 'href',\r\n 'target',\r\n 'rel',\r\n // Images\r\n 'src',\r\n 'alt',\r\n 'width',\r\n 'height',\r\n // Tables\r\n 'colspan',\r\n 'rowspan',\r\n // Lists — <ol type=\"a\"> and <ol start=\"2\">\r\n 'start',\r\n 'type',\r\n // Lexical-internal data markers\r\n 'data-lex-block',\r\n 'data-kind',\r\n 'data-lexical-decorator',\r\n // Misc\r\n 'title',\r\n 'allowfullscreen',\r\n]);\r\n\r\n/** Schemes that are never safe inside href or src. */\r\nconst DANGEROUS_URL = /^\\s*(javascript|data\\s*:|vbscript)/i;\r\n\r\n/**\r\n * Sanitizes a single DOM element in-place (recursive, bottom-up).\r\n *\r\n * Disallowed tags are \"unwrapped\" — their child nodes are promoted to the\r\n * parent so text content is never silently lost.\r\n */\r\nfunction sanitizeElement(el: Element): void {\r\n // Process children first so indices don't shift under us during parent removal.\r\n for (const child of Array.from(el.children)) {\r\n sanitizeElement(child);\r\n }\r\n\r\n const tag = el.tagName.toLowerCase();\r\n\r\n // Completely remove dangerous tags — do NOT unwrap because even their\r\n // text content (e.g. a <script> body) is executable / sensitive.\r\n if (DROP_ENTIRELY.has(tag)) {\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n\r\n // Only allow iframes that match the editor's YouTube embed output.\r\n if (tag === 'iframe') {\r\n const src = el.getAttribute('src') ?? '';\r\n const isYouTube =\r\n /^\\s*https:\\/\\/(www\\.)?(youtube\\.com|youtube-nocookie\\.com)\\/embed\\/[^?&/]+/i.test(src);\r\n if (!isYouTube) {\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n }\r\n\r\n if (!ALLOWED_TAGS.has(tag)) {\r\n // Unknown tag — unwrap: hoist all children (including text) before this\r\n // element so visible text is never silently discarded.\r\n while (el.firstChild) {\r\n el.parentNode?.insertBefore(el.firstChild, el);\r\n }\r\n el.parentNode?.removeChild(el);\r\n return;\r\n }\r\n\r\n // Strip disallowed / dangerous attributes.\r\n for (const { name, value } of Array.from(el.attributes)) {\r\n const lname = name.toLowerCase();\r\n\r\n if (!ALLOWED_ATTRS.has(lname)) {\r\n // Covers all on* event handlers and unknown attributes.\r\n el.removeAttribute(name);\r\n continue;\r\n }\r\n\r\n if (lname === 'href' || lname === 'src') {\r\n if (DANGEROUS_URL.test(value)) {\r\n el.removeAttribute(name);\r\n }\r\n }\r\n\r\n if (lname === 'style') {\r\n const safe = value\r\n .replace(/expression\\s*\\(/gi, '(')\r\n .replace(/url\\s*\\(\\s*['\"]?\\s*javascript:/gi, 'url(');\r\n el.setAttribute('style', safe);\r\n }\r\n }\r\n\r\n // Prevent reverse tabnabbing for links that open in a new tab/window.\r\n if (tag === 'a' && (el.getAttribute('target') || '').toLowerCase() === '_blank') {\r\n const rel = (el.getAttribute('rel') || '').trim();\r\n const tokens = new Set(\r\n rel\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .map((t) => t.toLowerCase()),\r\n );\r\n tokens.add('noopener');\r\n tokens.add('noreferrer');\r\n el.setAttribute('rel', Array.from(tokens).join(' '));\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes an HTML string using a strict allowlist.\r\n *\r\n * @param html - Raw HTML from an untrusted source (value prop, API, clipboard).\r\n * @returns Sanitized HTML safe to import into the Lexical editor.\r\n *\r\n * @example\r\n * const clean = sanitizeHtml(rawHtmlFromDatabase);\r\n * editor.update(() => {\r\n * const nodes = $generateNodesFromDOM(editor, new DOMParser().parseFromString(clean, 'text/html'));\r\n * $getRoot().append(...nodes);\r\n * });\r\n */\r\nexport function sanitizeHtml(html: string): string {\r\n if (!html || typeof html !== 'string') return '';\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n for (const child of Array.from(doc.body.children)) {\r\n sanitizeElement(child);\r\n }\r\n return doc.body.innerHTML;\r\n}\r\n\r\n/**\r\n * Post-processes HTML output from Lexical before it is handed to consumers\r\n * (onChange / getValue).\r\n *\r\n * Fixes three known issues with Lexical 0.44 output:\r\n *\r\n * 1. Bold double-wrap — Lexical's createDOM uses <strong> as the semantic\r\n * inner element, then exportDOM wraps with <b> for email-client compat.\r\n * Result: <b><strong>text</strong></b>. Any CSS that uses font-weight:\r\n * bolder (e.g. CSS resets, email clients) renders this noticeably heavier.\r\n * Fix: unwrap <strong> from inside <b>, merging any attributes into <b>.\r\n *\r\n * 2. Italic double-wrap — same pattern: createDOM creates <em>, exportDOM\r\n * wraps with <i>. Result: <i><em>text</em></i>.\r\n * Fix: unwrap <em> from inside <i>.\r\n *\r\n * 3. <p> default margins — normalizeToBlockHtml wraps all content in <p>.\r\n * Inside the editor the theme CSS resets margins; but the stored HTML is\r\n * used outside (email body, preview) where those CSS rules don't apply.\r\n * Fix: add inline margin:0; line-height:1.25 to every <p> that lacks\r\n * an explicit margin declaration.\r\n */\r\nexport function postProcessOutput(html: string): string {\r\n if (!html) return html;\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n\r\n // ── 1. Collapse <b><strong> → <b> ─────────────────────────────────────────\r\n for (const inner of Array.from(doc.querySelectorAll('b > strong'))) {\r\n const outer = inner.parentElement!;\r\n _mergeAttributes(inner, outer);\r\n while (inner.firstChild) outer.insertBefore(inner.firstChild, inner);\r\n outer.removeChild(inner);\r\n }\r\n\r\n // ── 2. Collapse <i><em> → <i> ─────────────────────────────────────────────\r\n for (const inner of Array.from(doc.querySelectorAll('i > em'))) {\r\n const outer = inner.parentElement!;\r\n _mergeAttributes(inner, outer);\r\n while (inner.firstChild) outer.insertBefore(inner.firstChild, inner);\r\n outer.removeChild(inner);\r\n }\r\n\r\n // ── 3. Inline margin reset on <p> so output renders correctly everywhere ──\r\n for (const p of Array.from(doc.querySelectorAll('p'))) {\r\n const style = (p as HTMLElement).style;\r\n const hasMargin = !!(\r\n style.margin ||\r\n style.marginTop ||\r\n style.marginRight ||\r\n style.marginBottom ||\r\n style.marginLeft\r\n );\r\n if (!hasMargin) style.margin = '0';\r\n if (!style.lineHeight) style.lineHeight = '1.25';\r\n }\r\n\r\n return doc.body.innerHTML;\r\n}\r\n\r\n/** Moves style and class attributes from src element into dst, merging values. */\r\nfunction _mergeAttributes(src: Element, dst: Element): void {\r\n for (const { name, value } of Array.from(src.attributes)) {\r\n if (name === 'style') {\r\n const prev = dst.getAttribute('style') || '';\r\n dst.setAttribute('style', prev ? `${prev}; ${value}` : value);\r\n } else if (name === 'class') {\r\n const prev = dst.getAttribute('class') || '';\r\n dst.setAttribute('class', prev ? `${prev} ${value}` : value);\r\n }\r\n // other attributes (data-*, etc.) are intentionally not merged\r\n }\r\n}\r\n\r\nconst BLOCK_TAGS = new Set([\r\n 'p',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'div',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'table',\r\n 'blockquote',\r\n 'pre',\r\n 'hr',\r\n]);\r\n\r\n/**\r\n * Ensures every top-level node is a block element so the HTML can be safely\r\n * imported into Lexical's root node (which only accepts block children).\r\n *\r\n * Handles three cases:\r\n * - Pure plain text / inline-only → wraps everything in one <p>\r\n * - Mixed (some blocks + loose text/inline) → wraps each loose node in its own <p>\r\n * - Already all blocks → returns the string unchanged (fast path)\r\n *\r\n * The mixed case can arise after sanitizeHtml() unwraps unknown block tags\r\n * (e.g. <section>text<p>para</p></section> → text<p>para</p>).\r\n */\r\nexport function normalizeToBlockHtml(html: string): string {\r\n if (!html) return '';\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n const body = doc.body;\r\n const childNodes = Array.from(body.childNodes);\r\n\r\n // Fast path: every non-whitespace top-level node is already a block.\r\n const needsWrap = childNodes.some((node) => {\r\n if (node.nodeType === Node.TEXT_NODE) return !!node.nodeValue?.trim();\r\n if (node.nodeType === Node.ELEMENT_NODE)\r\n return !BLOCK_TAGS.has((node as Element).tagName.toLowerCase());\r\n return false;\r\n });\r\n if (!needsWrap) return html;\r\n\r\n // Detach all children first (the references in childNodes[] remain valid).\r\n while (body.firstChild) body.removeChild(body.firstChild);\r\n\r\n // Re-append: block nodes stay as-is; consecutive inline/text nodes are\r\n // grouped into a single <p> that is flushed when the next block arrives.\r\n let pendingP: HTMLParagraphElement | null = null;\r\n for (const node of childNodes) {\r\n const isBlock =\r\n node.nodeType === Node.ELEMENT_NODE &&\r\n BLOCK_TAGS.has((node as Element).tagName.toLowerCase());\r\n const isWhitespace = node.nodeType === Node.TEXT_NODE && !node.nodeValue?.trim();\r\n\r\n if (isBlock) {\r\n if (pendingP) {\r\n body.appendChild(pendingP);\r\n pendingP = null;\r\n }\r\n body.appendChild(node);\r\n } else if (!isWhitespace) {\r\n if (!pendingP) pendingP = doc.createElement('p');\r\n pendingP.appendChild(node);\r\n }\r\n }\r\n if (pendingP) body.appendChild(pendingP);\r\n\r\n return body.innerHTML;\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\nimport { postProcessOutput } from '../Utils/Sanitize';\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(postProcessOutput($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 { Checkmark16Regular, Delete16Regular, Dismiss16Regular, Edit16Regular } from '@fluentui/react-icons';\r\nimport {\r\n $createLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n TOGGLE_LINK_COMMAND\r\n} from '@lexical/link';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport { $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 isLink &&\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, isLink, 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 placeholder=\"https://\"\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 className=\"link-actions\">\r\n <button\r\n type=\"button\"\r\n className=\"link-icon-btn link-cancel\"\r\n title=\"Cancel\"\r\n aria-label=\"Cancel\"\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n setIsLinkEditMode(false);\r\n }}>\r\n <Dismiss16Regular />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"link-icon-btn link-confirm\"\r\n title=\"Confirm\"\r\n aria-label=\"Confirm\"\r\n onMouseDown={preventDefault}\r\n onClick={handleLinkSubmission}>\r\n <Checkmark16Regular />\r\n </button>\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 className=\"link-actions\">\r\n <button\r\n type=\"button\"\r\n className=\"link-icon-btn link-edit\"\r\n title=\"Edit link\"\r\n aria-label=\"Edit link\"\r\n onMouseDown={preventDefault}\r\n onClick={(event) => {\r\n event.preventDefault();\r\n setEditedLinkUrl(linkUrl);\r\n setIsLinkEditMode(true);\r\n }}>\r\n <Edit16Regular />\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"link-icon-btn link-trash\"\r\n title=\"Remove link\"\r\n aria-label=\"Remove link\"\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }}>\r\n <Delete16Regular />\r\n </button>\r\n </div>\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 Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n Field,\r\n Input,\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\nexport const InsertImageDialog = ({\r\n activeEditor,\r\n disabled,\r\n open: externalOpen,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n open?: boolean;\r\n onClose?: () => void;\r\n}) => {\r\n const [src, setSrc] = useState('');\r\n const [altText, setAltText] = useState('');\r\n const [internalOpen, setInternalOpen] = useState(false);\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 isControlled = externalOpen !== undefined;\r\n const isOpen = isControlled ? (!!externalOpen && !disabled) : (internalOpen && !disabled);\r\n const isAddDisabled = disabled || src === '';\r\n\r\n const handleClose = () => {\r\n setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n if (isControlled) onClose?.();\r\n else setInternalOpen(false);\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 activeEditor.dispatchCommand(INSERT_IMAGE_COMMAND, payload);\r\n handleClose();\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 <>\r\n {!isControlled && (\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 setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n setInternalOpen(true);\r\n }}\r\n />\r\n )}\r\n\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!data.open) handleClose();\r\n }}>\r\n <DialogSurface style={{ maxWidth: '400px' }}>\r\n <DialogBody>\r\n <DialogTitle>Insert Image</DialogTitle>\r\n <DialogContent>\r\n <Stack tokens={{ childrenGap: 10 }} style={{ paddingTop: 8 }}>\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 </Stack>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n appearance='primary'\r\n size='small'\r\n disabled={isAddDisabled}\r\n onClick={() => onClick({ altText, src })}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={handleClose}>\r\n Cancel\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\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 Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n Dropdown,\r\n Field,\r\n Input,\r\n makeStyles,\r\n Option,\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 open: externalOpen,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n open?: boolean;\r\n onClose?: () => void;\r\n}): JSX.Element => {\r\n const hasModifier = useRef(false);\r\n const [src, setSrc] = useState('');\r\n const [internalOpen, setInternalOpen] = 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 isControlled = externalOpen !== undefined;\r\n const isOpen = isControlled ? (!!externalOpen && !disabled) : (internalOpen && !disabled);\r\n const isAddDisabled = disabled || src === '';\r\n\r\n const handleClose = () => {\r\n setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n if (isControlled) onClose?.();\r\n else setInternalOpen(false);\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 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 handleClose();\r\n };\r\n\r\n return (\r\n <>\r\n {!isControlled && (\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 setSrc('');\r\n setAltText('');\r\n setFileName('');\r\n setInternalOpen(true);\r\n }}\r\n />\r\n )}\r\n\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!data.open) handleClose();\r\n }}>\r\n <DialogSurface style={{ maxWidth: '440px' }}>\r\n <DialogBody>\r\n <DialogTitle>Insert Inline Image</DialogTitle>\r\n <DialogContent>\r\n <Stack tokens={{ childrenGap: 10 }} style={{ paddingTop: 8 }}>\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 </Stack>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n appearance='primary'\r\n size='small'\r\n key='file-inline-upload-btn'\r\n disabled={isAddDisabled}\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={handleClose}>\r\n Cancel\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\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 type { LexicalEditor } from 'lexical';\r\nimport { $createHtmlBlockNode, $isHtmlBlockNode, HtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\nimport { normalizeToBlockHtml, sanitizeHtml } from './Sanitize';\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: LexicalEditor, block: HtmlBlockNode, html: string) {\r\n const safe = normalizeToBlockHtml(sanitizeHtml(html));\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(safe || '<p></p>', 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, doc);\r\n block.clear();\r\n block.append(...nodes);\r\n}\r\n\r\nexport function upsertBlock(editor: LexicalEditor, 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: LexicalEditor, 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: LexicalEditor, 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\nimport { postProcessOutput } from '../Utils/Sanitize';\r\n\r\nexport default function RefApiPlugin({\r\n forwardedRef,\r\n contentEditableDomRef,\r\n focusedRef,\r\n setRefErrors,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n setRefErrors: React.Dispatch<React.SetStateAction<string[]>>;\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 postProcessOutput(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 setErrors: (messages: string[]) => setRefErrors(messages),\r\n clearErrors: () => setRefErrors([]),\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, setRefErrors],\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 MenuTrigger,\r\n} from '@fluentui/react-components';\r\n\r\nimport {\r\n ArrowDownRegular,\r\n ArrowLeftRegular,\r\n ArrowRightRegular,\r\n ArrowUpRegular,\r\n ChevronDown12Regular,\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 [anchorRect, setAnchorRect] = React.useState<DOMRect | null>(null);\r\n const [open, setOpen] = React.useState(false);\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 const dom = editor.getElementByKey(tableNode.getKey());\r\n if (dom) {\r\n setIsInTable(true);\r\n setAnchorRect(dom.getBoundingClientRect());\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n setIsInTable(false);\r\n setAnchorRect(null);\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 setAnchorRect(null);\r\n return;\r\n }\r\n\r\n const cellDom = editor.getElementByKey(cellNode.getKey());\r\n if (!cellDom) {\r\n setIsInTable(false);\r\n setAnchorRect(null);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n setAnchorRect(cellDom.getBoundingClientRect());\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 const canShow = isInTable && !!anchorRect && !disabled;\r\n\r\n const handleStyle: React.CSSProperties | undefined = React.useMemo(() => {\r\n if (!anchorRect) return undefined;\r\n\r\n const top = Math.max(8, anchorRect.top + 6);\r\n const left = Math.max(8, anchorRect.right - 34);\r\n\r\n return {\r\n position: 'fixed',\r\n top,\r\n left,\r\n zIndex: 9999,\r\n };\r\n }, [anchorRect]);\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\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\r\n const insertColRight = () => run(() => $insertTableColumnAtSelection(true));\r\n const insertColLeft = () => run(() => $insertTableColumnAtSelection(false));\r\n\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 if (!canShow || !handleStyle) return null;\r\n\r\n return createPortal(\r\n <div style={handleStyle} className='aoTableActionHandleRoot'>\r\n <Menu open={open} onOpenChange={(_, data) => setOpen(data.open)}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <button\r\n type='button'\r\n className='aoTableActionHandleBtn'\r\n aria-label='Table options'\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n }}>\r\n <ChevronDown12Regular />\r\n </button>\r\n </MenuTrigger>\r\n\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 </div>,\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\nimport { PageSetupValue } from './PageSetup';\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 pageSetup: PageSetupValue;\r\n onPageSetupChange: (value: PageSetupValue) => void;\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', '|'],\r\n ['Insert', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align', '|'],\r\n ['PageSetup'],\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', '|'],\r\n ['Insert', '|'],\r\n ['Heading', '|'],\r\n ['FontFamily', '|'],\r\n ['FontSize', '|'],\r\n ['Decorators', '|'],\r\n ['Align', '|'],\r\n ['PageSetup'],\r\n ];\r\n }\r\n}\r\n","import { Callout, Stack, TextField } from '@fluentui/react';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { Dismiss16Regular } from '@fluentui/react-icons';\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 * Fires synchronously whenever the popover opens or closes — including the\r\n * trigger-button click, before Fluent's Callout has a chance to steal DOM\r\n * focus via setInitialFocus. Lets the host capture \"was the editor the\r\n * active surface right before this opened\" at the only moment that's\r\n * actually knowable, and restore focus once on close rather than fighting\r\n * for it while the popover is open.\r\n */\r\n onOpenChange?: (open: boolean) => 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 const s = (v ?? '').trim();\r\n if (!s) return '#000000';\r\n\r\n // Selection style values aren't guaranteed to be hex — content pasted or\r\n // authored elsewhere (other editors, email clients) commonly carries\r\n // `rgb()`/`rgba()` inline colors. Without this, such a value would silently\r\n // fall through to the '#000000' default below, showing the wrong color.\r\n const rgbMatch = s.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*[\\d.]+\\s*)?\\)$/i);\r\n if (rgbMatch) {\r\n const [, r, g, b] = rgbMatch;\r\n return rgbToHex(clamp(+r, 0, 255), clamp(+g, 0, 255), clamp(+b, 0, 255));\r\n }\r\n\r\n let hex = s.startsWith('#') ? s : `#${s}`;\r\n if (hex.length === 9) hex = hex.slice(0, 7); // #rrggbbaa — drop alpha, picker has no alpha control\r\n if (hex.length === 4 || hex.length === 7) return hex.toLowerCase();\r\n return '#000000';\r\n};\r\n\r\n// A hex string is only safe to commit once it's a complete token — while the\r\n// user is mid-keystroke (\"#3\", \"#3a4\") it's neither valid nor intentional,\r\n// so live-apply must not fire for those partial states.\r\nconst isCompleteHex = (v: string) => /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test((v ?? '').trim());\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\nexport const ColorPickerControl = ({ value, title, disabled, onChange, icon, onOpenChange }: Props) => {\r\n const [open, setOpen] = React.useState(false);\r\n const btnRef = React.useRef<HTMLDivElement | null>(null);\r\n const setOpenAndNotify = React.useCallback(\r\n (next: boolean) => {\r\n setOpen(next);\r\n onOpenChange?.(next);\r\n },\r\n [onOpenChange],\r\n );\r\n\r\n const handleDismiss = React.useCallback(() => setOpenAndNotify(false), [setOpenAndNotify]);\r\n // Block every auto-dismiss trigger (scroll/resize/focus-shift) except a\r\n // genuine click — clicks on the picker's own controls are already inside\r\n // the Callout's DOM, so Fluent never treats them as an outside click in\r\n // the first place; nothing extra is needed for them here.\r\n const preventDismissOnEvent = React.useCallback(\r\n (ev: Event | React.FocusEvent | React.KeyboardEvent | React.MouseEvent) => ev.type !== 'click',\r\n [],\r\n );\r\n\r\n // Since scroll/resize no longer auto-close the callout, it must instead\r\n // actively follow the button as the page scrolls. Fluent recalculates the\r\n // Callout's position on every render of this component (its internal\r\n // effect depends on the whole `props` object, which is a new reference\r\n // each render), so forcing a re-render on scroll/resize is enough to keep\r\n // it correctly anchored — no manual position math needed.\r\n const [, forceReposition] = React.useState(0);\r\n React.useEffect(() => {\r\n if (!open) return;\r\n let rafId: number | null = null;\r\n const reposition = () => {\r\n if (rafId != null) return;\r\n rafId = requestAnimationFrame(() => {\r\n rafId = null;\r\n forceReposition((n) => n + 1);\r\n });\r\n };\r\n window.addEventListener('scroll', reposition, true);\r\n window.addEventListener('resize', reposition);\r\n return () => {\r\n if (rafId != null) cancelAnimationFrame(rafId);\r\n window.removeEventListener('scroll', reposition, true);\r\n window.removeEventListener('resize', reposition);\r\n };\r\n }, [open]);\r\n\r\n const appliedHex = React.useMemo(() => normalizeHex(value || '#000000'), [value]);\r\n\r\n // There's no more \"draft vs applied\" split — every interaction commits\r\n // straight to the editor via onChange, so this state IS the live color.\r\n const [hex, setHexState] = React.useState<string>(appliedHex);\r\n const [hexText, setHexText] = React.useState<string>(appliedHex);\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 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 // Commits a color: updates local state for the swatches/thumbs AND pushes\r\n // it straight to the editor. Every gesture in this popover funnels through\r\n // here so there is a single point where \"live apply\" happens.\r\n const commit = React.useCallback(\r\n (nextHex: string) => {\r\n const rgb = hexToRgb(nextHex);\r\n const next = rgbToHsv(rgb.r, rgb.g, rgb.b);\r\n setHexState(nextHex);\r\n setHexText(nextHex);\r\n setH(next.h);\r\n setS(next.s);\r\n setV(next.v);\r\n onChange(nextHex);\r\n },\r\n [onChange],\r\n );\r\n\r\n const commitFromHsv = React.useCallback(\r\n (hh: number, ss: number, vv: number) => {\r\n const rgb = hsvToRgb(hh, ss, vv);\r\n const nextHex = rgbToHex(rgb.r, rgb.g, rgb.b);\r\n setHexState(nextHex);\r\n setHexText(nextHex);\r\n setH(hh);\r\n setS(ss);\r\n setV(vv);\r\n onChange(nextHex);\r\n },\r\n [onChange],\r\n );\r\n\r\n // Re-seed from the editor's actual color only when the popover freshly\r\n // opens — never while it's open, since our own commits are already the\r\n // source of truth for the rest of the session.\r\n const wasOpenRef = React.useRef(open);\r\n React.useEffect(() => {\r\n const justOpened = open && !wasOpenRef.current;\r\n wasOpenRef.current = open;\r\n if (!justOpened) return;\r\n setHexState(appliedHex);\r\n setHexText(appliedHex);\r\n const rgb = hexToRgb(appliedHex);\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 }, [appliedHex, open]);\r\n\r\n // --- Saturation/Value square: click-to-set and drag-to-follow -----------\r\n const svRef = React.useRef<HTMLDivElement | null>(null);\r\n const svPointFromEvent = React.useCallback((clientX: number, clientY: number) => {\r\n if (!svRef.current) return null;\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 return { ss, vv };\r\n }, []);\r\n\r\n const hRef = React.useRef(h);\r\n hRef.current = h;\r\n\r\n const handleSVPointerDown = React.useCallback(\r\n (e: React.PointerEvent) => {\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n const pt = svPointFromEvent(e.clientX, e.clientY);\r\n if (pt) commitFromHsv(hRef.current, pt.ss, pt.vv);\r\n },\r\n [svPointFromEvent, commitFromHsv],\r\n );\r\n const handleSVPointerMove = React.useCallback(\r\n (e: React.PointerEvent) => {\r\n if (e.buttons !== 1) return;\r\n const pt = svPointFromEvent(e.clientX, e.clientY);\r\n if (pt) commitFromHsv(hRef.current, pt.ss, pt.vv);\r\n },\r\n [svPointFromEvent, commitFromHsv],\r\n );\r\n\r\n // --- Hue slider: click-to-set and drag-to-follow -------------------------\r\n const hueRef = React.useRef<HTMLDivElement | null>(null);\r\n const sRef = React.useRef(s);\r\n sRef.current = s;\r\n const vRef = React.useRef(v);\r\n vRef.current = v;\r\n\r\n const huePointFromEvent = React.useCallback((clientX: number) => {\r\n if (!hueRef.current) return null;\r\n const rect = hueRef.current.getBoundingClientRect();\r\n const x = clamp(clientX - rect.left, 0, rect.width);\r\n return rect.width === 0 ? 0 : (x / rect.width) * 360;\r\n }, []);\r\n\r\n const handleHuePointerDown = React.useCallback(\r\n (e: React.PointerEvent) => {\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n const hh = huePointFromEvent(e.clientX);\r\n if (hh != null) commitFromHsv(hh, sRef.current, vRef.current);\r\n },\r\n [huePointFromEvent, commitFromHsv],\r\n );\r\n const handleHuePointerMove = React.useCallback(\r\n (e: React.PointerEvent) => {\r\n if (e.buttons !== 1) return;\r\n const hh = huePointFromEvent(e.clientX);\r\n if (hh != null) commitFromHsv(hh, sRef.current, vRef.current);\r\n },\r\n [huePointFromEvent, commitFromHsv],\r\n );\r\n\r\n // --- Hex field: live-commit once the text is a complete token -----------\r\n const handleHexChange = React.useCallback(\r\n (_: any, val?: string) => {\r\n const next = val ?? '';\r\n setHexText(next);\r\n if (isCompleteHex(next.trim())) commit(normalizeHex(next));\r\n },\r\n [commit],\r\n );\r\n const handleHexBlur = React.useCallback(() => {\r\n commit(normalizeHex(hexText));\r\n }, [hexText, commit]);\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 type='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 setOpenAndNotify(!open);\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: appliedHex,\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={handleDismiss}\r\n setInitialFocus\r\n directionalHint={4}\r\n className='aoColorCallout'\r\n preventDismissOnEvent={preventDismissOnEvent}>\r\n <Stack tokens={{ childrenGap: 14 }} styles={{ root: { padding: '14px 16px 16px', width: 288 } }}>\r\n {/* Header */}\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <div style={{ fontSize: 13, fontWeight: 600, color: '#242424', letterSpacing: 0.1 }}>{title}</div>\r\n <button\r\n type='button'\r\n aria-label='Close'\r\n onClick={() => setOpenAndNotify(false)}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: 24,\r\n height: 24,\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: 4,\r\n background: 'transparent',\r\n color: '#616161',\r\n cursor: 'pointer',\r\n }}\r\n onMouseEnter={(e) => (e.currentTarget.style.background = '#f0f0f0')}\r\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}>\r\n <Dismiss16Regular />\r\n </button>\r\n </div>\r\n\r\n {/* Saturation / Value square */}\r\n <div\r\n ref={svRef}\r\n onPointerDown={handleSVPointerDown}\r\n onPointerMove={handleSVPointerMove}\r\n style={{\r\n position: 'relative',\r\n width: '100%',\r\n height: 150,\r\n borderRadius: 8,\r\n overflow: 'hidden',\r\n cursor: 'crosshair',\r\n touchAction: 'none',\r\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.08)',\r\n }}>\r\n <div style={{ position: 'absolute', inset: 0, background: hueColor }} />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n background: 'linear-gradient(to right, #fff, rgba(255,255,255,0))',\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n background: 'linear-gradient(to top, #000, rgba(0,0,0,0))',\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n width: 16,\r\n height: 16,\r\n borderRadius: '50%',\r\n border: '2px solid #fff',\r\n boxShadow: '0 0 0 1px rgba(0,0,0,0.35), 0 1px 3px rgba(0,0,0,0.4)',\r\n transform: 'translate(-50%, -50%)',\r\n pointerEvents: 'none',\r\n ...svThumb,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Hue slider */}\r\n <div\r\n ref={hueRef}\r\n onPointerDown={handleHuePointerDown}\r\n onPointerMove={handleHuePointerMove}\r\n style={{\r\n position: 'relative',\r\n width: '100%',\r\n height: 12,\r\n borderRadius: 999,\r\n cursor: 'pointer',\r\n touchAction: 'none',\r\n background:\r\n 'linear-gradient(to right, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)',\r\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.08)',\r\n }}>\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '50%',\r\n width: 16,\r\n height: 16,\r\n borderRadius: '50%',\r\n background: hueColor,\r\n border: '2px solid #fff',\r\n boxShadow: '0 0 0 1px rgba(0,0,0,0.35), 0 1px 3px rgba(0,0,0,0.4)',\r\n transform: 'translate(-50%, -50%)',\r\n pointerEvents: 'none',\r\n ...hueThumb,\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Hex + live preview */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <div\r\n style={{\r\n width: 32,\r\n height: 32,\r\n borderRadius: 6,\r\n flexShrink: 0,\r\n background: hex,\r\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.12)',\r\n }}\r\n />\r\n <TextField\r\n value={hexText}\r\n onChange={handleHexChange}\r\n onBlur={handleHexBlur}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') commit(normalizeHex(hexText));\r\n }}\r\n styles={{ root: { flex: 1 }, fieldGroup: { borderRadius: 6 } }}\r\n />\r\n </div>\r\n\r\n {/* Preset swatches */}\r\n <div>\r\n <div style={{ fontSize: 11, fontWeight: 600, color: '#8a8a8a', marginBottom: 6, letterSpacing: 0.3 }}>\r\n STANDARD COLORS\r\n </div>\r\n <div\r\n style={{\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(9, 1fr)',\r\n gap: 6,\r\n }}>\r\n {PRESET.map((c) => {\r\n const isSelected = c.toLowerCase() === hex.toLowerCase();\r\n return (\r\n <button\r\n key={c}\r\n type='button'\r\n onClick={() => commit(c)}\r\n title={c}\r\n aria-label={c}\r\n style={{\r\n width: 22,\r\n height: 22,\r\n padding: 0,\r\n borderRadius: 5,\r\n background: c,\r\n cursor: 'pointer',\r\n boxShadow: isSelected\r\n ? '0 0 0 2px #fff, 0 0 0 3px #4a86e8'\r\n : 'inset 0 0 0 1px rgba(0,0,0,0.15)',\r\n border: 'none',\r\n transition: 'transform 80ms ease',\r\n }}\r\n onMouseEnter={(e) => (e.currentTarget.style.transform = 'scale(1.12)')}\r\n onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')}\r\n />\r\n );\r\n })}\r\n </div>\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 SKIP_SELECTION_FOCUS_TAG,\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 // Captured once, synchronously, the instant a picker's trigger button is\r\n // clicked — i.e. before Fluent's Callout (setInitialFocus) has a chance to\r\n // move DOM focus into the portaled popover. Checking \"is the editor the\r\n // active surface\" at any later point is meaningless, since by then focus\r\n // already belongs to the open popover.\r\n const wasEditorActiveRef = React.useRef(false);\r\n\r\n const handleOpenChange = (open: boolean) => {\r\n if (open) {\r\n const root = editor.getRootElement();\r\n wasEditorActiveRef.current =\r\n !!root && (document.activeElement === root || root.contains(document.activeElement as Node));\r\n } else if (wasEditorActiveRef.current) {\r\n // Restore focus once the popover closes, so the user can keep typing\r\n // immediately — but only if the editor actually owned focus before\r\n // the picker opened (don't steal focus from unrelated fields, e.g.\r\n // To/CC/BCC in an email form).\r\n editor.focus();\r\n }\r\n };\r\n\r\n const applyStyle = (args: { property: 'background-color' | 'color'; color: string }) => {\r\n if (disabled) return;\r\n\r\n editor.update(\r\n () => {\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 if ($isRangeSelection(selection)) {\r\n $patchStyleText(selection, { [args.property]: args.color });\r\n }\r\n },\r\n // Without this tag, Lexical's reconciler force-focuses the editor root\r\n // whenever this update's selection diff finds the root isn't already\r\n // focused — which it isn't while the color picker's Callout holds\r\n // focus. The picker now only calls applyStyle once, on Apply, so this\r\n // is no longer fighting for focus on every drag pixel, but there's no\r\n // reason to force a focus change here at all — handleOpenChange above\r\n // already does that deliberately, once, on close.\r\n { tag: SKIP_SELECTION_FOCUS_TAG },\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 onOpenChange={handleOpenChange}\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 onOpenChange={handleOpenChange}\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 { $isHeadingNode, $createHeadingNode } from '@lexical/rich-text';\r\nimport { $setBlocksType } from '@lexical/selection';\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isRangeSelection,\r\n ElementNode,\r\n LexicalEditor,\r\n LexicalNode,\r\n RangeSelection,\r\n} 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\n/**\r\n * Splits block elements (paragraphs, headings …) that contain LineBreakNodes\r\n * (Shift+Enter) into individual same-type block elements, then restores a\r\n * valid selection.\r\n *\r\n * Must be called **inside** an `editor.update()` before any `$setBlocksType`.\r\n *\r\n * Problem: When the user presses Shift+Enter several times, multiple \"lines\"\r\n * live inside a single block element as LineBreakNodes. Calling $setBlocksType\r\n * then applies the new block type to the entire block — affecting ALL lines,\r\n * not just the one the user selected.\r\n *\r\n * Solution: Walk every block touched by the selection. If it contains any\r\n * LineBreakNodes, split it at each LineBreakNode boundary so every visual\r\n * \"line\" becomes its own independent block. $setBlocksType will then only\r\n * touch the block(s) that the selection actually covers.\r\n */\r\nexport function $splitBlocksAtLineBreaks(selection: RangeSelection): void {\r\n // Collect unique top-level blocks touched by the selection.\r\n const blocksToSplit = new Set<ElementNode>();\r\n for (const node of selection.getNodes()) {\r\n const block = node.getTopLevelElement();\r\n // DecoratorNodes (e.g. YouTube) are not ElementNodes and have no children.\r\n if (block && $isElementNode(block)) {\r\n const children = block.getChildren();\r\n if (children.some($isLineBreakNode)) {\r\n blocksToSplit.add(block);\r\n }\r\n }\r\n }\r\n\r\n for (const block of blocksToSplit) {\r\n const children = [...block.getChildren()];\r\n\r\n // Group children into segments at each LineBreakNode boundary.\r\n const groups: LexicalNode[][] = [[]];\r\n for (const child of children) {\r\n if ($isLineBreakNode(child)) {\r\n groups.push([]);\r\n } else {\r\n groups[groups.length - 1].push(child);\r\n }\r\n }\r\n\r\n // Only split if there is more than one non-empty segment.\r\n // We must NOT discard empty groups — they represent blank lines (visual\r\n // spacing) that the user explicitly inserted with Shift+Enter.\r\n const nonEmptyCount = groups.filter((g) => g.length > 0).length;\r\n if (nonEmptyCount <= 1) continue; // nothing to split\r\n\r\n // Insert new blocks in REVERSE order right after the original so the\r\n // DOM order ends up as: block[seg0] → newBlock[seg1] → newBlock[seg2] …\r\n //\r\n // Empty group → empty ParagraphNode (blank visual line).\r\n // Non-empty group → same-type block as original (heading keeps its tag).\r\n for (let i = groups.length - 1; i >= 1; i--) {\r\n const group = groups[i];\r\n const newBlock: ElementNode =\r\n group.length === 0\r\n ? $createParagraphNode() // blank line\r\n : $isHeadingNode(block)\r\n ? $createHeadingNode(block.getTag()) // heading content\r\n : $createParagraphNode(); // paragraph content\r\n\r\n // Appending moves nodes out of `block` automatically.\r\n group.forEach((child) => newBlock.append(child));\r\n block.insertAfter(newBlock);\r\n }\r\n\r\n // Remove any LineBreakNodes still left in the original block.\r\n // (groups[0] nodes are already there; only BRs need to go.)\r\n [...block.getChildren()]\r\n .filter($isLineBreakNode)\r\n .forEach((br) => br.remove());\r\n }\r\n}\r\n\r\n/**\r\n * If the selection is a non-collapsed partial selection within a **single**\r\n * block (not covering the entire block), splits that block at the selection\r\n * boundaries so the selected content becomes its own isolated paragraph.\r\n *\r\n * After the split, the editor selection is repositioned onto the new\r\n * isolated block so that a subsequent `$setBlocksType` call only converts\r\n * that block — leaving the text before and after as separate paragraphs.\r\n *\r\n * Returns `true` when a split occurred; `false` when no split was needed\r\n * (cursor-only selection, multi-block selection, or the whole block is\r\n * already selected).\r\n *\r\n * Only handles cases where all selected nodes are *direct* children of the\r\n * parent block (plain-text paragraphs). Content that is nested inside\r\n * inline-format nodes (bold, italic …) falls back gracefully to the\r\n * standard whole-block conversion so inline formatting is never broken.\r\n *\r\n * Must be called **inside** an `editor.update()`.\r\n */\r\nexport function $splitBlockAtPartialSelection(selection: RangeSelection): boolean {\r\n // Collapsed selections (cursor, no text selected) should not split the block.\r\n if (selection.isCollapsed()) return false;\r\n\r\n const anchorBlock = selection.anchor.getNode().getTopLevelElement();\r\n const focusBlock = selection.focus.getNode().getTopLevelElement();\r\n\r\n // Only handle same-block selections.\r\n if (!anchorBlock || !focusBlock || !anchorBlock.is(focusBlock)) return false;\r\n if (!$isElementNode(anchorBlock)) return false;\r\n\r\n const block = anchorBlock;\r\n\r\n // extract() splits TextNodes at the anchor/focus offsets so we get clean\r\n // node boundaries. After this call the selection anchor/focus point to\r\n // the split nodes; the returned array is the nodes *inside* the selection.\r\n const extractedNodes = selection.extract();\r\n if (!extractedNodes.length) return false;\r\n\r\n // Only split when every extracted node is a direct child of the block.\r\n // If any node is nested (e.g. TextNode inside <strong>), fall back to the\r\n // standard whole-block heading so we don't break inline formatting.\r\n const allDirect = extractedNodes.every((n) => {\r\n const parent = n.getParent();\r\n return parent !== null && parent.is(block);\r\n });\r\n if (!allDirect) return false;\r\n\r\n // Fetch FRESH children — extract() may have split TextNodes.\r\n const allChildren = [...block.getChildren()];\r\n\r\n const firstSelected = extractedNodes[0];\r\n const lastSelected = extractedNodes[extractedNodes.length - 1];\r\n const firstIdx = allChildren.findIndex((n) => n.is(firstSelected));\r\n const lastIdx = allChildren.findIndex((n) => n.is(lastSelected));\r\n\r\n if (firstIdx === -1 || lastIdx === -1) return false;\r\n // The whole block is already selected — no split needed.\r\n if (firstIdx === 0 && lastIdx === allChildren.length - 1) return false;\r\n\r\n const selectedNodes = allChildren.slice(firstIdx, lastIdx + 1);\r\n const afterNodes = allChildren.slice(lastIdx + 1);\r\n // Nodes at indices [0, firstIdx) stay in the original block unchanged.\r\n\r\n // Insert in an order that produces: original-block → selectedBlock → afterBlock\r\n // Strategy: each `insertAfter` places the new node *immediately* after block,\r\n // so we insert afterBlock first (pushed right by the next call), then selectedBlock.\r\n if (afterNodes.length > 0) {\r\n const afterBlock: ElementNode = $isHeadingNode(block)\r\n ? $createHeadingNode(block.getTag())\r\n : $createParagraphNode();\r\n afterNodes.forEach((n) => afterBlock.append(n)); // moves nodes out of original block\r\n block.insertAfter(afterBlock); // original → afterBlock\r\n }\r\n\r\n const selectedBlock = $createParagraphNode();\r\n selectedNodes.forEach((n) => selectedBlock.append(n)); // moves nodes out of original block\r\n block.insertAfter(selectedBlock); // original → selectedBlock → afterBlock\r\n\r\n // If nothing remained before the selection, the original block is now empty.\r\n if (block.getChildrenSize() === 0) {\r\n block.remove();\r\n }\r\n\r\n // Reposition the editor selection onto selectedBlock so the caller's\r\n // subsequent $setBlocksType converts only this block.\r\n selectedBlock.select();\r\n\r\n return true;\r\n}\r\n\r\nexport const formatParagraph = (editor: LexicalEditor) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Split multi-line blocks first so only the selected line(s) become a paragraph.\r\n $splitBlocksAtLineBreaks(selection);\r\n }\r\n $setBlocksType($getSelection(), () => $createParagraphNode());\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 Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n Field,\r\n Input,\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\n/** Schemes/paths that must be inserted verbatim, never auto-prefixed with `https://`. */\r\nconst VERBATIM_LINK_RE = /^https?:\\/\\/|^mailto:|^tel:|^#|^\\//i;\r\n\r\n/** Returns an inline validation message if the URL looks structurally invalid, otherwise undefined. */\r\nfunction getLinkValidationMessage(raw: string): string | undefined {\r\n const trimmed = raw.trim();\r\n if (!trimmed) return undefined;\r\n if (/\\s/.test(trimmed)) return 'URL cannot contain spaces';\r\n if (!VERBATIM_LINK_RE.test(trimmed) && !trimmed.includes('.')) {\r\n return 'Enter a valid URL (e.g. example.com)';\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const InsertLinkPlugin = ({\r\n disabled,\r\n open: externalOpen,\r\n onClose,\r\n}: {\r\n disabled: boolean;\r\n open?: boolean;\r\n onClose?: () => void;\r\n}) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [internalOpen, setInternalOpen] = 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 isControlled = externalOpen !== undefined;\r\n const isOpen = isControlled ? (!!externalOpen && !disabled) : (internalOpen && !disabled);\r\n const linkError = getLinkValidationMessage(link);\r\n\r\n const handleClose = () => {\r\n setText('');\r\n setLink('');\r\n if (isControlled) onClose?.();\r\n else setInternalOpen(false);\r\n };\r\n\r\n const insertLink = (text: string, link: string) => {\r\n if (disabled) return;\r\n if (getLinkValidationMessage(link)) return;\r\n\r\n const trimmedLink = link.trim();\r\n const href = VERBATIM_LINK_RE.test(trimmedLink) ? trimmedLink : `https://${trimmedLink}`;\r\n\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n const textNode = new TextNode(text);\r\n const linkNode = $createLinkNode(href);\r\n linkNode.append(textNode);\r\n selection.insertNodes([linkNode]);\r\n }\r\n });\r\n\r\n handleClose();\r\n };\r\n\r\n return (\r\n <>\r\n {!isControlled && (\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) return;\r\n setInternalOpen((prev) => !prev);\r\n }}\r\n />\r\n )}\r\n\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!data.open) handleClose();\r\n }}>\r\n <DialogSurface style={{ maxWidth: '380px' }}>\r\n <DialogBody>\r\n <DialogTitle>Insert Link</DialogTitle>\r\n <DialogContent>\r\n <Stack tokens={{ childrenGap: 10 }} style={{ paddingTop: 8 }}>\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\r\n label='Link'\r\n orientation='horizontal'\r\n size='small'\r\n validationState={linkError ? 'error' : 'none'}\r\n validationMessage={linkError}>\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 onKeyDown={(e) => {\r\n if (e.key === 'Enter' && text && link && !linkError) insertLink(text, link);\r\n }}\r\n />\r\n </Field>\r\n </Stack>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n appearance='primary'\r\n size='small'\r\n disabled={disabled || !text || !link || !!linkError}\r\n onClick={() => insertLink(text, link)}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={handleClose}>\r\n Cancel\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\r\n );\r\n};\r\n","import {\r\n Button,\r\n Menu,\r\n MenuDivider,\r\n MenuGroup,\r\n MenuGroupHeader,\r\n MenuItemRadio,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n} from '@fluentui/react-components';\r\nimport { DocumentRegular } from '@fluentui/react-icons';\r\nimport * as React from 'react';\r\nimport {\r\n MARGIN_OPTIONS,\r\n PAGE_SIZE_OPTIONS,\r\n PageMargin,\r\n PageOrientation,\r\n PageSetupValue,\r\n PageSize,\r\n} from '../Types/PageSetup';\r\n\r\ninterface PageSetupPluginProps {\r\n disabled?: boolean;\r\n value: PageSetupValue;\r\n onChange: (value: PageSetupValue) => void;\r\n}\r\n\r\nexport function PageSetupPlugin({ disabled, value, onChange }: PageSetupPluginProps) {\r\n const sizeLabel =\r\n value.size === 'pageless'\r\n ? 'Pageless'\r\n : (PAGE_SIZE_OPTIONS.find((o) => o.key === value.size)?.label ?? 'Pageless');\r\n\r\n const isPaged = value.size !== 'pageless';\r\n\r\n return (\r\n <Menu\r\n checkedValues={{\r\n size: [value.size],\r\n orientation: [value.orientation],\r\n margin: [value.margin],\r\n }}\r\n onCheckedValueChange={(_, data) => {\r\n const selected = data.checkedItems[0];\r\n if (!selected) return;\r\n if (data.name === 'size') onChange({ ...value, size: selected as PageSize });\r\n else if (data.name === 'orientation')\r\n onChange({ ...value, orientation: selected as PageOrientation });\r\n else if (data.name === 'margin') onChange({ ...value, margin: selected as PageMargin });\r\n }}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <Button\r\n appearance='subtle'\r\n size='small'\r\n disabled={disabled}\r\n icon={<DocumentRegular />}\r\n title='Page setup'\r\n style={{ minWidth: 'auto' }}>\r\n {sizeLabel}\r\n </Button>\r\n </MenuTrigger>\r\n\r\n <MenuPopover style={{ minWidth: 220 }}>\r\n <MenuList>\r\n <MenuGroup>\r\n <MenuGroupHeader>Page size</MenuGroupHeader>\r\n <MenuItemRadio name='size' value='pageless'>\r\n Pageless\r\n </MenuItemRadio>\r\n {PAGE_SIZE_OPTIONS.map((opt) => (\r\n <MenuItemRadio key={opt.key} name='size' value={opt.key}>\r\n {opt.label}\r\n </MenuItemRadio>\r\n ))}\r\n </MenuGroup>\r\n\r\n <MenuDivider />\r\n\r\n <MenuGroup>\r\n <MenuGroupHeader>Orientation</MenuGroupHeader>\r\n <MenuItemRadio name='orientation' value='portrait' disabled={!isPaged}>\r\n Portrait\r\n </MenuItemRadio>\r\n <MenuItemRadio name='orientation' value='landscape' disabled={!isPaged}>\r\n Landscape\r\n </MenuItemRadio>\r\n </MenuGroup>\r\n\r\n <MenuDivider />\r\n\r\n <MenuGroup>\r\n <MenuGroupHeader>Margins</MenuGroupHeader>\r\n {MARGIN_OPTIONS.map((opt) => (\r\n <MenuItemRadio key={opt.key} name='margin' value={opt.key} disabled={!isPaged}>\r\n {opt.label}\r\n </MenuItemRadio>\r\n ))}\r\n </MenuGroup>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n}\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n Field,\r\n Input,\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\nconst MAX_ROWS = 50;\r\nconst MAX_COLS = 50;\r\n\r\nexport const TableItemPlugin = ({\r\n disabled,\r\n open: externalOpen,\r\n onClose,\r\n}: {\r\n disabled: boolean;\r\n open?: boolean;\r\n onClose?: () => void;\r\n}) => {\r\n const [editor] = useLexicalComposerContext();\r\n const [columns, setColumns] = useState('');\r\n const [rows, setRows] = useState('');\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const [rowError, setRowError] = useState('');\r\n const [colError, setColError] = useState('');\r\n\r\n const isControlled = externalOpen !== undefined;\r\n const isOpen = isControlled ? (!!externalOpen && !disabled) : (internalOpen && !disabled);\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const handleClose = () => {\r\n setRows('');\r\n setColumns('');\r\n setRowError('');\r\n setColError('');\r\n if (isControlled) onClose?.();\r\n else setInternalOpen(false);\r\n };\r\n\r\n const onRowsChange = (val: string) => {\r\n const clean = val.replace(/\\D/g, '');\r\n setRows(clean);\r\n const n = Number(clean);\r\n if (clean && n > MAX_ROWS) setRowError(`Maximum ${MAX_ROWS} rows allowed`);\r\n else setRowError('');\r\n };\r\n\r\n const onColsChange = (val: string) => {\r\n const clean = val.replace(/\\D/g, '');\r\n setColumns(clean);\r\n const n = Number(clean);\r\n if (clean && n > MAX_COLS) setColError(`Maximum ${MAX_COLS} columns allowed`);\r\n else setColError('');\r\n };\r\n\r\n const onAddTable = () => {\r\n if (disabled) return;\r\n const row = Number(rows);\r\n const col = Number(columns);\r\n if (!row || !col) return;\r\n if (row > MAX_ROWS || col > MAX_COLS) 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 handleClose();\r\n };\r\n\r\n const isAddDisabled = disabled || !rows || !columns || !!rowError || !!colError;\r\n\r\n return (\r\n <>\r\n {!isControlled && (\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 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 setRows('');\r\n setColumns('');\r\n setRowError('');\r\n setColError('');\r\n setInternalOpen(true);\r\n }}\r\n />\r\n )}\r\n\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!data.open) handleClose();\r\n }}>\r\n <DialogSurface style={{ maxWidth: '380px' }}>\r\n <DialogBody>\r\n <DialogTitle>Insert Table</DialogTitle>\r\n <DialogContent>\r\n <Stack tokens={{ childrenGap: 10 }} style={{ paddingTop: 8 }}>\r\n <Field\r\n label='Rows'\r\n orientation='horizontal'\r\n size='small'\r\n validationMessage={rowError || undefined}\r\n validationState={rowError ? 'error' : 'none'}>\r\n <Input\r\n autoFocus={!disabled}\r\n type='number'\r\n min={1}\r\n max={MAX_ROWS}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n input={{ style: { textAlign: 'left' } }}\r\n onChange={(_, v) => onRowsChange(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field\r\n label='Columns'\r\n orientation='horizontal'\r\n size='small'\r\n validationMessage={colError || undefined}\r\n validationState={colError ? 'error' : 'none'}>\r\n <Input\r\n type='number'\r\n min={1}\r\n max={MAX_COLS}\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n input={{ style: { textAlign: 'left' } }}\r\n onChange={(_, v) => onColsChange(v.value)}\r\n />\r\n </Field>\r\n </Stack>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n appearance='primary'\r\n size='small'\r\n disabled={isAddDisabled}\r\n onClick={onAddTable}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={handleClose}>\r\n Cancel\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogBody,\r\n DialogContent,\r\n DialogSurface,\r\n DialogTitle,\r\n Field,\r\n Input,\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\n/**\r\n * Extract an 11-character YouTube video ID from any common URL format.\r\n *\r\n * Supported formats:\r\n * - https://www.youtube.com/watch?v=VIDEO_ID\r\n * - https://www.youtube.com/watch?v=VIDEO_ID&list=PLAYLIST\r\n * - https://youtu.be/VIDEO_ID\r\n * - https://youtu.be/VIDEO_ID?si=TRACKING\r\n * - https://www.youtube.com/embed/VIDEO_ID\r\n * - https://www.youtube.com/v/VIDEO_ID\r\n * - https://www.youtube.com/shorts/VIDEO_ID ← NEW\r\n * - https://www.youtube.com/live/VIDEO_ID ← NEW\r\n * - VIDEO_ID (bare 11-character alphanumeric ID) ← NEW\r\n */\r\nfunction extractYouTubeId(url: string): string | null {\r\n const trimmed = url.trim();\r\n\r\n // Bare 11-character video ID (only alphanumeric + _ -)\r\n if (/^[\\w-]{11}$/.test(trimmed)) return trimmed;\r\n\r\n // Full URL patterns\r\n const match = /(?:youtu\\.be\\/|youtube\\.com\\/(?:watch\\?v=|embed\\/|v\\/|shorts\\/|live\\/|u\\/\\w\\/))([^#&?]{11})/.exec(trimmed);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport const YoutubeUploadPlugin = ({\r\n disabled,\r\n open: externalOpen,\r\n onClose,\r\n}: {\r\n disabled: boolean;\r\n open?: boolean;\r\n onClose?: () => void;\r\n}) => {\r\n const [url, setURL] = useState('');\r\n const [urlError, setUrlError] = useState('');\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#424242';\r\n\r\n const isControlled = externalOpen !== undefined;\r\n const isOpen = isControlled ? (!!externalOpen && !disabled) : (internalOpen && !disabled);\r\n\r\n const handleClose = () => {\r\n setURL('');\r\n setUrlError('');\r\n if (isControlled) onClose?.();\r\n else setInternalOpen(false);\r\n };\r\n\r\n const onHandleEmbeded = () => {\r\n if (disabled) return;\r\n if (!url) return;\r\n\r\n const id = extractYouTubeId(url);\r\n if (!id) {\r\n setUrlError('Invalid YouTube URL. Supported: watch?v=, youtu.be/, /shorts/, /live/');\r\n return;\r\n }\r\n\r\n setUrlError('');\r\n editor.update(() => {\r\n const node = $createYouTubeNode(id);\r\n $insertNodes([node]);\r\n });\r\n\r\n handleClose();\r\n };\r\n\r\n return (\r\n <>\r\n {!isControlled && (\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 setURL('');\r\n setUrlError('');\r\n setInternalOpen(true);\r\n }}\r\n />\r\n )}\r\n\r\n <Dialog\r\n open={isOpen}\r\n onOpenChange={(_, data) => {\r\n if (!data.open) handleClose();\r\n }}>\r\n <DialogSurface style={{ maxWidth: '420px' }}>\r\n <DialogBody>\r\n <DialogTitle>Insert YouTube Video</DialogTitle>\r\n <DialogContent>\r\n <Stack tokens={{ childrenGap: 10 }} style={{ paddingTop: 8 }}>\r\n <Field\r\n label='URL'\r\n orientation='horizontal'\r\n size='small'\r\n validationState={urlError ? 'error' : 'none'}\r\n validationMessage={urlError || undefined}>\r\n <Input\r\n autoFocus={!disabled}\r\n disabled={disabled}\r\n value={url}\r\n appearance='underline'\r\n placeholder='Paste YouTube URL or video ID…'\r\n onChange={(_, v) => {\r\n setURL(v.value);\r\n if (urlError) setUrlError(''); // clear error on edit\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onHandleEmbeded();\r\n }}\r\n />\r\n </Field>\r\n <div style={{ fontSize: 11, color: '#94a3b8', lineHeight: 1.5 }}>\r\n Supports: youtube.com/watch?v=…, youtu.be/…, /shorts/…, /live/…\r\n </div>\r\n </Stack>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n appearance='primary'\r\n size='small'\r\n disabled={disabled || !url}\r\n onClick={onHandleEmbeded}>\r\n Add\r\n </Button>\r\n <Button size='small' disabled={disabled} onClick={handleClose}>\r\n Cancel\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n </>\r\n );\r\n};\r\n","import { Stack, useTheme } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Dropdown,\r\n makeStyles,\r\n Menu,\r\n MenuItem,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n Option,\r\n ToolbarDivider,\r\n} from '@fluentui/react-components';\r\nimport {\r\n AddRegular,\r\n CommentQuoteRegular,\r\n DocumentPageBreakRegular,\r\n HighlightAccentFilled,\r\n ImageAddRegular,\r\n ImageEditRegular,\r\n TableAddRegular,\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 VideoClipRegular,\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 $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\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 type RangeSelection,\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 { PageSetupPlugin } from './PageSetup';\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\ntype ActiveInsertDialog = 'table' | 'image' | 'inlineImage' | 'youtube' | null;\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 | 'Insert'\r\n | 'Heading'\r\n | 'FontFamily'\r\n | 'FontSize'\r\n | 'Decorators'\r\n | 'CodeBlock'\r\n | 'Align'\r\n | 'PageSetup';\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 Insert: 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 PageSetup: 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 [activeInsertDialog, setActiveInsertDialog] = useState<ActiveInsertDialog>(null);\r\n const lastSelectionRef = React.useRef<RangeSelection | 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 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 return;\r\n }\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\r\n // Restores the last saved cursor/selection before applying any block-level\r\n // transform. Without this, clicking a toolbar dropdown loses the selection\r\n // and the transform applies to the wrong block (or the whole document).\r\n const applyToBlock = React.useCallback(\r\n (fn: (sel: RangeSelection) => void) => {\r\n editor.update(() => {\r\n const saved = lastSelectionRef.current;\r\n if (saved) $setSelection(saved.clone());\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) fn(sel);\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n const formatQuote = () => {\r\n applyToBlock((selection) => {\r\n if (selectNodeType === 'quote') {\r\n $setBlocksType(selection, () => $createParagraphNode());\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 const sel = $getSelection();\r\n if ($isRangeSelection(sel)) lastSelectionRef.current = sel.clone();\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 applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('left'); } }); });\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('right'); } }); });\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('center'); } }); });\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n applyToBlock((sel) => { const seen = new Set<string>(); sel.getNodes().forEach(n => { const t = n.getTopLevelElementOrThrow(); if (!seen.has(t.getKey())) { seen.add(t.getKey()); (t as any).setFormat('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 applyToBlock((selection) => {\r\n $setBlocksType(selection, () => $createHeadingNode(heading));\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 const isDisabled = !isEditable || !!props.readOnly;\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 'Insert': {\r\n const menuIconColor = isDisabled ? fgDisabled : fg;\r\n return (\r\n <React.Fragment key={key}>\r\n <Menu>\r\n <MenuTrigger disableButtonEnhancement>\r\n <Button\r\n size='small'\r\n disabled={isDisabled}\r\n icon={<AddRegular style={{ color: menuIconColor }} />}\r\n style={{\r\n ...getButtonStyle(false),\r\n gap: 4,\r\n paddingInline: 8,\r\n }}>\r\n Insert\r\n </Button>\r\n </MenuTrigger>\r\n <MenuPopover>\r\n <MenuList>\r\n <MenuItem\r\n icon={<TableAddRegular style={{ color: menuIconColor }} />}\r\n onClick={() => !isDisabled && setActiveInsertDialog('table')}>\r\n Table\r\n </MenuItem>\r\n <MenuItem\r\n icon={<ImageAddRegular style={{ color: menuIconColor }} />}\r\n onClick={() => !isDisabled && setActiveInsertDialog('image')}>\r\n Image\r\n </MenuItem>\r\n <MenuItem\r\n icon={<ImageEditRegular style={{ color: menuIconColor }} />}\r\n onClick={() => !isDisabled && setActiveInsertDialog('inlineImage')}>\r\n Inline Image\r\n </MenuItem>\r\n <MenuItem\r\n icon={<VideoClipRegular style={{ color: menuIconColor }} />}\r\n onClick={() => !isDisabled && setActiveInsertDialog('youtube')}>\r\n YouTube\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n\r\n <TableItemPlugin\r\n disabled={isDisabled}\r\n open={activeInsertDialog === 'table'}\r\n onClose={() => setActiveInsertDialog(null)}\r\n />\r\n <InsertImageDialog\r\n activeEditor={editor}\r\n disabled={isDisabled}\r\n open={activeInsertDialog === 'image'}\r\n onClose={() => setActiveInsertDialog(null)}\r\n />\r\n <InsertInlineImageDialog\r\n activeEditor={editor}\r\n disabled={isDisabled}\r\n open={activeInsertDialog === 'inlineImage'}\r\n onClose={() => setActiveInsertDialog(null)}\r\n />\r\n <YoutubeUploadPlugin\r\n disabled={isDisabled}\r\n open={activeInsertDialog === 'youtube'}\r\n onClose={() => setActiveInsertDialog(null)}\r\n />\r\n </React.Fragment>\r\n );\r\n }\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 applyToBlock((sel) => $setBlocksType(sel, () => $createParagraphNode()));\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', lowercase: 'Lowercase', capitalize: 'Capitalize',\r\n strike: 'Strikethrough', subscript: 'Subscript', superscript: 'Superscript',\r\n highlight: 'Highlight', 'ul-list': 'Bullet list', 'ol-list': 'Number list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0 ? '' :\r\n activeDecorators.length === 1 ? 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': editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase'); break;\r\n case 'lowercase': onHandleSelectOption(RichTextPluginsType.Lowercase); break;\r\n case 'capitalize': onHandleSelectOption(RichTextPluginsType.Capitalize); break;\r\n case 'strike': onHandleSelectOption(RichTextPluginsType.Strikethrough); break;\r\n case 'subscript': onHandleSelectOption(RichTextPluginsType.Subscript); break;\r\n case 'superscript': onHandleSelectOption(RichTextPluginsType.Superscript); break;\r\n case 'highlight': onHandleSelectOption(RichTextPluginsType.Highlight); break;\r\n case 'ul-list':\r\n editor.dispatchCommand(selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'page-break': editor.dispatchCommand(INSERT_PAGE_BREAK, undefined); break;\r\n case 'quote': formatQuote(); break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }} />Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />Number list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />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 { value: 'left', label: 'Left Align', icon: <TextAlignLeftFilled style={optionIconStyle} />, action: RichTextPluginsType.LeftAlign },\r\n { value: 'center', label: 'Center Align', icon: <TextAlignCenterFilled style={optionIconStyle} />, action: RichTextPluginsType.CenterAlign },\r\n { value: 'right', label: 'Right Align', icon: <TextAlignRightFilled style={optionIconStyle} />, action: RichTextPluginsType.RightAlign },\r\n { value: 'justify', label: 'Justify Align', icon: <TextAlignJustifyFilled style={optionIconStyle} />, action: RichTextPluginsType.JustifyAlign },\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 case 'PageSetup':\r\n return (\r\n <PageSetupPlugin\r\n key={key}\r\n disabled={!isEditable || props.readOnly}\r\n value={props.pageSetup}\r\n onChange={props.onPageSetupChange}\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 </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"]}