sykpcomposer 1.20.133 → 1.20.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ImageComponent-3627f884.js → ImageComponent-26d24c20.js} +3 -3
- package/dist/{ImageComponent-3627f884.js.map → ImageComponent-26d24c20.js.map} +1 -1
- package/dist/{InlineImageComponent-63638e68.js → InlineImageComponent-982a1399.js} +3 -3
- package/dist/{InlineImageComponent-63638e68.js.map → InlineImageComponent-982a1399.js.map} +1 -1
- package/dist/{LexicalNestedComposer.prod-b5a6e731.js → LexicalNestedComposer.prod-fb4b9ebf.js} +2 -2
- package/dist/{LexicalNestedComposer.prod-b5a6e731.js.map → LexicalNestedComposer.prod-fb4b9ebf.js.map} +1 -1
- package/dist/{PollComponent-029dec37.js → PollComponent-18f1d6e1.js} +2 -2
- package/dist/{PollComponent-029dec37.js.map → PollComponent-18f1d6e1.js.map} +1 -1
- package/dist/{index-88bdacf5.js → index-dd17fa67.js} +51 -42
- package/dist/{index-88bdacf5.js.map → index-dd17fa67.js.map} +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +4 -4
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineImageComponent-63638e68.js","sources":["../src/lexical/utils/getDOMRangeRect.ts","../src/lexical/utils/setFloatingElemPosition.ts","../src/lexical/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/lexical/ui/Select.tsx","../src/lexical/nodes/InlineImageComponent.tsx"],"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\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = window.getSelection();\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n): 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 updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Select.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype SelectIntrinsicProps = JSX.IntrinsicElements['select'];\r\ninterface SelectProps extends SelectIntrinsicProps {\r\n label: string;\r\n}\r\n\r\nexport default function Select({\r\n children,\r\n label,\r\n className,\r\n ...other\r\n}: SelectProps): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label style={{marginTop: '-1em'}} className=\"Input__label\">\r\n {label}\r\n </label>\r\n <select {...other} className={className || 'select'}>\r\n {children}\r\n </select>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {Position} from './InlineImageNode';\r\nimport type {BaseSelection, LexicalEditor, NodeKey} from 'lexical';\r\n\r\nimport './InlineImageNode.css';\r\n\r\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary';\r\nimport {LexicalNestedComposer} from '@lexical/react/LexicalNestedComposer';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\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 * as React from 'react';\r\nimport {Suspense, useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nimport useModal from '../hooks/useModal';\r\nimport FloatingTextFormatToolbarPlugin from '../plugins/FloatingTextFormatToolbarPlugin/index';\r\nimport LinkPlugin from '../plugins/LinkPlugin';\r\nimport Button from '../ui/Button';\r\nimport ContentEditable from '../ui/ContentEditable';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport Placeholder from '../ui/Placeholder';\r\nimport Select from '../ui/Select';\r\nimport TextInput from '../ui/TextInput';\r\nimport {$isInlineImageNode, InlineImageNode} from './InlineImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nfunction 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\nfunction LazyImage({\r\n altText,\r\n className,\r\n imageRef,\r\n src,\r\n width,\r\n height,\r\n position,\r\n}: {\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): 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\nexport function UpdateInlineImageDialog({\r\n activeEditor,\r\n nodeKey,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n nodeKey: NodeKey;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const editorState = activeEditor.getEditorState();\r\n const node = editorState.read(\r\n () => $getNodeByKey(nodeKey) as InlineImageNode,\r\n );\r\n const [altText, setAltText] = useState(node.getAltText());\r\n const [showCaption, setShowCaption] = useState(node.getShowCaption());\r\n const [position, setPosition] = useState<Position>(node.getPosition());\r\n\r\n const handleShowCaptionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setShowCaption(e.target.checked);\r\n };\r\n\r\n const handlePositionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n setPosition(e.target.value as Position);\r\n };\r\n\r\n const handleOnConfirm = () => {\r\n const payload = {altText, position, showCaption};\r\n if (node) {\r\n activeEditor.update(() => {\r\n node.update(payload);\r\n });\r\n }\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <div style={{marginBottom: '1em'}}>\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n\r\n <Select\r\n style={{marginBottom: '1em', width: '208px'}}\r\n value={position}\r\n label=\"Position\"\r\n name=\"position\"\r\n id=\"position-select\"\r\n onChange={handlePositionChange}>\r\n <option value=\"left\">Left</option>\r\n <option value=\"right\">Right</option>\r\n <option value=\"full\">Full Width</option>\r\n </Select>\r\n\r\n <div className=\"Input__wrapper\">\r\n <input\r\n id=\"caption\"\r\n type=\"checkbox\"\r\n checked={showCaption}\r\n onChange={handleShowCaptionChange}\r\n />\r\n <label htmlFor=\"caption\">Show Caption</label>\r\n </div>\r\n\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n onClick={() => handleOnConfirm()}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function InlineImageComponent({\r\n src,\r\n altText,\r\n nodeKey,\r\n width,\r\n height,\r\n showCaption,\r\n caption,\r\n position,\r\n}: {\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [editor] = useLexicalComposerContext();\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n const onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n onDelete,\r\n onEnter,\r\n onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n <button\r\n className=\"image-edit-button\"\r\n ref={buttonRef}\r\n onClick={() => {\r\n showModal('Update Inline Image', (onClose) => (\r\n <UpdateInlineImageDialog\r\n activeEditor={editor}\r\n nodeKey={nodeKey}\r\n onClose={onClose}\r\n />\r\n ));\r\n }}>\r\n Edit\r\n </button>\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 </div>\r\n {showCaption && (\r\n <div className=\"image-caption-container\">\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <AutoFocusPlugin />\r\n <LinkPlugin />\r\n <FloatingTextFormatToolbarPlugin />\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable className=\"InlineImageNode__contentEditable\" />\r\n }\r\n placeholder={\r\n <Placeholder className=\"InlineImageNode__placeholder\">\r\n Enter a caption...\r\n </Placeholder>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n </div>\r\n )}\r\n </>\r\n {modal}\r\n </Suspense>\r\n );\r\n}\r\n"],"names":["getDOMRangeRect","nativeSelection","rootElement","domRange","rect","inner","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPosition","targetRect","floatingElem","anchorElem","isLink","verticalGap","horizontalOffset","scrollerElem","floatingElemRect","anchorElementRect","editorScrollerRect","top","left","TextFormatFloatingToolbar","editor","isBold","isItalic","isUnderline","isCode","isStrikethrough","isSubscript","isSuperscript","popupCharStylesEditorRef","useRef","insertLink","useCallback","TOGGLE_LINK_COMMAND","insertComment","INSERT_INLINE_COMMAND","mouseMoveListener","e","x","y","elementUnderMouse","mouseUpListener","useEffect","updateTextFormatFloatingToolbar","selection","$getSelection","popupCharStylesEditorElem","rangeRect","update","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","jsxs","Fragment","jsx","FORMAT_TEXT_COMMAND","useFloatingTextFormatToolbar","isText","setIsText","useState","setIsLink","setIsBold","setIsItalic","setIsUnderline","setIsStrikethrough","setIsSubscript","setIsSuperscript","setIsCode","updatePopup","$isRangeSelection","node","getSelectedNode","parent","$isLinkNode","$isCodeHighlightNode","$isTextNode","$isParagraphNode","rawTextContent","createPortal","FloatingTextFormatToolbarPlugin","useLexicalComposerContext","Select","children","label","className","other","imageCache","useSuspenseImage","src","resolve","img","LazyImage","altText","imageRef","width","height","position","UpdateInlineImageDialog","activeEditor","nodeKey","onClose","$getNodeByKey","setAltText","showCaption","setShowCaption","setPosition","handleShowCaptionChange","handlePositionChange","handleOnConfirm","payload","TextInput","DialogActions","Button","InlineImageComponent","caption","modal","showModal","useModal","buttonRef","isSelected","setSelected","clearSelection","useLexicalNodeSelection","setSelection","activeEditorRef","onDelete","$isNodeSelection","$isInlineImageNode","onEnter","event","latestSelection","buttonElem","$setSelection","onEscape","parentRootElement","isMounted","unregister","_","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","draggable","isFocused","Suspense","LexicalNestedComposer","AutoFocusPlugin","LinkPlugin","RichTextPlugin","ContentEditable","Placeholder","LexicalErrorBoundary"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InlineImageComponent-982a1399.js","sources":["../src/lexical/utils/getDOMRangeRect.ts","../src/lexical/utils/setFloatingElemPosition.ts","../src/lexical/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/lexical/ui/Select.tsx","../src/lexical/nodes/InlineImageComponent.tsx"],"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\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = window.getSelection();\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n): 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 updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Select.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype SelectIntrinsicProps = JSX.IntrinsicElements['select'];\r\ninterface SelectProps extends SelectIntrinsicProps {\r\n label: string;\r\n}\r\n\r\nexport default function Select({\r\n children,\r\n label,\r\n className,\r\n ...other\r\n}: SelectProps): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label style={{marginTop: '-1em'}} className=\"Input__label\">\r\n {label}\r\n </label>\r\n <select {...other} className={className || 'select'}>\r\n {children}\r\n </select>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {Position} from './InlineImageNode';\r\nimport type {BaseSelection, LexicalEditor, NodeKey} from 'lexical';\r\n\r\nimport './InlineImageNode.css';\r\n\r\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary';\r\nimport {LexicalNestedComposer} from '@lexical/react/LexicalNestedComposer';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\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 * as React from 'react';\r\nimport {Suspense, useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nimport useModal from '../hooks/useModal';\r\nimport FloatingTextFormatToolbarPlugin from '../plugins/FloatingTextFormatToolbarPlugin/index';\r\nimport LinkPlugin from '../plugins/LinkPlugin';\r\nimport Button from '../ui/Button';\r\nimport ContentEditable from '../ui/ContentEditable';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport Placeholder from '../ui/Placeholder';\r\nimport Select from '../ui/Select';\r\nimport TextInput from '../ui/TextInput';\r\nimport {$isInlineImageNode, InlineImageNode} from './InlineImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nfunction 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\nfunction LazyImage({\r\n altText,\r\n className,\r\n imageRef,\r\n src,\r\n width,\r\n height,\r\n position,\r\n}: {\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): 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\nexport function UpdateInlineImageDialog({\r\n activeEditor,\r\n nodeKey,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n nodeKey: NodeKey;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const editorState = activeEditor.getEditorState();\r\n const node = editorState.read(\r\n () => $getNodeByKey(nodeKey) as InlineImageNode,\r\n );\r\n const [altText, setAltText] = useState(node.getAltText());\r\n const [showCaption, setShowCaption] = useState(node.getShowCaption());\r\n const [position, setPosition] = useState<Position>(node.getPosition());\r\n\r\n const handleShowCaptionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setShowCaption(e.target.checked);\r\n };\r\n\r\n const handlePositionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n setPosition(e.target.value as Position);\r\n };\r\n\r\n const handleOnConfirm = () => {\r\n const payload = {altText, position, showCaption};\r\n if (node) {\r\n activeEditor.update(() => {\r\n node.update(payload);\r\n });\r\n }\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <div style={{marginBottom: '1em'}}>\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n\r\n <Select\r\n style={{marginBottom: '1em', width: '208px'}}\r\n value={position}\r\n label=\"Position\"\r\n name=\"position\"\r\n id=\"position-select\"\r\n onChange={handlePositionChange}>\r\n <option value=\"left\">Left</option>\r\n <option value=\"right\">Right</option>\r\n <option value=\"full\">Full Width</option>\r\n </Select>\r\n\r\n <div className=\"Input__wrapper\">\r\n <input\r\n id=\"caption\"\r\n type=\"checkbox\"\r\n checked={showCaption}\r\n onChange={handleShowCaptionChange}\r\n />\r\n <label htmlFor=\"caption\">Show Caption</label>\r\n </div>\r\n\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n onClick={() => handleOnConfirm()}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function InlineImageComponent({\r\n src,\r\n altText,\r\n nodeKey,\r\n width,\r\n height,\r\n showCaption,\r\n caption,\r\n position,\r\n}: {\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [editor] = useLexicalComposerContext();\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n const onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n onDelete,\r\n onEnter,\r\n onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n <button\r\n className=\"image-edit-button\"\r\n ref={buttonRef}\r\n onClick={() => {\r\n showModal('Update Inline Image', (onClose) => (\r\n <UpdateInlineImageDialog\r\n activeEditor={editor}\r\n nodeKey={nodeKey}\r\n onClose={onClose}\r\n />\r\n ));\r\n }}>\r\n Edit\r\n </button>\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 </div>\r\n {showCaption && (\r\n <div className=\"image-caption-container\">\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <AutoFocusPlugin />\r\n <LinkPlugin />\r\n <FloatingTextFormatToolbarPlugin />\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable className=\"InlineImageNode__contentEditable\" />\r\n }\r\n placeholder={\r\n <Placeholder className=\"InlineImageNode__placeholder\">\r\n Enter a caption...\r\n </Placeholder>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n </div>\r\n )}\r\n </>\r\n {modal}\r\n </Suspense>\r\n );\r\n}\r\n"],"names":["getDOMRangeRect","nativeSelection","rootElement","domRange","rect","inner","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPosition","targetRect","floatingElem","anchorElem","isLink","verticalGap","horizontalOffset","scrollerElem","floatingElemRect","anchorElementRect","editorScrollerRect","top","left","TextFormatFloatingToolbar","editor","isBold","isItalic","isUnderline","isCode","isStrikethrough","isSubscript","isSuperscript","popupCharStylesEditorRef","useRef","insertLink","useCallback","TOGGLE_LINK_COMMAND","insertComment","INSERT_INLINE_COMMAND","mouseMoveListener","e","x","y","elementUnderMouse","mouseUpListener","useEffect","updateTextFormatFloatingToolbar","selection","$getSelection","popupCharStylesEditorElem","rangeRect","update","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","jsxs","Fragment","jsx","FORMAT_TEXT_COMMAND","useFloatingTextFormatToolbar","isText","setIsText","useState","setIsLink","setIsBold","setIsItalic","setIsUnderline","setIsStrikethrough","setIsSubscript","setIsSuperscript","setIsCode","updatePopup","$isRangeSelection","node","getSelectedNode","parent","$isLinkNode","$isCodeHighlightNode","$isTextNode","$isParagraphNode","rawTextContent","createPortal","FloatingTextFormatToolbarPlugin","useLexicalComposerContext","Select","children","label","className","other","imageCache","useSuspenseImage","src","resolve","img","LazyImage","altText","imageRef","width","height","position","UpdateInlineImageDialog","activeEditor","nodeKey","onClose","$getNodeByKey","setAltText","showCaption","setShowCaption","setPosition","handleShowCaptionChange","handlePositionChange","handleOnConfirm","payload","TextInput","DialogActions","Button","InlineImageComponent","caption","modal","showModal","useModal","buttonRef","isSelected","setSelected","clearSelection","useLexicalNodeSelection","setSelection","activeEditorRef","onDelete","$isNodeSelection","$isInlineImageNode","onEnter","event","latestSelection","buttonElem","$setSelection","onEscape","parentRootElement","isMounted","unregister","_","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","draggable","isFocused","Suspense","LexicalNestedComposer","AutoFocusPlugin","LinkPlugin","RichTextPlugin","ContentEditable","Placeholder","LexicalErrorBoundary"],"mappings":"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"}
|
package/dist/{LexicalNestedComposer.prod-b5a6e731.js → LexicalNestedComposer.prod-fb4b9ebf.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as u, H as y, J as E, j as k } from "./index-
|
|
1
|
+
import { F as u, H as y, J as E, j as k } from "./index-dd17fa67.js";
|
|
2
2
|
import { useRef as O, useContext as j, useMemo as D, useEffect as h } from "react";
|
|
3
3
|
function K(e) {
|
|
4
4
|
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
@@ -45,4 +45,4 @@ function P({ initialEditor: e, children: r, initialNodes: o, initialTheme: g, sk
|
|
|
45
45
|
export {
|
|
46
46
|
P as d
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=LexicalNestedComposer.prod-
|
|
48
|
+
//# sourceMappingURL=LexicalNestedComposer.prod-fb4b9ebf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LexicalNestedComposer.prod-
|
|
1
|
+
{"version":3,"file":"LexicalNestedComposer.prod-fb4b9ebf.js","sources":["../node_modules/@lexical/react/LexicalNestedComposer.prod.mjs"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useCollaborationContext as e}from\"@lexical/react/LexicalCollaborationContext\";import{LexicalComposerContext as t,createLexicalComposerContext as r}from\"@lexical/react/LexicalComposerContext\";import{useRef as o,useContext as n,useMemo as l,useEffect as i}from\"react\";import{jsx as a}from\"react/jsx-runtime\";function s(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var c=s((function(e){const t=new URLSearchParams;t.append(\"code\",e);for(let e=1;e<arguments.length;e++)t.append(\"v\",arguments[e]);throw Error(`Minified Lexical error #${e}; visit https://lexical.dev/docs/error?${t} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}));function p(e){const t=e.transform();return null!==t?new Set([t]):new Set}function d({initialEditor:s,children:d,initialNodes:f,initialTheme:u,skipCollabChecks:m}){const h=o(!1),x=n(t);null==x&&c(9);const[_,{getTheme:g}]=x,v=l((()=>{const e=u||g()||void 0,t=r(x,e);if(void 0!==e&&(s._config.theme=e),s._parentEditor=_,f)for(let e of f){let t=null,r=null;if(\"function\"!=typeof e){const o=e;e=o.replace,t=o.with,r=o.withKlass||null}const o=s._nodes.get(e.getType());s._nodes.set(e.getType(),{exportDOM:o?o.exportDOM:void 0,klass:e,replace:t,replaceWithKlass:r,transforms:p(e)})}else{const e=s._nodes=new Map(_._nodes);for(const[t,r]of e)s._nodes.set(t,{exportDOM:r.exportDOM,klass:r.klass,replace:r.replace,replaceWithKlass:r.replaceWithKlass,transforms:p(r.klass)})}return s._config.namespace=_._config.namespace,s._editable=_._editable,[s,t]}),[]),{isCollabActive:w,yjsDocMap:b}=e(),M=m||h.current||b.has(s.getKey());return i((()=>{M&&(h.current=!0)}),[M]),i((()=>_.registerEditableListener((e=>{s.setEditable(e)}))),[s,_]),a(t.Provider,{value:v,children:!w||M?d:null})}export{d as LexicalNestedComposer};\n"],"names":["s","c","t","e","p","d","f","u","m","h","o","x","n","_","g","v","l","r","b","M","i","a"],"mappings":";;AAQyT,SAASA,EAAE,GAAE;AAAC,SAAO,KAAG,EAAE,cAAY,OAAO,UAAU,eAAe,KAAK,GAAE,SAAS,IAAE,EAAE,UAAQ;AAAC;AAAC,IAAIC,IAAED,EAAG,SAAS,GAAE;AAAC,QAAME,IAAE,IAAI;AAAgB,EAAAA,EAAE,OAAO,QAAO,CAAC;AAAE,WAAQC,IAAE,GAAEA,IAAE,UAAU,QAAOA;AAAI,IAAAD,EAAE,OAAO,KAAI,UAAUC,CAAC,CAAC;AAAE,QAAM,MAAM,2BAA2B,CAAC,0CAA0CD,CAAC,gHAAgH;AAAC,CAAC;AAAG,SAASE,EAAE,GAAE;AAAC,QAAMF,IAAE,EAAE,UAAW;AAAC,SAAcA,MAAP,OAAS,oBAAI,IAAI,CAACA,CAAC,CAAC,IAAE,oBAAI;AAAG;AAAC,SAASG,EAAE,EAAC,eAAcL,GAAE,UAASK,GAAE,cAAaC,GAAE,cAAaC,GAAE,kBAAiBC,EAAC,GAAE;AAAC,QAAMC,IAAEC,EAAE,EAAE,GAAEC,IAAEC,EAAEV,CAAC;AAAE,EAAMS,KAAN,QAASV,EAAE,CAAC;AAAE,QAAK,CAACY,GAAE,EAAC,UAASC,EAAC,CAAC,IAAEH,GAAEI,IAAEC,EAAG,MAAI;AAAC,UAAMb,IAAEI,KAAGO,EAAG,KAAE,QAAOZ,IAAEe,EAAEN,GAAER,CAAC;AAAE,QAAYA,MAAT,WAAaH,EAAE,QAAQ,QAAMG,IAAGH,EAAE,gBAAca,GAAEP;AAAE,eAAQH,KAAKG,GAAE;AAAC,YAAIJ,IAAE,MAAKe,IAAE;AAAK,YAAe,OAAOd,KAAnB,YAAqB;AAAC,gBAAMO,IAAEP;AAAE,UAAAA,IAAEO,EAAE,SAAQR,IAAEQ,EAAE,MAAKO,IAAEP,EAAE,aAAW;AAAA,QAAI;AAAC,cAAMA,IAAEV,EAAE,OAAO,IAAIG,EAAE,QAAS,CAAA;AAAE,QAAAH,EAAE,OAAO,IAAIG,EAAE,QAAO,GAAG,EAAC,WAAUO,IAAEA,EAAE,YAAU,QAAO,OAAMP,GAAE,SAAQD,GAAE,kBAAiBe,GAAE,YAAWb,EAAED,CAAC,EAAC,CAAC;AAAA,MAAC;AAAA,SAAK;AAAC,YAAMA,IAAEH,EAAE,SAAO,IAAI,IAAIa,EAAE,MAAM;AAAE,iBAAS,CAACX,GAAEe,CAAC,KAAId;AAAE,QAAAH,EAAE,OAAO,IAAIE,GAAE,EAAC,WAAUe,EAAE,WAAU,OAAMA,EAAE,OAAM,SAAQA,EAAE,SAAQ,kBAAiBA,EAAE,kBAAiB,YAAWb,EAAEa,EAAE,KAAK,EAAC,CAAC;AAAA,IAAC;AAAC,WAAOjB,EAAE,QAAQ,YAAUa,EAAE,QAAQ,WAAUb,EAAE,YAAUa,EAAE,WAAU,CAACb,GAAEE,CAAC;AAAA,EAAC,GAAG,CAAE,CAAA,GAAE,EAAC,gBAAe,GAAE,WAAUgB,EAAC,IAAEf,KAAIgB,IAAEX,KAAGC,EAAE,WAASS,EAAE,IAAIlB,EAAE,OAAM,CAAE;AAAE,SAAOoB,EAAG,MAAI;AAAC,IAAAD,MAAIV,EAAE,UAAQ;AAAA,EAAG,GAAG,CAACU,CAAC,CAAC,GAAEC,EAAG,MAAIP,EAAE,yBAA0B,CAAAV,MAAG;AAAC,IAAAH,EAAE,YAAYG,CAAC;AAAA,EAAC,CAAG,GAAE,CAACH,GAAEa,CAAC,CAAC,GAAEQ,EAAAA,IAAEnB,EAAE,UAAS,EAAC,OAAMa,GAAE,UAAS,CAAC,KAAGI,IAAEd,IAAE,KAAI,CAAC;AAAC;","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as O, u as S, d as C, w as P, x as g, K as j, e as I, k as D, C as f, h as E, r as $, j as t, E as V, J as R, M as k, N as w } from "./index-
|
|
1
|
+
import { a as O, u as S, d as C, w as P, x as g, K as j, e as I, k as D, C as f, h as E, r as $, j as t, E as V, J as R, M as k, N as w } from "./index-dd17fa67.js";
|
|
2
2
|
import { useMemo as y, useState as A, useRef as b, useCallback as M, useEffect as T } from "react";
|
|
3
3
|
import "react-dom";
|
|
4
4
|
function W(s) {
|
|
@@ -166,4 +166,4 @@ function U({
|
|
|
166
166
|
export {
|
|
167
167
|
U as default
|
|
168
168
|
};
|
|
169
|
-
//# sourceMappingURL=PollComponent-
|
|
169
|
+
//# sourceMappingURL=PollComponent-18f1d6e1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollComponent-029dec37.js","sources":["../src/lexical/nodes/PollComponent.tsx"],"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 type {Option, Options, PollNode} from './PollNode';\r\n\r\nimport './PollNode.css';\r\n\r\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n NodeKey,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport joinClasses from '../utils/joinClasses';\r\nimport {$isPollNode, createPollOption} from './PollNode';\r\n\r\nfunction getTotalVotes(options: Options): number {\r\n return options.reduce((totalVotes, next) => {\r\n return totalVotes + next.votes.length;\r\n }, 0);\r\n}\r\n\r\nfunction PollOptionComponent({\r\n option,\r\n index,\r\n options,\r\n totalVotes,\r\n withPollNode,\r\n}: {\r\n index: number;\r\n option: Option;\r\n options: Options;\r\n totalVotes: number;\r\n withPollNode: (\r\n cb: (pollNode: PollNode) => void,\r\n onSelect?: () => void,\r\n ) => void;\r\n}): JSX.Element {\r\n const {clientID} = useCollaborationContext();\r\n const checkboxRef = useRef(null);\r\n const votesArray = option.votes;\r\n const checkedIndex = votesArray.indexOf(clientID);\r\n const checked = checkedIndex !== -1;\r\n const votes = votesArray.length;\r\n const text = option.text;\r\n\r\n return (\r\n <div className=\"PollNode__optionContainer\">\r\n <div\r\n className={joinClasses(\r\n 'PollNode__optionCheckboxWrapper',\r\n checked && 'PollNode__optionCheckboxChecked',\r\n )}>\r\n <input\r\n ref={checkboxRef}\r\n className=\"PollNode__optionCheckbox\"\r\n type=\"checkbox\"\r\n onChange={(e) => {\r\n withPollNode((node) => {\r\n node.toggleVote(option, clientID);\r\n });\r\n }}\r\n checked={checked}\r\n />\r\n </div>\r\n <div className=\"PollNode__optionInputWrapper\">\r\n <div\r\n className=\"PollNode__optionInputVotes\"\r\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\r\n />\r\n <span className=\"PollNode__optionInputVotesCount\">\r\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\r\n </span>\r\n <input\r\n className=\"PollNode__optionInput\"\r\n type=\"text\"\r\n value={text}\r\n onChange={(e) => {\r\n const target = e.target;\r\n const value = target.value;\r\n const selectionStart = target.selectionStart;\r\n const selectionEnd = target.selectionEnd;\r\n withPollNode(\r\n (node) => {\r\n node.setOptionText(option, value);\r\n },\r\n () => {\r\n target.selectionStart = selectionStart;\r\n target.selectionEnd = selectionEnd;\r\n },\r\n );\r\n }}\r\n placeholder={`Option ${index + 1}`}\r\n />\r\n </div>\r\n <button\r\n disabled={options.length < 3}\r\n className={joinClasses(\r\n 'PollNode__optionDelete',\r\n options.length < 3 && 'PollNode__optionDeleteDisabled',\r\n )}\r\n aria-label=\"Remove\"\r\n onClick={() => {\r\n withPollNode((node) => {\r\n node.deleteOption(option);\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default function PollComponent({\r\n question,\r\n options,\r\n nodeKey,\r\n}: {\r\n nodeKey: NodeKey;\r\n options: Options;\r\n question: string;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const ref = useRef(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n\r\n if (event.target === ref.current) {\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 const withPollNode = (\r\n cb: (node: PollNode) => void,\r\n onUpdate?: () => void,\r\n ): void => {\r\n editor.update(\r\n () => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n cb(node);\r\n }\r\n },\r\n {onUpdate},\r\n );\r\n };\r\n\r\n const addOption = () => {\r\n withPollNode((node) => {\r\n node.addOption(createPollOption());\r\n });\r\n };\r\n\r\n const isFocused = $isNodeSelection(selection) && isSelected;\r\n\r\n return (\r\n <div\r\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\r\n ref={ref}>\r\n <div className=\"PollNode__inner\">\r\n <h2 className=\"PollNode__heading\">{question}</h2>\r\n {options.map((option, index) => {\r\n const key = option.uid;\r\n return (\r\n <PollOptionComponent\r\n key={key}\r\n withPollNode={withPollNode}\r\n option={option}\r\n index={index}\r\n options={options}\r\n totalVotes={totalVotes}\r\n />\r\n );\r\n })}\r\n <div className=\"PollNode__footer\">\r\n <Button onClick={addOption} small={true}>\r\n Add Option\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["getTotalVotes","options","totalVotes","next","PollOptionComponent","option","index","withPollNode","clientID","useCollaborationContext","checkboxRef","useRef","votesArray","checked","votes","text","jsxs","jsx","joinClasses","e","node","target","value","selectionStart","selectionEnd","PollComponent","question","nodeKey","editor","useLexicalComposerContext","useMemo","isSelected","setSelected","clearSelection","useLexicalNodeSelection","selection","setSelection","useState","ref","onDelete","useCallback","payload","$isNodeSelection","$getSelection","$getNodeByKey","$isPollNode","useEffect","mergeRegister","editorState","CLICK_COMMAND","event","COMMAND_PRIORITY_LOW","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","cb","onUpdate","addOption","createPollOption","isFocused","key","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PollComponent-18f1d6e1.js","sources":["../src/lexical/nodes/PollComponent.tsx"],"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 type {Option, Options, PollNode} from './PollNode';\r\n\r\nimport './PollNode.css';\r\n\r\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n NodeKey,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport joinClasses from '../utils/joinClasses';\r\nimport {$isPollNode, createPollOption} from './PollNode';\r\n\r\nfunction getTotalVotes(options: Options): number {\r\n return options.reduce((totalVotes, next) => {\r\n return totalVotes + next.votes.length;\r\n }, 0);\r\n}\r\n\r\nfunction PollOptionComponent({\r\n option,\r\n index,\r\n options,\r\n totalVotes,\r\n withPollNode,\r\n}: {\r\n index: number;\r\n option: Option;\r\n options: Options;\r\n totalVotes: number;\r\n withPollNode: (\r\n cb: (pollNode: PollNode) => void,\r\n onSelect?: () => void,\r\n ) => void;\r\n}): JSX.Element {\r\n const {clientID} = useCollaborationContext();\r\n const checkboxRef = useRef(null);\r\n const votesArray = option.votes;\r\n const checkedIndex = votesArray.indexOf(clientID);\r\n const checked = checkedIndex !== -1;\r\n const votes = votesArray.length;\r\n const text = option.text;\r\n\r\n return (\r\n <div className=\"PollNode__optionContainer\">\r\n <div\r\n className={joinClasses(\r\n 'PollNode__optionCheckboxWrapper',\r\n checked && 'PollNode__optionCheckboxChecked',\r\n )}>\r\n <input\r\n ref={checkboxRef}\r\n className=\"PollNode__optionCheckbox\"\r\n type=\"checkbox\"\r\n onChange={(e) => {\r\n withPollNode((node) => {\r\n node.toggleVote(option, clientID);\r\n });\r\n }}\r\n checked={checked}\r\n />\r\n </div>\r\n <div className=\"PollNode__optionInputWrapper\">\r\n <div\r\n className=\"PollNode__optionInputVotes\"\r\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\r\n />\r\n <span className=\"PollNode__optionInputVotesCount\">\r\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\r\n </span>\r\n <input\r\n className=\"PollNode__optionInput\"\r\n type=\"text\"\r\n value={text}\r\n onChange={(e) => {\r\n const target = e.target;\r\n const value = target.value;\r\n const selectionStart = target.selectionStart;\r\n const selectionEnd = target.selectionEnd;\r\n withPollNode(\r\n (node) => {\r\n node.setOptionText(option, value);\r\n },\r\n () => {\r\n target.selectionStart = selectionStart;\r\n target.selectionEnd = selectionEnd;\r\n },\r\n );\r\n }}\r\n placeholder={`Option ${index + 1}`}\r\n />\r\n </div>\r\n <button\r\n disabled={options.length < 3}\r\n className={joinClasses(\r\n 'PollNode__optionDelete',\r\n options.length < 3 && 'PollNode__optionDeleteDisabled',\r\n )}\r\n aria-label=\"Remove\"\r\n onClick={() => {\r\n withPollNode((node) => {\r\n node.deleteOption(option);\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default function PollComponent({\r\n question,\r\n options,\r\n nodeKey,\r\n}: {\r\n nodeKey: NodeKey;\r\n options: Options;\r\n question: string;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const ref = useRef(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n\r\n if (event.target === ref.current) {\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 const withPollNode = (\r\n cb: (node: PollNode) => void,\r\n onUpdate?: () => void,\r\n ): void => {\r\n editor.update(\r\n () => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n cb(node);\r\n }\r\n },\r\n {onUpdate},\r\n );\r\n };\r\n\r\n const addOption = () => {\r\n withPollNode((node) => {\r\n node.addOption(createPollOption());\r\n });\r\n };\r\n\r\n const isFocused = $isNodeSelection(selection) && isSelected;\r\n\r\n return (\r\n <div\r\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\r\n ref={ref}>\r\n <div className=\"PollNode__inner\">\r\n <h2 className=\"PollNode__heading\">{question}</h2>\r\n {options.map((option, index) => {\r\n const key = option.uid;\r\n return (\r\n <PollOptionComponent\r\n key={key}\r\n withPollNode={withPollNode}\r\n option={option}\r\n index={index}\r\n options={options}\r\n totalVotes={totalVotes}\r\n />\r\n );\r\n })}\r\n <div className=\"PollNode__footer\">\r\n <Button onClick={addOption} small={true}>\r\n Add Option\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["getTotalVotes","options","totalVotes","next","PollOptionComponent","option","index","withPollNode","clientID","useCollaborationContext","checkboxRef","useRef","votesArray","checked","votes","text","jsxs","jsx","joinClasses","e","node","target","value","selectionStart","selectionEnd","PollComponent","question","nodeKey","editor","useLexicalComposerContext","useMemo","isSelected","setSelected","clearSelection","useLexicalNodeSelection","selection","setSelection","useState","ref","onDelete","useCallback","payload","$isNodeSelection","$getSelection","$getNodeByKey","$isPollNode","useEffect","mergeRegister","editorState","CLICK_COMMAND","event","COMMAND_PRIORITY_LOW","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","cb","onUpdate","addOption","createPollOption","isFocused","key","Button"],"mappings":"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"}
|
|
@@ -11080,7 +11080,7 @@ class eg extends $0 {
|
|
|
11080
11080
|
function SA(c) {
|
|
11081
11081
|
return new eg(c);
|
|
11082
11082
|
}
|
|
11083
|
-
const CA = ar.lazy(() => import("./ImageComponent-
|
|
11083
|
+
const CA = ar.lazy(() => import("./ImageComponent-26d24c20.js"));
|
|
11084
11084
|
function EA(c) {
|
|
11085
11085
|
const t = c;
|
|
11086
11086
|
if (t.src.startsWith("file:///"))
|
|
@@ -11226,7 +11226,7 @@ function lu({
|
|
|
11226
11226
|
function tg(c) {
|
|
11227
11227
|
return c instanceof Su;
|
|
11228
11228
|
}
|
|
11229
|
-
const kA = ar.lazy(() => import("./InlineImageComponent-
|
|
11229
|
+
const kA = ar.lazy(() => import("./InlineImageComponent-982a1399.js"));
|
|
11230
11230
|
function TA(c) {
|
|
11231
11231
|
if (c instanceof HTMLImageElement) {
|
|
11232
11232
|
const { alt: t, src: n, width: e, height: a } = c;
|
|
@@ -15353,7 +15353,7 @@ function nC(c) {
|
|
|
15353
15353
|
function Ny(c) {
|
|
15354
15354
|
return c instanceof Ga;
|
|
15355
15355
|
}
|
|
15356
|
-
const RA = ar.lazy(() => import("./PollComponent-
|
|
15356
|
+
const RA = ar.lazy(() => import("./PollComponent-18f1d6e1.js"));
|
|
15357
15357
|
function DA() {
|
|
15358
15358
|
return Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 5);
|
|
15359
15359
|
}
|
|
@@ -22811,7 +22811,7 @@ function $j({ content: c }) {
|
|
|
22811
22811
|
}
|
|
22812
22812
|
var qj = { 155: (c, t, n) => {
|
|
22813
22813
|
n.r(t), n.d(t, { default: () => i });
|
|
22814
|
-
const e = JSON.parse('{"UU":"@codoxhq/lexical-provider","rE":"1.1.0-rc.
|
|
22814
|
+
const e = JSON.parse('{"UU":"@codoxhq/lexical-provider","rE":"1.1.0-rc.9"}');
|
|
22815
22815
|
let a = () => {
|
|
22816
22816
|
}, o = function() {
|
|
22817
22817
|
return a;
|
|
@@ -57914,11 +57914,15 @@ class dE {
|
|
|
57914
57914
|
this.blacklist = Object.keys(H_).reduce((t, n) => {
|
|
57915
57915
|
let e = H_[n];
|
|
57916
57916
|
return t[n] = e.reduce((a, o) => (a[o] = o, a), {}), t;
|
|
57917
|
-
}, {}), this._isBlacklistedFound = !1, this._blacklistCallback = null;
|
|
57917
|
+
}, {}), this._isBlacklistedFound = !1, this._blacklistCallback = null, this._blacklistedMessage = "";
|
|
57918
57918
|
}
|
|
57919
57919
|
_shouldSkipNode(t) {
|
|
57920
57920
|
return t instanceof Rt.TextNode || t instanceof Rt.ParagraphNode || t instanceof Rt.RootNode;
|
|
57921
57921
|
}
|
|
57922
|
+
_generateBlacklistedMessage(t) {
|
|
57923
|
+
let { node: n, parent: e, isNestedEditor: a = !1 } = t, o = `"Node ${n.__type}" with key ${n.__key} cannot be child of node "${e.__type}" with key ${e.__key}`;
|
|
57924
|
+
return a ? `Blacklisted combination found in nested editor. ${o}` : `Blacklisted combination found. ${o}`;
|
|
57925
|
+
}
|
|
57922
57926
|
setBlacklistCallback(t) {
|
|
57923
57927
|
this._blacklistCallback = t;
|
|
57924
57928
|
}
|
|
@@ -57926,7 +57930,8 @@ class dE {
|
|
|
57926
57930
|
this._blacklistCallback = null;
|
|
57927
57931
|
}
|
|
57928
57932
|
invokeBlacklistCallback() {
|
|
57929
|
-
|
|
57933
|
+
let t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
|
|
57934
|
+
this._blacklistCallback && this._blacklistCallback(t);
|
|
57930
57935
|
}
|
|
57931
57936
|
trackBlacklisted(t) {
|
|
57932
57937
|
let n = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", e = arguments.length > 2 ? arguments[2] : void 0;
|
|
@@ -57940,7 +57945,7 @@ class dE {
|
|
|
57940
57945
|
if (!s)
|
|
57941
57946
|
return;
|
|
57942
57947
|
if (o[s])
|
|
57943
|
-
return ft.default.debug("[ContentNestingsWatcher][trackBlacklisted] BLACKLISTED COMBINATION FOUND. nodes:", { targetNode: t, targetType: a, parent: r, parentType: s, mutationType: n }), void (this.
|
|
57948
|
+
return ft.default.debug("[ContentNestingsWatcher][trackBlacklisted] BLACKLISTED COMBINATION FOUND. nodes:", { targetNode: t, targetType: a, parent: r, parentType: s, mutationType: n }), this._isBlacklistedFound = !0, void (this._blacklistedMessage = this._generateBlacklistedMessage({ node: t, parent: r }));
|
|
57944
57949
|
r = r.getParent();
|
|
57945
57950
|
}
|
|
57946
57951
|
});
|
|
@@ -57953,11 +57958,12 @@ class dE {
|
|
|
57953
57958
|
if (!a || !o)
|
|
57954
57959
|
return;
|
|
57955
57960
|
let r = this.blacklist[o];
|
|
57956
|
-
r && r[a] && (this._isBlacklistedFound = !0, ft.default.warn("[ContentNestingsWatcher][trackBlacklistedInNestedEditor] FOUND: ", { targetNode: t, targetType: o, rootNode: e, rootType: a, mutationType: n }));
|
|
57961
|
+
r && r[a] && (this._isBlacklistedFound = !0, this._blacklistedMessage = this._generateBlacklistedMessage({ node: t, parent: e, isNestedEditor: !0 }), ft.default.warn("[ContentNestingsWatcher][trackBlacklistedInNestedEditor] FOUND: ", { targetNode: t, targetType: o, rootNode: e, rootType: a, mutationType: n }));
|
|
57957
57962
|
}
|
|
57958
57963
|
isBlacklistedFound() {
|
|
57959
|
-
|
|
57960
|
-
|
|
57964
|
+
this._isBlacklistedFound && (this._isBlacklistedFound = !1);
|
|
57965
|
+
let t = this._blacklistedMessage;
|
|
57966
|
+
return this._blacklistedMessage = "", t;
|
|
57961
57967
|
}
|
|
57962
57968
|
}
|
|
57963
57969
|
var vP = (c) => {
|
|
@@ -58001,35 +58007,35 @@ class SP {
|
|
|
58001
58007
|
let { editorState: r, prevEditorState: s, dirtyElements: l, dirtyLeaves: i } = o, u = (xP(o, _P), e.getEditorState()), d = $n.getCodoxLexicalEditorManager(e.getKey());
|
|
58002
58008
|
if (!d.isCodoxStarted || !u._nodeMap.get(t.__key))
|
|
58003
58009
|
return;
|
|
58004
|
-
let f = Kl(r), p = Kl(s), h = ib(f, p), m = r._selection, g = (s._selection, !1), v = null, b = (uE(l, i), t[n]), _ = $n.getContentNestingsWatcher(e.getKey());
|
|
58005
|
-
if (
|
|
58006
|
-
return a = !0, ft.default.debug("[NESTED EDITOR LISTENER] BLACKLISTED FOUND - revert to prev state"), tx(t) ? (b.update(() => {
|
|
58010
|
+
let f = Kl(r), p = Kl(s), h = ib(f, p), m = r._selection, g = (s._selection, !1), v = null, b = (uE(l, i), t[n]), _ = $n.getContentNestingsWatcher(e.getKey()), C = _.isBlacklistedFound();
|
|
58011
|
+
if (C)
|
|
58012
|
+
return a = !0, ft.default.debug("[NESTED EDITOR LISTENER] BLACKLISTED FOUND - revert to prev state"), tx(t) ? (_.invokeBlacklistCallback(C), void b.update(() => {
|
|
58007
58013
|
try {
|
|
58008
|
-
const
|
|
58009
|
-
if (
|
|
58014
|
+
const S = b.parseEditorState(p);
|
|
58015
|
+
if (S.isEmpty())
|
|
58010
58016
|
return (0, Rt.$getRoot)().clear(), !0;
|
|
58011
|
-
b.setEditorState(
|
|
58012
|
-
} catch (
|
|
58013
|
-
ft.default.error("[NESTED EDITOR LISTENER] BLACKLISTED FOUND - ROLLBACK ERROR: ",
|
|
58017
|
+
b.setEditorState(S);
|
|
58018
|
+
} catch (S) {
|
|
58019
|
+
ft.default.error("[NESTED EDITOR LISTENER] BLACKLISTED FOUND - ROLLBACK ERROR: ", S);
|
|
58014
58020
|
}
|
|
58015
|
-
})
|
|
58021
|
+
})) : void 0;
|
|
58016
58022
|
if (a)
|
|
58017
58023
|
a = !1;
|
|
58018
58024
|
else {
|
|
58019
58025
|
if (t.codoxId || t.codoxDId) {
|
|
58020
|
-
let
|
|
58026
|
+
let S = null;
|
|
58021
58027
|
u.read(() => {
|
|
58022
|
-
|
|
58028
|
+
S = gn.getNodeAncestorsCodoxIds(t), !t.codoxId && t.codoxDId && S.push(t.codoxDId);
|
|
58023
58029
|
}), r.read(() => {
|
|
58024
|
-
let
|
|
58025
|
-
v = d.getCurrentNestedSelectionJSON(), g = gn.equalSelectionsJSON(v,
|
|
58030
|
+
let x = qy(n), y = gn.lexicalToJSONNested(m, x, S);
|
|
58031
|
+
v = d.getCurrentNestedSelectionJSON(), g = gn.equalSelectionsJSON(v, y), g || d.setNestedSelectionJSON(y);
|
|
58026
58032
|
});
|
|
58027
58033
|
}
|
|
58028
58034
|
h && g || setTimeout(() => e.update(() => {
|
|
58029
58035
|
try {
|
|
58030
58036
|
Vy({ fromNestedEditor: !0 }), t.markDirty();
|
|
58031
|
-
} catch (
|
|
58032
|
-
ft.default.error("[NESTED EDITOR LISTENER] MARKING DIRTY TO TRIGGER UPDATE - ERROR: ",
|
|
58037
|
+
} catch (S) {
|
|
58038
|
+
ft.default.error("[NESTED EDITOR LISTENER] MARKING DIRTY TO TRIGGER UPDATE - ERROR: ", S);
|
|
58033
58039
|
}
|
|
58034
58040
|
}));
|
|
58035
58041
|
}
|
|
@@ -58312,8 +58318,12 @@ const jP = function(c) {
|
|
|
58312
58318
|
const r = o._nodeMap[Symbol.iterator]();
|
|
58313
58319
|
for (const s of r) {
|
|
58314
58320
|
let [l, i] = s;
|
|
58315
|
-
if (i
|
|
58316
|
-
|
|
58321
|
+
if (!i)
|
|
58322
|
+
continue;
|
|
58323
|
+
e.trackBlacklisted(i, ji.created, o);
|
|
58324
|
+
let u = e.isBlacklistedFound();
|
|
58325
|
+
if (u)
|
|
58326
|
+
throw new Error(`${lI}.${u}`);
|
|
58317
58327
|
}
|
|
58318
58328
|
} catch (n) {
|
|
58319
58329
|
throw n;
|
|
@@ -59639,19 +59649,20 @@ const N5 = (0, pt.forwardRef)((c, t) => {
|
|
|
59639
59649
|
return void ft.default.debug("[editorUpdatesListener] STOP - update is part of synced deltas segmental updates");
|
|
59640
59650
|
if (N.has(z_))
|
|
59641
59651
|
return void ft.default.debug("[editorUpdatesListener] STOP - update invoked by content revert, no need to sync");
|
|
59642
|
-
|
|
59643
|
-
|
|
59652
|
+
let z = d.isBlacklistedFound();
|
|
59653
|
+
if (z)
|
|
59654
|
+
return ft.default.warn("[editorUpdatesListener] BLACKLISTED CHANGES FOUND - stopping codox"), d.invokeBlacklistCallback(z), S();
|
|
59644
59655
|
if (!i.ensureDocTablesAreValid(a))
|
|
59645
59656
|
return void ft.default.warn("[editorUpdatesListener] INVALID TABLE(S) FOUND - fix logic will be triggered");
|
|
59646
|
-
let
|
|
59657
|
+
let V = uE(U, R), K = V ? f.getLocalContentStateJSON() : Kl(j);
|
|
59647
59658
|
if (N.has("codox_sync_state_changes"))
|
|
59648
|
-
return ft.default.debug("[editorUpdatesListener] STOP - EARLY RETURN - update invoked after remote synced state applied - should not sync"), void b(
|
|
59649
|
-
let
|
|
59659
|
+
return ft.default.debug("[editorUpdatesListener] STOP - EARLY RETURN - update invoked after remote synced state applied - should not sync"), void b(K, $_.remote);
|
|
59660
|
+
let I = N.has(_d), q = null;
|
|
59650
59661
|
j.read(() => {
|
|
59651
|
-
|
|
59662
|
+
q = gn.lexicalToJSON((0, Rt.$getSelection)());
|
|
59652
59663
|
});
|
|
59653
|
-
let
|
|
59654
|
-
ft.default.debug("[editorUpdatesListener] compares: ", { isStateSame:
|
|
59664
|
+
let W = !!V || f.isSameContentStateJSON(K), H = f.isSameSelectionJSON(q);
|
|
59665
|
+
ft.default.debug("[editorUpdatesListener] compares: ", { isStateSame: W, isSelectionSame: H }), W && !I || b(K, $_.local), W && H && !I ? ft.default.debug("[editorUpdatesListener] STOP - state and selection and comments are same - should not sync") : (f.undoInvoked() && f.setUndoInvoked(!1), f.redoInvoked() && f.setRedoInvoked(!1), V || f.setLocalContentStateJSON(K, "editorUpdatesListener"), f.setMainSelectionJSON(q), F());
|
|
59655
59666
|
}, O = { start: async (k) => {
|
|
59656
59667
|
ft.default.debug("[startCodoxInstance] invoked", { codoxConfigFromClient: k }), f.isCodoxStarted && S(), f.alignStateSelectionJSONsFromLatestEditor(), s.createNewInstance(), ft.default.debug("[startCodoxInstance] instance created");
|
|
59657
59668
|
let j = $n.getClientEventListeners(o);
|
|
@@ -66959,9 +66970,7 @@ function hD() {
|
|
|
66959
66970
|
if (e) {
|
|
66960
66971
|
const o = new DOMParser(), r = o.parseFromString(e, "text/html"), s = e == null ? void 0 : e.match(
|
|
66961
66972
|
/<!--StartFragment-->(.*?)<!--EndFragment-->/s
|
|
66962
|
-
), l = s ? s[1] : r.body.innerHTML;
|
|
66963
|
-
console.log("fragmentHtml", l);
|
|
66964
|
-
const u = (o == null ? void 0 : o.parseFromString(l, "text/html")).body.children;
|
|
66973
|
+
), l = s ? s[1] : r.body.innerHTML, u = (o == null ? void 0 : o.parseFromString(l, "text/html")).body.children;
|
|
66965
66974
|
if ((a = Array.from(u)) == null ? void 0 : a.every(
|
|
66966
66975
|
(f) => f.tagName.toLowerCase() === "table" ? !0 : f.tagName.toLowerCase() === "p" ? f.innerHTML.trim() === "<br>" : !1
|
|
66967
66976
|
))
|
|
@@ -67006,10 +67015,10 @@ function eL({
|
|
|
67006
67015
|
const M = er(null), { historyState: B } = hS(), [O, k] = Mt([]), [j, L] = Mt(""), [N, U] = Mt("skyp_1"), [R, z] = Mt([]), [V, K] = Mt(!1), [I, q] = ec(), [W, H] = Mt(null), [G, Z] = Mt([]), [X, Y] = Mt(null), [ee, ie] = Mt(!1), [de, ue] = Mt(!1), [ne, Se] = Mt(!1), [xe, ge] = Mt([]), Ee = er(null), [ce, se] = Mt(!1);
|
|
67007
67016
|
Mt(!1);
|
|
67008
67017
|
const [fe, le] = Mt(!1), Te = async () => ({ state: { root: [] }, timestamp: Date.now() });
|
|
67009
|
-
let Ae = () => {
|
|
67018
|
+
let Ae = (Ut) => {
|
|
67010
67019
|
console.log(
|
|
67011
67020
|
"[Lexical Demo][onBlacklistedInsert] blacklisted combination found"
|
|
67012
|
-
);
|
|
67021
|
+
), console.log("msg", Ut);
|
|
67013
67022
|
};
|
|
67014
67023
|
const { userName: ke, userId: Pe, userEmail: $e } = t || {
|
|
67015
67024
|
userName: "aa",
|
|
@@ -68097,7 +68106,7 @@ function nL({
|
|
|
68097
68106
|
try {
|
|
68098
68107
|
jE($t, ow), V($t);
|
|
68099
68108
|
} catch (Qt) {
|
|
68100
|
-
console.error("
|
|
68109
|
+
console.error("error: ", Qt);
|
|
68101
68110
|
}
|
|
68102
68111
|
})();
|
|
68103
68112
|
}, [B]), zt(() => {
|
|
@@ -68405,4 +68414,4 @@ export {
|
|
|
68405
68414
|
ec as y,
|
|
68406
68415
|
YD as z
|
|
68407
68416
|
};
|
|
68408
|
-
//# sourceMappingURL=index-
|
|
68417
|
+
//# sourceMappingURL=index-dd17fa67.js.map
|