sykpcomposer 1.20.61 → 1.20.63
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-bc2903fd.js → ImageComponent-9347da91.js} +3 -3
- package/dist/{ImageComponent-bc2903fd.js.map → ImageComponent-9347da91.js.map} +1 -1
- package/dist/{InlineImageComponent-8fa28a93.js → InlineImageComponent-e19e39a2.js} +3 -3
- package/dist/{InlineImageComponent-8fa28a93.js.map → InlineImageComponent-e19e39a2.js.map} +1 -1
- package/dist/{LexicalNestedComposer.prod-964e44f3.js → LexicalNestedComposer.prod-e833756c.js} +2 -2
- package/dist/{LexicalNestedComposer.prod-964e44f3.js.map → LexicalNestedComposer.prod-e833756c.js.map} +1 -1
- package/dist/{PollComponent-1fe2d0e3.js → PollComponent-11d33484.js} +2 -2
- package/dist/{PollComponent-1fe2d0e3.js.map → PollComponent-11d33484.js.map} +1 -1
- package/dist/{index-f288b0b1.js → index-f3b1dc4b.js} +39 -23
- package/dist/{index-f288b0b1.js.map → index-f3b1dc4b.js.map} +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +8 -7
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineImageComponent-8fa28a93.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-e19e39a2.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-964e44f3.js → LexicalNestedComposer.prod-e833756c.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-f3b1dc4b.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-e833756c.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LexicalNestedComposer.prod-
|
|
1
|
+
{"version":3,"file":"LexicalNestedComposer.prod-e833756c.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-f3b1dc4b.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-11d33484.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollComponent-1fe2d0e3.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-11d33484.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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"}
|
|
@@ -11085,7 +11085,7 @@ class Gh extends U0 {
|
|
|
11085
11085
|
function _O(c) {
|
|
11086
11086
|
return new Gh(c);
|
|
11087
11087
|
}
|
|
11088
|
-
const xO = sr.lazy(() => import("./ImageComponent-
|
|
11088
|
+
const xO = sr.lazy(() => import("./ImageComponent-9347da91.js"));
|
|
11089
11089
|
function wO(c) {
|
|
11090
11090
|
const t = c;
|
|
11091
11091
|
if (t.src.startsWith("file:///"))
|
|
@@ -11231,7 +11231,7 @@ function su({
|
|
|
11231
11231
|
function Yh(c) {
|
|
11232
11232
|
return c instanceof wu;
|
|
11233
11233
|
}
|
|
11234
|
-
const SO = sr.lazy(() => import("./InlineImageComponent-
|
|
11234
|
+
const SO = sr.lazy(() => import("./InlineImageComponent-e19e39a2.js"));
|
|
11235
11235
|
function EO(c) {
|
|
11236
11236
|
if (c instanceof HTMLImageElement) {
|
|
11237
11237
|
const { alt: t, src: n, width: e, height: a } = c;
|
|
@@ -15358,7 +15358,7 @@ function QS(c) {
|
|
|
15358
15358
|
function Ny(c) {
|
|
15359
15359
|
return c instanceof Il;
|
|
15360
15360
|
}
|
|
15361
|
-
const IO = sr.lazy(() => import("./PollComponent-
|
|
15361
|
+
const IO = sr.lazy(() => import("./PollComponent-11d33484.js"));
|
|
15362
15362
|
function PO() {
|
|
15363
15363
|
return Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 5);
|
|
15364
15364
|
}
|
|
@@ -19927,58 +19927,73 @@ const gA = async (c, t, n, e) => {
|
|
|
19927
19927
|
<style>
|
|
19928
19928
|
body {
|
|
19929
19929
|
font-family: "Times New Roman", Times, serif;
|
|
19930
|
-
font-size: 14.
|
|
19930
|
+
font-size: 14.5px;
|
|
19931
19931
|
}
|
|
19932
19932
|
|
|
19933
19933
|
h1 {
|
|
19934
19934
|
font-family: "Times New Roman", Times, serif;
|
|
19935
19935
|
font-weight: bold;
|
|
19936
|
-
font-size: 14.
|
|
19936
|
+
font-size: 14.5px;
|
|
19937
19937
|
}
|
|
19938
19938
|
|
|
19939
19939
|
h2 {
|
|
19940
19940
|
font-family: "Times New Roman", Times, serif;
|
|
19941
|
-
font-size: 14.
|
|
19941
|
+
font-size: 14.5px;
|
|
19942
19942
|
font-style: italic;
|
|
19943
19943
|
font-weight: bold;
|
|
19944
19944
|
}
|
|
19945
19945
|
|
|
19946
19946
|
h3 {
|
|
19947
19947
|
font-family: "Times New Roman", Times, serif;
|
|
19948
|
-
font-size: 14.
|
|
19948
|
+
font-size: 14.5px;
|
|
19949
19949
|
font-weight: 100;
|
|
19950
19950
|
font-style: italic;
|
|
19951
19951
|
}
|
|
19952
19952
|
|
|
19953
19953
|
h4 {
|
|
19954
19954
|
font-family: "Times New Roman", Times, serif;
|
|
19955
|
-
font-size: 14.
|
|
19955
|
+
font-size: 14.5px;
|
|
19956
19956
|
font-weight: 100;
|
|
19957
19957
|
font-style: italic;
|
|
19958
19958
|
}
|
|
19959
19959
|
|
|
19960
19960
|
h5 {
|
|
19961
19961
|
font-family: "Times New Roman", Times, serif;
|
|
19962
|
-
font-size: 14.
|
|
19962
|
+
font-size: 14.5px;
|
|
19963
19963
|
font-weight: 100;
|
|
19964
19964
|
font-style: italic;
|
|
19965
19965
|
}
|
|
19966
19966
|
</style>
|
|
19967
|
-
</head><body>`, a = "</body></html>", o = t || jl(".ContentEditable__root").html(), r = hA(o), s = pA(r), l = await yA(s
|
|
19967
|
+
</head><body>`, a = "</body></html>", o = t || jl(".ContentEditable__root").html(), r = hA(o), s = pA(r), l = await yA(s), i = e + l + a, u = new Blob([i], { type: "application/msword" });
|
|
19968
19968
|
fA.saveAs(u, `${c || "Exported"}.doc`);
|
|
19969
19969
|
};
|
|
19970
|
-
async function yA(c
|
|
19971
|
-
const
|
|
19972
|
-
|
|
19973
|
-
|
|
19974
|
-
|
|
19975
|
-
|
|
19976
|
-
|
|
19977
|
-
|
|
19978
|
-
|
|
19979
|
-
|
|
19970
|
+
async function yA(c) {
|
|
19971
|
+
const n = new DOMParser().parseFromString(c, "text/html");
|
|
19972
|
+
return Object.entries({
|
|
19973
|
+
h1: {
|
|
19974
|
+
fontColor: "black",
|
|
19975
|
+
fontSize: 14.5,
|
|
19976
|
+
bold: "Yes",
|
|
19977
|
+
italic: "No"
|
|
19978
|
+
},
|
|
19979
|
+
h2: {
|
|
19980
|
+
fontColor: "black",
|
|
19981
|
+
fontSize: 14.5,
|
|
19982
|
+
bold: "Yes",
|
|
19983
|
+
italic: "Yes"
|
|
19984
|
+
},
|
|
19985
|
+
h3: {
|
|
19986
|
+
fontColor: "black",
|
|
19987
|
+
fontSize: 14.5,
|
|
19988
|
+
bold: "No",
|
|
19989
|
+
italic: "Yes"
|
|
19990
|
+
}
|
|
19991
|
+
}).forEach(([o, r]) => {
|
|
19992
|
+
n.querySelectorAll(o).forEach((l) => {
|
|
19993
|
+
let i = "";
|
|
19994
|
+
r.fontColor && (i += `color: ${r.fontColor};`), r.fontSize && (i += `font-size: ${r.fontSize}px;`), r.bold === "Yes" && (i += "font-weight: bold;"), r.italic === "Yes" && (i += "font-style: italic;"), l.style.cssText += i;
|
|
19980
19995
|
});
|
|
19981
|
-
}), await vA(
|
|
19996
|
+
}), await vA(n.body.innerHTML);
|
|
19982
19997
|
}
|
|
19983
19998
|
function bA() {
|
|
19984
19999
|
const c = document.createElement("div");
|
|
@@ -20365,7 +20380,7 @@ function HE({
|
|
|
20365
20380
|
}) {
|
|
20366
20381
|
const [d] = Cn(), [p, h] = Ft(d), [m, g] = Ft("paragraph"), [v, b] = Ft("root"), [_, E] = Ft(
|
|
20367
20382
|
null
|
|
20368
|
-
), [w, x] = Ft("
|
|
20383
|
+
), [w, x] = Ft("14.5px"), [y, S] = Ft("#000"), [C, O] = Ft("#fff"), [F, B] = Ft("Arial"), [R, L] = Ft("left"), [N, T] = Ft(!1), [A, D] = Ft(!1), [j, $] = Ft(!1), [M, z] = Ft(!1), [V, K] = Ft(!1), [I, W] = Ft(!1), [q, U] = Ft(!1), [Y, Z] = Ft(!1), [X, G] = Ft(!1), [ee, oe] = Ft(!1), [ue, de] = Xl(), [ne, we] = Ft(!1), [_e, he] = Ft(""), [Se, ce] = Ft(() => d.isEditable()), [se, fe] = Ft(""), [le, Te] = Ft(""), [ke, Ce] = Ft(""), [Pe, He] = Ft(""), [Re, De] = Ft(!0), [Ee, Xe] = Ft(!1), Ie = 1, Qe = (Et) => {
|
|
20369
20384
|
Et.key === "Enter" && Ce((Bt) => Bt + 1);
|
|
20370
20385
|
};
|
|
20371
20386
|
Wt(() => (window.addEventListener("keydown", Qe), () => window.removeEventListener("keydown", Qe)), []);
|
|
@@ -60015,6 +60030,7 @@ const NC = ({ styleConfig: c }) => {
|
|
|
60015
60030
|
|
|
60016
60031
|
.PlaygroundEditorTheme__paragraph {
|
|
60017
60032
|
line-height: 25px !important;
|
|
60033
|
+
font-size: 14.5px !important;
|
|
60018
60034
|
}
|
|
60019
60035
|
|
|
60020
60036
|
.PlaygroundEditorTheme__h6 {
|
|
@@ -67759,4 +67775,4 @@ export {
|
|
|
67759
67775
|
Xl as y,
|
|
67760
67776
|
BD as z
|
|
67761
67777
|
};
|
|
67762
|
-
//# sourceMappingURL=index-
|
|
67778
|
+
//# sourceMappingURL=index-f3b1dc4b.js.map
|