@tarviks/lexical-rich-editor 1.3.2 → 1.3.4

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/Types/PageSetup.ts","../src/Nodes/AlphaListNode.tsx","../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/AoModal.tsx","../src/Plugins/ImagePlugin.tsx","../src/Plugins/InlineImage.tsx","../src/Plugins/PageBreak.tsx","../src/Utils/Helper.ts","../src/Plugins/RefApiPlugin.tsx","../src/Plugins/Spellcheckplugin.tsx","../src/Plugins/TableActionMenuPlugin.tsx","../src/Plugins/TableCellResizer.tsx","../src/Types/EditorType.tsx","../src/Utils/editorLevel.ts","../src/Utils/Index.tsx","../src/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Plugins/FontSize.tsx","../src/Plugins/InsertLink.tsx","../src/Plugins/PageSetup.tsx","../src/Plugins/Table.tsx","../src/Plugins/Youtube.tsx","../src/Plugins/ToolBar.tsx","../src/Plugins/YoutubeDeletePlugin.tsx","../src/Theme/index.ts"],"names":["createCommand","img","jsx","useRef","$getSelection","$isRangeSelection","jsxs","ImageComponent","React","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","useCallback","$isNodeSelection","$setSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","$getNodeByKey","Suspense","InlineImageComponent","React2","DecoratorNode","createEditor","ContentEditorLevel","$findMatchingParent","TextNode","React3","width","height","React4","COMMAND_PRIORITY_HIGH","clamp","$getRoot","getSelectedNode","$isAtNodeEnd","useFloatingPortalContainer","$isLinkNode","TOGGLE_LINK_COMMAND","Fragment","createPortal","React5","Button","DRAGSTART_COMMAND","isHTMLElement","Stack","Field","AttachFilled","MessageBar","MessageBarBody","Input","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","$onDragStart","DRAGOVER_COMMAND","$onDragover","DROP_COMMAND","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","$getNearestNodeFromDOMNode","canDropImage","getDragImageData","getDragSelection","$createRangeSelection","getDOMSelectionFromTarget","$generateNodesFromDOM","$isTextNode","$generateHtmlFromNodes","$isElementNode","$createTextNode","React7","React8","KEY_DOWN_COMMAND","DeleteRegular","$isTableCellNode","useMemo","$isLineBreakNode","r","g","b","useStyles","makeStyles","$getSelectionStyleValueForProperty","$patchStyleText","Dropdown","Option","fontSize","React12","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuDivider","$insertNodeToNearestRoot","useTheme","$isListNode","ListNode","type","$isHeadingNode","$setBlocksType","FORMAT_TEXT_COMMAND","FORMAT_ELEMENT_COMMAND","$createHeadingNode","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","$isDecoratorNode","FluentProvider","webLightTheme"],"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 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 = !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n {/* position:relative + inline-block ensures the div sizes to the image\r\n so the absolutely-positioned resizer handles anchor to image edges */}\r\n <div\r\n draggable={draggable}\r\n style={{ position: 'relative', display: 'inline-block' }}\r\n >\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 {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 </div>\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",".inline-editor-image {\r\n display: inline-block;\r\n position: relative;\r\n cursor: default;\r\n user-select: none;\r\n}\r\n\r\n.inline-editor-image .image-resizer {\r\n display: block;\r\n width: 7px;\r\n height: 7px;\r\n position: absolute;\r\n background-color: rgb(60, 132, 244);\r\n border: 1px solid #fff;\r\n z-index: 10;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-n {\r\n top: -6px;\r\n left: 48%;\r\n cursor: n-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-ne {\r\n top: -6px;\r\n right: -6px;\r\n cursor: ne-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-e {\r\n bottom: 48%;\r\n right: -6px;\r\n cursor: e-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-se {\r\n bottom: -2px;\r\n right: -6px;\r\n cursor: nwse-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-s {\r\n bottom: -2px;\r\n left: 48%;\r\n cursor: s-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-sw {\r\n bottom: -2px;\r\n left: -6px;\r\n cursor: sw-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-w {\r\n bottom: 48%;\r\n left: -6px;\r\n cursor: w-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-nw {\r\n top: -6px;\r\n left: -6px;\r\n cursor: nw-resize;\r\n}\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\n\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\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\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\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\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 [isResizing, setIsResizing] = useState(false);\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 $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 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 return false;\r\n },\r\n [isResizing, isSelected, setSelected, clearSelection],\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 onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_ESCAPE_COMMAND, $onEscape, COMMAND_PRIORITY_LOW),\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 onClick,\r\n setSelected,\r\n ]);\r\n\r\n const onResizeStart = () => {\r\n setIsResizing(true);\r\n };\r\n\r\n const onResizeEnd = (nextWidth: 'inherit' | number, nextHeight: 'inherit' | number) => {\r\n setTimeout(() => {\r\n setIsResizing(false);\r\n }, 200);\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 draggable = !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <span draggable={draggable} style={{ position: 'relative', display: 'inline-block' }}>\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 {$isNodeSelection(selection) && isFocused && (\r\n <ImageResizer\r\n showCaption={false}\r\n setShowCaption={() => {}}\r\n captionsEnabled={false}\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n imageRef={imageRef}\r\n onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n />\r\n )}\r\n </span>\r\n </Suspense>\r\n );\r\n}\r\n\r\nexport default InlineImageComponent;\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 {\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","import type { InitialConfigType } from '@lexical/react/LexicalComposer';\r\nimport type { LexicalEditor } from 'lexical';\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 /**\r\n * Replace the entire document with the provided HTML string.\r\n *\r\n * The HTML is sanitized before import, so event handlers and dangerous\r\n * URL schemes are automatically stripped.\r\n *\r\n * ⚠️ Do NOT call this inside an effect that watches the same `value` prop —\r\n * it will create an infinite update loop. Use the controlled `value` prop\r\n * for external state synchronization instead.\r\n *\r\n * @param html - HTML to load. Pass an empty string to clear the editor.\r\n *\r\n * @example\r\n * editorRef.current?.setValue('<p>Hello <strong>world</strong></p>');\r\n */\r\n setValue: (html: string) => void;\r\n\r\n /**\r\n * Return the current document as an HTML string.\r\n *\r\n * The returned HTML is Lexical-normalized (class names, data-attributes, etc.)\r\n * and is safe to store and later reload via `value` prop or `setValue()`.\r\n *\r\n * @example\r\n * const html = editorRef.current?.getValue();\r\n * await saveToDatabase(html);\r\n */\r\n getValue: () => string;\r\n\r\n /**\r\n * Clear the editor to a completely empty state.\r\n *\r\n * Equivalent to `setValue('')` but more efficient — skips HTML parsing.\r\n */\r\n clear: () => void;\r\n\r\n /**\r\n * Move keyboard focus into the editable content area.\r\n *\r\n * Useful for auto-focus after a modal opens or a dialog is confirmed.\r\n */\r\n focus: () => void;\r\n\r\n /**\r\n * Remove keyboard focus from the editable content area.\r\n */\r\n blur: () => void;\r\n\r\n /**\r\n * Returns `true` when the editor contains no visible user content.\r\n *\r\n * Note: system blocks inserted via `upsertBlock` may still affect this check\r\n * unless the implementation explicitly excludes `HtmlBlockNode` content.\r\n *\r\n * @example\r\n * if (editorRef.current?.isEmpty()) {\r\n * alert('Please write something before sending.');\r\n * }\r\n */\r\n isEmpty: () => boolean;\r\n\r\n /**\r\n * Returns `true` when the editor's content area currently has input focus.\r\n */\r\n isFocused: () => boolean;\r\n\r\n /**\r\n * Access the underlying Lexical `LexicalEditor` instance.\r\n *\r\n * Use only for advanced integrations (custom commands, plugins, etc.).\r\n * The return type is `any` to avoid coupling consumers to Lexical's internal\r\n * types; cast to `LexicalEditor` from the `lexical` package if needed.\r\n *\r\n * @example\r\n * import { $getRoot } from 'lexical';\r\n * const lexical = editorRef.current?.getEditor();\r\n * lexical?.getEditorState().read(() => console.log($getRoot().getTextContent()));\r\n */\r\n getEditor: () => any;\r\n\r\n /**\r\n * Insert or update a named system block in the document.\r\n *\r\n * System blocks (signature, footer, banner, etc.) are tracked by `kind` and\r\n * rendered as non-editable regions. The user can delete them but cannot type\r\n * inside them. They do **not** affect `checkDirty()` or `isEmpty()`.\r\n *\r\n * If a block with the same `kind` already exists it is replaced in-place;\r\n * otherwise a new block is appended (or prepended if `position = 'start'`).\r\n *\r\n * @param spec.kind - Unique identifier, e.g. `'signature'` or `'footer'`.\r\n * @param spec.html - HTML content for the block. Sanitized before import.\r\n * @param spec.position - Where to insert when creating: `'start'` | `'end'` (default `'end'`).\r\n *\r\n * @example\r\n * editorRef.current?.upsertBlock({\r\n * kind: 'signature',\r\n * html: '<p><strong>Vikram Singh</strong></p><p>Senior Engineer</p>',\r\n * position: 'end',\r\n * });\r\n */\r\n upsertBlock: (spec: BlockSpec) => void;\r\n\r\n /**\r\n * Remove a system block by its `kind` identifier.\r\n *\r\n * No-op if no block with that `kind` exists.\r\n *\r\n * @param kind - The same identifier used when calling `upsertBlock`.\r\n *\r\n * @example\r\n * editorRef.current?.removeBlock('signature');\r\n */\r\n removeBlock: (kind: string) => void;\r\n\r\n /**\r\n * Returns `true` if a system block with the given `kind` is present in the document.\r\n *\r\n * @example\r\n * const hasSig = editorRef.current?.hasBlock('signature'); // true | false\r\n */\r\n hasBlock: (kind: string) => boolean;\r\n\r\n /**\r\n * Returns `true` when the editor's user content differs from the clean baseline.\r\n *\r\n * **What counts as user content:**\r\n * Text the user typed in paragraphs, headings, lists, etc., plus any media\r\n * (images, YouTube embeds) inserted via the toolbar. System blocks added via\r\n * `upsertBlock` are **excluded** from the comparison.\r\n *\r\n * **What is always `false` (clean):**\r\n * - Empty editor (placeholder visible).\r\n * - Editor containing only a default / pre-loaded value that has not been changed.\r\n * - Editor cleared back to empty after the user had typed something.\r\n *\r\n * **Baseline:** captured automatically after the editor finishes loading its\r\n * initial content. Call `markClean()` to reset it after a successful save.\r\n *\r\n * @example\r\n * window.onbeforeunload = () => {\r\n * if (editorRef.current?.checkDirty()) return 'You have unsaved changes.';\r\n * };\r\n */\r\n checkDirty: () => boolean;\r\n\r\n /**\r\n * Reset the dirty baseline to the editor's current content.\r\n *\r\n * Call this after successfully saving so that `checkDirty()` compares against\r\n * the saved state going forward, rather than the original mount-time value.\r\n *\r\n * @example\r\n * const html = editorRef.current?.getValue();\r\n * await api.save(html);\r\n * editorRef.current?.markClean(); // checkDirty() now returns false\r\n */\r\n markClean: () => void;\r\n};\r\n// ─── Validation ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Built-in default messages used when no custom `validationMessages` entry is\r\n * provided for that rule. Export this to inspect or copy individual defaults.\r\n */\r\nexport const DEFAULT_VALIDATION_MESSAGES = {\r\n required: 'This field is required.',\r\n minWords: (current: number, min: number) =>\r\n `Minimum ${min} word${min === 1 ? '' : 's'} required (${current} entered).`,\r\n maxWords: (current: number, max: number) =>\r\n `Word limit exceeded: ${current} / ${max} words.`,\r\n minChars: (current: number, min: number) =>\r\n `Minimum ${min} character${min === 1 ? '' : 's'} required (${current} entered).`,\r\n maxChars: (current: number, max: number) =>\r\n `Character limit exceeded: ${current} / ${max} characters.`,\r\n noImages: 'Images are not allowed in this field.',\r\n maxImages: (current: number, max: number) =>\r\n `Too many images: ${current} / ${max} allowed.`,\r\n noLinks: 'Hyperlinks are not allowed in this field.',\r\n maxLinks: (current: number, max: number) =>\r\n `Too many links: ${current} / ${max} allowed.`,\r\n noTables: 'Tables are not allowed in this field.',\r\n imageTooLarge: (fileMB: number, maxMB: number) =>\r\n `Image size (${fileMB.toFixed(1)} MB) exceeds the ${maxMB} MB limit.`,\r\n} as const;\r\n\r\n/** A single active validation error on the editor. */\r\nexport type EditorValidationError = {\r\n type:\r\n | 'required'\r\n | 'minWords' | 'maxWords'\r\n | 'minChars' | 'maxChars'\r\n | 'noImages' | 'maxImages'\r\n | 'noLinks' | 'maxLinks'\r\n | 'noTables';\r\n message: string;\r\n};\r\n\r\n/**\r\n * Custom messages for each validation rule.\r\n * Each entry accepts either a static string or a function that receives\r\n * the relevant counts and returns a string.\r\n */\r\nexport type ValidationMessages = {\r\n // ── Word count ─────────────────────────────────────────────────────────\r\n /** Shown when the editor is empty and `required` is true. */\r\n required?: string;\r\n /** Shown when word count is below `minWords`. Receives (current, min). */\r\n minWords?: string | ((current: number, min: number) => string);\r\n /** Shown when word count exceeds `maxWords`. Receives (current, max). */\r\n maxWords?: string | ((current: number, max: number) => string);\r\n // ── Character count ────────────────────────────────────────────────────\r\n /** Shown when character count is below `minChars`. Receives (current, min). */\r\n minChars?: string | ((current: number, min: number) => string);\r\n /** Shown when character count exceeds `maxChars`. Receives (current, max). */\r\n maxChars?: string | ((current: number, max: number) => string);\r\n // ── Images ─────────────────────────────────────────────────────────────\r\n /** Shown when content contains images and `noImages` is true. */\r\n noImages?: string;\r\n /** Shown when image count exceeds `maxImages`. Receives (current, max). */\r\n maxImages?: string | ((current: number, max: number) => string);\r\n // ── Links ──────────────────────────────────────────────────────────────\r\n /** Shown when content contains links and `noLinks` is true. */\r\n noLinks?: string;\r\n /** Shown when link count exceeds `maxLinks`. Receives (current, max). */\r\n maxLinks?: string | ((current: number, max: number) => string);\r\n // ── Tables ─────────────────────────────────────────────────────────────\r\n /** Shown when content contains tables and `noTables` is true. */\r\n noTables?: string;\r\n // ── Image upload ───────────────────────────────────────────────────────\r\n /** Shown in the image dialog when an uploaded file exceeds `maxImageSizeMB`. Receives (fileMB, maxMB). */\r\n imageTooLarge?: string | ((fileMB: number, maxMB: number) => string);\r\n};\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 * Fully custom toolbar layout that overrides the `level` preset.\r\n *\r\n * Pass a 2-D array of **token strings**. Each inner array is rendered in order.\r\n * Use `'|'` inside a group (including at the end) to render a divider.\r\n * Every token renders as its own **standalone** control — there are no\r\n * hidden dropdowns. Items like `'Strikethrough'` or `'H1'` that were\r\n * previously only reachable inside aggregate dropdowns can now be placed\r\n * directly in the toolbar. Unknown tokens are silently ignored.\r\n *\r\n * ---\r\n * ### Text formatting (standalone toggle buttons)\r\n *\r\n * | Token | What it renders |\r\n * |------------------|----------------------------------|\r\n * | `'Bold'` | Bold toggle |\r\n * | `'Italic'` | Italic toggle |\r\n * | `'Underline'` | Underline toggle |\r\n * | `'Strikethrough'`| Strikethrough toggle |\r\n * | `'Subscript'` | Subscript toggle |\r\n * | `'Superscript'` | Superscript toggle |\r\n * | `'Highlight'` | Highlight toggle |\r\n * | `'Uppercase'` | Uppercase transform toggle |\r\n * | `'Lowercase'` | Lowercase transform toggle |\r\n * | `'Capitalize'` | Capitalize transform toggle |\r\n *\r\n * ### Lists (standalone toggle buttons)\r\n *\r\n * | Token | What it renders |\r\n * |---------------------|--------------------------|\r\n * | `'BulletList'` | Unordered list toggle |\r\n * | `'NumberList'` | Ordered list toggle |\r\n * | `'AlphabeticalList'`| Alphabetical list toggle |\r\n *\r\n * ### Block-level (standalone buttons)\r\n *\r\n * | Token | What it renders |\r\n * |--------------|-------------------------------------|\r\n * | `'Quote'` | Blockquote toggle |\r\n * | `'PageBreak'`| Insert page-break |\r\n *\r\n * ### Heading levels (standalone toggle buttons)\r\n *\r\n * Clicking an active heading level reverts the block to normal paragraph.\r\n *\r\n * | Token | What it renders |\r\n * |-------|-------------------------|\r\n * | `'H1'`| Heading 1 toggle button |\r\n * | `'H2'`| Heading 2 toggle button |\r\n * | `'H3'`| Heading 3 toggle button |\r\n * | `'H4'`| Heading 4 toggle button |\r\n * | `'H5'`| Heading 5 toggle button |\r\n * | `'H6'`| Heading 6 toggle button |\r\n *\r\n * ### Dropdowns / rich plugins\r\n *\r\n * | Token | What it renders |\r\n * |-----------------|---------------------------------------------------|\r\n * | `'Heading'` | Dropdown: Normal + H1–H6 (all heading levels) |\r\n * | `'Decorators'` | Dropdown: all text / list / block decorator items |\r\n * | `'Align'` | Dropdown: left / center / right / justify |\r\n * | `'FontFamily'` | Font-family dropdown |\r\n * | `'FontSize'` | Font-size dropdown |\r\n * | `'ColorPicker'` | Text color picker |\r\n * | `'Link'` | Insert / edit hyperlink |\r\n * | `'Table'` | Insert table |\r\n * | `'Image'` | Upload block image |\r\n * | `'InlineImage'` | Insert inline image |\r\n * | `'Youtube'` | Embed YouTube video |\r\n * | `'|'` | Inline divider within a group |\r\n *\r\n * ---\r\n * ### Examples\r\n *\r\n * **Only bold, italic, underline and strikethrough as standalone buttons:**\r\n * ```tsx\r\n * customToolbar={[['Bold', 'Italic', 'Underline', 'Strikethrough']]}\r\n * ```\r\n *\r\n * **Pick specific heading levels without a dropdown:**\r\n * ```tsx\r\n * customToolbar={[['H1', 'H2', 'H3'], ['Bold', 'Italic']]}\r\n * ```\r\n *\r\n * **Mix standalone items and aggregate dropdowns:**\r\n * ```tsx\r\n * customToolbar={[\r\n * ['Bold', 'Italic', 'Underline', 'Strikethrough', 'Highlight'],\r\n * ['BulletList', 'NumberList'],\r\n * ['H1', 'H2', 'H3'],\r\n * ['Link', 'Image'],\r\n * ]}\r\n * ```\r\n *\r\n * **Full toolbar using aggregate dropdowns:**\r\n * ```tsx\r\n * customToolbar={[\r\n * ['Heading', 'FontFamily', 'FontSize'],\r\n * ['Bold', 'Italic', 'Underline', '|', 'ColorPicker'],\r\n * ['Align'],\r\n * ['Link', 'Image', 'InlineImage', 'Youtube', 'Table'],\r\n * ['Decorators'],\r\n * ]}\r\n * ```\r\n *\r\n * ---\r\n * ### Notes\r\n * - When `customToolbar` is set the `level` prop has no effect.\r\n * - Token order within each group is preserved exactly as written.\r\n * - Avoid duplicate tokens in the same render (each renders once per occurrence).\r\n */\r\n customToolbar?: string[][];\r\n /**\r\n * @deprecated Not used by the component. Prefer styling overrides instead.\r\n */\r\n topPlaceholderMargin?: string;\r\n /** Change handler returning the latest HTML value. */\r\n onChange: (value: string) => void;\r\n /** When true, the editor becomes read-only (non-interactive). */\r\n readOnly?: boolean;\r\n /**\r\n * @deprecated Legacy flag intended to show a clear button.\r\n * This is currently not wired in the UI.\r\n */\r\n clearEditorMode?: boolean;\r\n // ── Autocomplete ───────────────────────────────────────────────────────────\r\n /**\r\n * Simple autocomplete — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, and ghost-text\r\n * insertion internally. Return the raw API response — supported shapes:\r\n * - `{ generated_text: string }` — single suggestion\r\n * - `string[]` — list of suggestions\r\n * - `null / undefined` — no suggestion\r\n *\r\n * Example:\r\n * ```ts\r\n * suggestFn={async (text) => {\r\n * const res = await fetch('/api/suggest', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n suggestFn?: (text: string, cursorIndex?: number) => Promise<any>;\r\n /**\r\n * Advanced: full control over autocomplete with manual cancellation.\r\n * Use `suggestFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n /** Called when the editor gains focus. */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus. */\r\n onBlur?: () => void;\r\n /**\r\n * Fires when the user **accepts** an autocomplete suggestion (Tab / ArrowRight).\r\n *\r\n * Use this to send a reward signal to your backend so the model improves\r\n * over time. Example:\r\n * ```ts\r\n * onSuggestionAccept={({ suggestionText, triggerText, method }) => {\r\n * sendReward({ suggestionText, triggerText }); // hits your reward API\r\n * }}\r\n * ```\r\n */\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n /**\r\n * Fires when a suggestion is displayed to the user (optional analytics hook).\r\n */\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n // ── Spell / Grammar check ──────────────────────────────────────────────────\r\n /**\r\n * Simple spell/grammar check — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, response adaptation,\r\n * underlines, and popovers internally. Supported API response shapes:\r\n * - `{ misspelled_words: string[], suggestions: Record<string, string[]>, grammar_correction?: string }`\r\n * - `{ misspelled: string[], suggestions: Record<string, string[]>, improved_text?: string }`\r\n * - `SpellCheckIssue[]` (legacy — already-adapted array)\r\n *\r\n * Example:\r\n * ```ts\r\n * spellCheckFn={async (text) => {\r\n * const res = await fetch('/api/spellcheck', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n spellCheckFn?: (text: string) => Promise<any>;\r\n /**\r\n * Advanced: full control over spell check with manual cancellation.\r\n * Use `spellCheckFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /**\r\n * Fires when the user accepts a spell/grammar correction from the popover.\r\n *\r\n * Use this to POST a reward signal to your backend.\r\n * ```ts\r\n * onSpellCheckAccept={({ original, replacement, message, type }) => {\r\n * myApi.rewardSpellCheck({ original, replacement });\r\n * }}\r\n * ```\r\n */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the spell-check\r\n * API is called. Defaults to 1200ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n spellCheckIdleMs?: number;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the `suggestFn`\r\n * API is called. Defaults to 300ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n suggestIdleMs?: number;\r\n /** When false, spell checking is disabled without unmounting the plugin. */\r\n spellCheckEnabled?: boolean;\r\n // ── Floating toolbar ───────────────────────────────────────────────────────\r\n /** When true, shows the floating formatting toolbar near text selections. */\r\n showFloatingToolbar?: boolean;\r\n /**\r\n * Maximum word count allowed. When set, a live counter is shown\r\n * below the editor. Exceeding the limit turns the counter red.\r\n * Example: wordLimit={500}\r\n */\r\n wordLimit?: number;\r\n\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n *\r\n * - exceeded: true -> user just exceeded the limit\r\n * - exceeded: false -> user came back within the limit\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n\r\n // ── Validation ─────────────────────────────────────────────────────────────\r\n\r\n /** When true, the editor must not be empty. Equivalent to `minWords: 1`. */\r\n required?: boolean;\r\n\r\n /** Minimum number of words required. */\r\n minWords?: number;\r\n\r\n /** Maximum number of words allowed. Shows a validation error when exceeded. */\r\n maxWords?: number;\r\n\r\n /** Minimum number of characters required. */\r\n minChars?: number;\r\n\r\n /** Maximum number of characters allowed. Shows a validation error when exceeded. */\r\n maxChars?: number;\r\n\r\n /** When true, the editor must not contain any images. */\r\n noImages?: boolean;\r\n\r\n /** Maximum number of images allowed in the content. */\r\n maxImages?: number;\r\n\r\n /** When true, the editor must not contain any hyperlinks. */\r\n noLinks?: boolean;\r\n\r\n /** Maximum number of hyperlinks allowed in the content. */\r\n maxLinks?: number;\r\n\r\n /** When true, the editor must not contain any tables. */\r\n noTables?: boolean;\r\n\r\n /**\r\n * Maximum image file size in megabytes. When set, the image upload dialogs\r\n * reject files that are larger and display an error inside the dialog.\r\n */\r\n maxImageSizeMB?: number;\r\n\r\n /**\r\n * Override the default error messages shown for each validation rule.\r\n * Accepts static strings or functions for dynamic messages.\r\n */\r\n validationMessages?: ValidationMessages;\r\n\r\n /**\r\n * Called whenever the set of active validation errors changes.\r\n * Receives the current array of errors (empty array means valid).\r\n */\r\n onValidationChange?: (errors: EditorValidationError[]) => void;\r\n\r\n /**\r\n * Pass any string here to display it as a custom error message below the\r\n * editor and turn the border red. Useful for server-side or form-level\r\n * errors that live outside the component's own validation rules.\r\n *\r\n * Example:\r\n * ```tsx\r\n * errorMessage={submitFailed ? 'Please fill in the email body before sending.' : undefined}\r\n * ```\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Called once before `LexicalComposer` is initialized.\r\n *\r\n * Receives the `InitialConfigType` object that will be passed to\r\n * `LexicalComposer`. You may mutate it (e.g. add custom nodes, override the\r\n * theme or namespace) — Lexical reads this config only once on mount, so\r\n * this is the only safe window to modify it.\r\n *\r\n * Note: called only on the initial mount, never on re-renders.\r\n */\r\n onBeforeInitialize?: (config: InitialConfigType) => void;\r\n\r\n /**\r\n * Called once when the Lexical editor instance is ready for use.\r\n *\r\n * Receives the live `LexicalEditor` instance. Use it for operations that\r\n * require the editor to be mounted — programmatic focus, registering\r\n * external commands, or handing the instance to an external controller.\r\n *\r\n * Note: called only once on mount, never on re-renders.\r\n */\r\n onReady?: (editor: LexicalEditor) => void;\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 { $insertList, $isListItemNode, $isListNode, $removeList, ListNode, SerializedListNode } from '@lexical/list';\r\nimport { $findMatchingParent } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n createCommand,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalCommand,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\n\r\nexport const INSERT_ALPHA_LIST_COMMAND: LexicalCommand<void> = createCommand(\r\n 'INSERT_ALPHA_LIST_COMMAND',\r\n);\r\n\r\nexport type SerializedAlphaListNode = Spread<{ type: 'alpha-list' }, SerializedListNode>;\r\n\r\nexport class AlphaListNode extends ListNode {\r\n static getType(): string {\r\n return 'alpha-list';\r\n }\r\n\r\n static clone(node: AlphaListNode): AlphaListNode {\r\n return new AlphaListNode(node.getStart(), node.__key);\r\n }\r\n\r\n constructor(start: number = 1, key?: NodeKey) {\r\n super('number', start, key);\r\n (this as any).__listType = 'lower-alpha';\r\n }\r\n\r\n createDOM(config: EditorConfig, _editor: LexicalEditor): HTMLElement {\r\n const element = document.createElement('ol');\r\n element.setAttribute('type', 'a');\r\n if (this.getStart() !== 1) element.setAttribute('start', String(this.getStart()));\r\n element.style.listStyleType = 'lower-alpha';\r\n const olClass = (config.theme as any)?.list?.ol;\r\n if (olClass) element.className = olClass;\r\n return element;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n exportDOM(_editor: LexicalEditor): DOMExportOutput {\r\n const element = document.createElement('ol');\r\n element.setAttribute('type', 'a');\r\n if (this.getStart() !== 1) element.setAttribute('start', String(this.getStart()));\r\n element.style.listStyleType = 'lower-alpha';\r\n return { element };\r\n }\r\n\r\n static importDOM(): DOMConversionMap {\r\n return {\r\n ol: (domNode: Node) => {\r\n if (\r\n domNode instanceof HTMLOListElement &&\r\n (domNode.getAttribute('type') === 'a' || domNode.style.listStyleType === 'lower-alpha')\r\n ) {\r\n return { conversion: convertAlphaOL, priority: 1 };\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n\r\n exportJSON(): SerializedAlphaListNode {\r\n const base = super.exportJSON();\r\n return {\r\n ...base,\r\n type: 'alpha-list',\r\n listType: 'lower-alpha' as any,\r\n tag: 'ol',\r\n version: 1,\r\n start: this.getStart(),\r\n };\r\n }\r\n\r\n static importJSON(serialized: SerializedAlphaListNode): AlphaListNode {\r\n return new AlphaListNode(serialized.start ?? 1);\r\n }\r\n}\r\n\r\nfunction convertAlphaOL(domNode: Node): DOMConversionOutput {\r\n const start =\r\n domNode instanceof HTMLOListElement ? parseInt(domNode.getAttribute('start') || '1', 10) || 1 : 1;\r\n return { node: $createAlphaListNode(start) };\r\n}\r\n\r\nexport function $createAlphaListNode(start: number = 1): AlphaListNode {\r\n return new AlphaListNode(start);\r\n}\r\n\r\nexport function $isAlphaListNode(node: LexicalNode | null | undefined): node is AlphaListNode {\r\n return node instanceof AlphaListNode;\r\n}\r\n\r\nexport function $toggleAlphaList(): void {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n const anchor = selection.anchor.getNode();\r\n const currentList = $findMatchingParent(anchor, $isListNode);\r\n\r\n if ($isAlphaListNode(currentList)) {\r\n $removeList();\r\n return;\r\n }\r\n\r\n $insertList('number');\r\n\r\n const sel2 = $getSelection();\r\n if (!$isRangeSelection(sel2)) return;\r\n\r\n const newAnchor = sel2.anchor.getNode();\r\n const newList = $findMatchingParent(newAnchor, (n) => $isListNode(n) && !$isAlphaListNode(n));\r\n if (!newList || !$isListNode(newList)) return;\r\n\r\n const start = (newList as ListNode).getStart();\r\n const formatType =\r\n typeof (newList as any).getFormatType === 'function' ? (newList as any).getFormatType() : undefined;\r\n\r\n const alpha = $createAlphaListNode(start);\r\n for (const child of newList.getChildren()) {\r\n alpha.append(child);\r\n }\r\n newList.replace(alpha);\r\n\r\n if (formatType && typeof (alpha as any).setFormat === 'function') {\r\n (alpha as any).setFormat(formatType);\r\n }\r\n\r\n const firstItem = alpha.getFirstChild();\r\n if ($isListItemNode(firstItem)) {\r\n firstItem.selectStart();\r\n } else {\r\n alpha.select();\r\n }\r\n}\r\n\r\nexport default AlphaListNode;\r\n","import type { DOMConversionMap, 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 // AutocompleteNode is excluded from copy via excludeFromCopy(), so it is\r\n // never placed on the clipboard and never needs to be reconstructed from\r\n // HTML. Returning null here satisfies Lexical's exportDOM/importDOM\r\n // contract check and silences the console warning.\r\n static importDOM(): DOMConversionMap | null {\r\n return null;\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, type InitialConfigType } 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 { $setSelection, type LexicalEditor } from 'lexical';\r\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nimport {\r\n ContentEditorLevel,\r\n ContentEditorProps,\r\n ContentEditorRef,\r\n DEFAULT_VALIDATION_MESSAGES,\r\n EditorValidationError,\r\n SearchPromise,\r\n SpellCheckIssue,\r\n SpellCheckPayload,\r\n SpellCheckResult,\r\n} from './ContentEditorComponent.types';\r\n\r\nimport './Editor.css';\r\nimport { DEFAULT_PAGE_SETUP, PageSetupValue, resolvePageCanvasMetrics } from \"./Types/PageSetup\";\r\nimport { AlphaListNode } from './Nodes/AlphaListNode';\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\ntype ContentMetrics = {\r\n words: number;\r\n chars: number;\r\n images: number;\r\n links: number;\r\n tables: number;\r\n};\r\n\r\nfunction ContentMetricsPlugin({\r\n onMetricsChange,\r\n}: {\r\n onMetricsChange: (m: ContentMetrics) => void;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n const prevRef = useRef<ContentMetrics>({ words: 0, chars: 0, images: 0, links: 0, tables: 0 });\r\n\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ dirtyElements, dirtyLeaves }) => {\r\n if (dirtyElements.size === 0 && dirtyLeaves.size === 0) return;\r\n\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n const text = root.innerText ?? '';\r\n const trimmed = text.trim();\r\n const words = trimmed === '' ? 0 : trimmed.split(/\\s+/).length;\r\n const chars = trimmed.length;\r\n const images = root.querySelectorAll('img').length;\r\n const links = root.querySelectorAll('a[href]').length;\r\n const tables = root.querySelectorAll('table').length;\r\n\r\n // Only notify (and trigger a re-render) when a value actually changed.\r\n const prev = prevRef.current;\r\n if (\r\n prev.words !== words ||\r\n prev.chars !== chars ||\r\n prev.images !== images ||\r\n prev.links !== links ||\r\n prev.tables !== tables\r\n ) {\r\n const next = { words, chars, images, links, tables };\r\n prevRef.current = next;\r\n onMetricsChange(next);\r\n }\r\n });\r\n }, [editor, onMetricsChange]);\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 Element | 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 // Also stay active if focus moved to one of our portal widgets (table\r\n // action menu, floating toolbar, etc.) — they live outside containerRef\r\n // in the DOM but are logically part of this editor.\r\n const isEditorPortal = !!next?.closest?.('[data-lexical-editor-portal]');\r\n if (stillInside || isEditorPortal) 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\nfunction EditorReadyPlugin({ onReady }: { onReady?: (editor: LexicalEditor) => void }) {\r\n const [editor] = useLexicalComposerContext();\r\n const calledRef = useRef(false);\r\n useEffect(() => {\r\n if (!onReady || calledRef.current) return;\r\n calledRef.current = true;\r\n onReady(editor);\r\n }, [editor, onReady]);\r\n return null;\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 [metrics, setMetrics] = useState<ContentMetrics>({\r\n words: 0,\r\n chars: 0,\r\n images: 0,\r\n links: 0,\r\n tables: 0,\r\n });\r\n const handleMetrics = useCallback((m: ContentMetrics) => setMetrics(m), []);\r\n const [pageSetup, setPageSetup] = useState<PageSetupValue>(DEFAULT_PAGE_SETUP);\r\n const pageCanvas = resolvePageCanvasMetrics(pageSetup);\r\n const wordCount = metrics.words;\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 // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const initialConfig: any = React.useMemo(() => {\r\n const config: InitialConfigType = {\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 AlphaListNode,\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 props.onBeforeInitialize?.(config);\r\n return config;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\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: 0,\r\n right: 0,\r\n maxWidth: pageCanvas.widthPx,\r\n marginLeft: pageCanvas.widthPx !== undefined ? \"auto\" : undefined,\r\n marginRight: pageCanvas.widthPx !== undefined ? \"auto\" : undefined,\r\n paddingLeft: pageCanvas.paddingPx,\r\n paddingRight: 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) => url === 'https://' || urlRegExp.test(url);\r\n\r\n const handleReadOnlyClickCapture = (e: React.SyntheticEvent) => {\r\n if (!isReadOnly) return;\r\n const target = e.target as HTMLElement | null;\r\n const anchor = target?.closest?.('a');\r\n if (anchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const isOverLimit = props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n useEffect(() => {\r\n if (props.wordLimit === undefined || !props.onWordLimitExceeded) return;\r\n\r\n const wasOverLimit = previousOverLimitRef.current;\r\n\r\n if (isOverLimit !== wasOverLimit) {\r\n props.onWordLimitExceeded({\r\n wordCount,\r\n wordLimit: props.wordLimit,\r\n exceeded: isOverLimit,\r\n });\r\n\r\n previousOverLimitRef.current = isOverLimit;\r\n }\r\n }, [isOverLimit, wordCount, props.wordLimit, props.onWordLimitExceeded]);\r\n\r\n // ── Validation ──────────────────────────────────────────────────────────\r\n const validationErrors = React.useMemo((): EditorValidationError[] => {\r\n const errors: EditorValidationError[] = [];\r\n const custom = props.validationMessages ?? {};\r\n const { words, chars, images, links, tables } = metrics;\r\n\r\n // Helper: resolve a message using custom override → default fallback.\r\n const msg = <T extends any[]>(\r\n key: keyof typeof DEFAULT_VALIDATION_MESSAGES,\r\n ...args: T\r\n ): string => {\r\n const override = (custom as any)[key];\r\n if (override !== undefined) {\r\n return typeof override === 'function' ? override(...args) : override;\r\n }\r\n const def = (DEFAULT_VALIDATION_MESSAGES as any)[key];\r\n return typeof def === 'function' ? def(...args) : def;\r\n };\r\n\r\n // ── Word count ──────────────────────────────────────────────────────\r\n const requiredFired = props.required && words === 0;\r\n if (requiredFired) {\r\n errors.push({ type: 'required', message: msg('required') });\r\n } else if (props.minWords !== undefined && words < props.minWords) {\r\n errors.push({ type: 'minWords', message: msg('minWords', words, props.minWords) });\r\n }\r\n\r\n // wordLimit is the legacy counter prop; treat it as maxWords for error messages.\r\n const effectiveMaxWords = props.maxWords ?? props.wordLimit;\r\n if (effectiveMaxWords !== undefined && words > effectiveMaxWords) {\r\n errors.push({ type: 'maxWords', message: msg('maxWords', words, effectiveMaxWords) });\r\n }\r\n\r\n // ── Character count ─────────────────────────────────────────────────\r\n // Skip minChars when the 'required' error already covers an empty editor.\r\n if (!requiredFired && props.minChars !== undefined && chars < props.minChars) {\r\n errors.push({ type: 'minChars', message: msg('minChars', chars, props.minChars) });\r\n }\r\n\r\n if (props.maxChars !== undefined && chars > props.maxChars) {\r\n errors.push({ type: 'maxChars', message: msg('maxChars', chars, props.maxChars) });\r\n }\r\n\r\n // ── Images ──────────────────────────────────────────────────────────\r\n if (props.noImages && images > 0) {\r\n errors.push({ type: 'noImages', message: msg('noImages') });\r\n } else if (props.maxImages !== undefined && images > props.maxImages) {\r\n errors.push({ type: 'maxImages', message: msg('maxImages', images, props.maxImages) });\r\n }\r\n\r\n // ── Links ────────────────────────────────────────────────────────────\r\n if (props.noLinks && links > 0) {\r\n errors.push({ type: 'noLinks', message: msg('noLinks') });\r\n } else if (props.maxLinks !== undefined && links > props.maxLinks) {\r\n errors.push({ type: 'maxLinks', message: msg('maxLinks', links, props.maxLinks) });\r\n }\r\n\r\n // ── Tables ───────────────────────────────────────────────────────────\r\n if (props.noTables && tables > 0) {\r\n errors.push({ type: 'noTables', message: msg('noTables') });\r\n }\r\n\r\n return errors;\r\n }, [\r\n metrics,\r\n props.required,\r\n props.minWords,\r\n props.maxWords,\r\n props.wordLimit,\r\n props.minChars,\r\n props.maxChars,\r\n props.noImages,\r\n props.maxImages,\r\n props.noLinks,\r\n props.maxLinks,\r\n props.noTables,\r\n props.validationMessages,\r\n ]);\r\n\r\n const previousErrorTypesRef = useRef<string>('');\r\n useEffect(() => {\r\n if (!props.onValidationChange) return;\r\n const key = validationErrors.map((e) => e.type).join(',');\r\n if (key !== previousErrorTypesRef.current) {\r\n previousErrorTypesRef.current = key;\r\n props.onValidationChange(validationErrors);\r\n }\r\n }, [validationErrors, props.onValidationChange]);\r\n\r\n const trimmedErrorMessage = props.errorMessage?.trim() || '';\r\n const hasValidationError = validationErrors.length > 0 || !!trimmedErrorMessage;\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme} style={{ height: '100%' }}>\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <div ref={containerRef} className='lexical-rich-editor-root' style={{ height: '100%', position: 'relative' }}>\r\n <Stack\r\n style={{\r\n zIndex: 1000,\r\n background: '#fff',\r\n borderRadius: '2px',\r\n width: props.width ?? '100%',\r\n height: props.height ?? '100%',\r\n margin: props.margin ?? '5px auto',\r\n border: `1px solid ${isOverLimit || hasValidationError\r\n ? '#c4272c'\r\n : '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 className='editor-toolbar-root'\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 customToolbar={props.customToolbar}\r\n readOnly={props.readOnly}\r\n pageSetup={pageSetup}\r\n onPageSetupChange={setPageSetup}\r\n maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\r\n setIsLinkEditMode={setIsLinkEditMode}\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)}>\r\n {props.placeholder}\r\n </Stack>\r\n }\r\n />\r\n\r\n {/* ── Content counters: sticky to bottom-right ── */}\r\n {(props.wordLimit !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minWords !== undefined ||\r\n props.maxChars !== undefined ||\r\n props.minChars !== 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 gap: 10,\r\n paddingRight: 14,\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n }}>\r\n {(props.wordLimit !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minWords !== undefined) && (\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: hasValidationError\r\n ? '#c4272c'\r\n : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: hasValidationError ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {wordCount}\r\n {(props.maxWords ?? props.wordLimit) !== undefined &&\r\n ` / ${props.maxWords ?? props.wordLimit}`}\r\n {props.minWords !== undefined &&\r\n props.maxWords === undefined &&\r\n props.wordLimit === undefined &&\r\n ` (min ${props.minWords})`}\r\n {' words'}\r\n </span>\r\n )}\r\n {(props.maxChars !== undefined || props.minChars !== undefined) && (\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: hasValidationError\r\n ? '#c4272c'\r\n : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: hasValidationError ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {metrics.chars}\r\n {props.maxChars !== undefined && ` / ${props.maxChars}`}\r\n {props.minChars !== undefined &&\r\n props.maxChars === undefined &&\r\n ` (min ${props.minChars})`}\r\n {' chars'}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={props.onBlur}\r\n setFocused={setFocused}\r\n containerRef={containerRef}\r\n />\r\n\r\n {props.autoFocus && !isReadOnly && <AutoFocusPlugin />}\r\n\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin validateUrl={validateUrl} />\r\n <AutoLinkPlugin matchers={MATCHERS} />\r\n <TablePlugin hasCellMerge hasCellBackgroundColor />\r\n\r\n {!isReadOnly && <YoutubeDeletePlugin />}\r\n\r\n {!isReadOnly && floatingAnchorElem && <TableActionMenuPlugin />}\r\n {!isReadOnly && floatingAnchorElem && (\r\n <TableCellResizerPlugin anchorElem={floatingAnchorElem} />\r\n )}\r\n\r\n {!isReadOnly && (\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n\r\n {!isReadOnly && <ImagesPlugin />}\r\n {!isReadOnly && <InlineImagePlugin />}\r\n {!isReadOnly && <PageBreakPlugin />}\r\n\r\n {/* ── Autocomplete (optimised) ────────────────────────────── */}\r\n {!!resolvedQuery && !isReadOnly && (\r\n <AutocompletePlugin\r\n useQuery={resolvedQuery}\r\n isReadOnly={isReadOnly}\r\n onSuggestionShown={props.onSuggestionShown}\r\n onSuggestionAccept={props.onSuggestionAccept}\r\n idleMs={props.suggestIdleMs ?? 300}\r\n minWords={4}\r\n prefixWindow={300}\r\n />\r\n )}\r\n\r\n {/* ── Spell / grammar check (NEW) ─────────────────────────── */}\r\n {!!resolvedSpellCheck && !isReadOnly && (\r\n <SpellCheckPlugin\r\n useSpellCheck={resolvedSpellCheck}\r\n onSpellCheckAccept={props.onSpellCheckAccept}\r\n idleMs={props.spellCheckIdleMs ?? 1200}\r\n enabled={props.spellCheckEnabled !== false}\r\n />\r\n )}\r\n\r\n {!isReadOnly && props.showFloatingToolbar && <CharacterStylesPopupPlugin />}\r\n <CustomOnChangePlugin value={props.value} onChange={props.onChange} />\r\n\r\n {(props.wordLimit !== undefined ||\r\n props.required ||\r\n props.minWords !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minChars !== undefined ||\r\n props.maxChars !== undefined ||\r\n props.noImages ||\r\n props.maxImages !== undefined ||\r\n props.noLinks ||\r\n props.maxLinks !== undefined ||\r\n props.noTables) && <ContentMetricsPlugin onMetricsChange={handleMetrics} />}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n />\r\n\r\n {/* ── Validation messages ─────────────────────────────────────────\r\n Inside the Stack so the height:100% chain is never broken.\r\n flex-shrink:0 keeps them at natural height; the scrollable\r\n content area (flex-grow:1) absorbs the remaining space. */}\r\n {(validationErrors.length > 0 || trimmedErrorMessage) && (\r\n <div style={{ flexShrink: 0, padding: '6px 20px 8px' }}>\r\n {validationErrors.map((err) => (\r\n <div\r\n key={err.type}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 6,\r\n marginTop: 2,\r\n color: '#c4272c',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n }}>\r\n <span style={{ fontWeight: 600, flexShrink: 0 }}>⚠</span>\r\n <span>{err.message}</span>\r\n </div>\r\n ))}\r\n {trimmedErrorMessage && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 6,\r\n marginTop: 2,\r\n color: '#c4272c',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n }}>\r\n <span style={{ fontWeight: 600, flexShrink: 0 }}>⚠</span>\r\n <span>{trimmedErrorMessage}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Stack>\r\n </div>\r\n <EditorReadyPlugin onReady={props.onReady} />\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 {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_ELEMENT_COMMAND,\r\n} 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\n// All 8 compass directions.\r\ntype ResizeDir = 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw';\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 // Right-side corners: drag right → wider (proportional)\r\n if (dir === 'se' || dir === 'ne') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n newH = newW / rs.ratio;\r\n // Left-side corners: drag left → wider (negate dx; proportional)\r\n } else if (dir === 'nw' || dir === 'sw') {\r\n newW = Math.max(MIN_WIDTH, rs.startW - dx);\r\n newH = newW / rs.ratio;\r\n // Right edge: width only\r\n } else if (dir === 'e') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n // Left edge: negate dx so dragging left grows width\r\n } else if (dir === 'w') {\r\n newW = Math.max(MIN_WIDTH, rs.startW - dx);\r\n // Bottom edge: height only\r\n } else if (dir === 's') {\r\n newH = Math.max(MIN_HEIGHT, rs.startH + dy);\r\n // Top edge: negate dy so dragging up grows height\r\n } else if (dir === 'n') {\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 {/* North – top centre */}\r\n <div\r\n style={{ ...handleBase, top: -5, left: '50%', transform: 'translateX(-50%)', cursor: 'n-resize' }}\r\n onPointerDown={(e) => startResize(e, 'n')}\r\n title='Resize height'\r\n />\r\n {/* North-East – top right */}\r\n <div\r\n style={{ ...handleBase, top: -5, right: -5, cursor: 'ne-resize' }}\r\n onPointerDown={(e) => startResize(e, 'ne')}\r\n title='Resize (proportional)'\r\n />\r\n {/* East – right centre */}\r\n <div\r\n style={{ ...handleBase, top: '50%', right: -5, transform: 'translateY(-50%)', cursor: 'ew-resize' }}\r\n onPointerDown={(e) => startResize(e, 'e')}\r\n title='Resize width'\r\n />\r\n {/* South-East – bottom right */}\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 {/* South – bottom centre */}\r\n <div\r\n style={{ ...handleBase, bottom: -5, left: '50%', transform: 'translateX(-50%)', cursor: 's-resize' }}\r\n onPointerDown={(e) => startResize(e, 's')}\r\n title='Resize height'\r\n />\r\n {/* South-West – bottom left */}\r\n <div\r\n style={{ ...handleBase, bottom: -5, left: -5, cursor: 'sw-resize' }}\r\n onPointerDown={(e) => startResize(e, 'sw')}\r\n title='Resize (proportional)'\r\n />\r\n {/* West – left centre */}\r\n <div\r\n style={{ ...handleBase, top: '50%', left: -5, transform: 'translateY(-50%)', cursor: 'ew-resize' }}\r\n onPointerDown={(e) => startResize(e, 'w')}\r\n title='Resize width'\r\n />\r\n {/* North-West – top left */}\r\n <div\r\n style={{ ...handleBase, top: -5, left: -5, cursor: 'nw-resize' }}\r\n onPointerDown={(e) => startResize(e, 'nw')}\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 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 format,\r\n nodeKey,\r\n videoID,\r\n width,\r\n height,\r\n editor,\r\n}: YouTubeComponentProps) {\r\n const wrapperRef = React.useRef<HTMLDivElement>(null);\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\r\n // Synchronous ref so onMouseLeave always reads the current resize state.\r\n const isResizingRef = React.useRef(false);\r\n\r\n const [isNodeSelected, setNodeSelected, clearNodeSelection] = useLexicalNodeSelection(nodeKey);\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n const [isResizing, setIsResizing] = React.useState(false);\r\n // When true the thumbnail is replaced by the live <iframe> in-place.\r\n const [isPlaying, setIsPlaying] = React.useState(false);\r\n\r\n // ── Lexical command registration ──────────────────────────────────────────\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n FORMAT_ELEMENT_COMMAND,\r\n (formatType: ElementFormatType) => {\r\n if (isNodeSelected) {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) node.setFormat(formatType);\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n // Select this node on click. When the thumbnail is shown the <img> is\r\n // in the parent DOM so CLICK_COMMAND fires naturally. When the iframe is\r\n // live, clicks land in the iframe's browsing context — the node stays\r\n // selected via wrapperRef boundary detection on the wrapper div.\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (event: MouseEvent) => {\r\n if (wrapperRef.current?.contains(event.target as Node)) {\r\n if (!event.shiftKey) clearNodeSelection();\r\n setNodeSelected(true);\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, isNodeSelected, nodeKey, clearNodeSelection, setNodeSelected]);\r\n\r\n // ── Handlers ──────────────────────────────────────────────────────────────\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 handleResizeStart = () => {\r\n isResizingRef.current = true;\r\n setIsResizing(true);\r\n // Disable iframe pointer-events immediately so pointermove events during\r\n // the drag are not swallowed by the iframe's browsing context.\r\n if (iframeRef.current) iframeRef.current.style.pointerEvents = 'none';\r\n };\r\n\r\n const handleResizeEnd = (w: number, h: number) => {\r\n isResizingRef.current = false;\r\n setIsResizing(false);\r\n if (iframeRef.current) iframeRef.current.style.pointerEvents = '';\r\n // Keep controls visible so the user can resize again without re-hovering.\r\n setIsHovered(true);\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) node.setSize(Math.round(w), Math.round(h));\r\n });\r\n };\r\n\r\n // Shared style for the small action buttons (delete / stop).\r\n const actionBtnStyle = (side: 'left' | 'right'): React.CSSProperties => ({\r\n position: 'absolute',\r\n top: 8,\r\n [side]: 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: side === 'right' ? 18 : 14,\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 // ── Render ────────────────────────────────────────────────────────────────\r\n return (\r\n <div ref={wrapperRef} style={{ display: 'block', textAlign: format || undefined }}>\r\n <div\r\n ref={containerRef}\r\n style={{\r\n position: 'relative',\r\n display: 'inline-block',\r\n width,\r\n height,\r\n lineHeight: 0,\r\n outline: isNodeSelected ? '2px solid #0078d4' : undefined,\r\n outlineOffset: 2,\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => {\r\n if (!isResizingRef.current) setIsHovered(false);\r\n }}>\r\n\r\n {isPlaying ? (\r\n /* ── Playing state ─────────────────────────────────────────────────\r\n * Show the real YouTube iframe in-place at the same dimensions.\r\n * autoplay=1 starts playback immediately.\r\n * pointer-events are set to 'none' during resize (handleResizeStart)\r\n * so drag events are not lost to the iframe's browsing context. */\r\n <iframe\r\n ref={iframeRef}\r\n width='100%'\r\n height='100%'\r\n src={`https://www.youtube.com/embed/${videoID}?autoplay=1`}\r\n sandbox='allow-same-origin allow-scripts allow-popups allow-presentation'\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' }}\r\n />\r\n ) : (\r\n /* ── Thumbnail state ───────────────────────────────────────────────\r\n * Static <img> keeps all clicks in the parent DOM so Lexical's\r\n * CLICK_COMMAND fires correctly and the node can be selected.\r\n * Clicking the red ▶ badge switches to playing state. */\r\n <>\r\n <img\r\n src={`https://img.youtube.com/vi/${videoID}/hqdefault.jpg`}\r\n alt='YouTube video'\r\n draggable={false}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n display: 'block',\r\n userSelect: 'none',\r\n cursor: 'pointer',\r\n }}\r\n />\r\n\r\n {/* Red play badge — no stopPropagation so CLICK_COMMAND still\r\n fires and the node is selected at the same time. */}\r\n <div\r\n role='button'\r\n aria-label='Play video'\r\n onClick={() => setIsPlaying(true)}\r\n style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 56,\r\n height: 56,\r\n background: 'rgba(255, 0, 0, 0.85)',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n cursor: 'pointer',\r\n }}>\r\n <span style={{ color: '#fff', fontSize: 20, lineHeight: 1, marginLeft: 5 }}>▶</span>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Controls — shown on hover or during a resize drag.\r\n VideoResizer is hidden while the iframe is live so that resize\r\n handles don't interfere with normal video interaction; the user\r\n should stop playback first, then resize. */}\r\n {(isHovered || isResizing) && (\r\n <>\r\n {/* Delete — always top-right */}\r\n <button\r\n type='button'\r\n onClick={handleDelete}\r\n title='Remove video'\r\n style={actionBtnStyle('right')}>\r\n ×\r\n </button>\r\n\r\n {/* Stop button (top-left) — shown only while the iframe is live */}\r\n {isPlaying && (\r\n <button\r\n type='button'\r\n onClick={(e) => { e.stopPropagation(); setIsPlaying(false); }}\r\n title='Stop video'\r\n style={actionBtnStyle('left')}>\r\n ⏹\r\n </button>\r\n )}\r\n\r\n {/* Open in browser — always visible in controls */}\r\n <button\r\n type='button'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n window.open(`https://www.youtube.com/watch?v=${videoID}`, '_blank', 'noopener,noreferrer');\r\n }}\r\n title='Open in browser'\r\n style={{\r\n ...actionBtnStyle('left'),\r\n top: isPlaying ? 44 : 8, // stack below stop button when playing\r\n fontSize: 13,\r\n }}>\r\n ↗\r\n </button>\r\n\r\n {/* Resize handles — shown in both thumbnail and playing states.\r\n handleResizeStart disables iframe pointer-events via iframeRef\r\n so drag events are not lost to the iframe's browsing context. */}\r\n <VideoResizer\r\n containerRef={containerRef}\r\n onResizeStart={handleResizeStart}\r\n onResizeEnd={handleResizeEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\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 // sandbox must be on the exported HTML too — not just the in-editor player —\r\n // so that when consumers render the saved HTML the iframe is sandboxed.\r\n iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-popups allow-presentation');\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 return (\r\n <YouTubeComponent\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, topBoundary: number): void {\r\n const GAP = 8;\r\n const MARGIN = 8;\r\n\r\n // Prefer above the cursor, with the popup's left edge starting at the\r\n // cursor position — i.e. anchored to the bottom-right of the caret —\r\n // rather than right-aligning the popup's edge to it.\r\n let top = rect.top - popupEl.offsetHeight - GAP;\r\n let left = rect.left;\r\n\r\n // If there isn't room above the selection without crossing the toolbar\r\n // (or the viewport edge), show below the selection instead.\r\n if (top < topBoundary) 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 // Anchor to the selection's focus point (where the user's cursor\r\n // currently sits) rather than the full range's bounding box. For a\r\n // multi-line selection the range's bounding rect spans every selected\r\n // line — right-aligning to that box's edge can land the popup far from\r\n // any actual text. A collapsed rect at the focus offset always sits\r\n // exactly at the caret, matching how Lexical's own playground behaves.\r\n let rect: DOMRect;\r\n try {\r\n const focusRange = document.createRange();\r\n focusRange.setStart(sel.focusNode!, sel.focusOffset);\r\n focusRange.setEnd(sel.focusNode!, sel.focusOffset);\r\n rect = focusRange.getBoundingClientRect();\r\n if (rect.width === 0 && rect.height === 0 && rect.top === 0 && rect.left === 0) {\r\n throw new Error('empty focus rect');\r\n }\r\n } catch {\r\n rect = sel.getRangeAt(0).getBoundingClientRect();\r\n }\r\n\r\n // Never render above the top of the editor's own chrome (toolbar) — the\r\n // toolbar is a sibling of the content-editable root, not an ancestor, so\r\n // walk up to their shared wrapper first.\r\n const toolbarEl = root\r\n ?.closest('.lexical-rich-editor-root')\r\n ?.querySelector('.editor-toolbar-root') as HTMLElement | null;\r\n const topBoundary = toolbarEl\r\n ? toolbarEl.getBoundingClientRect().bottom + 8\r\n : 8;\r\n\r\n if (!mouseDownRef.current) {\r\n setPopupPositionFixed(popupEl, rect as DOMRect, topBoundary);\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 // A Callout/Popover (color picker, insert-link, insert-table, …) can be\r\n // open while the browser's document selection still sits inside the\r\n // editor — hide this popup whenever focus has actually moved into one\r\n // of those, so the two floating surfaces never overlap.\r\n const activeElement = document.activeElement;\r\n if (\r\n activeElement &&\r\n activeElement !== document.body &&\r\n rootElement &&\r\n !rootElement.contains(activeElement)\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 // Focusing a Callout/Popover control doesn't always fire selectionchange,\r\n // so listen for focus moves directly too (see the activeElement check\r\n // inside updatePopupState).\r\n document.addEventListener('focusin', updatePopupState);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopupState);\r\n document.removeEventListener('focusin', updatePopupState);\r\n };\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 } from 'lexical';\r\nimport { useEffect, useRef } from 'react';\r\nimport { normalizeToBlockHtml, postProcessOutput, sanitizeHtml } from '../Utils/Sanitize';\r\n\r\ninterface ICustomOnChangePluginProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\n/**\r\n * Splits heading elements (h1–h6) that contain two or more consecutive <br>\r\n * tags into separate same-level heading elements.\r\n *\r\n * Why: Lexical stores Shift+Enter inside a heading as a LineBreakNode, which\r\n * round-trips as a <br>. When content is pasted or imported with double-<br>\r\n * paragraph separators inside a heading (common in email HTML), all text ends\r\n * up in one <hN> block. After publishing, browser default heading margins\r\n * make that look completely different from the editor view.\r\n *\r\n * Rule:\r\n * • 1 × <br> → kept as-is (intentional Shift+Enter line break)\r\n * • 2+ × <br> → paragraph boundary; the element is split at that run\r\n *\r\n * Applied both on import (so the Lexical node tree is clean) and on export\r\n * (so the saved HTML is semantically correct for the published view).\r\n */\r\nexport function splitHeadingsAtBrSequences(html: string): string {\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n const headings = Array.from(doc.querySelectorAll('h1, h2, h3, h4, h5, h6'));\r\n\r\n headings.forEach((el) => {\r\n const inner = el.innerHTML;\r\n\r\n // Regex: one <br> followed by one-or-more additional <br> (= 2+ total).\r\n // Whitespace between tags is allowed.\r\n const SEP = /<br\\s*\\/?>\\s*(?:<br\\s*\\/?>)+/gi;\r\n if (!SEP.test(inner)) return; // nothing to split\r\n SEP.lastIndex = 0; // reset after .test()\r\n\r\n const parts = inner.split(SEP).map((p) => p.trim()).filter(Boolean);\r\n if (parts.length <= 1) return;\r\n\r\n const parent = el.parentNode;\r\n if (!parent) return;\r\n\r\n const tagName = el.tagName.toLowerCase();\r\n const attrs = Array.from(el.attributes);\r\n\r\n const fragment = doc.createDocumentFragment();\r\n parts.forEach((part) => {\r\n const newEl = doc.createElement(tagName);\r\n // Preserve the original element's attributes (e.g. style, dir).\r\n attrs.forEach((a) => newEl.setAttribute(a.name, a.value));\r\n newEl.innerHTML = part;\r\n fragment.appendChild(newEl);\r\n });\r\n\r\n parent.replaceChild(fragment, el);\r\n });\r\n\r\n return doc.body.innerHTML;\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 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 // Sanitize → split headings → ensure block wrapper so Lexical root is valid.\r\n const safe = sanitizeHtml(value);\r\n const cleaned = normalizeToBlockHtml(splitHeadingsAtBrSequences(safe));\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(cleaned, 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n\r\n root.append(...nodes);\r\n });\r\n }, [editor, value]);\r\n\r\n return (\r\n <OnChangePlugin\r\n onChange={(editorState) => {\r\n editorState.read(() => {\r\n // Post-process: ensure any LineBreakNode-based paragraph separators\r\n // inside headings are split into proper block elements in the output.\r\n const raw = $generateHtmlFromNodes(editor);\r\n onChange(postProcessOutput(splitHeadingsAtBrSequences(raw)));\r\n });\r\n }}\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 { CheckmarkRegular, DeleteRegular, DismissRegular, EditRegular } from '@fluentui/react-icons';\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\nconst VIEWPORT_MARGIN = 8;\r\n\r\n/**\r\n * Mounts a `position: fixed` overlay host inside the closest Fluent\r\n * Panel/Layer (or document.body) rather than deep inside the editor's own\r\n * DOM tree. Matches CharacterStylesPopupPlugin's `useFloatingPortalContainer`\r\n * — without it, a `position: absolute` popup nested inside the editor can\r\n * get clipped/hidden by a host Panel/Layer's own stacking context or an\r\n * ancestor's `overflow`, even though it renders with a valid opacity/rect.\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\nexport const setFloatingElemPositionForLinkEditor = (targetRect: DOMRect | null, floatingElem: HTMLElement, topBoundary: number = VIEWPORT_MARGIN, verticalGap: number = VERTICAL_GAP, horizontalOffset: number = HORIZONTAL_OFFSET): void => {\r\n if (targetRect === null) {\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\r\n let top = targetRect.bottom + verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top + floatingElemRect.height > window.innerHeight - VIEWPORT_MARGIN) {\r\n top = targetRect.top - floatingElemRect.height - verticalGap;\r\n }\r\n\r\n if (top < topBoundary) {\r\n top = topBoundary;\r\n }\r\n\r\n left = Math.max(VIEWPORT_MARGIN, Math.min(left, window.innerWidth - floatingElemRect.width - VIEWPORT_MARGIN));\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = 'none';\r\n floatingElem.style.top = `${top}px`;\r\n floatingElem.style.left = `${left}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 isLinkEditMode: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nconst FloatingLinkEditor = ({editor, isLink, setIsLink, 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 const toolbarEl = rootElement\r\n .closest('.lexical-rich-editor-root')\r\n ?.querySelector('.editor-toolbar-root') as HTMLElement | null;\r\n const topBoundary = toolbarEl ? toolbarEl.getBoundingClientRect().bottom + 8 : 8;\r\n setFloatingElemPositionForLinkEditor(domRect, editorElem, topBoundary);\r\n }\r\n setLastSelection(selection);\r\n } else if (!activeElement || activeElement.className !== 'aoLinkInput') {\r\n if (rootElement !== null) {\r\n setFloatingElemPositionForLinkEditor(null, editorElem);\r\n }\r\n setLastSelection(null);\r\n setIsLinkEditMode(false);\r\n setLinkUrl('');\r\n }\r\n\r\n return true;\r\n }, [editor, setIsLinkEditMode, isLinkEditMode, isLink, linkUrl]);\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n };\r\n\r\n const root = editor.getRootElement();\r\n\r\n window.addEventListener('resize', update);\r\n window.addEventListener('scroll', update, true);\r\n root?.addEventListener('scroll', update, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n window.removeEventListener('scroll', update, true);\r\n root?.removeEventListener('scroll', update);\r\n };\r\n }, [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=\"aoLinkEditor\">\r\n {!isLink ? null : isLinkEditMode ? (\r\n <>\r\n <input\r\n ref={inputRef}\r\n className=\"aoLinkInput\"\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=\"aoLinkInputActions\">\r\n <div\r\n className=\"aoLinkCancel\"\r\n role=\"button\"\r\n tabIndex={0}\r\n title=\"Cancel\"\r\n aria-label=\"Cancel\"\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n setIsLinkEditMode(false);\r\n }}>\r\n <DismissRegular fontSize={16} />\r\n </div>\r\n\r\n <div\r\n className=\"aoLinkConfirm\"\r\n role=\"button\"\r\n tabIndex={0}\r\n title=\"Confirm\"\r\n aria-label=\"Confirm\"\r\n onMouseDown={preventDefault}\r\n onClick={handleLinkSubmission}>\r\n <CheckmarkRegular fontSize={16} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"aoLinkView\">\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=\"aoLinkEdit\"\r\n role=\"button\"\r\n tabIndex={0}\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 <EditRegular fontSize={16} />\r\n </div>\r\n <div\r\n className=\"aoLinkTrash\"\r\n role=\"button\"\r\n tabIndex={0}\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 <DeleteRegular fontSize={16} />\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 const portalContainer = useFloatingPortalContainer(editor);\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) || !portalContainer) {\r\n return null; // Prevent rendering if anchorElem or the portal host isn't ready\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 isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n portalContainer\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 { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport './AoModal.css';\r\n\r\nexport interface AoModalProps {\r\n isOpen: boolean;\r\n onDismiss: () => void;\r\n title: string;\r\n maxWidth?: number;\r\n actions?: React.ReactNode;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst useIsomorphicLayoutEffect =\r\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\r\n\r\n/**\r\n * Shared replacement for Dialog across the insert plugins.\r\n * Portals the modal content to the nearest editor root wrapper\r\n * to position it absolutely within the editor component's boundaries.\r\n */\r\nexport const AoModal = ({\r\n isOpen,\r\n onDismiss,\r\n title,\r\n maxWidth = 280, // Default to a smaller, compact size\r\n actions,\r\n children,\r\n}: AoModalProps): JSX.Element | null => {\r\n const [hostElement, setHostElement] = React.useState<Element | null>(null);\r\n const mountRef = React.useRef<HTMLDivElement>(null);\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n if (isOpen && mountRef.current) {\r\n const root = mountRef.current.closest('.lexical-rich-editor-root');\r\n if (root) {\r\n setHostElement(root);\r\n } else {\r\n setHostElement(mountRef.current.parentElement);\r\n }\r\n }\r\n }, [isOpen]);\r\n\r\n if (!isOpen) return null;\r\n\r\n const modalContent = (\r\n <div className=\"aoModalBackdrop\" onClick={onDismiss}>\r\n <FluentProvider\r\n theme={webLightTheme}\r\n className=\"aoModalWrapper aoModalContainer\"\r\n style={{ maxWidth, width: '90vw' }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header Section */}\r\n <div className=\"aoModalHeader\">\r\n <h2 className=\"aoModalTitle\">{title}</h2>\r\n <button\r\n className=\"aoModalCloseButton\"\r\n aria-label=\"Close popup\"\r\n onClick={onDismiss}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n {/* Body Section */}\r\n <div className=\"aoModalBody\">{children}</div>\r\n\r\n {/* Actions Footer Section */}\r\n {actions && <div className=\"aoModalActions\">{actions}</div>}\r\n </FluentProvider>\r\n </div>\r\n );\r\n\r\n if (hostElement) {\r\n return createPortal(modalContent, hostElement);\r\n }\r\n\r\n // Render a hidden mount helper to resolve the DOM context first\r\n return <div ref={mountRef} style={{ display: 'none' }} />;\r\n};\r\n\r\nexport default AoModal;","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n MessageBar,\r\n MessageBarBody,\r\n SelectTabData,\r\n SelectTabEvent,\r\n} from '@fluentui/react-components';\r\nimport { AoModal } from './AoModal';\r\nimport { DEFAULT_VALIDATION_MESSAGES } from '../ContentEditorComponent.types';\r\nimport type { ValidationMessages } from '../ContentEditorComponent.types';\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 $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $insertNodes,\r\n $isNodeSelection,\r\n $isRangeSelection,\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' 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' 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 maxImageSizeMB,\r\n validationMessages,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\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 [fileSizeError, setFileSizeError] = useState<string | null>(null);\r\n const hasModifier = useRef(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n const isDisabled = disabled || src === '' || !!fileSizeError;\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 setFileSizeError(null);\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 file = files[0];\r\n\r\n if (maxImageSizeMB !== undefined) {\r\n const fileMB = file.size / (1024 * 1024);\r\n if (fileMB > maxImageSizeMB) {\r\n const override = validationMessages?.imageTooLarge;\r\n const msg = override !== undefined\r\n ? (typeof override === 'function' ? override(fileMB, maxImageSizeMB) : override)\r\n : DEFAULT_VALIDATION_MESSAGES.imageTooLarge(fileMB, maxImageSizeMB);\r\n setFileSizeError(msg);\r\n setSrc('');\r\n setFileName('');\r\n event.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n setFileSizeError(null);\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(file.name);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n return (\r\n <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert image'\r\n maxWidth={340}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Upload' 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 {fileSizeError && (\r\n <MessageBar intent='error' style={{ marginTop: 4 }}>\r\n <MessageBarBody>{fileSizeError}</MessageBarBody>\r\n </MessageBar>\r\n )}\r\n\r\n <Field label='Alt Text' 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 {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 </Stack>\r\n </AoModal>\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 const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n // Always insert block images in their own paragraph so they never\r\n // appear inline with existing text content.\r\n const anchorNode = selection.anchor.getNode();\r\n const topLevel = anchorNode.getTopLevelElementOrThrow();\r\n\r\n const imageParagraph = $createParagraphNode();\r\n imageParagraph.append(imageNode);\r\n topLevel.insertAfter(imageParagraph);\r\n\r\n // Leave an empty paragraph after the image for continued typing.\r\n const tail = $createParagraphNode();\r\n imageParagraph.insertAfter(tail);\r\n tail.select();\r\n } else {\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\r\n }\r\n }\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n\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 // Find the image node — first from selection, then from the drag target element.\r\n let node = $getImageNodeInSelection();\r\n\r\n if (!node) {\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return false;\r\n const lexicalNode = $getNearestNodeFromDOMNode(target);\r\n if ($isImageNode(lexicalNode)) {\r\n node = lexicalNode;\r\n }\r\n }\r\n\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) return false;\r\n\r\n // Use the actual image element as the drag ghost so the user sees what they're moving.\r\n const imgEl = (event.target as HTMLElement)?.closest?.('span.editor-image')\r\n ?.querySelector?.('img') ?? (event.target as HTMLElement);\r\n if (imgEl instanceof HTMLElement) {\r\n dataTransfer.setDragImage(imgEl, 20, 20);\r\n } else {\r\n dataTransfer.setDragImage(img, 0, 0);\r\n }\r\n\r\n dataTransfer.setData('text/plain', '_');\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 data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n // Remove the source node using its key stored in drag data.\r\n const sourceKey = (data as any).key as string | undefined;\r\n if (sourceKey) {\r\n const sourceNode = $getNodeByKey(sourceKey);\r\n if (sourceNode) sourceNode.remove();\r\n }\r\n\r\n const range = getDragSelection(event);\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\r\n // Insert without the old key so a fresh node is created.\r\n const { key: _key, ...insertPayload } = data as any;\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, insertPayload);\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 target.closest('[contenteditable=\"true\"]')\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 MessageBar,\r\n MessageBarBody,\r\n Option,\r\n} from '@fluentui/react-components';\r\nimport { AoModal } from './AoModal';\r\nimport { DEFAULT_VALIDATION_MESSAGES } from '../ContentEditorComponent.types';\r\nimport type { ValidationMessages } from '../ContentEditorComponent.types';\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 $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\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 maxImageSizeMB,\r\n validationMessages,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\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 [fileSizeError, setFileSizeError] = useState<string | null>(null);\r\n const styles = useStyles();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const isDisabled = disabled || src === '' || !!fileSizeError;\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 file = files[0];\r\n\r\n if (maxImageSizeMB !== undefined) {\r\n const fileMB = file.size / (1024 * 1024);\r\n if (fileMB > maxImageSizeMB) {\r\n const override = validationMessages?.imageTooLarge;\r\n const msg = override !== undefined\r\n ? (typeof override === 'function' ? override(fileMB, maxImageSizeMB) : override)\r\n : DEFAULT_VALIDATION_MESSAGES.imageTooLarge(fileMB, maxImageSizeMB);\r\n setFileSizeError(msg);\r\n setSrc('');\r\n setFileName('');\r\n event.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n setFileSizeError(null);\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(file.name);\r\n }\r\n };\r\n reader.readAsDataURL(file);\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 setFileSizeError(null);\r\n };\r\n\r\n return (\r\n <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert inline image'\r\n maxWidth={360}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Upload' 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' size='small'>\r\n <Dropdown\r\n className={styles.alignDropdown}\r\n disabled={disabled}\r\n value={position === 'full' ? 'Full' : position === 'right' ? 'Right' : 'Left'}\r\n selectedOptions={[position ?? 'left']}\r\n listbox={{ style: { width: '120px' } }}\r\n root={{ style: { borderBottom: '1px solid black' } }}\r\n onOptionSelect={(_, data) => setPosition(data.optionValue as Position)}>\r\n <Option key='left' value='left'>Left</Option>\r\n <Option key='right' value='right'>Right</Option>\r\n <Option key='full' value='full'>Full</Option>\r\n </Dropdown>\r\n </Field>\r\n\r\n {fileSizeError && (\r\n <MessageBar intent='error' style={{ marginTop: 4 }}>\r\n <MessageBarBody>{fileSizeError}</MessageBarBody>\r\n </MessageBar>\r\n )}\r\n\r\n <Field label='Alt Text' 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 </AoModal>\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 // Apply text alignment to the paragraph so toolbar alignment works\r\n const parent = imageNode.getParent();\r\n if (parent && typeof (parent as any).setFormat === 'function') {\r\n const fmt = payload.position === 'right' ? 'right'\r\n : payload.position === 'full' ? 'center'\r\n : 'left';\r\n (parent as any).setFormat(fmt);\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 let node = $getImageNodeInSelection();\r\n\r\n if (!node) {\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return false;\r\n const lexicalNode = $getNearestNodeFromDOMNode(target);\r\n if ($isInlineImageNode(lexicalNode)) node = lexicalNode;\r\n }\r\n\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) return false;\r\n\r\n const imgEl = (event.target as HTMLElement)?.closest?.('.inline-editor-image')\r\n ?.querySelector?.('img') ?? event.target;\r\n if (imgEl instanceof HTMLElement) {\r\n dataTransfer.setDragImage(imgEl, 20, 20);\r\n } else {\r\n dataTransfer.setDragImage(img, 0, 0);\r\n }\r\n\r\n dataTransfer.setData('text/plain', '_');\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 hasDragData = !!event.dataTransfer?.types.includes('application/x-lexical-drag');\r\n if (!hasDragData) 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 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 sourceKey = (data as any).key as string | undefined;\r\n if (sourceKey) {\r\n const sourceNode = $getNodeByKey(sourceKey);\r\n if (sourceNode) sourceNode.remove();\r\n }\r\n\r\n const range = getDragSelection(event);\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\r\n const { key: _key, ...insertPayload } = data as any;\r\n editor.dispatchCommand(INSERT_INLINE_IMAGE_COMMAND, insertPayload);\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, .inline-editor-image') &&\r\n target.closest('[contenteditable=\"true\"]')\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, $isDecoratorNode, $isElementNode, $isLineBreakNode, $isTextNode, LexicalEditor } from 'lexical';\r\nimport React, { useImperativeHandle } from 'react';\r\nimport { ContentEditorRef } from '../ContentEditorComponent.types';\r\nimport { $isHtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\nimport { BlockSpec, hasBlock, removeBlock, upsertBlock } from '../Utils/Helper';\r\nimport { normalizeToBlockHtml, postProcessOutput, sanitizeHtml } from '../Utils/Sanitize';\r\nimport { splitHeadingsAtBrSequences } from './CustomOnChange';\r\n\r\n/**\r\n * Builds a stable string that represents only the user-typed content in the\r\n * editor, including text, inline formatting, and block structure.\r\n *\r\n * Captures:\r\n * • TextNode text content + format bitmask (bold/italic/underline/etc.)\r\n * and inline style — so formatting-only changes (e.g. bolding a word)\r\n * are detected even when the plain text is unchanged.\r\n * • ElementNode type + tag + listType + format so heading-level, list-type,\r\n * quote, and alignment changes are also detected.\r\n * • Decorator node keys (images, YouTube) so adding/removing media is\r\n * detected even when text is unchanged.\r\n *\r\n * Excluded: HtmlBlockNode children (signature, footer, banner — system blocks).\r\n */\r\nfunction getUserContentSignature(editor: LexicalEditor): string {\r\n const parts: string[] = [];\r\n\r\n editor.getEditorState().read(() => {\r\n const root = $getRoot();\r\n\r\n const collectNode = (node: any) => {\r\n if ($isHtmlBlockNode(node)) return;\r\n\r\n if ($isDecoratorNode(node)) {\r\n parts.push(`D:${node.getKey()}`);\r\n return;\r\n }\r\n\r\n if ($isLineBreakNode(node)) {\r\n parts.push('BR');\r\n return;\r\n }\r\n\r\n if ($isTextNode(node)) {\r\n // Include format bitmask so bold/italic/underline changes are detected.\r\n // Include style so colour/font changes are detected.\r\n parts.push(`T${node.getFormat()}:${node.getStyle()}:${node.getTextContent()}`);\r\n return;\r\n }\r\n\r\n if ($isElementNode(node)) {\r\n const type = node.getType();\r\n // Heading level (h1–h6) via HeadingNode.getTag()\r\n const tag = typeof (node as any).getTag === 'function' ? (node as any).getTag() : '';\r\n // List type (bullet / number / check) via ListNode.getListType()\r\n const list = typeof (node as any).getListType === 'function' ? (node as any).getListType() : '';\r\n // Paragraph/element alignment format\r\n const fmt = typeof (node as any).getFormat === 'function' ? (node as any).getFormat() : '';\r\n parts.push(`[${type}:${tag}:${list}:${fmt}]`);\r\n for (const child of node.getChildren()) {\r\n collectNode(child);\r\n }\r\n parts.push('[/]');\r\n }\r\n };\r\n\r\n for (const child of root.getChildren()) {\r\n if ($isHtmlBlockNode(child)) continue;\r\n collectNode(child);\r\n }\r\n });\r\n\r\n return JSON.stringify(parts);\r\n}\r\n\r\nexport default function RefApiPlugin({\r\n forwardedRef,\r\n contentEditableDomRef,\r\n focusedRef,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n // Clean baseline for checkDirty().\r\n //\r\n // null = not yet captured; checkDirty() returns false during this window.\r\n // \"\" = editor was empty when it first loaded.\r\n // text = whatever getUserContentSignature() returned after the initial load.\r\n //\r\n // We capture lazily via a one-shot updateListener so the baseline always\r\n // reflects the actual first loaded state (whether that is an empty editor,\r\n // a pre-populated signature via the value prop, or anything else).\r\n // getUserContentSignature() is text-based and always stable, so this\r\n // comparison is reliable across any Lexical version or empty-state variant.\r\n const cleanBaselineRef = React.useRef<string | null>(null);\r\n\r\n React.useEffect(() => {\r\n // Strategy: capture the baseline from whatever content is in the editor\r\n // after the initial load settles, so the default value (signature, etc.)\r\n // is always treated as clean.\r\n //\r\n // Two mechanisms work together:\r\n //\r\n // 1. registerUpdateListener — fires when CustomOnChangePlugin's\r\n // editor.update() commits the initial value prop as a Lexical microtask.\r\n // This is the fast path when the editor has pre-populated content.\r\n //\r\n // 2. setTimeout(0) fallback — macrotasks run after all pending microtasks,\r\n // so it fires AFTER Lexical has flushed any scheduled updates.\r\n // If the editor loaded with content the listener already captured it and\r\n // this is a no-op. If the editor is empty (no update was scheduled)\r\n // this captures \"\" so the empty state is also treated as clean.\r\n\r\n const capture = () => {\r\n if (cleanBaselineRef.current === null) {\r\n cleanBaselineRef.current = getUserContentSignature(editor);\r\n }\r\n };\r\n\r\n const unregister = editor.registerUpdateListener(({ dirtyElements, dirtyLeaves }) => {\r\n if (cleanBaselineRef.current !== null) { unregister(); return; }\r\n if (dirtyElements.size === 0 && dirtyLeaves.size === 0) return;\r\n capture();\r\n unregister();\r\n });\r\n\r\n const timerId = setTimeout(capture, 0);\r\n\r\n return () => {\r\n clearTimeout(timerId);\r\n unregister();\r\n };\r\n }, [editor]);\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 safe = normalizeToBlockHtml(sanitizeHtml(html || ''));\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(safe || '<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 = postProcessOutput(splitHeadingsAtBrSequences($generateHtmlFromNodes(editor, null)));\r\n });\r\n return html;\r\n },\r\n\r\n clear: () => {\r\n editor.update(() => {\r\n $getRoot().clear();\r\n });\r\n },\r\n\r\n focus: () => contentEditableDomRef.current?.focus(),\r\n blur: () => contentEditableDomRef.current?.blur(),\r\n\r\n isEmpty: () => {\r\n let empty = true;\r\n editor.getEditorState().read(() => {\r\n empty = $getRoot().getTextContent().trim().length === 0;\r\n });\r\n return empty;\r\n },\r\n\r\n isFocused: () => focusedRef.current,\r\n getEditor: () => editor,\r\n\r\n // Generic blocks (signature, footer, banner, etc.)\r\n upsertBlock: (spec: BlockSpec) => upsertBlock(editor, spec),\r\n removeBlock: (kind: string) => removeBlock(editor, kind),\r\n hasBlock: (kind: string) => hasBlock(editor, kind),\r\n\r\n checkDirty: () => {\r\n if (cleanBaselineRef.current === null) return false;\r\n const current = getUserContentSignature(editor);\r\n return current !== cleanBaselineRef.current;\r\n },\r\n\r\n markClean: () => {\r\n cleanBaselineRef.current = getUserContentSignature(editor);\r\n },\r\n }) as any,\r\n [editor, contentEditableDomRef, focusedRef],\r\n );\r\n\r\n return null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n LexicalNode,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n $createSpellErrorNode,\r\n $isSpellErrorNode,\r\n SpellErrorMeta,\r\n SpellErrorNode,\r\n SpellIssueType,\r\n} from '../Nodes/SpellErrorNode';\r\n\r\n// ─── Public types ─────────────────────────────────────────────────────────────\r\n\r\nexport type SpellCheckIssue = {\r\n offset: number;\r\n length: number;\r\n message: string;\r\n suggestions: string[];\r\n type?: SpellIssueType;\r\n word?: string;\r\n};\r\n\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── CSS (injected once, outside Lexical) ─────────────────────────────────────\r\n\r\nconst CSS_ID = '__sc_styles__';\r\n\r\nfunction injectCSS() {\r\n if (document.getElementById(CSS_ID)) return;\r\n const s = document.createElement('style');\r\n s.id = CSS_ID;\r\n s.textContent = `\r\n .sc-err-spelling { text-decoration: underline dotted #e53e3e 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-grammar { text-decoration: underline dotted #3182ce 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-style { text-decoration: underline dotted #d97706 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-popover {\r\n position:fixed; z-index:10000000; background:#fff; border:1px solid #e2e8f0;\r\n border-radius:10px; box-shadow:0 6px 24px rgba(0,0,0,.15);\r\n padding:6px 0 4px; min-width:200px; max-width:300px;\r\n font-family:system-ui,sans-serif; font-size:13px; user-select:none;\r\n }\r\n .sc-popover-header { display:flex; align-items:center; gap:6px; padding:4px 12px 6px; border-bottom:1px solid #f0f0f0; margin-bottom:2px; }\r\n .sc-popover-badge { font-size:10px; font-weight:700; text-transform:uppercase; padding:2px 6px; border-radius:4px; color:#fff; flex-shrink:0; }\r\n .sc-popover-badge-spelling { background:#e53e3e; }\r\n .sc-popover-badge-grammar { background:#3182ce; }\r\n .sc-popover-badge-style { background:#d69e2e; }\r\n .sc-popover-message { color:#4a5568; font-size:12px; flex:1; }\r\n .sc-popover-item { padding:7px 14px; cursor:pointer; color:#1a202c; display:flex; align-items:center; gap:8px; font-size:13.5px; font-weight:500; }\r\n .sc-popover-item:hover { background:#f0fff4; }\r\n .sc-popover-empty { padding:8px 14px; color:#a0aec0; font-style:italic; font-size:12px; }\r\n .sc-popover-footer { border-top:1px solid #f0f0f0; margin-top:2px; padding:5px 14px 2px; display:flex; gap:8px; }\r\n .sc-popover-action { cursor:pointer; font-size:11px; color:#a0aec0; padding:3px 0; }\r\n .sc-popover-action:hover { color:#e53e3e; }\r\n .sc-popover-improve { border-top:1px solid #f0f0f0; margin-top:2px; padding:8px 12px 6px; }\r\n .sc-popover-improve-label { font-size:10px; font-weight:700; text-transform:uppercase; color:#d69e2e; margin-bottom:6px; }\r\n .sc-popover-improve-text { font-size:12px; color:#4a5568; font-style:italic; margin-bottom:8px; line-height:1.45; }\r\n .sc-popover-improve-accept { background:#d69e2e; color:#fff; border:none; border-radius:6px; padding:5px 12px; font-size:12px; font-weight:600; cursor:pointer; width:100%; }\r\n .sc-popover-improve-accept:hover { background:#b7791f; }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\n// ─── Tree helpers ─────────────────────────────────────────────────────────────\r\n\r\nfunction escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\ntype Seg = { node: TextNode; start: number; end: number; text: string };\r\n\r\n/**\r\n * Walk the Lexical tree and return all wrappable TextNode segments with their\r\n * absolute character offsets. SpellErrorNodes are counted but not returned.\r\n * Block separators (\\n) are counted between top-level blocks, not after the last.\r\n */\r\nfunction getSegments(root: LexicalNode): Seg[] {\r\n const segs: Seg[] = [];\r\n let pos = 0;\r\n\r\n function walk(node: LexicalNode) {\r\n if ($isSpellErrorNode(node)) {\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isTextNode(node)) {\r\n const t = node.getTextContent();\r\n if (t.length > 0)\r\n segs.push({ node: node as TextNode, start: pos, end: pos + t.length, text: t });\r\n pos += t.length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(walk);\r\n }\r\n\r\n if (!$isElementNode(root)) return segs;\r\n root.getChildren().forEach((block, i) => {\r\n if (i > 0) pos += 1;\r\n walk(block);\r\n });\r\n return segs;\r\n}\r\n\r\nfunction removeAllSpellNodes(root: LexicalNode) {\r\n if ($isSpellErrorNode(root)) {\r\n (root as SpellErrorNode).replace($createTextNode(root.getTextContent()));\r\n return;\r\n }\r\n if ($isElementNode(root)) {\r\n [...root.getChildren()].forEach(removeAllSpellNodes);\r\n }\r\n}\r\n\r\n/** Split TextNode at [start, start+len) and wrap that slice with a SpellErrorNode */\r\nfunction wrapWord(node: TextNode, start: number, len: number, meta: SpellErrorMeta) {\r\n const full = node.getTextContent();\r\n const before = full.slice(0, start);\r\n const word = full.slice(start, start + len);\r\n const after = full.slice(start + len);\r\n if (!word) return;\r\n\r\n const err = $createSpellErrorNode(word, meta);\r\n if (before && after) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n err.insertAfter($createTextNode(after));\r\n } else if (before) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n } else if (after) {\r\n node.replace(err);\r\n err.insertAfter($createTextNode(after));\r\n } else {\r\n node.replace(err);\r\n }\r\n}\r\n\r\n/** Move caret to the very end of the last text node in the document */\r\nfunction moveCursorToEnd(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\r\n editor.update(\r\n () => {\r\n const root = $getRoot();\r\n const lastBlock = root.getLastChild();\r\n if (!lastBlock || !$isElementNode(lastBlock)) return;\r\n // Walk to the last leaf TextNode (skip SpellErrorNodes and element nodes)\r\n let lastTextNode: TextNode | null = null;\r\n const findLast = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node) || ($isTextNode(node) && !$isSpellErrorNode(node))) {\r\n lastTextNode = node as TextNode;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(findLast);\r\n };\r\n findLast(lastBlock);\r\n if (!lastTextNode) return;\r\n const sel = $createRangeSelection();\r\n const key = (lastTextNode as TextNode).getKey();\r\n const off = (lastTextNode as TextNode).getTextContent().length;\r\n sel.anchor.set(key, off, 'text');\r\n sel.focus.set(key, off, 'text');\r\n $setSelection(sel);\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n}\r\n\r\n/** Replace all content of the first paragraph with plain text */\r\nfunction replaceFirstParagraph(\r\n editor: ReturnType<typeof useLexicalComposerContext>[0],\r\n text: string,\r\n onUpdate?: () => void,\r\n) {\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n const first = $getRoot().getFirstChild();\r\n if (first && $isElementNode(first)) {\r\n first.getChildren().forEach((c) => c.remove());\r\n first.append($createTextNode(text));\r\n }\r\n },\r\n { tag: 'spell-clear', onUpdate },\r\n );\r\n}\r\n\r\n// ─── Popover component ────────────────────────────────────────────────────────\r\n\r\ntype PopoverState = {\r\n x: number;\r\n y: number;\r\n issue: SpellCheckIssue;\r\n nodeKey: string;\r\n improvedText?: string;\r\n grammarCorrection?: string;\r\n};\r\n\r\nfunction SpellPopover({\r\n state,\r\n onAccept,\r\n onDismiss,\r\n onClose,\r\n onImprove,\r\n onAcceptGrammar,\r\n}: {\r\n state: PopoverState;\r\n onAccept: (replacement: string, nodeKey: string) => void;\r\n onDismiss: (nodeKey: string) => void;\r\n onClose: () => void;\r\n onImprove?: (text: string, nodeKey: string) => void;\r\n onAcceptGrammar?: (corrected: string) => void;\r\n}) {\r\n const ref = React.useRef<HTMLDivElement>(null);\r\n const type = state.issue.type ?? 'spelling';\r\n\r\n // Viewport-aware position\r\n const [pos, setPos] = React.useState({ left: state.x, top: state.y });\r\n React.useEffect(() => {\r\n if (!ref.current) return;\r\n const { offsetHeight: h, offsetWidth: w } = ref.current;\r\n const top = state.y + h > window.innerHeight - 8 ? state.y - h - 32 : state.y;\r\n setPos({ left: Math.min(state.x, window.innerWidth - w - 8), top });\r\n }, [state.x, state.y]);\r\n\r\n // Close on outside click\r\n React.useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n };\r\n document.addEventListener('mousedown', h, true);\r\n return () => document.removeEventListener('mousedown', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = () => onClose();\r\n window.addEventListener('scroll', h, { capture: true, passive: true });\r\n return () => window.removeEventListener('scroll', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', h, true);\r\n return () => document.removeEventListener('keydown', h, true);\r\n }, [onClose]);\r\n\r\n // Grammar correction takes priority over legacy improvedText\r\n const grammar = state.grammarCorrection;\r\n const improved = !grammar ? state.improvedText : undefined;\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className='sc-popover'\r\n style={{ left: pos.left, top: pos.top }}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }}>\r\n {' '}\r\n <div className='sc-popover-header'>\r\n <span className={`sc-popover-badge sc-popover-badge-${type}`}>{type.toUpperCase()}</span>\r\n <span className='sc-popover-message'>{state.issue.message}</span>\r\n </div>\r\n {state.issue.suggestions.length > 0 ? (\r\n state.issue.suggestions.slice(0, 5).map((s) => (\r\n <div\r\n key={s}\r\n className='sc-popover-item'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAccept(s, state.nodeKey);\r\n }}>\r\n → {s}\r\n </div>\r\n ))\r\n ) : (\r\n <div className='sc-popover-empty'>No suggestions</div>\r\n )}\r\n <div className='sc-popover-footer'>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDismiss(state.nodeKey);\r\n }}>\r\n Ignore\r\n </span>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose();\r\n }}>\r\n Close\r\n </span>\r\n </div>\r\n {grammar && onAcceptGrammar && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Grammar Suggestion</div>\r\n <div className='sc-popover-improve-text'>\"{grammar}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAcceptGrammar(grammar);\r\n onClose();\r\n }}>\r\n Accept correction\r\n </button>\r\n </div>\r\n )}\r\n {improved && onImprove && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Suggested Improvement</div>\r\n <div className='sc-popover-improve-text'>\"{improved}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onImprove(improved, state.nodeKey);\r\n }}>\r\n Accept improvement\r\n </button>\r\n </div>\r\n )}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function SpellCheckPlugin({\r\n useSpellCheck,\r\n onSpellCheckAccept,\r\n idleMs = 1200,\r\n enabled = true,\r\n}: {\r\n /** Return `{ promise, dismiss }` for the given text. */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /** Called after the user accepts any suggestion or correction. */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /** Debounce delay in ms before calling the API. Default 1200. */\r\n idleMs?: number;\r\n /** Set false to disable without unmounting (clears existing underlines). Default true. */\r\n enabled?: boolean;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const timerRef = React.useRef<number | null>(null);\r\n const dismissRef = React.useRef<(() => void) | null>(null);\r\n const reqIdRef = React.useRef(0);\r\n const lastTextRef = React.useRef('');\r\n const applyingRef = React.useRef(false);\r\n const grammarCorrectionRef = React.useRef<string | undefined>(undefined);\r\n\r\n const [popover, setPopover] = React.useState<PopoverState | null>(null);\r\n\r\n React.useEffect(() => {\r\n injectCSS();\r\n }, []);\r\n\r\n // ── Clear all underlines ─────────────────────────────────────────────────\r\n\r\n const clearErrors = React.useCallback(() => {\r\n setPopover(null);\r\n grammarCorrectionRef.current = undefined;\r\n applyingRef.current = true;\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n },\r\n {\r\n tag: 'spell-clear',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n }, [editor]);\r\n\r\n // ── Apply issues ─────────────────────────────────────────────────────────\r\n\r\n const applyIssues = React.useCallback(\r\n (issues: SpellCheckIssue[], improvedText?: string, trimOffset = 0) => {\r\n // Capture cursor as absolute char offset — stable across node splits\r\n let savedCharOffset = -1;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const anchorKey = sel.anchor.key;\r\n const anchorOff = sel.anchor.offset;\r\n let pos = 0;\r\n let found = false;\r\n const visit = (node: LexicalNode): void => {\r\n if (found) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n if (node.getKey() === anchorKey) {\r\n savedCharOffset = pos + anchorOff;\r\n found = true;\r\n return;\r\n }\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n $getRoot()\r\n .getChildren()\r\n .forEach((block, i) => {\r\n if (found) return;\r\n if (i > 0) pos += 1;\r\n visit(block);\r\n });\r\n });\r\n\r\n applyingRef.current = true;\r\n\r\n editor.update(\r\n () => {\r\n try {\r\n const root = $getRoot();\r\n removeAllSpellNodes(root);\r\n\r\n const sorted = [...issues].sort((a, b) => a.offset - b.offset);\r\n\r\n for (const issue of sorted) {\r\n const word = issue.word ?? '';\r\n if (!word) continue;\r\n\r\n const meta: SpellErrorMeta = {\r\n message: issue.message,\r\n suggestions: issue.suggestions,\r\n type: issue.type ?? 'spelling',\r\n offset: issue.offset,\r\n };\r\n\r\n const absOffset = issue.offset + trimOffset;\r\n let segs = getSegments(root);\r\n let placed = false;\r\n\r\n // Pass 1: exact offset + text match, with per-segment regex fallback\r\n for (const seg of segs) {\r\n if (absOffset < seg.start || absOffset >= seg.end) continue;\r\n const local = absOffset - seg.start;\r\n const slice = seg.text.slice(local, local + word.length);\r\n if (slice.toLowerCase() === word.toLowerCase()) {\r\n wrapWord(seg.node, local, word.length, meta);\r\n placed = true;\r\n break;\r\n }\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n\r\n // Pass 2: full-tree regex scan (handles trimOffset drift)\r\n if (!placed) {\r\n segs = getSegments(root); // re-collect after any prior wraps\r\n for (const seg of segs) {\r\n if (!seg.text.trim()) continue;\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Grammar-only: no spelling issues but grammar correction exists.\r\n // We need a click target — underline the first word of text with\r\n // a 'grammar' style node so the popover can open and show the correction.\r\n if (issues.length === 0 && !improvedText) {\r\n // grammarCorrection is stored in grammarCorrectionRef by the caller —\r\n // we just need any node to be clickable. Wrap first word of first segment.\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n const firstWord = target.text.trim().match(/^\\S+/)?.[0] ?? target.text;\r\n const wordStart = target.text.indexOf(firstWord);\r\n wrapWord(target.node, wordStart, firstWord.length, {\r\n message: 'Grammar suggestion available — click to review',\r\n suggestions: [],\r\n type: 'grammar',\r\n offset: target.start + wordStart,\r\n });\r\n }\r\n }\r\n\r\n // Legacy: full-text style underline for improvedText\r\n if (improvedText) {\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n wrapWord(target.node, 0, target.text.length, {\r\n message: 'AI suggested improvement available',\r\n suggestions: [],\r\n type: 'style',\r\n offset: -1,\r\n improvedText,\r\n });\r\n }\r\n }\r\n\r\n // Restore cursor to saved absolute position in new tree\r\n if (savedCharOffset >= 0) {\r\n let pos = 0;\r\n let restored = false;\r\n const restoreVisit = (node: LexicalNode): void => {\r\n if (restored) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n const len = node.getTextContent().length;\r\n if (savedCharOffset <= pos + len) {\r\n const sel = $createRangeSelection();\r\n const off = savedCharOffset - pos;\r\n sel.anchor.set(node.getKey(), off, 'text');\r\n sel.focus.set(node.getKey(), off, 'text');\r\n $setSelection(sel);\r\n restored = true;\r\n return;\r\n }\r\n pos += len;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(restoreVisit);\r\n };\r\n root.getChildren().forEach((block, i) => {\r\n if (restored) return;\r\n if (i > 0) pos += 1;\r\n restoreVisit(block);\r\n });\r\n }\r\n } catch (err) {\r\n console.error('[SpellCheckPlugin] applyIssues error:', err);\r\n }\r\n },\r\n {\r\n tag: 'spell-apply',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Click → open popover ─────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n let currentRoot: HTMLElement | null = null;\r\n\r\n const onClick = (e: MouseEvent) => {\r\n const span = (e.target as HTMLElement).closest('[data-spell-offset]') as HTMLElement | null;\r\n if (!span) return;\r\n if (!currentRoot?.contains(span)) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const visit = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node)) {\r\n const meta = (node as SpellErrorNode).getMeta();\r\n if (String(meta.offset) === span.dataset.spellOffset) {\r\n const rect = span.getBoundingClientRect();\r\n setPopover({\r\n x: rect.left,\r\n y: rect.bottom + 8,\r\n issue: {\r\n offset: meta.offset,\r\n length: node.getTextContent().length,\r\n message: meta.message,\r\n suggestions: meta.suggestions,\r\n type: meta.type,\r\n },\r\n nodeKey: node.getKey(),\r\n improvedText: meta.improvedText,\r\n grammarCorrection: grammarCorrectionRef.current,\r\n });\r\n }\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n visit($getRoot());\r\n });\r\n };\r\n\r\n // registerRootListener fires immediately with current root, then again on\r\n // every root change (e.g. Panel mount gives a new contenteditable element).\r\n const unregister = editor.registerRootListener((nextRoot, prevRoot) => {\r\n // Detach from old root\r\n if (prevRoot) prevRoot.removeEventListener('click', onClick);\r\n // Attach to new root\r\n if (nextRoot) nextRoot.addEventListener('click', onClick);\r\n currentRoot = nextRoot;\r\n });\r\n\r\n return () => {\r\n unregister();\r\n if (currentRoot) currentRoot.removeEventListener('click', onClick);\r\n };\r\n }, [editor]);\r\n\r\n // ── Accept spelling suggestion ───────────────────────────────────────────\r\n\r\n const handleAccept = React.useCallback(\r\n (replacement: string, nodeKey: string) => {\r\n let original = '';\r\n editor.getEditorState().read(() => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) original = n.getTextContent();\r\n });\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) (n as SpellErrorNode).replace($createTextNode(replacement));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement,\r\n message: popover?.issue.message ?? '',\r\n type: popover?.issue.type,\r\n });\r\n },\r\n [editor, onSpellCheckAccept, popover],\r\n );\r\n\r\n // ── Ignore (remove underline, keep word) ────────────────────────────────\r\n\r\n const handleDismiss = React.useCallback(\r\n (nodeKey: string) => {\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n))\r\n (n as SpellErrorNode).replace($createTextNode(n.getTextContent()));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n setPopover(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Accept legacy improved text ──────────────────────────────────────────\r\n\r\n const handleImprove = React.useCallback(\r\n (text: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, text, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: text,\r\n message: 'Accepted improved text',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Accept grammar correction ────────────────────────────────────────────\r\n\r\n const handleAcceptGrammar = React.useCallback(\r\n (corrected: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, corrected, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: corrected,\r\n message: 'Accepted grammar correction',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Debounced API trigger ────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !useSpellCheck) return;\r\n\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (applyingRef.current) return;\r\n if (tags.has('spell-apply') || tags.has('spell-clear') || tags.has('autocomplete-ghost'))\r\n return;\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n\r\n timerRef.current = window.setTimeout(async () => {\r\n timerRef.current = null;\r\n\r\n let rawText = '';\r\n editor.getEditorState().read(() => {\r\n rawText = $getRoot().getTextContent();\r\n });\r\n const text = rawText.trim();\r\n\r\n if (!text || text === lastTextRef.current) return;\r\n\r\n dismissRef.current?.();\r\n const myId = ++reqIdRef.current;\r\n const { promise, dismiss } = useSpellCheck(text);\r\n dismissRef.current = dismiss;\r\n\r\n try {\r\n const payload = await promise;\r\n if (myId !== reqIdRef.current) return; // superseded\r\n\r\n lastTextRef.current = text;\r\n\r\n const hasContent =\r\n payload?.issues?.length || payload?.grammarCorrection || payload?.improvedText;\r\n if (!payload || !hasContent) {\r\n clearErrors();\r\n return;\r\n }\r\n\r\n grammarCorrectionRef.current = payload.grammarCorrection ?? undefined;\r\n\r\n const improved =\r\n payload.improvedText && payload.improvedText.trim() !== text\r\n ? payload.improvedText\r\n : undefined;\r\n\r\n applyIssues(payload.issues ?? [], improved, rawText.length - rawText.trimStart().length);\r\n } catch (e) {\r\n console.error('[SpellCheckPlugin] request failed:', e);\r\n lastTextRef.current = '';\r\n }\r\n }, idleMs);\r\n });\r\n }, [editor, useSpellCheck, enabled, idleMs, applyIssues, clearErrors]);\r\n\r\n // ── enabled toggle ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled) {\r\n clearErrors();\r\n lastTextRef.current = '';\r\n }\r\n }, [enabled, clearErrors]);\r\n\r\n // ── Unmount cleanup ──────────────────────────────────────────────────────\r\n\r\n React.useEffect(\r\n () => () => {\r\n dismissRef.current?.();\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n },\r\n [],\r\n );\r\n\r\n return popover ? (\r\n <SpellPopover\r\n state={popover}\r\n onAccept={handleAccept}\r\n onDismiss={handleDismiss}\r\n onClose={() => setPopover(null)}\r\n onImprove={handleImprove}\r\n onAcceptGrammar={handleAcceptGrammar}\r\n />\r\n ) : null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $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 $createRangeSelection,\r\n $findMatchingParent,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\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 [contentRight, setContentRight] = React.useState<number | null>(null);\r\n const [open, setOpen] = React.useState(false);\r\n const openRef = React.useRef(false);\r\n const savedAnchorRef = React.useRef<{ key: string; offset: number; type: 'text' | 'element' } | null>(null);\r\n\r\n const measureContentRight = React.useCallback((cellDom: HTMLElement): number | null => {\r\n try {\r\n const range = document.createRange();\r\n range.selectNodeContents(cellDom);\r\n const cr = range.getBoundingClientRect();\r\n return cr.width > 2 ? cr.right : null;\r\n } catch {\r\n return null;\r\n }\r\n }, []);\r\n\r\n const updateFromSelection = React.useCallback(() => {\r\n if (openRef.current) return;\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 setContentRight(null);\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 setContentRight(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 setContentRight(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 setContentRight(null);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n setAnchorRect(cellDom.getBoundingClientRect());\r\n setContentRight(measureContentRight(cellDom as HTMLElement));\r\n\r\n if ($isRangeSelection(selection)) {\r\n savedAnchorRef.current = {\r\n key: selection.anchor.key,\r\n offset: selection.anchor.offset,\r\n type: selection.anchor.type as 'text' | 'element',\r\n };\r\n }\r\n });\r\n }, [editor, measureContentRight]);\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\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 clampedCellRight = Math.min(anchorRect.right, window.innerWidth - 8);\r\n // Place button right beside the content; fall back to near left edge when cell is empty\r\n const left = contentRight !== null\r\n ? Math.max(anchorRect.left + 4, Math.min(contentRight + 4, clampedCellRight - 32))\r\n : Math.max(8, anchorRect.left + 8);\r\n\r\n return {\r\n position: 'fixed',\r\n top,\r\n left,\r\n zIndex: 9999,\r\n };\r\n }, [anchorRect, contentRight]);\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 openRef.current = false;\r\n setOpen(false);\r\n editor.update(() => {\r\n const saved = savedAnchorRef.current;\r\n if (saved && $getNodeByKey(saved.key)) {\r\n const sel = $createRangeSelection();\r\n sel.anchor.set(saved.key, saved.offset, saved.type);\r\n sel.focus.set(saved.key, saved.offset, saved.type);\r\n $setSelection(sel);\r\n }\r\n fn();\r\n });\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 if (disabled) return;\r\n openRef.current = false;\r\n setOpen(false);\r\n editor.update(() => {\r\n const saved = savedAnchorRef.current;\r\n if (!saved) return;\r\n const anchorNode = $getNodeByKey(saved.key);\r\n if (!anchorNode) return;\r\n // Walk up the tree to find the enclosing table node, then remove it.\r\n const tableNode = $findMatchingParent(anchorNode, (n) => $isTableNode(n));\r\n if (tableNode) tableNode.remove();\r\n });\r\n };\r\n\r\n\r\n if (!canShow || !handleStyle) return null;\r\n\r\n return createPortal(\r\n <div style={handleStyle} className='aoTableActionHandleRoot' data-lexical-editor-portal='true'>\r\n <Menu open={open} onOpenChange={(_, data) => { openRef.current = data.open; 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 <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\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, ValidationMessages } from '../ContentEditorComponent.types';\r\nimport { PageSetupValue } from './PageSetup';\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 /** Fully custom toolbar layout; overrides the `level`-based preset. */\r\n customToolbar?: string[][];\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\r\n pageSetup: PageSetupValue;\r\n onPageSetupChange: (value: PageSetupValue) => void;\r\n setIsLinkEditMode: (isLinkEditMode: boolean) => 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', 'Table', '|'],\r\n // ['Image', 'Youtube', 'InlineImage', '|'],\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', '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 ['PageSetup'],\r\n ];\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 { 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: 250 } }}>\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: 18,\r\n height: 18,\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: 125,\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: 20,\r\n height: 20,\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: 18,\r\n height: 18,\r\n padding: 0,\r\n borderRadius: 4,\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 { 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 { Button } from '@fluentui/react-components';\nimport { LinkAddRegular } from '@fluentui/react-icons';\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent } from '@lexical/utils';\nimport { $getSelection, $isRangeSelection } from 'lexical';\nimport { getSelectedNode } from './FloatLinkEditor';\n\n/**\n * Toolbar entry point for inserting a link. Wraps the current selection in a\n * link node (if it isn't one already) and hands off to the floating\n * `FloatingLinkEditor` — the exact same UI used when editing an existing\n * link — instead of a separate popover form.\n */\nexport const InsertLinkPlugin = ({\n disabled,\n setIsLinkEditMode,\n}: {\n disabled: boolean;\n setIsLinkEditMode: (isLinkEditMode: boolean) => void;\n}) => {\n const [editor] = useLexicalComposerContext();\n\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\n\n const insertLink = () => {\n if (disabled) return;\n\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n\n if (!linkParent && !$isLinkNode(node)) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\n }\n });\n\n setIsLinkEditMode(true);\n };\n\n return (\n <Button\n size='small'\n title='Add link'\n key='insert-link'\n disabled={disabled}\n icon={<LinkAddRegular style={{ color: iconColor }} />}\n style={{\n background: 'none',\n border: 'none',\n margin: 2,\n opacity: disabled ? 0.55 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={insertLink}\n />\n );\n};\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 { Button, Field, Input } 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\nimport { AoModal } from './AoModal';\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 <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert table'\r\n maxWidth={300}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Rows' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setRows(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Columns' size='small'>\r\n <Input\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setColumns(v.value)}\r\n />\r\n </Field>\r\n </Stack>\r\n </AoModal>\r\n </>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { Button, Field, Input } 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\nimport { AoModal } from './AoModal';\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 <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Embed YouTube video'\r\n maxWidth={320}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='URL' 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 </Stack>\r\n </AoModal>\r\n </>\r\n );\r\n};\r\n","import { Stack, useTheme } from '@fluentui/react';\r\nimport { Button, Dropdown, makeStyles, Option, ToolbarDivider } from '@fluentui/react-components';\r\nimport {\r\n CommentQuoteRegular,\r\n 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 $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n REDO_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport React, { useMemo, useState } from 'react';\r\nimport {\r\n HEADING_OPTION,\r\n IEditorProps,\r\n LOW_PRIORIRTY,\r\n RichTextPluginsType,\r\n} from '../Types/EditorType';\r\nimport { $isAlphaListNode, $toggleAlphaList } from '../Nodes/AlphaListNode';\r\nimport { getToolbarGroupsByLevel } from '../Utils/editorLevel';\r\nimport { $splitBlockAtPartialSelection, $splitBlocksAtLineBreaks, 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 TextAlphaListLtrFilled: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\r\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" style={style}>\r\n <path d=\"M8.75 4a.75.75 0 1 0 0 1.5h7.5a.75.75 0 0 0 0-1.5h-7.5Z\" />\r\n <path d=\"M8.75 9a.75.75 0 1 0 0 1.5h7.5a.75.75 0 0 0 0-1.5h-7.5Z\" />\r\n <path d=\"M8 14.75c0-.41.34-.75.75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1-.75-.75Z\" />\r\n <text x=\"3.5\" y=\"6\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">a</text>\r\n <text x=\"3.5\" y=\"11\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">b</text>\r\n <text x=\"3.5\" y=\"16\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">c</text>\r\n </svg>\r\n);\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 // ── Text formatting (standalone toggle buttons) ──────────────────────────\r\n | 'Bold'\r\n | 'Italic'\r\n | 'Underline'\r\n | 'Strikethrough'\r\n | 'Subscript'\r\n | 'Superscript'\r\n | 'Highlight'\r\n | 'Uppercase'\r\n | 'Lowercase'\r\n | 'Capitalize'\r\n // ── Lists (standalone toggle buttons) ────────────────────────────────────\r\n | 'BulletList'\r\n | 'NumberList'\r\n | 'AlphabeticalList'\r\n // ── Block-level (standalone buttons) ─────────────────────────────────────\r\n | 'Quote'\r\n | 'PageBreak'\r\n // ── Heading levels (standalone toggle buttons) ────────────────────────────\r\n | 'H1'\r\n | 'H2'\r\n | 'H3'\r\n | 'H4'\r\n | 'H5'\r\n | 'H6'\r\n // ── Rich media / plugins ──────────────────────────────────────────────────\r\n | 'ColorPicker'\r\n | 'Link'\r\n | 'Table'\r\n | 'Image'\r\n | 'InlineImage'\r\n | 'Youtube'\r\n | 'FontFamily'\r\n | 'FontSize'\r\n | 'Align'\r\n | 'PageSetup'\r\n // ── Aggregate dropdowns (show ALL options of that category) ───────────────\r\n | 'Heading' // dropdown: Normal + H1–H6\r\n | 'Decorators' // dropdown: all text / list / block decorators\r\n | 'CodeBlock';\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 Strikethrough: true,\r\n Subscript: true,\r\n Superscript: true,\r\n Highlight: true,\r\n Uppercase: true,\r\n Lowercase: true,\r\n Capitalize: true,\r\n BulletList: true,\r\n NumberList: true,\r\n AlphabeticalList: true,\r\n Quote: true,\r\n PageBreak: true,\r\n H1: true,\r\n H2: true,\r\n H3: true,\r\n H4: true,\r\n H5: true,\r\n H6: 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 FontFamily: true,\r\n FontSize: true,\r\n Align: true,\r\n Heading: true,\r\n Decorators: true,\r\n CodeBlock: 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 // Guard against non-array values (e.g. {} passed by Storybook's \"Set object\" control).\r\n if (!Array.isArray(groups) || groups.length === 0) return [];\r\n return groups\r\n .map((g) =>\r\n (Array.isArray(g) ? g : [])\r\n .map((t) => (typeof t === 'string' ? 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 [hasTextSelection, setHasTextSelection] = useState(false);\r\n\r\n // Controlled open state for the decorator dropdown so it stays open\r\n // after an option is selected (only closes on click-outside / Escape).\r\n const [decoratorOpen, setDecoratorOpen] = useState(false);\r\n const decoratorSelectingRef = React.useRef(false);\r\n\r\n const presetGroups = props.customToolbar ?? 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 setHasTextSelection(false);\r\n return;\r\n }\r\n\r\n setHasTextSelection(!selection.isCollapsed());\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 // Alpha list must be checked before the generic $isListNode branch because\r\n // AlphaListNode extends ListNode — $isListNode would match it too.\r\n if ($isAlphaListNode(element)) {\r\n setSelectNodeType('alpha');\r\n return;\r\n }\r\n\r\n if ($isListNode(element)) {\r\n const parentList = $getNearestNodeOfType(anchorNode, ListNode);\r\n const type = parentList ? parentList.getTag() : element.getTag();\r\n setSelectNodeType(type);\r\n return;\r\n }\r\n\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n setSelectNodeType(\r\n ['paragraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'quote', 'code'].includes(type)\r\n ? type\r\n : 'paragraph',\r\n );\r\n };\r\n\r\n const formatQuote = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n if (selectNodeType === 'quote') {\r\n // toggle back to paragraph\r\n formatParagraph(editor);\r\n } else {\r\n // Split multi-line blocks first so only the selected line(s) become a quote.\r\n $splitBlocksAtLineBreaks(selection);\r\n $setBlocksType($getSelection(), () => $createQuoteNode());\r\n }\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerEditableListener((editable) => {\r\n setIsEditable(editable);\r\n }),\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n updateToolbarPlugins();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbarPlugins();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n const onHandleSelectOption = (id: RichTextPluginsType) => {\r\n switch (id) {\r\n case RichTextPluginsType.Bold:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n break;\r\n case RichTextPluginsType.Italic:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n break;\r\n case RichTextPluginsType.Underline:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n break;\r\n case RichTextPluginsType.Strikethrough:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n break;\r\n case RichTextPluginsType.Superscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n break;\r\n case RichTextPluginsType.Subscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n break;\r\n case RichTextPluginsType.Highlight:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'highlight');\r\n break;\r\n case RichTextPluginsType.LeftAlign:\r\n applyAlignmentWithSplit('left');\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n applyAlignmentWithSplit('right');\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n applyAlignmentWithSplit('center');\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n applyAlignmentWithSplit('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 /**\r\n * Apply an alignment format to only the selected block(s).\r\n *\r\n * Problem: FORMAT_ELEMENT_COMMAND applies to every top-level element that\r\n * is touched by the selection — so if the user has several Shift+Enter\r\n * \"lines\" in one block, or selects a single word in the middle of a\r\n * paragraph, alignment spreads to the entire block.\r\n *\r\n * Fix (same two-step strategy as updateHeading):\r\n * 1. Split multi-line blocks at LineBreakNode boundaries so each visual\r\n * line is its own block.\r\n * 2. Split the block at the selection edges when only part of a line is\r\n * selected, isolating the selected words into their own block.\r\n *\r\n * After the splits the selection sits on the isolated block(s). We then\r\n * dispatch FORMAT_ELEMENT_COMMAND which applies alignment only to whatever\r\n * blocks the current selection covers — i.e. just the isolated block.\r\n *\r\n * For non-range selections (e.g. a YouTube node selected as a node\r\n * selection), the update() returns early and the command still fires,\r\n * so YouTube / image alignment continues to work unchanged.\r\n */\r\n const applyAlignmentWithSplit = (formatType: 'left' | 'center' | 'right' | 'justify') => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n // Step 1 – split Shift+Enter multi-line blocks.\r\n $splitBlocksAtLineBreaks(selection);\r\n\r\n // Step 2 – split at partial-selection boundaries (word / phrase selection).\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) {\r\n $splitBlockAtPartialSelection(sel);\r\n }\r\n });\r\n\r\n // Dispatch AFTER the split update so the command sees the repositioned\r\n // selection and aligns only the isolated block(s).\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, formatType);\r\n };\r\n\r\n const updateHeading = (heading: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Step 1 – split multi-line blocks (Shift+Enter) so only the selected\r\n // line(s) are affected.\r\n $splitBlocksAtLineBreaks(selection);\r\n\r\n // Step 2 – if the selection covers only part of a single block (e.g.\r\n // one word in the middle of a paragraph), split the block at\r\n // the selection edges so the heading applies only to the\r\n // selected words, leaving the surrounding text as paragraphs.\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) {\r\n $splitBlockAtPartialSelection(sel);\r\n }\r\n\r\n $setBlocksType($getSelection(), () => $createHeadingNode(heading));\r\n }\r\n });\r\n\r\n editor.getEditorState().read(() => {\r\n updateToolbarPlugins();\r\n });\r\n };\r\n\r\n /**\r\n * Token renderer registry\r\n * Each token returns a React element (button/plugin/divider).\r\n * If token should render nothing (e.g. unknown), return null.\r\n */\r\n const renderToken = (token: ToolbarToken, groupIndex: number, tokenIndex: number) => {\r\n const key = `${groupIndex}-${tokenIndex}-${token}`;\r\n\r\n // ---------- Fluent UI v8 theme.palette mapping ----------\r\n const palette = theme.palette;\r\n\r\n const fg = palette.neutralPrimary; // main icon/text\r\n const fgSubtle = palette.neutralSecondary; // subtle icons (chevrons)\r\n const fgDisabled = palette.neutralTertiary; // disabled\r\n\r\n const brand = palette.themePrimary; // active/toggled icon\r\n const brandHover = palette.themeDarkAlt ?? brand;\r\n const brandPressed = palette.themeDark ?? brand;\r\n\r\n const 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 aria-label='Bold'\r\n aria-pressed={isBold}\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 aria-label='Italic'\r\n aria-pressed={isItalic}\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 aria-label='Underline'\r\n aria-pressed={isUnderline}\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 (\r\n <InsertLinkPlugin\r\n key={key}\r\n disabled={!isEditable || props.readOnly! || !hasTextSelection}\r\n setIsLinkEditMode={props.setIsLinkEditMode}\r\n />\r\n );\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 maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\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 maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\r\n />\r\n );\r\n\r\n case 'Youtube':\r\n return <YoutubeUploadPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Heading': {\r\n const headingLabel =\r\n selectNodeType === 'paragraph'\r\n ? 'Normal'\r\n : (HEADING_OPTION.find((h) => h.key === selectNodeType)?.text ?? selectNodeType);\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n title='Add heading'\r\n id={`heading-option-${groupIndex}`}\r\n placeholder='Format'\r\n disabled={!isEditable}\r\n style={{ minWidth: '100px' }}\r\n className={styles.dropdown}\r\n value={headingLabel}\r\n selectedOptions={[selectNodeType]}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as HeadingTagType | 'paragraph' | undefined;\r\n if (!val) return;\r\n\r\n if (val === 'paragraph') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading(val);\r\n setSelectNodeType(val);\r\n }\r\n }}>\r\n <Option value='paragraph'>Normal</Option>\r\n\r\n {HEADING_OPTION.map((option, idx) => (\r\n <Option key={`${option.key}-${idx}`} value={option.key as HeadingTagType}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n case 'FontFamily':\r\n return <FontFamilyPlugin key={key} disabled={!isEditable || props.readOnly} />;\r\n\r\n case 'FontSize':\r\n return <FontSizePlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case '|':\r\n return <ToolbarDivider key={key} />;\r\n\r\n // ── Standalone text-format toggle buttons ─────────────────────────────\r\n // These were previously only accessible inside the 'Decorators' dropdown.\r\n // Use them directly in customToolbar to show individual buttons instead.\r\n\r\n case 'Strikethrough':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Strikethrough'\r\n aria-pressed={isStrikethrough}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextStrikethroughFilled style={{ color: getIconColor(isStrikethrough) }} />}\r\n style={getButtonStyle(isStrikethrough)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Strikethrough)}\r\n />\r\n );\r\n\r\n case 'Subscript':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Subscript'\r\n aria-pressed={isSubscript}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextSubscriptFilled style={{ color: getIconColor(isSubscript) }} />}\r\n style={getButtonStyle(isSubscript)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Subscript)}\r\n />\r\n );\r\n\r\n case 'Superscript':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Superscript'\r\n aria-pressed={isSuperscript}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextSuperscriptFilled style={{ color: getIconColor(isSuperscript) }} />}\r\n style={getButtonStyle(isSuperscript)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Superscript)}\r\n />\r\n );\r\n\r\n case 'Highlight':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Highlight'\r\n aria-pressed={isHighlight}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <HighlightAccentFilled\r\n style={{ color: isEditable ? (isHighlight ? brand : fg) : fgDisabled }}\r\n />\r\n }\r\n style={getButtonStyle(isHighlight)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Highlight)}\r\n />\r\n );\r\n\r\n case 'Uppercase':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Uppercase'\r\n aria-pressed={isUppercase}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseUppercaseFilled style={{ color: getIconColor(isUppercase) }} />}\r\n style={getButtonStyle(isUppercase)}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase')}\r\n />\r\n );\r\n\r\n case 'Lowercase':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Lowercase'\r\n aria-pressed={isLowercase}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseLowercaseFilled style={{ color: getIconColor(isLowercase) }} />}\r\n style={getButtonStyle(isLowercase)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Lowercase)}\r\n />\r\n );\r\n\r\n case 'Capitalize':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Capitalize'\r\n aria-pressed={isCapitalize}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseTitleFilled style={{ color: getIconColor(isCapitalize) }} />}\r\n style={getButtonStyle(isCapitalize)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Capitalize)}\r\n />\r\n );\r\n\r\n // ── Standalone list toggle buttons ────────────────────────────────────\r\n\r\n case 'BulletList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Bullet list'\r\n aria-pressed={selectNodeType === 'ul'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextBulletListLtrFilled style={{ color: getIconColor(selectNodeType === 'ul') }} />\r\n }\r\n style={getButtonStyle(selectNodeType === 'ul')}\r\n onClick={() =>\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n )\r\n }\r\n />\r\n );\r\n\r\n case 'NumberList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Number list'\r\n aria-pressed={selectNodeType === 'ol'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextNumberListLtrFilled style={{ color: getIconColor(selectNodeType === 'ol') }} />\r\n }\r\n style={getButtonStyle(selectNodeType === 'ol')}\r\n onClick={() =>\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n )\r\n }\r\n />\r\n );\r\n\r\n case 'AlphabeticalList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Alphabetical list'\r\n aria-pressed={selectNodeType === 'alpha'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextAlphaListLtrFilled\r\n style={{ color: getIconColor(selectNodeType === 'alpha') }}\r\n />\r\n }\r\n style={getButtonStyle(selectNodeType === 'alpha')}\r\n onClick={() => editor.update(() => $toggleAlphaList())}\r\n />\r\n );\r\n\r\n // ── Standalone block buttons ──────────────────────────────────────────\r\n\r\n case 'Quote':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Quote'\r\n aria-pressed={selectNodeType === 'quote'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<CommentQuoteRegular style={{ color: getIconColor(selectNodeType === 'quote') }} />}\r\n style={getButtonStyle(selectNodeType === 'quote')}\r\n onClick={() => formatQuote()}\r\n />\r\n );\r\n\r\n case 'PageBreak':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Page break'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<DocumentPageBreakRegular style={{ color: getIconColor() }} />}\r\n style={getButtonStyle()}\r\n onClick={() => editor.dispatchCommand(INSERT_PAGE_BREAK, undefined)}\r\n />\r\n );\r\n\r\n // ── Standalone heading-level toggle buttons ───────────────────────────\r\n // Each button sets (or toggles off) that specific heading level.\r\n // Clicking an active heading reverts to normal paragraph.\r\n\r\n case 'H1':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 1'\r\n aria-pressed={selectNodeType === 'h1'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h1'),\r\n color: getIconColor(selectNodeType === 'h1'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h1') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h1');\r\n setSelectNodeType('h1');\r\n }\r\n }}>\r\n H1\r\n </Button>\r\n );\r\n\r\n case 'H2':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 2'\r\n aria-pressed={selectNodeType === 'h2'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h2'),\r\n color: getIconColor(selectNodeType === 'h2'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h2') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h2');\r\n setSelectNodeType('h2');\r\n }\r\n }}>\r\n H2\r\n </Button>\r\n );\r\n\r\n case 'H3':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 3'\r\n aria-pressed={selectNodeType === 'h3'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h3'),\r\n color: getIconColor(selectNodeType === 'h3'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h3') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h3');\r\n setSelectNodeType('h3');\r\n }\r\n }}>\r\n H3\r\n </Button>\r\n );\r\n\r\n case 'H4':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 4'\r\n aria-pressed={selectNodeType === 'h4'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h4'),\r\n color: getIconColor(selectNodeType === 'h4'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h4') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h4');\r\n setSelectNodeType('h4');\r\n }\r\n }}>\r\n H4\r\n </Button>\r\n );\r\n\r\n case 'H5':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 5'\r\n aria-pressed={selectNodeType === 'h5'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h5'),\r\n color: getIconColor(selectNodeType === 'h5'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h5') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h5');\r\n setSelectNodeType('h5');\r\n }\r\n }}>\r\n H5\r\n </Button>\r\n );\r\n\r\n case 'H6':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 6'\r\n aria-pressed={selectNodeType === 'h6'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h6'),\r\n color: getIconColor(selectNodeType === 'h6'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h6') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h6');\r\n setSelectNodeType('h6');\r\n }\r\n }}>\r\n H6\r\n </Button>\r\n );\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 === 'alpha' ? ['al-list'] : []),\r\n ...(selectNodeType === 'quote' ? ['quote'] : []),\r\n ];\r\n\r\n const DECORATOR_LABEL: Record<string, string> = {\r\n uppercase: 'Uppercase',\r\n lowercase: 'Lowercase',\r\n capitalize: 'Capitalize',\r\n strike: 'Strikethrough',\r\n subscript: 'Subscript',\r\n superscript: 'Superscript',\r\n highlight: 'Highlight',\r\n 'ul-list': 'Bullet list',\r\n 'ol-list': 'Number list',\r\n 'al-list': 'Alphabetical list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0\r\n ? ''\r\n : activeDecorators.length === 1\r\n ? DECORATOR_LABEL[activeDecorators[0]]\r\n : `${DECORATOR_LABEL[activeDecorators[0]]} +${activeDecorators.length - 1}`;\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n multiselect\r\n id={`${groupIndex}-set-decorators`}\r\n placeholder='Text'\r\n value={decoratorValue}\r\n selectedOptions={activeDecorators}\r\n disabled={!isEditable}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '180px' } }}\r\n open={decoratorOpen}\r\n onOpenChange={(_, data) => {\r\n // Suppress the close that Fluent UI fires right after an option is\r\n // selected — we only want to close on click-outside or Escape.\r\n if (decoratorSelectingRef.current) {\r\n decoratorSelectingRef.current = false;\r\n return;\r\n }\r\n setDecoratorOpen(data.open);\r\n }}\r\n onOptionSelect={(_, data) => {\r\n decoratorSelectingRef.current = true;\r\n switch (data.optionValue as string) {\r\n case 'uppercase':\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case 'lowercase':\r\n onHandleSelectOption(RichTextPluginsType.Lowercase);\r\n break;\r\n case 'capitalize':\r\n onHandleSelectOption(RichTextPluginsType.Capitalize);\r\n break;\r\n case 'strike':\r\n onHandleSelectOption(RichTextPluginsType.Strikethrough);\r\n break;\r\n case 'subscript':\r\n onHandleSelectOption(RichTextPluginsType.Subscript);\r\n break;\r\n case 'superscript':\r\n onHandleSelectOption(RichTextPluginsType.Superscript);\r\n break;\r\n case 'highlight':\r\n onHandleSelectOption(RichTextPluginsType.Highlight);\r\n break;\r\n case 'ul-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'al-list':\r\n editor.update(() => $toggleAlphaList());\r\n break;\r\n case 'page-break':\r\n editor.dispatchCommand(INSERT_PAGE_BREAK, undefined);\r\n break;\r\n case 'quote':\r\n formatQuote();\r\n break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />\r\n Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />\r\n Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />\r\n Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />\r\n Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />\r\n Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />\r\n Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled\r\n style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }}\r\n />\r\n Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />\r\n Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />\r\n Number list\r\n </Option>\r\n <Option value='al-list' text='Alphabetical list'>\r\n <TextAlphaListLtrFilled style={optionIconStyle} />\r\n Alphabetical list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />\r\n Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />\r\n Quote\r\n </Option>\r\n </Dropdown>\r\n );\r\n }\r\n\r\n // case 'CodeBlock':\r\n // return (\r\n // <CodeBlockPlugin\r\n // key={key}\r\n // codeLanguage={codeLanguage}\r\n // selectNodeType={selectNodeType}\r\n // selectedElementKey={selectedNodeKey}\r\n // disabled={!isEditable}\r\n // />\r\n // );\r\n\r\n case 'Align': {\r\n const ALIGN_OPTIONS = [\r\n {\r\n value: 'left',\r\n label: 'Left Align',\r\n icon: <TextAlignLeftFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.LeftAlign,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Center Align',\r\n icon: <TextAlignCenterFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.CenterAlign,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Right Align',\r\n icon: <TextAlignRightFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.RightAlign,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify Align',\r\n icon: <TextAlignJustifyFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.JustifyAlign,\r\n },\r\n ];\r\n const alignLabel = ALIGN_OPTIONS.find((o) => o.value === alignment)?.label ?? 'Left Align';\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n id='set-alignment'\r\n disabled={!isEditable}\r\n placeholder='Left Align'\r\n value={alignLabel}\r\n selectedOptions={[alignment]}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const opt = ALIGN_OPTIONS.find((o) => o.value === data.optionValue);\r\n if (opt) onHandleSelectOption(opt.action);\r\n }}>\r\n {ALIGN_OPTIONS.map((opt) => (\r\n <Option key={opt.value} value={opt.value} text={opt.label}>\r\n {opt.icon}\r\n {opt.label}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n 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"]}
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/AlphaListNode.tsx","../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/Utils/FloatingPortal.ts","../src/Plugins/CharacterStylesPopupPlugin.tsx","../src/Utils/Sanitize.ts","../src/Plugins/CustomOnChange.tsx","../src/Plugins/FloatLinkEditor.tsx","../src/Plugins/AoModal.tsx","../src/Plugins/ImagePlugin.tsx","../src/Plugins/InlineImage.tsx","../src/Plugins/PageBreak.tsx","../src/Utils/Helper.ts","../src/Plugins/RefApiPlugin.tsx","../src/Plugins/Spellcheckplugin.tsx","../src/Plugins/TableActionMenuPlugin.tsx","../src/Plugins/TableCellResizer.tsx","../src/Types/EditorType.tsx","../src/Utils/editorLevel.ts","../src/Utils/Index.tsx","../src/Nodes/ColorPickerComponent.tsx","../src/Plugins/ColorBar.tsx","../src/Plugins/FontFamily.tsx","../src/Plugins/FontSize.tsx","../src/Plugins/InsertLink.tsx","../src/Plugins/PageSetup.tsx","../src/Plugins/Table.tsx","../src/Plugins/Youtube.tsx","../src/Plugins/ToolBar.tsx","../src/Plugins/YoutubeDeletePlugin.tsx","../src/Theme/index.ts"],"names":["createCommand","img","jsx","useRef","$getSelection","$isRangeSelection","jsxs","ImageComponent","React","theme","$applyNodeReplacement","imageCache","useSuspenseImage","LazyImage","useLexicalNodeSelection","useState","useLexicalComposerContext","useLexicalEditable","useCallback","$isNodeSelection","$setSelection","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","CLICK_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","$getNodeByKey","Suspense","InlineImageComponent","React2","DecoratorNode","createEditor","ContentEditorLevel","$findMatchingParent","TextNode","React3","width","height","React4","COMMAND_PRIORITY_HIGH","clamp","$getRoot","getSelectedNode","$isAtNodeEnd","$isLinkNode","TOGGLE_LINK_COMMAND","Fragment","createPortal","Button","DRAGSTART_COMMAND","isHTMLElement","Stack","Field","AttachFilled","MessageBar","MessageBarBody","Input","$insertNodes","$isRootOrShadowRoot","$wrapNodeInElement","$createParagraphNode","COMMAND_PRIORITY_EDITOR","$onDragStart","DRAGOVER_COMMAND","$onDragover","DROP_COMMAND","$onDrop","TRANSPARENT_IMAGE","$getImageNodeInSelection","$getNearestNodeFromDOMNode","canDropImage","getDragImageData","getDragSelection","$createRangeSelection","getDOMSelectionFromTarget","$generateNodesFromDOM","$isTextNode","$generateHtmlFromNodes","$isElementNode","$createTextNode","React6","React7","KEY_DOWN_COMMAND","DeleteRegular","$isTableCellNode","useMemo","$isLineBreakNode","r","g","b","useStyles","makeStyles","$getSelectionStyleValueForProperty","$patchStyleText","Dropdown","Option","fontSize","React11","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuDivider","$insertNodeToNearestRoot","useTheme","$isListNode","ListNode","type","$isHeadingNode","$setBlocksType","FORMAT_TEXT_COMMAND","FORMAT_ELEMENT_COMMAND","$createHeadingNode","TextBold24Regular","TextItalicFilled","TextUnderlineFilled","TextStrikethroughFilled","TextSubscriptFilled","TextSuperscriptFilled","$isDecoratorNode","FluentProvider","webLightTheme"],"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 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 = !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n return (\r\n <Suspense fallback={null}>\r\n {/* position:relative + inline-block ensures the div sizes to the image\r\n so the absolutely-positioned resizer handles anchor to image edges */}\r\n <div\r\n draggable={draggable}\r\n style={{ position: 'relative', display: 'inline-block' }}\r\n >\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 {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 </div>\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",".inline-editor-image {\r\n display: inline-block;\r\n position: relative;\r\n cursor: default;\r\n user-select: none;\r\n}\r\n\r\n.inline-editor-image .image-resizer {\r\n display: block;\r\n width: 7px;\r\n height: 7px;\r\n position: absolute;\r\n background-color: rgb(60, 132, 244);\r\n border: 1px solid #fff;\r\n z-index: 10;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-n {\r\n top: -6px;\r\n left: 48%;\r\n cursor: n-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-ne {\r\n top: -6px;\r\n right: -6px;\r\n cursor: ne-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-e {\r\n bottom: 48%;\r\n right: -6px;\r\n cursor: e-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-se {\r\n bottom: -2px;\r\n right: -6px;\r\n cursor: nwse-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-s {\r\n bottom: -2px;\r\n left: 48%;\r\n cursor: s-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-sw {\r\n bottom: -2px;\r\n left: -6px;\r\n cursor: sw-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-w {\r\n bottom: 48%;\r\n left: -6px;\r\n cursor: w-resize;\r\n}\r\n\r\n.inline-editor-image .image-resizer.image-resizer-nw {\r\n top: -6px;\r\n left: -6px;\r\n cursor: nw-resize;\r\n}\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\n\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\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\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\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\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 [isResizing, setIsResizing] = useState(false);\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 $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 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 return false;\r\n },\r\n [isResizing, isSelected, setSelected, clearSelection],\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 onClick,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_ENTER_COMMAND, $onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_ESCAPE_COMMAND, $onEscape, COMMAND_PRIORITY_LOW),\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 onClick,\r\n setSelected,\r\n ]);\r\n\r\n const onResizeStart = () => {\r\n setIsResizing(true);\r\n };\r\n\r\n const onResizeEnd = (nextWidth: 'inherit' | number, nextHeight: 'inherit' | number) => {\r\n setTimeout(() => {\r\n setIsResizing(false);\r\n }, 200);\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 draggable = !isResizing;\r\n const isFocused = (isSelected || isResizing) && isEditable;\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <span draggable={draggable} style={{ position: 'relative', display: 'inline-block' }}>\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 {$isNodeSelection(selection) && isFocused && (\r\n <ImageResizer\r\n showCaption={false}\r\n setShowCaption={() => {}}\r\n captionsEnabled={false}\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n imageRef={imageRef}\r\n onResizeStart={onResizeStart}\r\n onResizeEnd={onResizeEnd}\r\n />\r\n )}\r\n </span>\r\n </Suspense>\r\n );\r\n}\r\n\r\nexport default InlineImageComponent;\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 {\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","import type { InitialConfigType } from '@lexical/react/LexicalComposer';\r\nimport type { LexicalEditor } from 'lexical';\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 /**\r\n * Replace the entire document with the provided HTML string.\r\n *\r\n * The HTML is sanitized before import, so event handlers and dangerous\r\n * URL schemes are automatically stripped.\r\n *\r\n * ⚠️ Do NOT call this inside an effect that watches the same `value` prop —\r\n * it will create an infinite update loop. Use the controlled `value` prop\r\n * for external state synchronization instead.\r\n *\r\n * @param html - HTML to load. Pass an empty string to clear the editor.\r\n *\r\n * @example\r\n * editorRef.current?.setValue('<p>Hello <strong>world</strong></p>');\r\n */\r\n setValue: (html: string) => void;\r\n\r\n /**\r\n * Return the current document as an HTML string.\r\n *\r\n * The returned HTML is Lexical-normalized (class names, data-attributes, etc.)\r\n * and is safe to store and later reload via `value` prop or `setValue()`.\r\n *\r\n * @example\r\n * const html = editorRef.current?.getValue();\r\n * await saveToDatabase(html);\r\n */\r\n getValue: () => string;\r\n\r\n /**\r\n * Clear the editor to a completely empty state.\r\n *\r\n * Equivalent to `setValue('')` but more efficient — skips HTML parsing.\r\n */\r\n clear: () => void;\r\n\r\n /**\r\n * Move keyboard focus into the editable content area.\r\n *\r\n * Useful for auto-focus after a modal opens or a dialog is confirmed.\r\n */\r\n focus: () => void;\r\n\r\n /**\r\n * Remove keyboard focus from the editable content area.\r\n */\r\n blur: () => void;\r\n\r\n /**\r\n * Returns `true` when the editor contains no visible user content.\r\n *\r\n * Note: system blocks inserted via `upsertBlock` may still affect this check\r\n * unless the implementation explicitly excludes `HtmlBlockNode` content.\r\n *\r\n * @example\r\n * if (editorRef.current?.isEmpty()) {\r\n * alert('Please write something before sending.');\r\n * }\r\n */\r\n isEmpty: () => boolean;\r\n\r\n /**\r\n * Returns `true` when the editor's content area currently has input focus.\r\n */\r\n isFocused: () => boolean;\r\n\r\n /**\r\n * Access the underlying Lexical `LexicalEditor` instance.\r\n *\r\n * Use only for advanced integrations (custom commands, plugins, etc.).\r\n * The return type is `any` to avoid coupling consumers to Lexical's internal\r\n * types; cast to `LexicalEditor` from the `lexical` package if needed.\r\n *\r\n * @example\r\n * import { $getRoot } from 'lexical';\r\n * const lexical = editorRef.current?.getEditor();\r\n * lexical?.getEditorState().read(() => console.log($getRoot().getTextContent()));\r\n */\r\n getEditor: () => any;\r\n\r\n /**\r\n * Insert or update a named system block in the document.\r\n *\r\n * System blocks (signature, footer, banner, etc.) are tracked by `kind` and\r\n * rendered as non-editable regions. The user can delete them but cannot type\r\n * inside them. They do **not** affect `checkDirty()` or `isEmpty()`.\r\n *\r\n * If a block with the same `kind` already exists it is replaced in-place;\r\n * otherwise a new block is appended (or prepended if `position = 'start'`).\r\n *\r\n * @param spec.kind - Unique identifier, e.g. `'signature'` or `'footer'`.\r\n * @param spec.html - HTML content for the block. Sanitized before import.\r\n * @param spec.position - Where to insert when creating: `'start'` | `'end'` (default `'end'`).\r\n *\r\n * @example\r\n * editorRef.current?.upsertBlock({\r\n * kind: 'signature',\r\n * html: '<p><strong>Vikram Singh</strong></p><p>Senior Engineer</p>',\r\n * position: 'end',\r\n * });\r\n */\r\n upsertBlock: (spec: BlockSpec) => void;\r\n\r\n /**\r\n * Remove a system block by its `kind` identifier.\r\n *\r\n * No-op if no block with that `kind` exists.\r\n *\r\n * @param kind - The same identifier used when calling `upsertBlock`.\r\n *\r\n * @example\r\n * editorRef.current?.removeBlock('signature');\r\n */\r\n removeBlock: (kind: string) => void;\r\n\r\n /**\r\n * Returns `true` if a system block with the given `kind` is present in the document.\r\n *\r\n * @example\r\n * const hasSig = editorRef.current?.hasBlock('signature'); // true | false\r\n */\r\n hasBlock: (kind: string) => boolean;\r\n\r\n /**\r\n * Returns `true` when the editor's user content differs from the clean baseline.\r\n *\r\n * **What counts as user content:**\r\n * Text the user typed in paragraphs, headings, lists, etc., plus any media\r\n * (images, YouTube embeds) inserted via the toolbar. System blocks added via\r\n * `upsertBlock` are **excluded** from the comparison.\r\n *\r\n * **What is always `false` (clean):**\r\n * - Empty editor (placeholder visible).\r\n * - Editor containing only a default / pre-loaded value that has not been changed.\r\n * - Editor cleared back to empty after the user had typed something.\r\n *\r\n * **Baseline:** captured automatically after the editor finishes loading its\r\n * initial content. Call `markClean()` to reset it after a successful save.\r\n *\r\n * @example\r\n * window.onbeforeunload = () => {\r\n * if (editorRef.current?.checkDirty()) return 'You have unsaved changes.';\r\n * };\r\n */\r\n checkDirty: () => boolean;\r\n\r\n /**\r\n * Reset the dirty baseline to the editor's current content.\r\n *\r\n * Call this after successfully saving so that `checkDirty()` compares against\r\n * the saved state going forward, rather than the original mount-time value.\r\n *\r\n * @example\r\n * const html = editorRef.current?.getValue();\r\n * await api.save(html);\r\n * editorRef.current?.markClean(); // checkDirty() now returns false\r\n */\r\n markClean: () => void;\r\n};\r\n// ─── Validation ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Built-in default messages used when no custom `validationMessages` entry is\r\n * provided for that rule. Export this to inspect or copy individual defaults.\r\n */\r\nexport const DEFAULT_VALIDATION_MESSAGES = {\r\n required: 'This field is required.',\r\n minWords: (current: number, min: number) =>\r\n `Minimum ${min} word${min === 1 ? '' : 's'} required (${current} entered).`,\r\n maxWords: (current: number, max: number) =>\r\n `Word limit exceeded: ${current} / ${max} words.`,\r\n minChars: (current: number, min: number) =>\r\n `Minimum ${min} character${min === 1 ? '' : 's'} required (${current} entered).`,\r\n maxChars: (current: number, max: number) =>\r\n `Character limit exceeded: ${current} / ${max} characters.`,\r\n noImages: 'Images are not allowed in this field.',\r\n maxImages: (current: number, max: number) =>\r\n `Too many images: ${current} / ${max} allowed.`,\r\n noLinks: 'Hyperlinks are not allowed in this field.',\r\n maxLinks: (current: number, max: number) =>\r\n `Too many links: ${current} / ${max} allowed.`,\r\n noTables: 'Tables are not allowed in this field.',\r\n imageTooLarge: (fileMB: number, maxMB: number) =>\r\n `Image size (${fileMB.toFixed(1)} MB) exceeds the ${maxMB} MB limit.`,\r\n} as const;\r\n\r\n/** A single active validation error on the editor. */\r\nexport type EditorValidationError = {\r\n type:\r\n | 'required'\r\n | 'minWords' | 'maxWords'\r\n | 'minChars' | 'maxChars'\r\n | 'noImages' | 'maxImages'\r\n | 'noLinks' | 'maxLinks'\r\n | 'noTables';\r\n message: string;\r\n};\r\n\r\n/**\r\n * Custom messages for each validation rule.\r\n * Each entry accepts either a static string or a function that receives\r\n * the relevant counts and returns a string.\r\n */\r\nexport type ValidationMessages = {\r\n // ── Word count ─────────────────────────────────────────────────────────\r\n /** Shown when the editor is empty and `required` is true. */\r\n required?: string;\r\n /** Shown when word count is below `minWords`. Receives (current, min). */\r\n minWords?: string | ((current: number, min: number) => string);\r\n /** Shown when word count exceeds `maxWords`. Receives (current, max). */\r\n maxWords?: string | ((current: number, max: number) => string);\r\n // ── Character count ────────────────────────────────────────────────────\r\n /** Shown when character count is below `minChars`. Receives (current, min). */\r\n minChars?: string | ((current: number, min: number) => string);\r\n /** Shown when character count exceeds `maxChars`. Receives (current, max). */\r\n maxChars?: string | ((current: number, max: number) => string);\r\n // ── Images ─────────────────────────────────────────────────────────────\r\n /** Shown when content contains images and `noImages` is true. */\r\n noImages?: string;\r\n /** Shown when image count exceeds `maxImages`. Receives (current, max). */\r\n maxImages?: string | ((current: number, max: number) => string);\r\n // ── Links ──────────────────────────────────────────────────────────────\r\n /** Shown when content contains links and `noLinks` is true. */\r\n noLinks?: string;\r\n /** Shown when link count exceeds `maxLinks`. Receives (current, max). */\r\n maxLinks?: string | ((current: number, max: number) => string);\r\n // ── Tables ─────────────────────────────────────────────────────────────\r\n /** Shown when content contains tables and `noTables` is true. */\r\n noTables?: string;\r\n // ── Image upload ───────────────────────────────────────────────────────\r\n /** Shown in the image dialog when an uploaded file exceeds `maxImageSizeMB`. Receives (fileMB, maxMB). */\r\n imageTooLarge?: string | ((fileMB: number, maxMB: number) => string);\r\n};\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 * Fully custom toolbar layout that overrides the `level` preset.\r\n *\r\n * Pass a 2-D array of **token strings**. Each inner array is rendered in order.\r\n * Use `'|'` inside a group (including at the end) to render a divider.\r\n * Every token renders as its own **standalone** control — there are no\r\n * hidden dropdowns. Items like `'Strikethrough'` or `'H1'` that were\r\n * previously only reachable inside aggregate dropdowns can now be placed\r\n * directly in the toolbar. Unknown tokens are silently ignored.\r\n *\r\n * ---\r\n * ### Text formatting (standalone toggle buttons)\r\n *\r\n * | Token | What it renders |\r\n * |------------------|----------------------------------|\r\n * | `'Bold'` | Bold toggle |\r\n * | `'Italic'` | Italic toggle |\r\n * | `'Underline'` | Underline toggle |\r\n * | `'Strikethrough'`| Strikethrough toggle |\r\n * | `'Subscript'` | Subscript toggle |\r\n * | `'Superscript'` | Superscript toggle |\r\n * | `'Highlight'` | Highlight toggle |\r\n * | `'Uppercase'` | Uppercase transform toggle |\r\n * | `'Lowercase'` | Lowercase transform toggle |\r\n * | `'Capitalize'` | Capitalize transform toggle |\r\n *\r\n * ### Lists (standalone toggle buttons)\r\n *\r\n * | Token | What it renders |\r\n * |---------------------|--------------------------|\r\n * | `'BulletList'` | Unordered list toggle |\r\n * | `'NumberList'` | Ordered list toggle |\r\n * | `'AlphabeticalList'`| Alphabetical list toggle |\r\n *\r\n * ### Block-level (standalone buttons)\r\n *\r\n * | Token | What it renders |\r\n * |--------------|-------------------------------------|\r\n * | `'Quote'` | Blockquote toggle |\r\n * | `'PageBreak'`| Insert page-break |\r\n *\r\n * ### Heading levels (standalone toggle buttons)\r\n *\r\n * Clicking an active heading level reverts the block to normal paragraph.\r\n *\r\n * | Token | What it renders |\r\n * |-------|-------------------------|\r\n * | `'H1'`| Heading 1 toggle button |\r\n * | `'H2'`| Heading 2 toggle button |\r\n * | `'H3'`| Heading 3 toggle button |\r\n * | `'H4'`| Heading 4 toggle button |\r\n * | `'H5'`| Heading 5 toggle button |\r\n * | `'H6'`| Heading 6 toggle button |\r\n *\r\n * ### Dropdowns / rich plugins\r\n *\r\n * | Token | What it renders |\r\n * |-----------------|---------------------------------------------------|\r\n * | `'Heading'` | Dropdown: Normal + H1–H6 (all heading levels) |\r\n * | `'Decorators'` | Dropdown: all text / list / block decorator items |\r\n * | `'Align'` | Dropdown: left / center / right / justify |\r\n * | `'FontFamily'` | Font-family dropdown |\r\n * | `'FontSize'` | Font-size dropdown |\r\n * | `'ColorPicker'` | Text color picker |\r\n * | `'Link'` | Insert / edit hyperlink |\r\n * | `'Table'` | Insert table |\r\n * | `'Image'` | Upload block image |\r\n * | `'InlineImage'` | Insert inline image |\r\n * | `'Youtube'` | Embed YouTube video |\r\n * | `'|'` | Inline divider within a group |\r\n *\r\n * ---\r\n * ### Examples\r\n *\r\n * **Only bold, italic, underline and strikethrough as standalone buttons:**\r\n * ```tsx\r\n * customToolbar={[['Bold', 'Italic', 'Underline', 'Strikethrough']]}\r\n * ```\r\n *\r\n * **Pick specific heading levels without a dropdown:**\r\n * ```tsx\r\n * customToolbar={[['H1', 'H2', 'H3'], ['Bold', 'Italic']]}\r\n * ```\r\n *\r\n * **Mix standalone items and aggregate dropdowns:**\r\n * ```tsx\r\n * customToolbar={[\r\n * ['Bold', 'Italic', 'Underline', 'Strikethrough', 'Highlight'],\r\n * ['BulletList', 'NumberList'],\r\n * ['H1', 'H2', 'H3'],\r\n * ['Link', 'Image'],\r\n * ]}\r\n * ```\r\n *\r\n * **Full toolbar using aggregate dropdowns:**\r\n * ```tsx\r\n * customToolbar={[\r\n * ['Heading', 'FontFamily', 'FontSize'],\r\n * ['Bold', 'Italic', 'Underline', '|', 'ColorPicker'],\r\n * ['Align'],\r\n * ['Link', 'Image', 'InlineImage', 'Youtube', 'Table'],\r\n * ['Decorators'],\r\n * ]}\r\n * ```\r\n *\r\n * ---\r\n * ### Notes\r\n * - When `customToolbar` is set the `level` prop has no effect.\r\n * - Token order within each group is preserved exactly as written.\r\n * - Avoid duplicate tokens in the same render (each renders once per occurrence).\r\n */\r\n customToolbar?: string[][];\r\n /**\r\n * @deprecated Not used by the component. Prefer styling overrides instead.\r\n */\r\n topPlaceholderMargin?: string;\r\n /** Change handler returning the latest HTML value. */\r\n onChange: (value: string) => void;\r\n /** When true, the editor becomes read-only (non-interactive). */\r\n readOnly?: boolean;\r\n /**\r\n * @deprecated Legacy flag intended to show a clear button.\r\n * This is currently not wired in the UI.\r\n */\r\n clearEditorMode?: boolean;\r\n // ── Autocomplete ───────────────────────────────────────────────────────────\r\n /**\r\n * Simple autocomplete — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, and ghost-text\r\n * insertion internally. Return the raw API response — supported shapes:\r\n * - `{ generated_text: string }` — single suggestion\r\n * - `string[]` — list of suggestions\r\n * - `null / undefined` — no suggestion\r\n *\r\n * Example:\r\n * ```ts\r\n * suggestFn={async (text) => {\r\n * const res = await fetch('/api/suggest', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n suggestFn?: (text: string, cursorIndex?: number) => Promise<any>;\r\n /**\r\n * Advanced: full control over autocomplete with manual cancellation.\r\n * Use `suggestFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useQuery?: (searchText?: string, cursorIndex?: number) => SearchPromise;\r\n /** Called when the editor gains focus. */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus. */\r\n onBlur?: () => void;\r\n /**\r\n * Fires when the user **accepts** an autocomplete suggestion (Tab / ArrowRight).\r\n *\r\n * Use this to send a reward signal to your backend so the model improves\r\n * over time. Example:\r\n * ```ts\r\n * onSuggestionAccept={({ suggestionText, triggerText, method }) => {\r\n * sendReward({ suggestionText, triggerText }); // hits your reward API\r\n * }}\r\n * ```\r\n */\r\n onSuggestionAccept?: (info: {\r\n suggestionText: string;\r\n triggerText?: string;\r\n method: AcceptMethod;\r\n }) => void;\r\n /**\r\n * Fires when a suggestion is displayed to the user (optional analytics hook).\r\n */\r\n onSuggestionShown?: (info: { suggestionText: string; triggerText?: string }) => void;\r\n // ── Spell / Grammar check ──────────────────────────────────────────────────\r\n /**\r\n * Simple spell/grammar check — just pass your raw async API call.\r\n *\r\n * The component handles all debouncing, cancellation, response adaptation,\r\n * underlines, and popovers internally. Supported API response shapes:\r\n * - `{ misspelled_words: string[], suggestions: Record<string, string[]>, grammar_correction?: string }`\r\n * - `{ misspelled: string[], suggestions: Record<string, string[]>, improved_text?: string }`\r\n * - `SpellCheckIssue[]` (legacy — already-adapted array)\r\n *\r\n * Example:\r\n * ```ts\r\n * spellCheckFn={async (text) => {\r\n * const res = await fetch('/api/spellcheck', { method: 'POST', body: JSON.stringify({ text }) });\r\n * return res.json(); // return raw — component adapts internally\r\n * }}\r\n * ```\r\n */\r\n spellCheckFn?: (text: string) => Promise<any>;\r\n /**\r\n * Advanced: full control over spell check with manual cancellation.\r\n * Use `spellCheckFn` instead unless you need a custom `dismiss()` implementation.\r\n */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /**\r\n * Fires when the user accepts a spell/grammar correction from the popover.\r\n *\r\n * Use this to POST a reward signal to your backend.\r\n * ```ts\r\n * onSpellCheckAccept={({ original, replacement, message, type }) => {\r\n * myApi.rewardSpellCheck({ original, replacement });\r\n * }}\r\n * ```\r\n */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the spell-check\r\n * API is called. Defaults to 1200ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n spellCheckIdleMs?: number;\r\n /**\r\n * Debounce delay (ms) after the user stops typing before the `suggestFn`\r\n * API is called. Defaults to 300ms. Tune this to balance responsiveness\r\n * vs. API call frequency.\r\n */\r\n suggestIdleMs?: number;\r\n /** When false, spell checking is disabled without unmounting the plugin. */\r\n spellCheckEnabled?: boolean;\r\n // ── Floating toolbar ───────────────────────────────────────────────────────\r\n /** When true, shows the floating formatting toolbar near text selections. */\r\n showFloatingToolbar?: boolean;\r\n /**\r\n * Maximum word count allowed. When set, a live counter is shown\r\n * below the editor. Exceeding the limit turns the counter red.\r\n * Example: wordLimit={500}\r\n */\r\n wordLimit?: number;\r\n\r\n /**\r\n * Fires when the content crosses the configured word limit boundary.\r\n *\r\n * - exceeded: true -> user just exceeded the limit\r\n * - exceeded: false -> user came back within the limit\r\n */\r\n onWordLimitExceeded?: (info: { wordCount: number; wordLimit: number; exceeded: boolean }) => void;\r\n\r\n // ── Validation ─────────────────────────────────────────────────────────────\r\n\r\n /** When true, the editor must not be empty. Equivalent to `minWords: 1`. */\r\n required?: boolean;\r\n\r\n /** Minimum number of words required. */\r\n minWords?: number;\r\n\r\n /** Maximum number of words allowed. Shows a validation error when exceeded. */\r\n maxWords?: number;\r\n\r\n /** Minimum number of characters required. */\r\n minChars?: number;\r\n\r\n /** Maximum number of characters allowed. Shows a validation error when exceeded. */\r\n maxChars?: number;\r\n\r\n /** When true, the editor must not contain any images. */\r\n noImages?: boolean;\r\n\r\n /** Maximum number of images allowed in the content. */\r\n maxImages?: number;\r\n\r\n /** When true, the editor must not contain any hyperlinks. */\r\n noLinks?: boolean;\r\n\r\n /** Maximum number of hyperlinks allowed in the content. */\r\n maxLinks?: number;\r\n\r\n /** When true, the editor must not contain any tables. */\r\n noTables?: boolean;\r\n\r\n /**\r\n * Maximum image file size in megabytes. When set, the image upload dialogs\r\n * reject files that are larger and display an error inside the dialog.\r\n */\r\n maxImageSizeMB?: number;\r\n\r\n /**\r\n * Override the default error messages shown for each validation rule.\r\n * Accepts static strings or functions for dynamic messages.\r\n */\r\n validationMessages?: ValidationMessages;\r\n\r\n /**\r\n * Called whenever the set of active validation errors changes.\r\n * Receives the current array of errors (empty array means valid).\r\n */\r\n onValidationChange?: (errors: EditorValidationError[]) => void;\r\n\r\n /**\r\n * Pass any string here to display it as a custom error message below the\r\n * editor and turn the border red. Useful for server-side or form-level\r\n * errors that live outside the component's own validation rules.\r\n *\r\n * Example:\r\n * ```tsx\r\n * errorMessage={submitFailed ? 'Please fill in the email body before sending.' : undefined}\r\n * ```\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Called once before `LexicalComposer` is initialized.\r\n *\r\n * Receives the `InitialConfigType` object that will be passed to\r\n * `LexicalComposer`. You may mutate it (e.g. add custom nodes, override the\r\n * theme or namespace) — Lexical reads this config only once on mount, so\r\n * this is the only safe window to modify it.\r\n *\r\n * Note: called only on the initial mount, never on re-renders.\r\n */\r\n onBeforeInitialize?: (config: InitialConfigType) => void;\r\n\r\n /**\r\n * Called once when the Lexical editor instance is ready for use.\r\n *\r\n * Receives the live `LexicalEditor` instance. Use it for operations that\r\n * require the editor to be mounted — programmatic focus, registering\r\n * external commands, or handing the instance to an external controller.\r\n *\r\n * Note: called only once on mount, never on re-renders.\r\n */\r\n onReady?: (editor: LexicalEditor) => void;\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 { $insertList, $isListItemNode, $isListNode, $removeList, ListNode, SerializedListNode } from '@lexical/list';\r\nimport { $findMatchingParent } from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n createCommand,\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n EditorConfig,\r\n LexicalCommand,\r\n LexicalEditor,\r\n LexicalNode,\r\n NodeKey,\r\n Spread,\r\n} from 'lexical';\r\n\r\nexport const INSERT_ALPHA_LIST_COMMAND: LexicalCommand<void> = createCommand(\r\n 'INSERT_ALPHA_LIST_COMMAND',\r\n);\r\n\r\nexport type SerializedAlphaListNode = Spread<{ type: 'alpha-list' }, SerializedListNode>;\r\n\r\nexport class AlphaListNode extends ListNode {\r\n static getType(): string {\r\n return 'alpha-list';\r\n }\r\n\r\n static clone(node: AlphaListNode): AlphaListNode {\r\n return new AlphaListNode(node.getStart(), node.__key);\r\n }\r\n\r\n constructor(start: number = 1, key?: NodeKey) {\r\n super('number', start, key);\r\n (this as any).__listType = 'lower-alpha';\r\n }\r\n\r\n createDOM(config: EditorConfig, _editor: LexicalEditor): HTMLElement {\r\n const element = document.createElement('ol');\r\n element.setAttribute('type', 'a');\r\n if (this.getStart() !== 1) element.setAttribute('start', String(this.getStart()));\r\n element.style.listStyleType = 'lower-alpha';\r\n const olClass = (config.theme as any)?.list?.ol;\r\n if (olClass) element.className = olClass;\r\n return element;\r\n }\r\n\r\n updateDOM(): boolean {\r\n return false;\r\n }\r\n\r\n exportDOM(_editor: LexicalEditor): DOMExportOutput {\r\n const element = document.createElement('ol');\r\n element.setAttribute('type', 'a');\r\n if (this.getStart() !== 1) element.setAttribute('start', String(this.getStart()));\r\n element.style.listStyleType = 'lower-alpha';\r\n return { element };\r\n }\r\n\r\n static importDOM(): DOMConversionMap {\r\n return {\r\n ol: (domNode: Node) => {\r\n if (\r\n domNode instanceof HTMLOListElement &&\r\n (domNode.getAttribute('type') === 'a' || domNode.style.listStyleType === 'lower-alpha')\r\n ) {\r\n return { conversion: convertAlphaOL, priority: 1 };\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n\r\n exportJSON(): SerializedAlphaListNode {\r\n const base = super.exportJSON();\r\n return {\r\n ...base,\r\n type: 'alpha-list',\r\n listType: 'lower-alpha' as any,\r\n tag: 'ol',\r\n version: 1,\r\n start: this.getStart(),\r\n };\r\n }\r\n\r\n static importJSON(serialized: SerializedAlphaListNode): AlphaListNode {\r\n return new AlphaListNode(serialized.start ?? 1);\r\n }\r\n}\r\n\r\nfunction convertAlphaOL(domNode: Node): DOMConversionOutput {\r\n const start =\r\n domNode instanceof HTMLOListElement ? parseInt(domNode.getAttribute('start') || '1', 10) || 1 : 1;\r\n return { node: $createAlphaListNode(start) };\r\n}\r\n\r\nexport function $createAlphaListNode(start: number = 1): AlphaListNode {\r\n return new AlphaListNode(start);\r\n}\r\n\r\nexport function $isAlphaListNode(node: LexicalNode | null | undefined): node is AlphaListNode {\r\n return node instanceof AlphaListNode;\r\n}\r\n\r\nexport function $toggleAlphaList(): void {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n const anchor = selection.anchor.getNode();\r\n const currentList = $findMatchingParent(anchor, $isListNode);\r\n\r\n if ($isAlphaListNode(currentList)) {\r\n $removeList();\r\n return;\r\n }\r\n\r\n $insertList('number');\r\n\r\n const sel2 = $getSelection();\r\n if (!$isRangeSelection(sel2)) return;\r\n\r\n const newAnchor = sel2.anchor.getNode();\r\n const newList = $findMatchingParent(newAnchor, (n) => $isListNode(n) && !$isAlphaListNode(n));\r\n if (!newList || !$isListNode(newList)) return;\r\n\r\n const start = (newList as ListNode).getStart();\r\n const formatType =\r\n typeof (newList as any).getFormatType === 'function' ? (newList as any).getFormatType() : undefined;\r\n\r\n const alpha = $createAlphaListNode(start);\r\n for (const child of newList.getChildren()) {\r\n alpha.append(child);\r\n }\r\n newList.replace(alpha);\r\n\r\n if (formatType && typeof (alpha as any).setFormat === 'function') {\r\n (alpha as any).setFormat(formatType);\r\n }\r\n\r\n const firstItem = alpha.getFirstChild();\r\n if ($isListItemNode(firstItem)) {\r\n firstItem.selectStart();\r\n } else {\r\n alpha.select();\r\n }\r\n}\r\n\r\nexport default AlphaListNode;\r\n","import type { DOMConversionMap, 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 // AutocompleteNode is excluded from copy via excludeFromCopy(), so it is\r\n // never placed on the clipboard and never needs to be reconstructed from\r\n // HTML. Returning null here satisfies Lexical's exportDOM/importDOM\r\n // contract check and silences the console warning.\r\n static importDOM(): DOMConversionMap | null {\r\n return null;\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, type InitialConfigType } 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 { $setSelection, type LexicalEditor } from 'lexical';\r\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nimport {\r\n ContentEditorLevel,\r\n ContentEditorProps,\r\n ContentEditorRef,\r\n DEFAULT_VALIDATION_MESSAGES,\r\n EditorValidationError,\r\n SearchPromise,\r\n SpellCheckIssue,\r\n SpellCheckPayload,\r\n SpellCheckResult,\r\n} from './ContentEditorComponent.types';\r\n\r\nimport './Editor.css';\r\nimport { DEFAULT_PAGE_SETUP, PageSetupValue, resolvePageCanvasMetrics } from \"./Types/PageSetup\";\r\nimport { AlphaListNode } from './Nodes/AlphaListNode';\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\ntype ContentMetrics = {\r\n words: number;\r\n chars: number;\r\n images: number;\r\n links: number;\r\n tables: number;\r\n};\r\n\r\nfunction ContentMetricsPlugin({\r\n onMetricsChange,\r\n}: {\r\n onMetricsChange: (m: ContentMetrics) => void;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n const prevRef = useRef<ContentMetrics>({ words: 0, chars: 0, images: 0, links: 0, tables: 0 });\r\n\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ dirtyElements, dirtyLeaves }) => {\r\n if (dirtyElements.size === 0 && dirtyLeaves.size === 0) return;\r\n\r\n const root = editor.getRootElement();\r\n if (!root) return;\r\n const text = root.innerText ?? '';\r\n const trimmed = text.trim();\r\n const words = trimmed === '' ? 0 : trimmed.split(/\\s+/).length;\r\n const chars = trimmed.length;\r\n const images = root.querySelectorAll('img').length;\r\n const links = root.querySelectorAll('a[href]').length;\r\n const tables = root.querySelectorAll('table').length;\r\n\r\n // Only notify (and trigger a re-render) when a value actually changed.\r\n const prev = prevRef.current;\r\n if (\r\n prev.words !== words ||\r\n prev.chars !== chars ||\r\n prev.images !== images ||\r\n prev.links !== links ||\r\n prev.tables !== tables\r\n ) {\r\n const next = { words, chars, images, links, tables };\r\n prevRef.current = next;\r\n onMetricsChange(next);\r\n }\r\n });\r\n }, [editor, onMetricsChange]);\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 Element | 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 // Also stay active if focus moved to one of our portal widgets (table\r\n // action menu, floating toolbar, etc.) — they live outside containerRef\r\n // in the DOM but are logically part of this editor.\r\n const isEditorPortal = !!next?.closest?.('[data-lexical-editor-portal]');\r\n if (stillInside || isEditorPortal) 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\nfunction EditorReadyPlugin({ onReady }: { onReady?: (editor: LexicalEditor) => void }) {\r\n const [editor] = useLexicalComposerContext();\r\n const calledRef = useRef(false);\r\n useEffect(() => {\r\n if (!onReady || calledRef.current) return;\r\n calledRef.current = true;\r\n onReady(editor);\r\n }, [editor, onReady]);\r\n return null;\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 [metrics, setMetrics] = useState<ContentMetrics>({\r\n words: 0,\r\n chars: 0,\r\n images: 0,\r\n links: 0,\r\n tables: 0,\r\n });\r\n const handleMetrics = useCallback((m: ContentMetrics) => setMetrics(m), []);\r\n const [pageSetup, setPageSetup] = useState<PageSetupValue>(DEFAULT_PAGE_SETUP);\r\n const pageCanvas = resolvePageCanvasMetrics(pageSetup);\r\n const wordCount = metrics.words;\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 // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const initialConfig: any = React.useMemo(() => {\r\n const config: InitialConfigType = {\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 AlphaListNode,\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 props.onBeforeInitialize?.(config);\r\n return config;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\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: 0,\r\n right: 0,\r\n maxWidth: pageCanvas.widthPx,\r\n marginLeft: pageCanvas.widthPx !== undefined ? \"auto\" : undefined,\r\n marginRight: pageCanvas.widthPx !== undefined ? \"auto\" : undefined,\r\n paddingLeft: pageCanvas.paddingPx,\r\n paddingRight: 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) => url === 'https://' || urlRegExp.test(url);\r\n\r\n const handleReadOnlyClickCapture = (e: React.SyntheticEvent) => {\r\n if (!isReadOnly) return;\r\n const target = e.target as HTMLElement | null;\r\n const anchor = target?.closest?.('a');\r\n if (anchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n const isOverLimit = props.wordLimit !== undefined && wordCount > props.wordLimit;\r\n\r\n useEffect(() => {\r\n if (props.wordLimit === undefined || !props.onWordLimitExceeded) return;\r\n\r\n const wasOverLimit = previousOverLimitRef.current;\r\n\r\n if (isOverLimit !== wasOverLimit) {\r\n props.onWordLimitExceeded({\r\n wordCount,\r\n wordLimit: props.wordLimit,\r\n exceeded: isOverLimit,\r\n });\r\n\r\n previousOverLimitRef.current = isOverLimit;\r\n }\r\n }, [isOverLimit, wordCount, props.wordLimit, props.onWordLimitExceeded]);\r\n\r\n // ── Validation ──────────────────────────────────────────────────────────\r\n const validationErrors = React.useMemo((): EditorValidationError[] => {\r\n const errors: EditorValidationError[] = [];\r\n const custom = props.validationMessages ?? {};\r\n const { words, chars, images, links, tables } = metrics;\r\n\r\n // Helper: resolve a message using custom override → default fallback.\r\n const msg = <T extends any[]>(\r\n key: keyof typeof DEFAULT_VALIDATION_MESSAGES,\r\n ...args: T\r\n ): string => {\r\n const override = (custom as any)[key];\r\n if (override !== undefined) {\r\n return typeof override === 'function' ? override(...args) : override;\r\n }\r\n const def = (DEFAULT_VALIDATION_MESSAGES as any)[key];\r\n return typeof def === 'function' ? def(...args) : def;\r\n };\r\n\r\n // ── Word count ──────────────────────────────────────────────────────\r\n const requiredFired = props.required && words === 0;\r\n if (requiredFired) {\r\n errors.push({ type: 'required', message: msg('required') });\r\n } else if (props.minWords !== undefined && words < props.minWords) {\r\n errors.push({ type: 'minWords', message: msg('minWords', words, props.minWords) });\r\n }\r\n\r\n // wordLimit is the legacy counter prop; treat it as maxWords for error messages.\r\n const effectiveMaxWords = props.maxWords ?? props.wordLimit;\r\n if (effectiveMaxWords !== undefined && words > effectiveMaxWords) {\r\n errors.push({ type: 'maxWords', message: msg('maxWords', words, effectiveMaxWords) });\r\n }\r\n\r\n // ── Character count ─────────────────────────────────────────────────\r\n // Skip minChars when the 'required' error already covers an empty editor.\r\n if (!requiredFired && props.minChars !== undefined && chars < props.minChars) {\r\n errors.push({ type: 'minChars', message: msg('minChars', chars, props.minChars) });\r\n }\r\n\r\n if (props.maxChars !== undefined && chars > props.maxChars) {\r\n errors.push({ type: 'maxChars', message: msg('maxChars', chars, props.maxChars) });\r\n }\r\n\r\n // ── Images ──────────────────────────────────────────────────────────\r\n if (props.noImages && images > 0) {\r\n errors.push({ type: 'noImages', message: msg('noImages') });\r\n } else if (props.maxImages !== undefined && images > props.maxImages) {\r\n errors.push({ type: 'maxImages', message: msg('maxImages', images, props.maxImages) });\r\n }\r\n\r\n // ── Links ────────────────────────────────────────────────────────────\r\n if (props.noLinks && links > 0) {\r\n errors.push({ type: 'noLinks', message: msg('noLinks') });\r\n } else if (props.maxLinks !== undefined && links > props.maxLinks) {\r\n errors.push({ type: 'maxLinks', message: msg('maxLinks', links, props.maxLinks) });\r\n }\r\n\r\n // ── Tables ───────────────────────────────────────────────────────────\r\n if (props.noTables && tables > 0) {\r\n errors.push({ type: 'noTables', message: msg('noTables') });\r\n }\r\n\r\n return errors;\r\n }, [\r\n metrics,\r\n props.required,\r\n props.minWords,\r\n props.maxWords,\r\n props.wordLimit,\r\n props.minChars,\r\n props.maxChars,\r\n props.noImages,\r\n props.maxImages,\r\n props.noLinks,\r\n props.maxLinks,\r\n props.noTables,\r\n props.validationMessages,\r\n ]);\r\n\r\n const previousErrorTypesRef = useRef<string>('');\r\n useEffect(() => {\r\n if (!props.onValidationChange) return;\r\n const key = validationErrors.map((e) => e.type).join(',');\r\n if (key !== previousErrorTypesRef.current) {\r\n previousErrorTypesRef.current = key;\r\n props.onValidationChange(validationErrors);\r\n }\r\n }, [validationErrors, props.onValidationChange]);\r\n\r\n const trimmedErrorMessage = props.errorMessage?.trim() || '';\r\n const hasValidationError = validationErrors.length > 0 || !!trimmedErrorMessage;\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme} style={{ height: '100%' }}>\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <div ref={containerRef} className='lexical-rich-editor-root' style={{ height: '100%', position: 'relative' }}>\r\n <Stack\r\n style={{\r\n zIndex: 1000,\r\n background: '#fff',\r\n borderRadius: '2px',\r\n width: props.width ?? '100%',\r\n height: props.height ?? '100%',\r\n margin: props.margin ?? '5px auto',\r\n border: `1px solid ${isOverLimit || hasValidationError\r\n ? '#c4272c'\r\n : '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 className='editor-toolbar-root'\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 customToolbar={props.customToolbar}\r\n readOnly={props.readOnly}\r\n pageSetup={pageSetup}\r\n onPageSetupChange={setPageSetup}\r\n maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\r\n setIsLinkEditMode={setIsLinkEditMode}\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)}>\r\n {props.placeholder}\r\n </Stack>\r\n }\r\n />\r\n\r\n {/* ── Content counters: sticky to bottom-right ── */}\r\n {(props.wordLimit !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minWords !== undefined ||\r\n props.maxChars !== undefined ||\r\n props.minChars !== 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 gap: 10,\r\n paddingRight: 14,\r\n pointerEvents: 'none',\r\n userSelect: 'none',\r\n }}>\r\n {(props.wordLimit !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minWords !== undefined) && (\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: hasValidationError\r\n ? '#c4272c'\r\n : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: hasValidationError ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {wordCount}\r\n {(props.maxWords ?? props.wordLimit) !== undefined &&\r\n ` / ${props.maxWords ?? props.wordLimit}`}\r\n {props.minWords !== undefined &&\r\n props.maxWords === undefined &&\r\n props.wordLimit === undefined &&\r\n ` (min ${props.minWords})`}\r\n {' words'}\r\n </span>\r\n )}\r\n {(props.maxChars !== undefined || props.minChars !== undefined) && (\r\n <span\r\n style={{\r\n fontSize: '11px',\r\n color: hasValidationError\r\n ? '#c4272c'\r\n : 'var(--colorNeutralForeground3, #aaa)',\r\n fontWeight: hasValidationError ? 600 : 400,\r\n transition: 'color 0.2s, font-weight 0.2s',\r\n }}>\r\n {metrics.chars}\r\n {props.maxChars !== undefined && ` / ${props.maxChars}`}\r\n {props.minChars !== undefined &&\r\n props.maxChars === undefined &&\r\n ` (min ${props.minChars})`}\r\n {' chars'}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <ReadOnlyPlugin readonly={isReadOnly} />\r\n <BrowserSpellCheckPlugin enabled={!resolvedSpellCheck} />\r\n <FocusEventsPlugin\r\n onFocus={props.onFocus}\r\n onBlur={props.onBlur}\r\n setFocused={setFocused}\r\n containerRef={containerRef}\r\n />\r\n\r\n {props.autoFocus && !isReadOnly && <AutoFocusPlugin />}\r\n\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin validateUrl={validateUrl} />\r\n <AutoLinkPlugin matchers={MATCHERS} />\r\n <TablePlugin hasCellMerge hasCellBackgroundColor />\r\n\r\n {!isReadOnly && <YoutubeDeletePlugin />}\r\n\r\n {!isReadOnly && floatingAnchorElem && <TableActionMenuPlugin />}\r\n {!isReadOnly && floatingAnchorElem && (\r\n <TableCellResizerPlugin anchorElem={floatingAnchorElem} />\r\n )}\r\n\r\n {!isReadOnly && (\r\n <FloatingLinkEditorPlugin\r\n anchorElem={floatingAnchorElem}\r\n isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />\r\n )}\r\n\r\n {!isReadOnly && <ImagesPlugin />}\r\n {!isReadOnly && <InlineImagePlugin />}\r\n {!isReadOnly && <PageBreakPlugin />}\r\n\r\n {/* ── Autocomplete (optimised) ────────────────────────────── */}\r\n {!!resolvedQuery && !isReadOnly && (\r\n <AutocompletePlugin\r\n useQuery={resolvedQuery}\r\n isReadOnly={isReadOnly}\r\n onSuggestionShown={props.onSuggestionShown}\r\n onSuggestionAccept={props.onSuggestionAccept}\r\n idleMs={props.suggestIdleMs ?? 300}\r\n minWords={4}\r\n prefixWindow={300}\r\n />\r\n )}\r\n\r\n {/* ── Spell / grammar check (NEW) ─────────────────────────── */}\r\n {!!resolvedSpellCheck && !isReadOnly && (\r\n <SpellCheckPlugin\r\n useSpellCheck={resolvedSpellCheck}\r\n onSpellCheckAccept={props.onSpellCheckAccept}\r\n idleMs={props.spellCheckIdleMs ?? 1200}\r\n enabled={props.spellCheckEnabled !== false}\r\n />\r\n )}\r\n\r\n {!isReadOnly && props.showFloatingToolbar && <CharacterStylesPopupPlugin />}\r\n <CustomOnChangePlugin value={props.value} onChange={props.onChange} />\r\n\r\n {(props.wordLimit !== undefined ||\r\n props.required ||\r\n props.minWords !== undefined ||\r\n props.maxWords !== undefined ||\r\n props.minChars !== undefined ||\r\n props.maxChars !== undefined ||\r\n props.noImages ||\r\n props.maxImages !== undefined ||\r\n props.noLinks ||\r\n props.maxLinks !== undefined ||\r\n props.noTables) && <ContentMetricsPlugin onMetricsChange={handleMetrics} />}\r\n\r\n <RefApiPlugin\r\n forwardedRef={ref}\r\n contentEditableDomRef={contentEditableDomRef}\r\n focusedRef={focusedRef}\r\n />\r\n\r\n {/* ── Validation messages ─────────────────────────────────────────\r\n Inside the Stack so the height:100% chain is never broken.\r\n flex-shrink:0 keeps them at natural height; the scrollable\r\n content area (flex-grow:1) absorbs the remaining space. */}\r\n {(validationErrors.length > 0 || trimmedErrorMessage) && (\r\n <div style={{ flexShrink: 0, padding: '6px 20px 8px' }}>\r\n {validationErrors.map((err) => (\r\n <div\r\n key={err.type}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 6,\r\n marginTop: 2,\r\n color: '#c4272c',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n }}>\r\n <span style={{ fontWeight: 600, flexShrink: 0 }}>⚠</span>\r\n <span>{err.message}</span>\r\n </div>\r\n ))}\r\n {trimmedErrorMessage && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 6,\r\n marginTop: 2,\r\n color: '#c4272c',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n }}>\r\n <span style={{ fontWeight: 600, flexShrink: 0 }}>⚠</span>\r\n <span>{trimmedErrorMessage}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Stack>\r\n </div>\r\n <EditorReadyPlugin onReady={props.onReady} />\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 {\r\n DecoratorBlockNode,\r\n SerializedDecoratorBlockNode,\r\n} from '@lexical/react/LexicalDecoratorBlockNode';\r\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_ELEMENT_COMMAND,\r\n} 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\n// All 8 compass directions.\r\ntype ResizeDir = 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw';\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 // Right-side corners: drag right → wider (proportional)\r\n if (dir === 'se' || dir === 'ne') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n newH = newW / rs.ratio;\r\n // Left-side corners: drag left → wider (negate dx; proportional)\r\n } else if (dir === 'nw' || dir === 'sw') {\r\n newW = Math.max(MIN_WIDTH, rs.startW - dx);\r\n newH = newW / rs.ratio;\r\n // Right edge: width only\r\n } else if (dir === 'e') {\r\n newW = Math.max(MIN_WIDTH, rs.startW + dx);\r\n // Left edge: negate dx so dragging left grows width\r\n } else if (dir === 'w') {\r\n newW = Math.max(MIN_WIDTH, rs.startW - dx);\r\n // Bottom edge: height only\r\n } else if (dir === 's') {\r\n newH = Math.max(MIN_HEIGHT, rs.startH + dy);\r\n // Top edge: negate dy so dragging up grows height\r\n } else if (dir === 'n') {\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 {/* North – top centre */}\r\n <div\r\n style={{ ...handleBase, top: -5, left: '50%', transform: 'translateX(-50%)', cursor: 'n-resize' }}\r\n onPointerDown={(e) => startResize(e, 'n')}\r\n title='Resize height'\r\n />\r\n {/* North-East – top right */}\r\n <div\r\n style={{ ...handleBase, top: -5, right: -5, cursor: 'ne-resize' }}\r\n onPointerDown={(e) => startResize(e, 'ne')}\r\n title='Resize (proportional)'\r\n />\r\n {/* East – right centre */}\r\n <div\r\n style={{ ...handleBase, top: '50%', right: -5, transform: 'translateY(-50%)', cursor: 'ew-resize' }}\r\n onPointerDown={(e) => startResize(e, 'e')}\r\n title='Resize width'\r\n />\r\n {/* South-East – bottom right */}\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 {/* South – bottom centre */}\r\n <div\r\n style={{ ...handleBase, bottom: -5, left: '50%', transform: 'translateX(-50%)', cursor: 's-resize' }}\r\n onPointerDown={(e) => startResize(e, 's')}\r\n title='Resize height'\r\n />\r\n {/* South-West – bottom left */}\r\n <div\r\n style={{ ...handleBase, bottom: -5, left: -5, cursor: 'sw-resize' }}\r\n onPointerDown={(e) => startResize(e, 'sw')}\r\n title='Resize (proportional)'\r\n />\r\n {/* West – left centre */}\r\n <div\r\n style={{ ...handleBase, top: '50%', left: -5, transform: 'translateY(-50%)', cursor: 'ew-resize' }}\r\n onPointerDown={(e) => startResize(e, 'w')}\r\n title='Resize width'\r\n />\r\n {/* North-West – top left */}\r\n <div\r\n style={{ ...handleBase, top: -5, left: -5, cursor: 'nw-resize' }}\r\n onPointerDown={(e) => startResize(e, 'nw')}\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 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 format,\r\n nodeKey,\r\n videoID,\r\n width,\r\n height,\r\n editor,\r\n}: YouTubeComponentProps) {\r\n const wrapperRef = React.useRef<HTMLDivElement>(null);\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\r\n // Synchronous ref so onMouseLeave always reads the current resize state.\r\n const isResizingRef = React.useRef(false);\r\n\r\n const [isNodeSelected, setNodeSelected, clearNodeSelection] = useLexicalNodeSelection(nodeKey);\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n const [isResizing, setIsResizing] = React.useState(false);\r\n // When true the thumbnail is replaced by the live <iframe> in-place.\r\n const [isPlaying, setIsPlaying] = React.useState(false);\r\n\r\n // ── Lexical command registration ──────────────────────────────────────────\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerCommand(\r\n FORMAT_ELEMENT_COMMAND,\r\n (formatType: ElementFormatType) => {\r\n if (isNodeSelected) {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) node.setFormat(formatType);\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n // Select this node on click. When the thumbnail is shown the <img> is\r\n // in the parent DOM so CLICK_COMMAND fires naturally. When the iframe is\r\n // live, clicks land in the iframe's browsing context — the node stays\r\n // selected via wrapperRef boundary detection on the wrapper div.\r\n editor.registerCommand(\r\n CLICK_COMMAND,\r\n (event: MouseEvent) => {\r\n if (wrapperRef.current?.contains(event.target as Node)) {\r\n if (!event.shiftKey) clearNodeSelection();\r\n setNodeSelected(true);\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, isNodeSelected, nodeKey, clearNodeSelection, setNodeSelected]);\r\n\r\n // ── Handlers ──────────────────────────────────────────────────────────────\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 handleResizeStart = () => {\r\n isResizingRef.current = true;\r\n setIsResizing(true);\r\n // Disable iframe pointer-events immediately so pointermove events during\r\n // the drag are not swallowed by the iframe's browsing context.\r\n if (iframeRef.current) iframeRef.current.style.pointerEvents = 'none';\r\n };\r\n\r\n const handleResizeEnd = (w: number, h: number) => {\r\n isResizingRef.current = false;\r\n setIsResizing(false);\r\n if (iframeRef.current) iframeRef.current.style.pointerEvents = '';\r\n // Keep controls visible so the user can resize again without re-hovering.\r\n setIsHovered(true);\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isYouTubeNode(node)) node.setSize(Math.round(w), Math.round(h));\r\n });\r\n };\r\n\r\n // Shared style for the small action buttons (delete / stop).\r\n const actionBtnStyle = (side: 'left' | 'right'): React.CSSProperties => ({\r\n position: 'absolute',\r\n top: 8,\r\n [side]: 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: side === 'right' ? 18 : 14,\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 // ── Render ────────────────────────────────────────────────────────────────\r\n return (\r\n <div ref={wrapperRef} style={{ display: 'block', textAlign: format || undefined }}>\r\n <div\r\n ref={containerRef}\r\n style={{\r\n position: 'relative',\r\n display: 'inline-block',\r\n width,\r\n height,\r\n lineHeight: 0,\r\n outline: isNodeSelected ? '2px solid #0078d4' : undefined,\r\n outlineOffset: 2,\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => {\r\n if (!isResizingRef.current) setIsHovered(false);\r\n }}>\r\n\r\n {isPlaying ? (\r\n /* ── Playing state ─────────────────────────────────────────────────\r\n * Show the real YouTube iframe in-place at the same dimensions.\r\n * autoplay=1 starts playback immediately.\r\n * pointer-events are set to 'none' during resize (handleResizeStart)\r\n * so drag events are not lost to the iframe's browsing context. */\r\n <iframe\r\n ref={iframeRef}\r\n width='100%'\r\n height='100%'\r\n src={`https://www.youtube.com/embed/${videoID}?autoplay=1`}\r\n sandbox='allow-same-origin allow-scripts allow-popups allow-presentation'\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' }}\r\n />\r\n ) : (\r\n /* ── Thumbnail state ───────────────────────────────────────────────\r\n * Static <img> keeps all clicks in the parent DOM so Lexical's\r\n * CLICK_COMMAND fires correctly and the node can be selected.\r\n * Clicking the red ▶ badge switches to playing state. */\r\n <>\r\n <img\r\n src={`https://img.youtube.com/vi/${videoID}/hqdefault.jpg`}\r\n alt='YouTube video'\r\n draggable={false}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n display: 'block',\r\n userSelect: 'none',\r\n cursor: 'pointer',\r\n }}\r\n />\r\n\r\n {/* Red play badge — no stopPropagation so CLICK_COMMAND still\r\n fires and the node is selected at the same time. */}\r\n <div\r\n role='button'\r\n aria-label='Play video'\r\n onClick={() => setIsPlaying(true)}\r\n style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 56,\r\n height: 56,\r\n background: 'rgba(255, 0, 0, 0.85)',\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n cursor: 'pointer',\r\n }}>\r\n <span style={{ color: '#fff', fontSize: 20, lineHeight: 1, marginLeft: 5 }}>▶</span>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Controls — shown on hover or during a resize drag.\r\n VideoResizer is hidden while the iframe is live so that resize\r\n handles don't interfere with normal video interaction; the user\r\n should stop playback first, then resize. */}\r\n {(isHovered || isResizing) && (\r\n <>\r\n {/* Delete — always top-right */}\r\n <button\r\n type='button'\r\n onClick={handleDelete}\r\n title='Remove video'\r\n style={actionBtnStyle('right')}>\r\n ×\r\n </button>\r\n\r\n {/* Stop button (top-left) — shown only while the iframe is live */}\r\n {isPlaying && (\r\n <button\r\n type='button'\r\n onClick={(e) => { e.stopPropagation(); setIsPlaying(false); }}\r\n title='Stop video'\r\n style={actionBtnStyle('left')}>\r\n ⏹\r\n </button>\r\n )}\r\n\r\n {/* Open in browser — always visible in controls */}\r\n <button\r\n type='button'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n window.open(`https://www.youtube.com/watch?v=${videoID}`, '_blank', 'noopener,noreferrer');\r\n }}\r\n title='Open in browser'\r\n style={{\r\n ...actionBtnStyle('left'),\r\n top: isPlaying ? 44 : 8, // stack below stop button when playing\r\n fontSize: 13,\r\n }}>\r\n ↗\r\n </button>\r\n\r\n {/* Resize handles — shown in both thumbnail and playing states.\r\n handleResizeStart disables iframe pointer-events via iframeRef\r\n so drag events are not lost to the iframe's browsing context. */}\r\n <VideoResizer\r\n containerRef={containerRef}\r\n onResizeStart={handleResizeStart}\r\n onResizeEnd={handleResizeEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\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 // sandbox must be on the exported HTML too — not just the in-editor player —\r\n // so that when consumers render the saved HTML the iframe is sandboxed.\r\n iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-popups allow-presentation');\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 return (\r\n <YouTubeComponent\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","import type { LexicalEditor } from 'lexical';\nimport { useEffect, useState } from 'react';\n\n/**\n * Mounts a `position: fixed` overlay host as a direct child of\n * `document.body` rather than anywhere inside the editor's own DOM tree\n * (or a host app's Panel/Layer wrapper). Nesting inside a host container\n * — even one picked specifically to dodge clipping — still inherits\n * whatever sizing/containing-block behavior that container has, which is\n * exactly what broke positioning inside a Fluent `Panel`. Appending\n * straight to `body` is the one placement every `position: fixed`\n * consumer can reason about: no ancestor `overflow`, no ancestor\n * transform/filter/contain to redefine the containing block, and our\n * z-index (10000010) is comfortably above any host chrome (Fluent's\n * Panel layer host sits at 1000000).\n */\nexport function useFloatingPortalContainer(editor: LexicalEditor): HTMLElement | null {\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n const root = editor.getRootElement();\n if (!root) return;\n\n const host = document.createElement('div');\n host.className = 'lexical-floating-ui-host';\n document.body.appendChild(host);\n setContainer(host);\n\n return () => {\n host.remove();\n setContainer(null);\n };\n }, [editor]);\n\n return container;\n}\n\n/**\n * A host Panel/Layer that animates with a CSS transform (slide-in panels,\n * Fluent's Panel included) creates a new containing block for its\n * `position: fixed` descendants — per spec, `fixed` then resolves against\n * that ancestor's padding box instead of the viewport. Since our floating\n * elements compute their target top/left from `getBoundingClientRect()`\n * (viewport coordinates), we have to subtract that ancestor's own rect to\n * land in the right place; otherwise the popup renders offset toward\n * whatever corner the transformed ancestor happens to start at.\n */\nexport function getFixedPositionOrigin(fromElement: HTMLElement): { top: number; left: number } {\n let node: HTMLElement | null = fromElement.parentElement;\n\n while (node && node !== document.body && node !== document.documentElement) {\n const style = getComputedStyle(node);\n const createsContainingBlock =\n (style.transform && style.transform !== 'none') ||\n (style.perspective && style.perspective !== 'none') ||\n (style.filter && style.filter !== 'none') ||\n (style.backdropFilter && style.backdropFilter !== 'none') ||\n (style.willChange && /transform|perspective|filter/.test(style.willChange)) ||\n (style.contain && /paint|layout|strict|content/.test(style.contain));\n\n if (createsContainingBlock) {\n const rect = node.getBoundingClientRect();\n return { top: rect.top, left: rect.left };\n }\n node = node.parentElement;\n }\n\n return { top: 0, left: 0 };\n}\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\nimport { getFixedPositionOrigin, useFloatingPortalContainer } from '../Utils/FloatingPortal';\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\nfunction setPopupPositionFixed(popupEl: HTMLElement, rect: DOMRect, topBoundary: number): void {\r\n const GAP = 8;\r\n const MARGIN = 8;\r\n\r\n // Prefer above the cursor, with the popup's left edge starting at the\r\n // cursor position — i.e. anchored to the bottom-right of the caret —\r\n // rather than right-aligning the popup's edge to it.\r\n let top = rect.top - popupEl.offsetHeight - GAP;\r\n let left = rect.left;\r\n\r\n // If there isn't room above the selection without crossing the toolbar\r\n // (or the viewport edge), show below the selection instead.\r\n if (top < topBoundary) 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 // rect/window math above is all viewport coordinates, but if popupEl is\r\n // portaled inside an ancestor that creates a new containing block (e.g. a\r\n // sliding Fluent Panel animated with `transform`), `position: fixed`\r\n // resolves against that ancestor's box instead of the viewport — shift\r\n // into that ancestor's coordinate space so the popup lands next to the caret.\r\n const origin = getFixedPositionOrigin(popupEl);\r\n top -= origin.top;\r\n left -= origin.left;\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 // Anchor to the selection's focus point (where the user's cursor\r\n // currently sits) rather than the full range's bounding box. For a\r\n // multi-line selection the range's bounding rect spans every selected\r\n // line — right-aligning to that box's edge can land the popup far from\r\n // any actual text. A collapsed rect at the focus offset always sits\r\n // exactly at the caret, matching how Lexical's own playground behaves.\r\n let rect: DOMRect;\r\n try {\r\n const focusRange = document.createRange();\r\n focusRange.setStart(sel.focusNode!, sel.focusOffset);\r\n focusRange.setEnd(sel.focusNode!, sel.focusOffset);\r\n rect = focusRange.getBoundingClientRect();\r\n if (rect.width === 0 && rect.height === 0 && rect.top === 0 && rect.left === 0) {\r\n throw new Error('empty focus rect');\r\n }\r\n } catch {\r\n rect = sel.getRangeAt(0).getBoundingClientRect();\r\n }\r\n\r\n // Never render above the top of the editor's own chrome (toolbar) — the\r\n // toolbar is a sibling of the content-editable root, not an ancestor, so\r\n // walk up to their shared wrapper first.\r\n const toolbarEl = root\r\n ?.closest('.lexical-rich-editor-root')\r\n ?.querySelector('.editor-toolbar-root') as HTMLElement | null;\r\n const topBoundary = toolbarEl\r\n ? toolbarEl.getBoundingClientRect().bottom + 8\r\n : 8;\r\n\r\n if (!mouseDownRef.current) {\r\n setPopupPositionFixed(popupEl, rect as DOMRect, topBoundary);\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 // A Callout/Popover (color picker, insert-link, insert-table, …) can be\r\n // open while the browser's document selection still sits inside the\r\n // editor — hide this popup whenever focus has actually moved into one\r\n // of those, so the two floating surfaces never overlap.\r\n const activeElement = document.activeElement;\r\n if (\r\n activeElement &&\r\n activeElement !== document.body &&\r\n rootElement &&\r\n !rootElement.contains(activeElement)\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 // Focusing a Callout/Popover control doesn't always fire selectionchange,\r\n // so listen for focus moves directly too (see the activeElement check\r\n // inside updatePopupState).\r\n document.addEventListener('focusin', updatePopupState);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopupState);\r\n document.removeEventListener('focusin', updatePopupState);\r\n };\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 } from 'lexical';\r\nimport { useEffect, useRef } from 'react';\r\nimport { normalizeToBlockHtml, postProcessOutput, sanitizeHtml } from '../Utils/Sanitize';\r\n\r\ninterface ICustomOnChangePluginProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n}\r\n\r\n/**\r\n * Splits heading elements (h1–h6) that contain two or more consecutive <br>\r\n * tags into separate same-level heading elements.\r\n *\r\n * Why: Lexical stores Shift+Enter inside a heading as a LineBreakNode, which\r\n * round-trips as a <br>. When content is pasted or imported with double-<br>\r\n * paragraph separators inside a heading (common in email HTML), all text ends\r\n * up in one <hN> block. After publishing, browser default heading margins\r\n * make that look completely different from the editor view.\r\n *\r\n * Rule:\r\n * • 1 × <br> → kept as-is (intentional Shift+Enter line break)\r\n * • 2+ × <br> → paragraph boundary; the element is split at that run\r\n *\r\n * Applied both on import (so the Lexical node tree is clean) and on export\r\n * (so the saved HTML is semantically correct for the published view).\r\n */\r\nexport function splitHeadingsAtBrSequences(html: string): string {\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n const headings = Array.from(doc.querySelectorAll('h1, h2, h3, h4, h5, h6'));\r\n\r\n headings.forEach((el) => {\r\n const inner = el.innerHTML;\r\n\r\n // Regex: one <br> followed by one-or-more additional <br> (= 2+ total).\r\n // Whitespace between tags is allowed.\r\n const SEP = /<br\\s*\\/?>\\s*(?:<br\\s*\\/?>)+/gi;\r\n if (!SEP.test(inner)) return; // nothing to split\r\n SEP.lastIndex = 0; // reset after .test()\r\n\r\n const parts = inner.split(SEP).map((p) => p.trim()).filter(Boolean);\r\n if (parts.length <= 1) return;\r\n\r\n const parent = el.parentNode;\r\n if (!parent) return;\r\n\r\n const tagName = el.tagName.toLowerCase();\r\n const attrs = Array.from(el.attributes);\r\n\r\n const fragment = doc.createDocumentFragment();\r\n parts.forEach((part) => {\r\n const newEl = doc.createElement(tagName);\r\n // Preserve the original element's attributes (e.g. style, dir).\r\n attrs.forEach((a) => newEl.setAttribute(a.name, a.value));\r\n newEl.innerHTML = part;\r\n fragment.appendChild(newEl);\r\n });\r\n\r\n parent.replaceChild(fragment, el);\r\n });\r\n\r\n return doc.body.innerHTML;\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 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 // Sanitize → split headings → ensure block wrapper so Lexical root is valid.\r\n const safe = sanitizeHtml(value);\r\n const cleaned = normalizeToBlockHtml(splitHeadingsAtBrSequences(safe));\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(cleaned, 'text/html');\r\n const nodes = $generateNodesFromDOM(editor, dom);\r\n\r\n root.append(...nodes);\r\n });\r\n }, [editor, value]);\r\n\r\n return (\r\n <OnChangePlugin\r\n onChange={(editorState) => {\r\n editorState.read(() => {\r\n // Post-process: ensure any LineBreakNode-based paragraph separators\r\n // inside headings are split into proper block elements in the output.\r\n const raw = $generateHtmlFromNodes(editor);\r\n onChange(postProcessOutput(splitHeadingsAtBrSequences(raw)));\r\n });\r\n }}\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 { CheckmarkRegular, DeleteRegular, DismissRegular, EditRegular } from '@fluentui/react-icons';\r\nimport { getFixedPositionOrigin, useFloatingPortalContainer } from '../Utils/FloatingPortal';\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\nconst VIEWPORT_MARGIN = 8;\r\n\r\nexport const setFloatingElemPositionForLinkEditor = (targetRect: DOMRect | null, floatingElem: HTMLElement, topBoundary: number = VIEWPORT_MARGIN, verticalGap: number = VERTICAL_GAP, horizontalOffset: number = HORIZONTAL_OFFSET): void => {\r\n if (targetRect === null) {\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\r\n let top = targetRect.bottom + verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top + floatingElemRect.height > window.innerHeight - VIEWPORT_MARGIN) {\r\n top = targetRect.top - floatingElemRect.height - verticalGap;\r\n }\r\n\r\n if (top < topBoundary) {\r\n top = topBoundary;\r\n }\r\n\r\n left = Math.max(VIEWPORT_MARGIN, Math.min(left, window.innerWidth - floatingElemRect.width - VIEWPORT_MARGIN));\r\n\r\n // targetRect/window math above is all in viewport coordinates, but if\r\n // floatingElem is portaled inside an ancestor that creates a new\r\n // containing block (e.g. a sliding Fluent Panel animated with\r\n // `transform`), `position: fixed` resolves against that ancestor's box\r\n // instead of the viewport — shift our viewport-space numbers into that\r\n // ancestor's coordinate space so the popup still lands next to the caret.\r\n const origin = getFixedPositionOrigin(floatingElem);\r\n top -= origin.top;\r\n left -= origin.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = 'none';\r\n floatingElem.style.top = `${top}px`;\r\n floatingElem.style.left = `${left}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 isLinkEditMode: boolean;\r\n setIsLink: Dispatch<boolean>;\r\n setIsLinkEditMode: Dispatch<boolean>;\r\n}\r\nconst FloatingLinkEditor = ({editor, isLink, setIsLink, 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 const toolbarEl = rootElement\r\n .closest('.lexical-rich-editor-root')\r\n ?.querySelector('.editor-toolbar-root') as HTMLElement | null;\r\n const topBoundary = toolbarEl ? toolbarEl.getBoundingClientRect().bottom + 8 : 8;\r\n setFloatingElemPositionForLinkEditor(domRect, editorElem, topBoundary);\r\n }\r\n setLastSelection(selection);\r\n } else if (!activeElement || activeElement.className !== 'aoLinkInput') {\r\n if (rootElement !== null) {\r\n setFloatingElemPositionForLinkEditor(null, editorElem);\r\n }\r\n setLastSelection(null);\r\n setIsLinkEditMode(false);\r\n setLinkUrl('');\r\n }\r\n\r\n return true;\r\n }, [editor, setIsLinkEditMode, isLinkEditMode, isLink, linkUrl]);\r\n\r\n useEffect(() => {\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n $updateLinkEditor();\r\n });\r\n };\r\n\r\n const root = editor.getRootElement();\r\n\r\n window.addEventListener('resize', update);\r\n window.addEventListener('scroll', update, true);\r\n root?.addEventListener('scroll', update, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n window.removeEventListener('scroll', update, true);\r\n root?.removeEventListener('scroll', update);\r\n };\r\n }, [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=\"aoLinkEditor\">\r\n {!isLink ? null : isLinkEditMode ? (\r\n <>\r\n <input\r\n ref={inputRef}\r\n className=\"aoLinkInput\"\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=\"aoLinkInputActions\">\r\n <div\r\n className=\"aoLinkCancel\"\r\n role=\"button\"\r\n tabIndex={0}\r\n title=\"Cancel\"\r\n aria-label=\"Cancel\"\r\n onMouseDown={preventDefault}\r\n onClick={() => {\r\n setIsLinkEditMode(false);\r\n }}>\r\n <DismissRegular fontSize={16} />\r\n </div>\r\n\r\n <div\r\n className=\"aoLinkConfirm\"\r\n role=\"button\"\r\n tabIndex={0}\r\n title=\"Confirm\"\r\n aria-label=\"Confirm\"\r\n onMouseDown={preventDefault}\r\n onClick={handleLinkSubmission}>\r\n <CheckmarkRegular fontSize={16} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"aoLinkView\">\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=\"aoLinkEdit\"\r\n role=\"button\"\r\n tabIndex={0}\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 <EditRegular fontSize={16} />\r\n </div>\r\n <div\r\n className=\"aoLinkTrash\"\r\n role=\"button\"\r\n tabIndex={0}\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 <DeleteRegular fontSize={16} />\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 const portalContainer = useFloatingPortalContainer(editor);\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) || !portalContainer) {\r\n return null; // Prevent rendering if anchorElem or the portal host isn't ready\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 isLinkEditMode={isLinkEditMode}\r\n setIsLinkEditMode={setIsLinkEditMode}\r\n />,\r\n portalContainer\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 { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { useFloatingPortalContainer } from '../Utils/FloatingPortal';\r\nimport './AoModal.css';\r\n\r\nexport interface AoModalProps {\r\n isOpen: boolean;\r\n onDismiss: () => void;\r\n title: string;\r\n maxWidth?: number;\r\n actions?: React.ReactNode;\r\n children: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Shared replacement for Dialog across the insert plugins. Portals the modal\r\n * as a `position: fixed` overlay into the closest Fluent Panel/Layer (or\r\n * document.body) instead of the editor's own root wrapper — the editor root\r\n * is only ever as tall as its content, so an absolutely-positioned backdrop\r\n * anchored there doesn't cover the page; it just renders in-flow after it.\r\n */\r\nexport const AoModal = ({\r\n isOpen,\r\n onDismiss,\r\n title,\r\n maxWidth = 280, // Default to a smaller, compact size\r\n actions,\r\n children,\r\n}: AoModalProps): JSX.Element | null => {\r\n const [editor] = useLexicalComposerContext();\r\n const hostElement = useFloatingPortalContainer(editor);\r\n\r\n if (!isOpen) return null;\r\n\r\n const modalContent = (\r\n <div className=\"aoModalBackdrop\" onClick={onDismiss}>\r\n <FluentProvider\r\n theme={webLightTheme}\r\n className=\"aoModalWrapper aoModalContainer\"\r\n style={{ maxWidth, width: '90vw' }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header Section */}\r\n <div className=\"aoModalHeader\">\r\n <h2 className=\"aoModalTitle\">{title}</h2>\r\n <button\r\n className=\"aoModalCloseButton\"\r\n aria-label=\"Close popup\"\r\n onClick={onDismiss}\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n\r\n {/* Body Section */}\r\n <div className=\"aoModalBody\">{children}</div>\r\n\r\n {/* Actions Footer Section */}\r\n {actions && <div className=\"aoModalActions\">{actions}</div>}\r\n </FluentProvider>\r\n </div>\r\n );\r\n\r\n if (!hostElement) return null;\r\n\r\n return createPortal(modalContent, hostElement);\r\n};\r\n\r\nexport default AoModal;","import { Stack } from '@fluentui/react';\r\nimport {\r\n Button,\r\n Field,\r\n Input,\r\n MessageBar,\r\n MessageBarBody,\r\n SelectTabData,\r\n SelectTabEvent,\r\n} from '@fluentui/react-components';\r\nimport { AoModal } from './AoModal';\r\nimport { DEFAULT_VALIDATION_MESSAGES } from '../ContentEditorComponent.types';\r\nimport type { ValidationMessages } from '../ContentEditorComponent.types';\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 $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\r\n $getSelection,\r\n $insertNodes,\r\n $isNodeSelection,\r\n $isRangeSelection,\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' 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' 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 maxImageSizeMB,\r\n validationMessages,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\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 [fileSizeError, setFileSizeError] = useState<string | null>(null);\r\n const hasModifier = useRef(false);\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n const isDisabled = disabled || src === '' || !!fileSizeError;\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 setFileSizeError(null);\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 file = files[0];\r\n\r\n if (maxImageSizeMB !== undefined) {\r\n const fileMB = file.size / (1024 * 1024);\r\n if (fileMB > maxImageSizeMB) {\r\n const override = validationMessages?.imageTooLarge;\r\n const msg = override !== undefined\r\n ? (typeof override === 'function' ? override(fileMB, maxImageSizeMB) : override)\r\n : DEFAULT_VALIDATION_MESSAGES.imageTooLarge(fileMB, maxImageSizeMB);\r\n setFileSizeError(msg);\r\n setSrc('');\r\n setFileName('');\r\n event.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n setFileSizeError(null);\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(file.name);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n return (\r\n <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert image'\r\n maxWidth={340}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Upload' 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 {fileSizeError && (\r\n <MessageBar intent='error' style={{ marginTop: 4 }}>\r\n <MessageBarBody>{fileSizeError}</MessageBarBody>\r\n </MessageBar>\r\n )}\r\n\r\n <Field label='Alt Text' 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 {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 </Stack>\r\n </AoModal>\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 const selection = $getSelection();\r\n\r\n if ($isRangeSelection(selection)) {\r\n // Always insert block images in their own paragraph so they never\r\n // appear inline with existing text content.\r\n const anchorNode = selection.anchor.getNode();\r\n const topLevel = anchorNode.getTopLevelElementOrThrow();\r\n\r\n const imageParagraph = $createParagraphNode();\r\n imageParagraph.append(imageNode);\r\n topLevel.insertAfter(imageParagraph);\r\n\r\n // Leave an empty paragraph after the image for continued typing.\r\n const tail = $createParagraphNode();\r\n imageParagraph.insertAfter(tail);\r\n tail.select();\r\n } else {\r\n $insertNodes([imageNode]);\r\n if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) {\r\n $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd();\r\n }\r\n }\r\n return true;\r\n },\r\n COMMAND_PRIORITY_EDITOR\r\n ),\r\n\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 // Find the image node — first from selection, then from the drag target element.\r\n let node = $getImageNodeInSelection();\r\n\r\n if (!node) {\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return false;\r\n const lexicalNode = $getNearestNodeFromDOMNode(target);\r\n if ($isImageNode(lexicalNode)) {\r\n node = lexicalNode;\r\n }\r\n }\r\n\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) return false;\r\n\r\n // Use the actual image element as the drag ghost so the user sees what they're moving.\r\n const imgEl = (event.target as HTMLElement)?.closest?.('span.editor-image')\r\n ?.querySelector?.('img') ?? (event.target as HTMLElement);\r\n if (imgEl instanceof HTMLElement) {\r\n dataTransfer.setDragImage(imgEl, 20, 20);\r\n } else {\r\n dataTransfer.setDragImage(img, 0, 0);\r\n }\r\n\r\n dataTransfer.setData('text/plain', '_');\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 data = getDragImageData(event);\r\n if (!data) return false;\r\n\r\n event.preventDefault();\r\n\r\n if (canDropImage(event)) {\r\n // Remove the source node using its key stored in drag data.\r\n const sourceKey = (data as any).key as string | undefined;\r\n if (sourceKey) {\r\n const sourceNode = $getNodeByKey(sourceKey);\r\n if (sourceNode) sourceNode.remove();\r\n }\r\n\r\n const range = getDragSelection(event);\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\r\n // Insert without the old key so a fresh node is created.\r\n const { key: _key, ...insertPayload } = data as any;\r\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, insertPayload);\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 target.closest('[contenteditable=\"true\"]')\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 MessageBar,\r\n MessageBarBody,\r\n Option,\r\n} from '@fluentui/react-components';\r\nimport { AoModal } from './AoModal';\r\nimport { DEFAULT_VALIDATION_MESSAGES } from '../ContentEditorComponent.types';\r\nimport type { ValidationMessages } from '../ContentEditorComponent.types';\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 $getNearestNodeFromDOMNode,\r\n $getNodeByKey,\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 maxImageSizeMB,\r\n validationMessages,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n disabled: boolean;\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\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 [fileSizeError, setFileSizeError] = useState<string | null>(null);\r\n const styles = useStyles();\r\n\r\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\r\n\r\n const isDisabled = disabled || src === '' || !!fileSizeError;\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 file = files[0];\r\n\r\n if (maxImageSizeMB !== undefined) {\r\n const fileMB = file.size / (1024 * 1024);\r\n if (fileMB > maxImageSizeMB) {\r\n const override = validationMessages?.imageTooLarge;\r\n const msg = override !== undefined\r\n ? (typeof override === 'function' ? override(fileMB, maxImageSizeMB) : override)\r\n : DEFAULT_VALIDATION_MESSAGES.imageTooLarge(fileMB, maxImageSizeMB);\r\n setFileSizeError(msg);\r\n setSrc('');\r\n setFileName('');\r\n event.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n setFileSizeError(null);\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(file.name);\r\n }\r\n };\r\n reader.readAsDataURL(file);\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 setFileSizeError(null);\r\n };\r\n\r\n return (\r\n <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert inline image'\r\n maxWidth={360}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Upload' 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' size='small'>\r\n <Dropdown\r\n className={styles.alignDropdown}\r\n disabled={disabled}\r\n value={position === 'full' ? 'Full' : position === 'right' ? 'Right' : 'Left'}\r\n selectedOptions={[position ?? 'left']}\r\n listbox={{ style: { width: '120px' } }}\r\n root={{ style: { borderBottom: '1px solid black' } }}\r\n onOptionSelect={(_, data) => setPosition(data.optionValue as Position)}>\r\n <Option key='left' value='left'>Left</Option>\r\n <Option key='right' value='right'>Right</Option>\r\n <Option key='full' value='full'>Full</Option>\r\n </Dropdown>\r\n </Field>\r\n\r\n {fileSizeError && (\r\n <MessageBar intent='error' style={{ marginTop: 4 }}>\r\n <MessageBarBody>{fileSizeError}</MessageBarBody>\r\n </MessageBar>\r\n )}\r\n\r\n <Field label='Alt Text' 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 </AoModal>\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 // Apply text alignment to the paragraph so toolbar alignment works\r\n const parent = imageNode.getParent();\r\n if (parent && typeof (parent as any).setFormat === 'function') {\r\n const fmt = payload.position === 'right' ? 'right'\r\n : payload.position === 'full' ? 'center'\r\n : 'left';\r\n (parent as any).setFormat(fmt);\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 let node = $getImageNodeInSelection();\r\n\r\n if (!node) {\r\n const target = event.target as HTMLElement | null;\r\n if (!target) return false;\r\n const lexicalNode = $getNearestNodeFromDOMNode(target);\r\n if ($isInlineImageNode(lexicalNode)) node = lexicalNode;\r\n }\r\n\r\n if (!node) return false;\r\n\r\n const dataTransfer = event.dataTransfer;\r\n if (!dataTransfer) return false;\r\n\r\n const imgEl = (event.target as HTMLElement)?.closest?.('.inline-editor-image')\r\n ?.querySelector?.('img') ?? event.target;\r\n if (imgEl instanceof HTMLElement) {\r\n dataTransfer.setDragImage(imgEl, 20, 20);\r\n } else {\r\n dataTransfer.setDragImage(img, 0, 0);\r\n }\r\n\r\n dataTransfer.setData('text/plain', '_');\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 hasDragData = !!event.dataTransfer?.types.includes('application/x-lexical-drag');\r\n if (!hasDragData) 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 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 sourceKey = (data as any).key as string | undefined;\r\n if (sourceKey) {\r\n const sourceNode = $getNodeByKey(sourceKey);\r\n if (sourceNode) sourceNode.remove();\r\n }\r\n\r\n const range = getDragSelection(event);\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\r\n const { key: _key, ...insertPayload } = data as any;\r\n editor.dispatchCommand(INSERT_INLINE_IMAGE_COMMAND, insertPayload);\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, .inline-editor-image') &&\r\n target.closest('[contenteditable=\"true\"]')\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, $isDecoratorNode, $isElementNode, $isLineBreakNode, $isTextNode, LexicalEditor } from 'lexical';\r\nimport React, { useImperativeHandle } from 'react';\r\nimport { ContentEditorRef } from '../ContentEditorComponent.types';\r\nimport { $isHtmlBlockNode } from '../Nodes/HtmlBlockNode';\r\nimport { BlockSpec, hasBlock, removeBlock, upsertBlock } from '../Utils/Helper';\r\nimport { normalizeToBlockHtml, postProcessOutput, sanitizeHtml } from '../Utils/Sanitize';\r\nimport { splitHeadingsAtBrSequences } from './CustomOnChange';\r\n\r\n/**\r\n * Builds a stable string that represents only the user-typed content in the\r\n * editor, including text, inline formatting, and block structure.\r\n *\r\n * Captures:\r\n * • TextNode text content + format bitmask (bold/italic/underline/etc.)\r\n * and inline style — so formatting-only changes (e.g. bolding a word)\r\n * are detected even when the plain text is unchanged.\r\n * • ElementNode type + tag + listType + format so heading-level, list-type,\r\n * quote, and alignment changes are also detected.\r\n * • Decorator node keys (images, YouTube) so adding/removing media is\r\n * detected even when text is unchanged.\r\n *\r\n * Excluded: HtmlBlockNode children (signature, footer, banner — system blocks).\r\n */\r\nfunction getUserContentSignature(editor: LexicalEditor): string {\r\n const parts: string[] = [];\r\n\r\n editor.getEditorState().read(() => {\r\n const root = $getRoot();\r\n\r\n const collectNode = (node: any) => {\r\n if ($isHtmlBlockNode(node)) return;\r\n\r\n if ($isDecoratorNode(node)) {\r\n parts.push(`D:${node.getKey()}`);\r\n return;\r\n }\r\n\r\n if ($isLineBreakNode(node)) {\r\n parts.push('BR');\r\n return;\r\n }\r\n\r\n if ($isTextNode(node)) {\r\n // Include format bitmask so bold/italic/underline changes are detected.\r\n // Include style so colour/font changes are detected.\r\n parts.push(`T${node.getFormat()}:${node.getStyle()}:${node.getTextContent()}`);\r\n return;\r\n }\r\n\r\n if ($isElementNode(node)) {\r\n const type = node.getType();\r\n // Heading level (h1–h6) via HeadingNode.getTag()\r\n const tag = typeof (node as any).getTag === 'function' ? (node as any).getTag() : '';\r\n // List type (bullet / number / check) via ListNode.getListType()\r\n const list = typeof (node as any).getListType === 'function' ? (node as any).getListType() : '';\r\n // Paragraph/element alignment format\r\n const fmt = typeof (node as any).getFormat === 'function' ? (node as any).getFormat() : '';\r\n parts.push(`[${type}:${tag}:${list}:${fmt}]`);\r\n for (const child of node.getChildren()) {\r\n collectNode(child);\r\n }\r\n parts.push('[/]');\r\n }\r\n };\r\n\r\n for (const child of root.getChildren()) {\r\n if ($isHtmlBlockNode(child)) continue;\r\n collectNode(child);\r\n }\r\n });\r\n\r\n return JSON.stringify(parts);\r\n}\r\n\r\nexport default function RefApiPlugin({\r\n forwardedRef,\r\n contentEditableDomRef,\r\n focusedRef,\r\n}: {\r\n forwardedRef: React.Ref<ContentEditorRef>;\r\n contentEditableDomRef: React.RefObject<HTMLDivElement>;\r\n focusedRef: React.MutableRefObject<boolean>;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n // Clean baseline for checkDirty().\r\n //\r\n // null = not yet captured; checkDirty() returns false during this window.\r\n // \"\" = editor was empty when it first loaded.\r\n // text = whatever getUserContentSignature() returned after the initial load.\r\n //\r\n // We capture lazily via a one-shot updateListener so the baseline always\r\n // reflects the actual first loaded state (whether that is an empty editor,\r\n // a pre-populated signature via the value prop, or anything else).\r\n // getUserContentSignature() is text-based and always stable, so this\r\n // comparison is reliable across any Lexical version or empty-state variant.\r\n const cleanBaselineRef = React.useRef<string | null>(null);\r\n\r\n React.useEffect(() => {\r\n // Strategy: capture the baseline from whatever content is in the editor\r\n // after the initial load settles, so the default value (signature, etc.)\r\n // is always treated as clean.\r\n //\r\n // Two mechanisms work together:\r\n //\r\n // 1. registerUpdateListener — fires when CustomOnChangePlugin's\r\n // editor.update() commits the initial value prop as a Lexical microtask.\r\n // This is the fast path when the editor has pre-populated content.\r\n //\r\n // 2. setTimeout(0) fallback — macrotasks run after all pending microtasks,\r\n // so it fires AFTER Lexical has flushed any scheduled updates.\r\n // If the editor loaded with content the listener already captured it and\r\n // this is a no-op. If the editor is empty (no update was scheduled)\r\n // this captures \"\" so the empty state is also treated as clean.\r\n\r\n const capture = () => {\r\n if (cleanBaselineRef.current === null) {\r\n cleanBaselineRef.current = getUserContentSignature(editor);\r\n }\r\n };\r\n\r\n const unregister = editor.registerUpdateListener(({ dirtyElements, dirtyLeaves }) => {\r\n if (cleanBaselineRef.current !== null) { unregister(); return; }\r\n if (dirtyElements.size === 0 && dirtyLeaves.size === 0) return;\r\n capture();\r\n unregister();\r\n });\r\n\r\n const timerId = setTimeout(capture, 0);\r\n\r\n return () => {\r\n clearTimeout(timerId);\r\n unregister();\r\n };\r\n }, [editor]);\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 safe = normalizeToBlockHtml(sanitizeHtml(html || ''));\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(safe || '<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 = postProcessOutput(splitHeadingsAtBrSequences($generateHtmlFromNodes(editor, null)));\r\n });\r\n return html;\r\n },\r\n\r\n clear: () => {\r\n editor.update(() => {\r\n $getRoot().clear();\r\n });\r\n },\r\n\r\n focus: () => contentEditableDomRef.current?.focus(),\r\n blur: () => contentEditableDomRef.current?.blur(),\r\n\r\n isEmpty: () => {\r\n let empty = true;\r\n editor.getEditorState().read(() => {\r\n empty = $getRoot().getTextContent().trim().length === 0;\r\n });\r\n return empty;\r\n },\r\n\r\n isFocused: () => focusedRef.current,\r\n getEditor: () => editor,\r\n\r\n // Generic blocks (signature, footer, banner, etc.)\r\n upsertBlock: (spec: BlockSpec) => upsertBlock(editor, spec),\r\n removeBlock: (kind: string) => removeBlock(editor, kind),\r\n hasBlock: (kind: string) => hasBlock(editor, kind),\r\n\r\n checkDirty: () => {\r\n if (cleanBaselineRef.current === null) return false;\r\n const current = getUserContentSignature(editor);\r\n return current !== cleanBaselineRef.current;\r\n },\r\n\r\n markClean: () => {\r\n cleanBaselineRef.current = getUserContentSignature(editor);\r\n },\r\n }) as any,\r\n [editor, contentEditableDomRef, focusedRef],\r\n );\r\n\r\n return null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $createRangeSelection,\r\n $createTextNode,\r\n $getNodeByKey,\r\n $getRoot,\r\n $getSelection,\r\n $isElementNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n $setSelection,\r\n LexicalNode,\r\n TextNode,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nimport {\r\n $createSpellErrorNode,\r\n $isSpellErrorNode,\r\n SpellErrorMeta,\r\n SpellErrorNode,\r\n SpellIssueType,\r\n} from '../Nodes/SpellErrorNode';\r\n\r\n// ─── Public types ─────────────────────────────────────────────────────────────\r\n\r\nexport type SpellCheckIssue = {\r\n offset: number;\r\n length: number;\r\n message: string;\r\n suggestions: string[];\r\n type?: SpellIssueType;\r\n word?: string;\r\n};\r\n\r\nexport type SpellCheckPayload = {\r\n issues: SpellCheckIssue[];\r\n /** Full corrected sentence from grammar check */\r\n grammarCorrection?: string;\r\n /** Legacy: full improved text. Prefer grammarCorrection. */\r\n improvedText?: string;\r\n};\r\n\r\nexport type SpellCheckResult = {\r\n promise: Promise<SpellCheckPayload | null>;\r\n dismiss: () => void;\r\n};\r\n\r\n// ─── CSS (injected once, outside Lexical) ─────────────────────────────────────\r\n\r\nconst CSS_ID = '__sc_styles__';\r\n\r\nfunction injectCSS() {\r\n if (document.getElementById(CSS_ID)) return;\r\n const s = document.createElement('style');\r\n s.id = CSS_ID;\r\n s.textContent = `\r\n .sc-err-spelling { text-decoration: underline dotted #e53e3e 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-grammar { text-decoration: underline dotted #3182ce 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-err-style { text-decoration: underline dotted #d97706 1.5px; cursor: pointer; text-underline-offset: 3px; }\r\n .sc-popover {\r\n position:fixed; z-index:10000000; background:#fff; border:1px solid #e2e8f0;\r\n border-radius:10px; box-shadow:0 6px 24px rgba(0,0,0,.15);\r\n padding:6px 0 4px; min-width:200px; max-width:300px;\r\n font-family:system-ui,sans-serif; font-size:13px; user-select:none;\r\n }\r\n .sc-popover-header { display:flex; align-items:center; gap:6px; padding:4px 12px 6px; border-bottom:1px solid #f0f0f0; margin-bottom:2px; }\r\n .sc-popover-badge { font-size:10px; font-weight:700; text-transform:uppercase; padding:2px 6px; border-radius:4px; color:#fff; flex-shrink:0; }\r\n .sc-popover-badge-spelling { background:#e53e3e; }\r\n .sc-popover-badge-grammar { background:#3182ce; }\r\n .sc-popover-badge-style { background:#d69e2e; }\r\n .sc-popover-message { color:#4a5568; font-size:12px; flex:1; }\r\n .sc-popover-item { padding:7px 14px; cursor:pointer; color:#1a202c; display:flex; align-items:center; gap:8px; font-size:13.5px; font-weight:500; }\r\n .sc-popover-item:hover { background:#f0fff4; }\r\n .sc-popover-empty { padding:8px 14px; color:#a0aec0; font-style:italic; font-size:12px; }\r\n .sc-popover-footer { border-top:1px solid #f0f0f0; margin-top:2px; padding:5px 14px 2px; display:flex; gap:8px; }\r\n .sc-popover-action { cursor:pointer; font-size:11px; color:#a0aec0; padding:3px 0; }\r\n .sc-popover-action:hover { color:#e53e3e; }\r\n .sc-popover-improve { border-top:1px solid #f0f0f0; margin-top:2px; padding:8px 12px 6px; }\r\n .sc-popover-improve-label { font-size:10px; font-weight:700; text-transform:uppercase; color:#d69e2e; margin-bottom:6px; }\r\n .sc-popover-improve-text { font-size:12px; color:#4a5568; font-style:italic; margin-bottom:8px; line-height:1.45; }\r\n .sc-popover-improve-accept { background:#d69e2e; color:#fff; border:none; border-radius:6px; padding:5px 12px; font-size:12px; font-weight:600; cursor:pointer; width:100%; }\r\n .sc-popover-improve-accept:hover { background:#b7791f; }\r\n `;\r\n document.head.appendChild(s);\r\n}\r\n\r\n// ─── Tree helpers ─────────────────────────────────────────────────────────────\r\n\r\nfunction escRx(s: string) {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\ntype Seg = { node: TextNode; start: number; end: number; text: string };\r\n\r\n/**\r\n * Walk the Lexical tree and return all wrappable TextNode segments with their\r\n * absolute character offsets. SpellErrorNodes are counted but not returned.\r\n * Block separators (\\n) are counted between top-level blocks, not after the last.\r\n */\r\nfunction getSegments(root: LexicalNode): Seg[] {\r\n const segs: Seg[] = [];\r\n let pos = 0;\r\n\r\n function walk(node: LexicalNode) {\r\n if ($isSpellErrorNode(node)) {\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isTextNode(node)) {\r\n const t = node.getTextContent();\r\n if (t.length > 0)\r\n segs.push({ node: node as TextNode, start: pos, end: pos + t.length, text: t });\r\n pos += t.length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(walk);\r\n }\r\n\r\n if (!$isElementNode(root)) return segs;\r\n root.getChildren().forEach((block, i) => {\r\n if (i > 0) pos += 1;\r\n walk(block);\r\n });\r\n return segs;\r\n}\r\n\r\nfunction removeAllSpellNodes(root: LexicalNode) {\r\n if ($isSpellErrorNode(root)) {\r\n (root as SpellErrorNode).replace($createTextNode(root.getTextContent()));\r\n return;\r\n }\r\n if ($isElementNode(root)) {\r\n [...root.getChildren()].forEach(removeAllSpellNodes);\r\n }\r\n}\r\n\r\n/** Split TextNode at [start, start+len) and wrap that slice with a SpellErrorNode */\r\nfunction wrapWord(node: TextNode, start: number, len: number, meta: SpellErrorMeta) {\r\n const full = node.getTextContent();\r\n const before = full.slice(0, start);\r\n const word = full.slice(start, start + len);\r\n const after = full.slice(start + len);\r\n if (!word) return;\r\n\r\n const err = $createSpellErrorNode(word, meta);\r\n if (before && after) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n err.insertAfter($createTextNode(after));\r\n } else if (before) {\r\n node.setTextContent(before);\r\n node.insertAfter(err);\r\n } else if (after) {\r\n node.replace(err);\r\n err.insertAfter($createTextNode(after));\r\n } else {\r\n node.replace(err);\r\n }\r\n}\r\n\r\n/** Move caret to the very end of the last text node in the document */\r\nfunction moveCursorToEnd(editor: ReturnType<typeof useLexicalComposerContext>[0]) {\r\n editor.update(\r\n () => {\r\n const root = $getRoot();\r\n const lastBlock = root.getLastChild();\r\n if (!lastBlock || !$isElementNode(lastBlock)) return;\r\n // Walk to the last leaf TextNode (skip SpellErrorNodes and element nodes)\r\n let lastTextNode: TextNode | null = null;\r\n const findLast = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node) || ($isTextNode(node) && !$isSpellErrorNode(node))) {\r\n lastTextNode = node as TextNode;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(findLast);\r\n };\r\n findLast(lastBlock);\r\n if (!lastTextNode) return;\r\n const sel = $createRangeSelection();\r\n const key = (lastTextNode as TextNode).getKey();\r\n const off = (lastTextNode as TextNode).getTextContent().length;\r\n sel.anchor.set(key, off, 'text');\r\n sel.focus.set(key, off, 'text');\r\n $setSelection(sel);\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n}\r\n\r\n/** Replace all content of the first paragraph with plain text */\r\nfunction replaceFirstParagraph(\r\n editor: ReturnType<typeof useLexicalComposerContext>[0],\r\n text: string,\r\n onUpdate?: () => void,\r\n) {\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n const first = $getRoot().getFirstChild();\r\n if (first && $isElementNode(first)) {\r\n first.getChildren().forEach((c) => c.remove());\r\n first.append($createTextNode(text));\r\n }\r\n },\r\n { tag: 'spell-clear', onUpdate },\r\n );\r\n}\r\n\r\n// ─── Popover component ────────────────────────────────────────────────────────\r\n\r\ntype PopoverState = {\r\n x: number;\r\n y: number;\r\n issue: SpellCheckIssue;\r\n nodeKey: string;\r\n improvedText?: string;\r\n grammarCorrection?: string;\r\n};\r\n\r\nfunction SpellPopover({\r\n state,\r\n onAccept,\r\n onDismiss,\r\n onClose,\r\n onImprove,\r\n onAcceptGrammar,\r\n}: {\r\n state: PopoverState;\r\n onAccept: (replacement: string, nodeKey: string) => void;\r\n onDismiss: (nodeKey: string) => void;\r\n onClose: () => void;\r\n onImprove?: (text: string, nodeKey: string) => void;\r\n onAcceptGrammar?: (corrected: string) => void;\r\n}) {\r\n const ref = React.useRef<HTMLDivElement>(null);\r\n const type = state.issue.type ?? 'spelling';\r\n\r\n // Viewport-aware position\r\n const [pos, setPos] = React.useState({ left: state.x, top: state.y });\r\n React.useEffect(() => {\r\n if (!ref.current) return;\r\n const { offsetHeight: h, offsetWidth: w } = ref.current;\r\n const top = state.y + h > window.innerHeight - 8 ? state.y - h - 32 : state.y;\r\n setPos({ left: Math.min(state.x, window.innerWidth - w - 8), top });\r\n }, [state.x, state.y]);\r\n\r\n // Close on outside click\r\n React.useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\r\n };\r\n document.addEventListener('mousedown', h, true);\r\n return () => document.removeEventListener('mousedown', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = () => onClose();\r\n window.addEventListener('scroll', h, { capture: true, passive: true });\r\n return () => window.removeEventListener('scroll', h, true);\r\n }, [onClose]);\r\n\r\n React.useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') onClose();\r\n };\r\n document.addEventListener('keydown', h, true);\r\n return () => document.removeEventListener('keydown', h, true);\r\n }, [onClose]);\r\n\r\n // Grammar correction takes priority over legacy improvedText\r\n const grammar = state.grammarCorrection;\r\n const improved = !grammar ? state.improvedText : undefined;\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className='sc-popover'\r\n style={{ left: pos.left, top: pos.top }}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }}>\r\n {' '}\r\n <div className='sc-popover-header'>\r\n <span className={`sc-popover-badge sc-popover-badge-${type}`}>{type.toUpperCase()}</span>\r\n <span className='sc-popover-message'>{state.issue.message}</span>\r\n </div>\r\n {state.issue.suggestions.length > 0 ? (\r\n state.issue.suggestions.slice(0, 5).map((s) => (\r\n <div\r\n key={s}\r\n className='sc-popover-item'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAccept(s, state.nodeKey);\r\n }}>\r\n → {s}\r\n </div>\r\n ))\r\n ) : (\r\n <div className='sc-popover-empty'>No suggestions</div>\r\n )}\r\n <div className='sc-popover-footer'>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDismiss(state.nodeKey);\r\n }}>\r\n Ignore\r\n </span>\r\n <span\r\n className='sc-popover-action'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onClose();\r\n }}>\r\n Close\r\n </span>\r\n </div>\r\n {grammar && onAcceptGrammar && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Grammar Suggestion</div>\r\n <div className='sc-popover-improve-text'>\"{grammar}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAcceptGrammar(grammar);\r\n onClose();\r\n }}>\r\n Accept correction\r\n </button>\r\n </div>\r\n )}\r\n {improved && onImprove && (\r\n <div className='sc-popover-improve'>\r\n <div className='sc-popover-improve-label'>✦ Suggested Improvement</div>\r\n <div className='sc-popover-improve-text'>\"{improved}\"</div>\r\n <button\r\n className='sc-popover-improve-accept'\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onImprove(improved, state.nodeKey);\r\n }}>\r\n Accept improvement\r\n </button>\r\n </div>\r\n )}\r\n </div>,\r\n document.body,\r\n );\r\n}\r\n\r\n// ─── Plugin ───────────────────────────────────────────────────────────────────\r\n\r\nexport default function SpellCheckPlugin({\r\n useSpellCheck,\r\n onSpellCheckAccept,\r\n idleMs = 1200,\r\n enabled = true,\r\n}: {\r\n /** Return `{ promise, dismiss }` for the given text. */\r\n useSpellCheck?: (text: string) => SpellCheckResult;\r\n /** Called after the user accepts any suggestion or correction. */\r\n onSpellCheckAccept?: (info: {\r\n original: string;\r\n replacement: string;\r\n message: string;\r\n type?: string;\r\n }) => void;\r\n /** Debounce delay in ms before calling the API. Default 1200. */\r\n idleMs?: number;\r\n /** Set false to disable without unmounting (clears existing underlines). Default true. */\r\n enabled?: boolean;\r\n}) {\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const timerRef = React.useRef<number | null>(null);\r\n const dismissRef = React.useRef<(() => void) | null>(null);\r\n const reqIdRef = React.useRef(0);\r\n const lastTextRef = React.useRef('');\r\n const applyingRef = React.useRef(false);\r\n const grammarCorrectionRef = React.useRef<string | undefined>(undefined);\r\n\r\n const [popover, setPopover] = React.useState<PopoverState | null>(null);\r\n\r\n React.useEffect(() => {\r\n injectCSS();\r\n }, []);\r\n\r\n // ── Clear all underlines ─────────────────────────────────────────────────\r\n\r\n const clearErrors = React.useCallback(() => {\r\n setPopover(null);\r\n grammarCorrectionRef.current = undefined;\r\n applyingRef.current = true;\r\n editor.update(\r\n () => {\r\n removeAllSpellNodes($getRoot());\r\n },\r\n {\r\n tag: 'spell-clear',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n }, [editor]);\r\n\r\n // ── Apply issues ─────────────────────────────────────────────────────────\r\n\r\n const applyIssues = React.useCallback(\r\n (issues: SpellCheckIssue[], improvedText?: string, trimOffset = 0) => {\r\n // Capture cursor as absolute char offset — stable across node splits\r\n let savedCharOffset = -1;\r\n editor.getEditorState().read(() => {\r\n const sel = $getSelection();\r\n if (!$isRangeSelection(sel)) return;\r\n const anchorKey = sel.anchor.key;\r\n const anchorOff = sel.anchor.offset;\r\n let pos = 0;\r\n let found = false;\r\n const visit = (node: LexicalNode): void => {\r\n if (found) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n if (node.getKey() === anchorKey) {\r\n savedCharOffset = pos + anchorOff;\r\n found = true;\r\n return;\r\n }\r\n pos += node.getTextContent().length;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n $getRoot()\r\n .getChildren()\r\n .forEach((block, i) => {\r\n if (found) return;\r\n if (i > 0) pos += 1;\r\n visit(block);\r\n });\r\n });\r\n\r\n applyingRef.current = true;\r\n\r\n editor.update(\r\n () => {\r\n try {\r\n const root = $getRoot();\r\n removeAllSpellNodes(root);\r\n\r\n const sorted = [...issues].sort((a, b) => a.offset - b.offset);\r\n\r\n for (const issue of sorted) {\r\n const word = issue.word ?? '';\r\n if (!word) continue;\r\n\r\n const meta: SpellErrorMeta = {\r\n message: issue.message,\r\n suggestions: issue.suggestions,\r\n type: issue.type ?? 'spelling',\r\n offset: issue.offset,\r\n };\r\n\r\n const absOffset = issue.offset + trimOffset;\r\n let segs = getSegments(root);\r\n let placed = false;\r\n\r\n // Pass 1: exact offset + text match, with per-segment regex fallback\r\n for (const seg of segs) {\r\n if (absOffset < seg.start || absOffset >= seg.end) continue;\r\n const local = absOffset - seg.start;\r\n const slice = seg.text.slice(local, local + word.length);\r\n if (slice.toLowerCase() === word.toLowerCase()) {\r\n wrapWord(seg.node, local, word.length, meta);\r\n placed = true;\r\n break;\r\n }\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n\r\n // Pass 2: full-tree regex scan (handles trimOffset drift)\r\n if (!placed) {\r\n segs = getSegments(root); // re-collect after any prior wraps\r\n for (const seg of segs) {\r\n if (!seg.text.trim()) continue;\r\n const m =\r\n seg.text.match(new RegExp('\\\\b' + escRx(word) + '\\\\b', 'i')) ??\r\n seg.text.match(new RegExp(escRx(word), 'i'));\r\n if (m?.index != null) {\r\n wrapWord(seg.node, m.index, m[0].length, meta);\r\n placed = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Grammar-only: no spelling issues but grammar correction exists.\r\n // We need a click target — underline the first word of text with\r\n // a 'grammar' style node so the popover can open and show the correction.\r\n if (issues.length === 0 && !improvedText) {\r\n // grammarCorrection is stored in grammarCorrectionRef by the caller —\r\n // we just need any node to be clickable. Wrap first word of first segment.\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n const firstWord = target.text.trim().match(/^\\S+/)?.[0] ?? target.text;\r\n const wordStart = target.text.indexOf(firstWord);\r\n wrapWord(target.node, wordStart, firstWord.length, {\r\n message: 'Grammar suggestion available — click to review',\r\n suggestions: [],\r\n type: 'grammar',\r\n offset: target.start + wordStart,\r\n });\r\n }\r\n }\r\n\r\n // Legacy: full-text style underline for improvedText\r\n if (improvedText) {\r\n const target = getSegments(root).find((s) => s.text.trim());\r\n if (target) {\r\n wrapWord(target.node, 0, target.text.length, {\r\n message: 'AI suggested improvement available',\r\n suggestions: [],\r\n type: 'style',\r\n offset: -1,\r\n improvedText,\r\n });\r\n }\r\n }\r\n\r\n // Restore cursor to saved absolute position in new tree\r\n if (savedCharOffset >= 0) {\r\n let pos = 0;\r\n let restored = false;\r\n const restoreVisit = (node: LexicalNode): void => {\r\n if (restored) return;\r\n if ($isSpellErrorNode(node) || $isTextNode(node)) {\r\n const len = node.getTextContent().length;\r\n if (savedCharOffset <= pos + len) {\r\n const sel = $createRangeSelection();\r\n const off = savedCharOffset - pos;\r\n sel.anchor.set(node.getKey(), off, 'text');\r\n sel.focus.set(node.getKey(), off, 'text');\r\n $setSelection(sel);\r\n restored = true;\r\n return;\r\n }\r\n pos += len;\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(restoreVisit);\r\n };\r\n root.getChildren().forEach((block, i) => {\r\n if (restored) return;\r\n if (i > 0) pos += 1;\r\n restoreVisit(block);\r\n });\r\n }\r\n } catch (err) {\r\n console.error('[SpellCheckPlugin] applyIssues error:', err);\r\n }\r\n },\r\n {\r\n tag: 'spell-apply',\r\n onUpdate: () => {\r\n applyingRef.current = false;\r\n },\r\n },\r\n );\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Click → open popover ─────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n let currentRoot: HTMLElement | null = null;\r\n\r\n const onClick = (e: MouseEvent) => {\r\n const span = (e.target as HTMLElement).closest('[data-spell-offset]') as HTMLElement | null;\r\n if (!span) return;\r\n if (!currentRoot?.contains(span)) return;\r\n\r\n editor.getEditorState().read(() => {\r\n const visit = (node: LexicalNode): void => {\r\n if ($isSpellErrorNode(node)) {\r\n const meta = (node as SpellErrorNode).getMeta();\r\n if (String(meta.offset) === span.dataset.spellOffset) {\r\n const rect = span.getBoundingClientRect();\r\n setPopover({\r\n x: rect.left,\r\n y: rect.bottom + 8,\r\n issue: {\r\n offset: meta.offset,\r\n length: node.getTextContent().length,\r\n message: meta.message,\r\n suggestions: meta.suggestions,\r\n type: meta.type,\r\n },\r\n nodeKey: node.getKey(),\r\n improvedText: meta.improvedText,\r\n grammarCorrection: grammarCorrectionRef.current,\r\n });\r\n }\r\n return;\r\n }\r\n if ($isElementNode(node)) node.getChildren().forEach(visit);\r\n };\r\n visit($getRoot());\r\n });\r\n };\r\n\r\n // registerRootListener fires immediately with current root, then again on\r\n // every root change (e.g. Panel mount gives a new contenteditable element).\r\n const unregister = editor.registerRootListener((nextRoot, prevRoot) => {\r\n // Detach from old root\r\n if (prevRoot) prevRoot.removeEventListener('click', onClick);\r\n // Attach to new root\r\n if (nextRoot) nextRoot.addEventListener('click', onClick);\r\n currentRoot = nextRoot;\r\n });\r\n\r\n return () => {\r\n unregister();\r\n if (currentRoot) currentRoot.removeEventListener('click', onClick);\r\n };\r\n }, [editor]);\r\n\r\n // ── Accept spelling suggestion ───────────────────────────────────────────\r\n\r\n const handleAccept = React.useCallback(\r\n (replacement: string, nodeKey: string) => {\r\n let original = '';\r\n editor.getEditorState().read(() => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) original = n.getTextContent();\r\n });\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n)) (n as SpellErrorNode).replace($createTextNode(replacement));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement,\r\n message: popover?.issue.message ?? '',\r\n type: popover?.issue.type,\r\n });\r\n },\r\n [editor, onSpellCheckAccept, popover],\r\n );\r\n\r\n // ── Ignore (remove underline, keep word) ────────────────────────────────\r\n\r\n const handleDismiss = React.useCallback(\r\n (nodeKey: string) => {\r\n editor.update(\r\n () => {\r\n const n = $getNodeByKey(nodeKey);\r\n if ($isSpellErrorNode(n))\r\n (n as SpellErrorNode).replace($createTextNode(n.getTextContent()));\r\n },\r\n { tag: 'spell-clear' },\r\n );\r\n setPopover(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // ── Accept legacy improved text ──────────────────────────────────────────\r\n\r\n const handleImprove = React.useCallback(\r\n (text: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, text, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: text,\r\n message: 'Accepted improved text',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Accept grammar correction ────────────────────────────────────────────\r\n\r\n const handleAcceptGrammar = React.useCallback(\r\n (corrected: string) => {\r\n const original = lastTextRef.current;\r\n applyingRef.current = true;\r\n replaceFirstParagraph(editor, corrected, () => {\r\n applyingRef.current = false;\r\n });\r\n moveCursorToEnd(editor);\r\n setPopover(null);\r\n lastTextRef.current = '';\r\n grammarCorrectionRef.current = undefined;\r\n onSpellCheckAccept?.({\r\n original,\r\n replacement: corrected,\r\n message: 'Accepted grammar correction',\r\n type: 'style',\r\n });\r\n },\r\n [editor, onSpellCheckAccept],\r\n );\r\n\r\n // ── Debounced API trigger ────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !useSpellCheck) return;\r\n\r\n return editor.registerUpdateListener(({ tags }) => {\r\n if (applyingRef.current) return;\r\n if (tags.has('spell-apply') || tags.has('spell-clear') || tags.has('autocomplete-ghost'))\r\n return;\r\n\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n\r\n timerRef.current = window.setTimeout(async () => {\r\n timerRef.current = null;\r\n\r\n let rawText = '';\r\n editor.getEditorState().read(() => {\r\n rawText = $getRoot().getTextContent();\r\n });\r\n const text = rawText.trim();\r\n\r\n if (!text || text === lastTextRef.current) return;\r\n\r\n dismissRef.current?.();\r\n const myId = ++reqIdRef.current;\r\n const { promise, dismiss } = useSpellCheck(text);\r\n dismissRef.current = dismiss;\r\n\r\n try {\r\n const payload = await promise;\r\n if (myId !== reqIdRef.current) return; // superseded\r\n\r\n lastTextRef.current = text;\r\n\r\n const hasContent =\r\n payload?.issues?.length || payload?.grammarCorrection || payload?.improvedText;\r\n if (!payload || !hasContent) {\r\n clearErrors();\r\n return;\r\n }\r\n\r\n grammarCorrectionRef.current = payload.grammarCorrection ?? undefined;\r\n\r\n const improved =\r\n payload.improvedText && payload.improvedText.trim() !== text\r\n ? payload.improvedText\r\n : undefined;\r\n\r\n applyIssues(payload.issues ?? [], improved, rawText.length - rawText.trimStart().length);\r\n } catch (e) {\r\n console.error('[SpellCheckPlugin] request failed:', e);\r\n lastTextRef.current = '';\r\n }\r\n }, idleMs);\r\n });\r\n }, [editor, useSpellCheck, enabled, idleMs, applyIssues, clearErrors]);\r\n\r\n // ── enabled toggle ───────────────────────────────────────────────────────\r\n\r\n React.useEffect(() => {\r\n if (!enabled) {\r\n clearErrors();\r\n lastTextRef.current = '';\r\n }\r\n }, [enabled, clearErrors]);\r\n\r\n // ── Unmount cleanup ──────────────────────────────────────────────────────\r\n\r\n React.useEffect(\r\n () => () => {\r\n dismissRef.current?.();\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n },\r\n [],\r\n );\r\n\r\n return popover ? (\r\n <SpellPopover\r\n state={popover}\r\n onAccept={handleAccept}\r\n onDismiss={handleDismiss}\r\n onClose={() => setPopover(null)}\r\n onImprove={handleImprove}\r\n onAcceptGrammar={handleAcceptGrammar}\r\n />\r\n ) : null;\r\n}\r\n","import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\r\nimport {\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $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 $createRangeSelection,\r\n $findMatchingParent,\r\n $getNodeByKey,\r\n $getSelection,\r\n $isRangeSelection,\r\n $setSelection,\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 [contentRight, setContentRight] = React.useState<number | null>(null);\r\n const [open, setOpen] = React.useState(false);\r\n const openRef = React.useRef(false);\r\n const savedAnchorRef = React.useRef<{ key: string; offset: number; type: 'text' | 'element' } | null>(null);\r\n\r\n const measureContentRight = React.useCallback((cellDom: HTMLElement): number | null => {\r\n try {\r\n const range = document.createRange();\r\n range.selectNodeContents(cellDom);\r\n const cr = range.getBoundingClientRect();\r\n return cr.width > 2 ? cr.right : null;\r\n } catch {\r\n return null;\r\n }\r\n }, []);\r\n\r\n const updateFromSelection = React.useCallback(() => {\r\n if (openRef.current) return;\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 setContentRight(null);\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 setContentRight(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 setContentRight(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 setContentRight(null);\r\n return;\r\n }\r\n\r\n setIsInTable(true);\r\n setAnchorRect(cellDom.getBoundingClientRect());\r\n setContentRight(measureContentRight(cellDom as HTMLElement));\r\n\r\n if ($isRangeSelection(selection)) {\r\n savedAnchorRef.current = {\r\n key: selection.anchor.key,\r\n offset: selection.anchor.offset,\r\n type: selection.anchor.type as 'text' | 'element',\r\n };\r\n }\r\n });\r\n }, [editor, measureContentRight]);\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\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 clampedCellRight = Math.min(anchorRect.right, window.innerWidth - 8);\r\n // Place button right beside the content; fall back to near left edge when cell is empty\r\n const left = contentRight !== null\r\n ? Math.max(anchorRect.left + 4, Math.min(contentRight + 4, clampedCellRight - 32))\r\n : Math.max(8, anchorRect.left + 8);\r\n\r\n return {\r\n position: 'fixed',\r\n top,\r\n left,\r\n zIndex: 9999,\r\n };\r\n }, [anchorRect, contentRight]);\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 openRef.current = false;\r\n setOpen(false);\r\n editor.update(() => {\r\n const saved = savedAnchorRef.current;\r\n if (saved && $getNodeByKey(saved.key)) {\r\n const sel = $createRangeSelection();\r\n sel.anchor.set(saved.key, saved.offset, saved.type);\r\n sel.focus.set(saved.key, saved.offset, saved.type);\r\n $setSelection(sel);\r\n }\r\n fn();\r\n });\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 if (disabled) return;\r\n openRef.current = false;\r\n setOpen(false);\r\n editor.update(() => {\r\n const saved = savedAnchorRef.current;\r\n if (!saved) return;\r\n const anchorNode = $getNodeByKey(saved.key);\r\n if (!anchorNode) return;\r\n // Walk up the tree to find the enclosing table node, then remove it.\r\n const tableNode = $findMatchingParent(anchorNode, (n) => $isTableNode(n));\r\n if (tableNode) tableNode.remove();\r\n });\r\n };\r\n\r\n\r\n if (!canShow || !handleStyle) return null;\r\n\r\n return createPortal(\r\n <div style={handleStyle} className='aoTableActionHandleRoot' data-lexical-editor-portal='true'>\r\n <Menu open={open} onOpenChange={(_, data) => { openRef.current = data.open; 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 <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\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, ValidationMessages } from '../ContentEditorComponent.types';\r\nimport { PageSetupValue } from './PageSetup';\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 /** Fully custom toolbar layout; overrides the `level`-based preset. */\r\n customToolbar?: string[][];\r\n maxImageSizeMB?: number;\r\n validationMessages?: ValidationMessages;\r\n pageSetup: PageSetupValue;\r\n onPageSetupChange: (value: PageSetupValue) => void;\r\n setIsLinkEditMode: (isLinkEditMode: boolean) => 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', 'Table', '|'],\r\n // ['Image', 'Youtube', 'InlineImage', '|'],\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', '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 ['PageSetup'],\r\n ];\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 { 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: 250 } }}>\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: 18,\r\n height: 18,\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: 125,\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: 20,\r\n height: 20,\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: 18,\r\n height: 18,\r\n padding: 0,\r\n borderRadius: 4,\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 { 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 { Button } from '@fluentui/react-components';\nimport { LinkAddRegular } from '@fluentui/react-icons';\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent } from '@lexical/utils';\nimport { $getSelection, $isRangeSelection } from 'lexical';\nimport { getSelectedNode } from './FloatLinkEditor';\n\n/**\n * Toolbar entry point for inserting a link. Wraps the current selection in a\n * link node (if it isn't one already) and hands off to the floating\n * `FloatingLinkEditor` — the exact same UI used when editing an existing\n * link — instead of a separate popover form.\n */\nexport const InsertLinkPlugin = ({\n disabled,\n setIsLinkEditMode,\n}: {\n disabled: boolean;\n setIsLinkEditMode: (isLinkEditMode: boolean) => void;\n}) => {\n const [editor] = useLexicalComposerContext();\n\n const iconColor = disabled ? 'var(--colorNeutralForegroundDisabled, #A6A6A6)' : '#333333';\n\n const insertLink = () => {\n if (disabled) return;\n\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n\n if (!linkParent && !$isLinkNode(node)) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\n }\n });\n\n setIsLinkEditMode(true);\n };\n\n return (\n <Button\n size='small'\n title='Add link'\n key='insert-link'\n disabled={disabled}\n icon={<LinkAddRegular style={{ color: iconColor }} />}\n style={{\n background: 'none',\n border: 'none',\n margin: 2,\n opacity: disabled ? 0.55 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n onClick={insertLink}\n />\n );\n};\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 { Button, Field, Input } 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\nimport { AoModal } from './AoModal';\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 <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Insert table'\r\n maxWidth={300}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='Rows' size='small'>\r\n <Input\r\n autoFocus={!disabled}\r\n value={rows}\r\n placeholder='Rows'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setRows(v.value)}\r\n />\r\n </Field>\r\n\r\n <Field label='Columns' size='small'>\r\n <Input\r\n value={columns}\r\n placeholder='Columns'\r\n appearance='underline'\r\n disabled={disabled}\r\n onChange={(_, v) => setColumns(v.value)}\r\n />\r\n </Field>\r\n </Stack>\r\n </AoModal>\r\n </>\r\n );\r\n};\r\n","import { Stack } from '@fluentui/react';\r\nimport { Button, Field, Input } 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\nimport { AoModal } from './AoModal';\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 <>\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\r\n <AoModal\r\n isOpen={disabled ? false : isOpen}\r\n onDismiss={() => !disabled && setIsOpen(false)}\r\n title='Embed YouTube video'\r\n maxWidth={320}\r\n actions={\r\n <>\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 </>\r\n }>\r\n <Stack tokens={{ childrenGap: 8 }}>\r\n <Field label='URL' 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 </Stack>\r\n </AoModal>\r\n </>\r\n );\r\n};\r\n","import { Stack, useTheme } from '@fluentui/react';\r\nimport { Button, Dropdown, makeStyles, Option, ToolbarDivider } from '@fluentui/react-components';\r\nimport {\r\n CommentQuoteRegular,\r\n 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 $getSelection,\r\n $isRangeSelection,\r\n FORMAT_ELEMENT_COMMAND,\r\n FORMAT_TEXT_COMMAND,\r\n REDO_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n UNDO_COMMAND,\r\n} from 'lexical';\r\nimport React, { useMemo, useState } from 'react';\r\nimport {\r\n HEADING_OPTION,\r\n IEditorProps,\r\n LOW_PRIORIRTY,\r\n RichTextPluginsType,\r\n} from '../Types/EditorType';\r\nimport { $isAlphaListNode, $toggleAlphaList } from '../Nodes/AlphaListNode';\r\nimport { getToolbarGroupsByLevel } from '../Utils/editorLevel';\r\nimport { $splitBlockAtPartialSelection, $splitBlocksAtLineBreaks, 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 TextAlphaListLtrFilled: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\r\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" style={style}>\r\n <path d=\"M8.75 4a.75.75 0 1 0 0 1.5h7.5a.75.75 0 0 0 0-1.5h-7.5Z\" />\r\n <path d=\"M8.75 9a.75.75 0 1 0 0 1.5h7.5a.75.75 0 0 0 0-1.5h-7.5Z\" />\r\n <path d=\"M8 14.75c0-.41.34-.75.75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1-.75-.75Z\" />\r\n <text x=\"3.5\" y=\"6\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">a</text>\r\n <text x=\"3.5\" y=\"11\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">b</text>\r\n <text x=\"3.5\" y=\"16\" fontSize=\"5.5\" fontWeight=\"bold\" textAnchor=\"middle\">c</text>\r\n </svg>\r\n);\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 // ── Text formatting (standalone toggle buttons) ──────────────────────────\r\n | 'Bold'\r\n | 'Italic'\r\n | 'Underline'\r\n | 'Strikethrough'\r\n | 'Subscript'\r\n | 'Superscript'\r\n | 'Highlight'\r\n | 'Uppercase'\r\n | 'Lowercase'\r\n | 'Capitalize'\r\n // ── Lists (standalone toggle buttons) ────────────────────────────────────\r\n | 'BulletList'\r\n | 'NumberList'\r\n | 'AlphabeticalList'\r\n // ── Block-level (standalone buttons) ─────────────────────────────────────\r\n | 'Quote'\r\n | 'PageBreak'\r\n // ── Heading levels (standalone toggle buttons) ────────────────────────────\r\n | 'H1'\r\n | 'H2'\r\n | 'H3'\r\n | 'H4'\r\n | 'H5'\r\n | 'H6'\r\n // ── Rich media / plugins ──────────────────────────────────────────────────\r\n | 'ColorPicker'\r\n | 'Link'\r\n | 'Table'\r\n | 'Image'\r\n | 'InlineImage'\r\n | 'Youtube'\r\n | 'FontFamily'\r\n | 'FontSize'\r\n | 'Align'\r\n | 'PageSetup'\r\n // ── Aggregate dropdowns (show ALL options of that category) ───────────────\r\n | 'Heading' // dropdown: Normal + H1–H6\r\n | 'Decorators' // dropdown: all text / list / block decorators\r\n | 'CodeBlock';\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 Strikethrough: true,\r\n Subscript: true,\r\n Superscript: true,\r\n Highlight: true,\r\n Uppercase: true,\r\n Lowercase: true,\r\n Capitalize: true,\r\n BulletList: true,\r\n NumberList: true,\r\n AlphabeticalList: true,\r\n Quote: true,\r\n PageBreak: true,\r\n H1: true,\r\n H2: true,\r\n H3: true,\r\n H4: true,\r\n H5: true,\r\n H6: 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 FontFamily: true,\r\n FontSize: true,\r\n Align: true,\r\n Heading: true,\r\n Decorators: true,\r\n CodeBlock: 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 // Guard against non-array values (e.g. {} passed by Storybook's \"Set object\" control).\r\n if (!Array.isArray(groups) || groups.length === 0) return [];\r\n return groups\r\n .map((g) =>\r\n (Array.isArray(g) ? g : [])\r\n .map((t) => (typeof t === 'string' ? 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 [hasTextSelection, setHasTextSelection] = useState(false);\r\n\r\n // Controlled open state for the decorator dropdown so it stays open\r\n // after an option is selected (only closes on click-outside / Escape).\r\n const [decoratorOpen, setDecoratorOpen] = useState(false);\r\n const decoratorSelectingRef = React.useRef(false);\r\n\r\n const presetGroups = props.customToolbar ?? 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 setHasTextSelection(false);\r\n return;\r\n }\r\n\r\n setHasTextSelection(!selection.isCollapsed());\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 // Alpha list must be checked before the generic $isListNode branch because\r\n // AlphaListNode extends ListNode — $isListNode would match it too.\r\n if ($isAlphaListNode(element)) {\r\n setSelectNodeType('alpha');\r\n return;\r\n }\r\n\r\n if ($isListNode(element)) {\r\n const parentList = $getNearestNodeOfType(anchorNode, ListNode);\r\n const type = parentList ? parentList.getTag() : element.getTag();\r\n setSelectNodeType(type);\r\n return;\r\n }\r\n\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n setSelectNodeType(\r\n ['paragraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'quote', 'code'].includes(type)\r\n ? type\r\n : 'paragraph',\r\n );\r\n };\r\n\r\n const formatQuote = () => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n if (selectNodeType === 'quote') {\r\n // toggle back to paragraph\r\n formatParagraph(editor);\r\n } else {\r\n // Split multi-line blocks first so only the selected line(s) become a quote.\r\n $splitBlocksAtLineBreaks(selection);\r\n $setBlocksType($getSelection(), () => $createQuoteNode());\r\n }\r\n });\r\n };\r\n\r\n React.useEffect(() => {\r\n return mergeRegister(\r\n editor.registerEditableListener((editable) => {\r\n setIsEditable(editable);\r\n }),\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n updateToolbarPlugins();\r\n });\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateToolbarPlugins();\r\n return false;\r\n },\r\n LOW_PRIORIRTY,\r\n ),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editor]);\r\n\r\n const onHandleSelectOption = (id: RichTextPluginsType) => {\r\n switch (id) {\r\n case RichTextPluginsType.Bold:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n break;\r\n case RichTextPluginsType.Italic:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n break;\r\n case RichTextPluginsType.Underline:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n break;\r\n case RichTextPluginsType.Strikethrough:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n break;\r\n case RichTextPluginsType.Superscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n break;\r\n case RichTextPluginsType.Subscript:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n break;\r\n case RichTextPluginsType.Highlight:\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'highlight');\r\n break;\r\n case RichTextPluginsType.LeftAlign:\r\n applyAlignmentWithSplit('left');\r\n break;\r\n case RichTextPluginsType.RightAlign:\r\n applyAlignmentWithSplit('right');\r\n break;\r\n case RichTextPluginsType.CenterAlign:\r\n applyAlignmentWithSplit('center');\r\n break;\r\n case RichTextPluginsType.JustifyAlign:\r\n applyAlignmentWithSplit('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 /**\r\n * Apply an alignment format to only the selected block(s).\r\n *\r\n * Problem: FORMAT_ELEMENT_COMMAND applies to every top-level element that\r\n * is touched by the selection — so if the user has several Shift+Enter\r\n * \"lines\" in one block, or selects a single word in the middle of a\r\n * paragraph, alignment spreads to the entire block.\r\n *\r\n * Fix (same two-step strategy as updateHeading):\r\n * 1. Split multi-line blocks at LineBreakNode boundaries so each visual\r\n * line is its own block.\r\n * 2. Split the block at the selection edges when only part of a line is\r\n * selected, isolating the selected words into their own block.\r\n *\r\n * After the splits the selection sits on the isolated block(s). We then\r\n * dispatch FORMAT_ELEMENT_COMMAND which applies alignment only to whatever\r\n * blocks the current selection covers — i.e. just the isolated block.\r\n *\r\n * For non-range selections (e.g. a YouTube node selected as a node\r\n * selection), the update() returns early and the command still fires,\r\n * so YouTube / image alignment continues to work unchanged.\r\n */\r\n const applyAlignmentWithSplit = (formatType: 'left' | 'center' | 'right' | 'justify') => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n\r\n // Step 1 – split Shift+Enter multi-line blocks.\r\n $splitBlocksAtLineBreaks(selection);\r\n\r\n // Step 2 – split at partial-selection boundaries (word / phrase selection).\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) {\r\n $splitBlockAtPartialSelection(sel);\r\n }\r\n });\r\n\r\n // Dispatch AFTER the split update so the command sees the repositioned\r\n // selection and aligns only the isolated block(s).\r\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, formatType);\r\n };\r\n\r\n const updateHeading = (heading: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n // Step 1 – split multi-line blocks (Shift+Enter) so only the selected\r\n // line(s) are affected.\r\n $splitBlocksAtLineBreaks(selection);\r\n\r\n // Step 2 – if the selection covers only part of a single block (e.g.\r\n // one word in the middle of a paragraph), split the block at\r\n // the selection edges so the heading applies only to the\r\n // selected words, leaving the surrounding text as paragraphs.\r\n const sel = $getSelection();\r\n if ($isRangeSelection(sel)) {\r\n $splitBlockAtPartialSelection(sel);\r\n }\r\n\r\n $setBlocksType($getSelection(), () => $createHeadingNode(heading));\r\n }\r\n });\r\n\r\n editor.getEditorState().read(() => {\r\n updateToolbarPlugins();\r\n });\r\n };\r\n\r\n /**\r\n * Token renderer registry\r\n * Each token returns a React element (button/plugin/divider).\r\n * If token should render nothing (e.g. unknown), return null.\r\n */\r\n const renderToken = (token: ToolbarToken, groupIndex: number, tokenIndex: number) => {\r\n const key = `${groupIndex}-${tokenIndex}-${token}`;\r\n\r\n // ---------- Fluent UI v8 theme.palette mapping ----------\r\n const palette = theme.palette;\r\n\r\n const fg = palette.neutralPrimary; // main icon/text\r\n const fgSubtle = palette.neutralSecondary; // subtle icons (chevrons)\r\n const fgDisabled = palette.neutralTertiary; // disabled\r\n\r\n const brand = palette.themePrimary; // active/toggled icon\r\n const brandHover = palette.themeDarkAlt ?? brand;\r\n const brandPressed = palette.themeDark ?? brand;\r\n\r\n const 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 aria-label='Bold'\r\n aria-pressed={isBold}\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 aria-label='Italic'\r\n aria-pressed={isItalic}\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 aria-label='Underline'\r\n aria-pressed={isUnderline}\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 (\r\n <InsertLinkPlugin\r\n key={key}\r\n disabled={!isEditable || props.readOnly! || !hasTextSelection}\r\n setIsLinkEditMode={props.setIsLinkEditMode}\r\n />\r\n );\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 maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\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 maxImageSizeMB={props.maxImageSizeMB}\r\n validationMessages={props.validationMessages}\r\n />\r\n );\r\n\r\n case 'Youtube':\r\n return <YoutubeUploadPlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case 'Heading': {\r\n const headingLabel =\r\n selectNodeType === 'paragraph'\r\n ? 'Normal'\r\n : (HEADING_OPTION.find((h) => h.key === selectNodeType)?.text ?? selectNodeType);\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n title='Add heading'\r\n id={`heading-option-${groupIndex}`}\r\n placeholder='Format'\r\n disabled={!isEditable}\r\n style={{ minWidth: '100px' }}\r\n className={styles.dropdown}\r\n value={headingLabel}\r\n selectedOptions={[selectNodeType]}\r\n onOptionSelect={(_, data) => {\r\n const val = data.optionValue as HeadingTagType | 'paragraph' | undefined;\r\n if (!val) return;\r\n\r\n if (val === 'paragraph') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading(val);\r\n setSelectNodeType(val);\r\n }\r\n }}>\r\n <Option value='paragraph'>Normal</Option>\r\n\r\n {HEADING_OPTION.map((option, idx) => (\r\n <Option key={`${option.key}-${idx}`} value={option.key as HeadingTagType}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n case 'FontFamily':\r\n return <FontFamilyPlugin key={key} disabled={!isEditable || props.readOnly} />;\r\n\r\n case 'FontSize':\r\n return <FontSizePlugin key={key} disabled={!isEditable || props.readOnly!} />;\r\n\r\n case '|':\r\n return <ToolbarDivider key={key} />;\r\n\r\n // ── Standalone text-format toggle buttons ─────────────────────────────\r\n // These were previously only accessible inside the 'Decorators' dropdown.\r\n // Use them directly in customToolbar to show individual buttons instead.\r\n\r\n case 'Strikethrough':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Strikethrough'\r\n aria-pressed={isStrikethrough}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextStrikethroughFilled style={{ color: getIconColor(isStrikethrough) }} />}\r\n style={getButtonStyle(isStrikethrough)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Strikethrough)}\r\n />\r\n );\r\n\r\n case 'Subscript':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Subscript'\r\n aria-pressed={isSubscript}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextSubscriptFilled style={{ color: getIconColor(isSubscript) }} />}\r\n style={getButtonStyle(isSubscript)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Subscript)}\r\n />\r\n );\r\n\r\n case 'Superscript':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Superscript'\r\n aria-pressed={isSuperscript}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextSuperscriptFilled style={{ color: getIconColor(isSuperscript) }} />}\r\n style={getButtonStyle(isSuperscript)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Superscript)}\r\n />\r\n );\r\n\r\n case 'Highlight':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Highlight'\r\n aria-pressed={isHighlight}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <HighlightAccentFilled\r\n style={{ color: isEditable ? (isHighlight ? brand : fg) : fgDisabled }}\r\n />\r\n }\r\n style={getButtonStyle(isHighlight)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Highlight)}\r\n />\r\n );\r\n\r\n case 'Uppercase':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Uppercase'\r\n aria-pressed={isUppercase}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseUppercaseFilled style={{ color: getIconColor(isUppercase) }} />}\r\n style={getButtonStyle(isUppercase)}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase')}\r\n />\r\n );\r\n\r\n case 'Lowercase':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Lowercase'\r\n aria-pressed={isLowercase}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseLowercaseFilled style={{ color: getIconColor(isLowercase) }} />}\r\n style={getButtonStyle(isLowercase)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Lowercase)}\r\n />\r\n );\r\n\r\n case 'Capitalize':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Capitalize'\r\n aria-pressed={isCapitalize}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<TextCaseTitleFilled style={{ color: getIconColor(isCapitalize) }} />}\r\n style={getButtonStyle(isCapitalize)}\r\n onClick={() => onHandleSelectOption(RichTextPluginsType.Capitalize)}\r\n />\r\n );\r\n\r\n // ── Standalone list toggle buttons ────────────────────────────────────\r\n\r\n case 'BulletList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Bullet list'\r\n aria-pressed={selectNodeType === 'ul'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextBulletListLtrFilled style={{ color: getIconColor(selectNodeType === 'ul') }} />\r\n }\r\n style={getButtonStyle(selectNodeType === 'ul')}\r\n onClick={() =>\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n )\r\n }\r\n />\r\n );\r\n\r\n case 'NumberList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Number list'\r\n aria-pressed={selectNodeType === 'ol'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextNumberListLtrFilled style={{ color: getIconColor(selectNodeType === 'ol') }} />\r\n }\r\n style={getButtonStyle(selectNodeType === 'ol')}\r\n onClick={() =>\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n )\r\n }\r\n />\r\n );\r\n\r\n case 'AlphabeticalList':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Alphabetical list'\r\n aria-pressed={selectNodeType === 'alpha'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={\r\n <TextAlphaListLtrFilled\r\n style={{ color: getIconColor(selectNodeType === 'alpha') }}\r\n />\r\n }\r\n style={getButtonStyle(selectNodeType === 'alpha')}\r\n onClick={() => editor.update(() => $toggleAlphaList())}\r\n />\r\n );\r\n\r\n // ── Standalone block buttons ──────────────────────────────────────────\r\n\r\n case 'Quote':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Quote'\r\n aria-pressed={selectNodeType === 'quote'}\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<CommentQuoteRegular style={{ color: getIconColor(selectNodeType === 'quote') }} />}\r\n style={getButtonStyle(selectNodeType === 'quote')}\r\n onClick={() => formatQuote()}\r\n />\r\n );\r\n\r\n case 'PageBreak':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Page break'\r\n disabled={!isEditable || props.readOnly!}\r\n icon={<DocumentPageBreakRegular style={{ color: getIconColor() }} />}\r\n style={getButtonStyle()}\r\n onClick={() => editor.dispatchCommand(INSERT_PAGE_BREAK, undefined)}\r\n />\r\n );\r\n\r\n // ── Standalone heading-level toggle buttons ───────────────────────────\r\n // Each button sets (or toggles off) that specific heading level.\r\n // Clicking an active heading reverts to normal paragraph.\r\n\r\n case 'H1':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 1'\r\n aria-pressed={selectNodeType === 'h1'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h1'),\r\n color: getIconColor(selectNodeType === 'h1'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h1') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h1');\r\n setSelectNodeType('h1');\r\n }\r\n }}>\r\n H1\r\n </Button>\r\n );\r\n\r\n case 'H2':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 2'\r\n aria-pressed={selectNodeType === 'h2'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h2'),\r\n color: getIconColor(selectNodeType === 'h2'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h2') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h2');\r\n setSelectNodeType('h2');\r\n }\r\n }}>\r\n H2\r\n </Button>\r\n );\r\n\r\n case 'H3':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 3'\r\n aria-pressed={selectNodeType === 'h3'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h3'),\r\n color: getIconColor(selectNodeType === 'h3'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h3') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h3');\r\n setSelectNodeType('h3');\r\n }\r\n }}>\r\n H3\r\n </Button>\r\n );\r\n\r\n case 'H4':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 4'\r\n aria-pressed={selectNodeType === 'h4'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h4'),\r\n color: getIconColor(selectNodeType === 'h4'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h4') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h4');\r\n setSelectNodeType('h4');\r\n }\r\n }}>\r\n H4\r\n </Button>\r\n );\r\n\r\n case 'H5':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 5'\r\n aria-pressed={selectNodeType === 'h5'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h5'),\r\n color: getIconColor(selectNodeType === 'h5'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h5') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h5');\r\n setSelectNodeType('h5');\r\n }\r\n }}>\r\n H5\r\n </Button>\r\n );\r\n\r\n case 'H6':\r\n return (\r\n <Button\r\n key={key}\r\n size='small'\r\n aria-label='Heading 6'\r\n aria-pressed={selectNodeType === 'h6'}\r\n disabled={!isEditable || props.readOnly!}\r\n style={{\r\n ...getButtonStyle(selectNodeType === 'h6'),\r\n color: getIconColor(selectNodeType === 'h6'),\r\n fontSize: 12,\r\n fontWeight: 600,\r\n }}\r\n onClick={() => {\r\n if (selectNodeType === 'h6') {\r\n formatParagraph(editor);\r\n setSelectNodeType('paragraph');\r\n } else {\r\n updateHeading('h6');\r\n setSelectNodeType('h6');\r\n }\r\n }}>\r\n H6\r\n </Button>\r\n );\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 === 'alpha' ? ['al-list'] : []),\r\n ...(selectNodeType === 'quote' ? ['quote'] : []),\r\n ];\r\n\r\n const DECORATOR_LABEL: Record<string, string> = {\r\n uppercase: 'Uppercase',\r\n lowercase: 'Lowercase',\r\n capitalize: 'Capitalize',\r\n strike: 'Strikethrough',\r\n subscript: 'Subscript',\r\n superscript: 'Superscript',\r\n highlight: 'Highlight',\r\n 'ul-list': 'Bullet list',\r\n 'ol-list': 'Number list',\r\n 'al-list': 'Alphabetical list',\r\n quote: 'Quote',\r\n };\r\n\r\n const decoratorValue =\r\n activeDecorators.length === 0\r\n ? ''\r\n : activeDecorators.length === 1\r\n ? DECORATOR_LABEL[activeDecorators[0]]\r\n : `${DECORATOR_LABEL[activeDecorators[0]]} +${activeDecorators.length - 1}`;\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n multiselect\r\n id={`${groupIndex}-set-decorators`}\r\n placeholder='Text'\r\n value={decoratorValue}\r\n selectedOptions={activeDecorators}\r\n disabled={!isEditable}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '180px' } }}\r\n open={decoratorOpen}\r\n onOpenChange={(_, data) => {\r\n // Suppress the close that Fluent UI fires right after an option is\r\n // selected — we only want to close on click-outside or Escape.\r\n if (decoratorSelectingRef.current) {\r\n decoratorSelectingRef.current = false;\r\n return;\r\n }\r\n setDecoratorOpen(data.open);\r\n }}\r\n onOptionSelect={(_, data) => {\r\n decoratorSelectingRef.current = true;\r\n switch (data.optionValue as string) {\r\n case 'uppercase':\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'uppercase');\r\n break;\r\n case 'lowercase':\r\n onHandleSelectOption(RichTextPluginsType.Lowercase);\r\n break;\r\n case 'capitalize':\r\n onHandleSelectOption(RichTextPluginsType.Capitalize);\r\n break;\r\n case 'strike':\r\n onHandleSelectOption(RichTextPluginsType.Strikethrough);\r\n break;\r\n case 'subscript':\r\n onHandleSelectOption(RichTextPluginsType.Subscript);\r\n break;\r\n case 'superscript':\r\n onHandleSelectOption(RichTextPluginsType.Superscript);\r\n break;\r\n case 'highlight':\r\n onHandleSelectOption(RichTextPluginsType.Highlight);\r\n break;\r\n case 'ul-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ul' ? REMOVE_LIST_COMMAND : INSERT_UNORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'ol-list':\r\n editor.dispatchCommand(\r\n selectNodeType === 'ol' ? REMOVE_LIST_COMMAND : INSERT_ORDERED_LIST_COMMAND,\r\n undefined,\r\n );\r\n break;\r\n case 'al-list':\r\n editor.update(() => $toggleAlphaList());\r\n break;\r\n case 'page-break':\r\n editor.dispatchCommand(INSERT_PAGE_BREAK, undefined);\r\n break;\r\n case 'quote':\r\n formatQuote();\r\n break;\r\n }\r\n }}>\r\n <Option value='uppercase' text='Uppercase'>\r\n <TextCaseUppercaseFilled style={optionIconStyle} />\r\n Uppercase\r\n </Option>\r\n <Option value='lowercase' text='Lowercase'>\r\n <TextCaseLowercaseFilled style={optionIconStyle} />\r\n Lowercase\r\n </Option>\r\n <Option value='capitalize' text='Capitalize'>\r\n <TextCaseTitleFilled style={optionIconStyle} />\r\n Capitalize\r\n </Option>\r\n <Option value='strike' text='Strikethrough'>\r\n <TextStrikethroughFilled style={optionIconStyle} />\r\n Strikethrough\r\n </Option>\r\n <Option value='subscript' text='Subscript'>\r\n <TextSubscriptFilled style={optionIconStyle} />\r\n Subscript\r\n </Option>\r\n <Option value='superscript' text='Superscript'>\r\n <TextSuperscriptFilled style={optionIconStyle} />\r\n Superscript\r\n </Option>\r\n <Option value='highlight' text='Highlight'>\r\n <HighlightAccentFilled\r\n style={{ ...optionIconStyle, color: isEditable ? brand : fgDisabled }}\r\n />\r\n Highlight\r\n </Option>\r\n <Option value='ul-list' text='Bullet list'>\r\n <TextBulletListLtrFilled style={optionIconStyle} />\r\n Bullet list\r\n </Option>\r\n <Option value='ol-list' text='Number list'>\r\n <TextNumberListLtrFilled style={optionIconStyle} />\r\n Number list\r\n </Option>\r\n <Option value='al-list' text='Alphabetical list'>\r\n <TextAlphaListLtrFilled style={optionIconStyle} />\r\n Alphabetical list\r\n </Option>\r\n <Option value='page-break' text='Page Break'>\r\n <DocumentPageBreakRegular style={optionIconStyle} />\r\n Page break\r\n </Option>\r\n <Option value='quote' text='Quote'>\r\n <CommentQuoteRegular style={optionIconStyle} />\r\n Quote\r\n </Option>\r\n </Dropdown>\r\n );\r\n }\r\n\r\n // case 'CodeBlock':\r\n // return (\r\n // <CodeBlockPlugin\r\n // key={key}\r\n // codeLanguage={codeLanguage}\r\n // selectNodeType={selectNodeType}\r\n // selectedElementKey={selectedNodeKey}\r\n // disabled={!isEditable}\r\n // />\r\n // );\r\n\r\n case 'Align': {\r\n const ALIGN_OPTIONS = [\r\n {\r\n value: 'left',\r\n label: 'Left Align',\r\n icon: <TextAlignLeftFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.LeftAlign,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Center Align',\r\n icon: <TextAlignCenterFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.CenterAlign,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Right Align',\r\n icon: <TextAlignRightFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.RightAlign,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify Align',\r\n icon: <TextAlignJustifyFilled style={optionIconStyle} />,\r\n action: RichTextPluginsType.JustifyAlign,\r\n },\r\n ];\r\n const alignLabel = ALIGN_OPTIONS.find((o) => o.value === alignment)?.label ?? 'Left Align';\r\n\r\n return (\r\n <Dropdown\r\n key={key}\r\n id='set-alignment'\r\n disabled={!isEditable}\r\n placeholder='Left Align'\r\n value={alignLabel}\r\n selectedOptions={[alignment]}\r\n className={styles.alignDropdown}\r\n button={{ style: dropdownButtonStyle }}\r\n expandIcon={{ style: dropdownExpandIconStyle }}\r\n listbox={{ style: { minInlineSize: '170px' } }}\r\n onOptionSelect={(_, data) => {\r\n const opt = ALIGN_OPTIONS.find((o) => o.value === data.optionValue);\r\n if (opt) onHandleSelectOption(opt.action);\r\n }}>\r\n {ALIGN_OPTIONS.map((opt) => (\r\n <Option key={opt.value} value={opt.value} text={opt.label}>\r\n {opt.icon}\r\n {opt.label}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n );\r\n }\r\n\r\n 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"]}