@payloadcms/richtext-lexical 4.0.0-internal.a2d053c → 4.0.0-internal.a5acc33
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/exports/client/index.js +13 -13
- package/dist/exports/client/index.js.map +3 -3
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +2 -2
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js +1 -1
- package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/populateGraphQL/populate.d.ts.map +1 -1
- package/dist/populateGraphQL/populate.js +4 -1
- package/dist/populateGraphQL/populate.js.map +1 -1
- package/package.json +19 -19
|
@@ -132,7 +132,7 @@ export function LinkEditor({
|
|
|
132
132
|
throw new Error(`Focus link parent is missing doc.value or doc.relationTo`);
|
|
133
133
|
}
|
|
134
134
|
const loadingLabel = t('fields:linkedTo', {
|
|
135
|
-
label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis'
|
|
135
|
+
label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis')}`
|
|
136
136
|
}).replace(/<[^>]*>?/g, '');
|
|
137
137
|
setLinkLabel(loadingLabel);
|
|
138
138
|
requests.get(formatAdminURL({
|
|
@@ -160,7 +160,7 @@ export function LinkEditor({
|
|
|
160
160
|
setLinkLabel(label);
|
|
161
161
|
}).catch(() => {
|
|
162
162
|
const label_0 = t('fields:linkedTo', {
|
|
163
|
-
label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled'
|
|
163
|
+
label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled')} - ID: ${id}`
|
|
164
164
|
}).replace(/<[^>]*>?/g, '');
|
|
165
165
|
setLinkLabel(label_0);
|
|
166
166
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","formatDrawerSlug","NewTabIcon","useConfig","useEditDepth","useLocale","useModal","useTranslation","WriteIcon","requests","$getSelection","$isLineBreakNode","$isRangeSelection","$onUpdate","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useLayoutEffect","useRef","useState","useEditorConfigContext","LinkIcon","PageIcon","TrashIcon","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","selectedNodeRectRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","modalState","isDrawerOpen","Boolean","isOpen","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","stopImmediatePropagation","_jsxs","Fragment","_jsx","hidden","ref","__fields","length","href","rel","target","newTab","_Fragment","size","onClick","onMouseDown","tabIndex","type","small","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n formatDrawerSlug,\n NewTabIcon,\n useConfig,\n useEditDepth,\n useLocale,\n useModal,\n useTranslation,\n WriteIcon,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n $onUpdate,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../server/schema.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { LinkIcon } from '../../../../../../lexical/ui/icons/Link/index.js'\nimport { PageIcon } from '../../../../../../lexical/ui/icons/Page/index.js'\nimport { TrashIcon } from '../../../../../../lexical/ui/icons/Trash/index.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const selectedNodeRectRef = useRef<DOMRect | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n const { modalState } = useModal()\n const isDrawerOpen = Boolean(modalState[drawerSlug]?.isOpen)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n // The drawer owns the in-progress edit until it closes, including its selected nodes.\n if (isDrawerOpen) {\n return\n }\n\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n // Store the rect for positioning in useLayoutEffect after content renders\n selectedNodeRectRef.current = selectedNodeDomRect\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n isDrawerOpen,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $onUpdate(() => editor.read('latest', $updateLinkEditor))\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n (event) => {\n if (isLink) {\n event.preventDefault()\n event.stopImmediatePropagation()\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n // Position the tooltip after React renders the link content\n useLayoutEffect(() => {\n if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {\n return\n }\n\n // Now the DOM has the actual link element, we can position the tooltip\n setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem)\n // linkNode dependency ensures re-positioning when clicking between different links with the same URL\n }, [linkUrl, linkLabel, isLink, anchorElem, linkNode])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" data-theme=\"dark\" hidden={!isLink} ref={editorRef}>\n <div className=\"link-input\">\n {linkNode?.__fields?.linkType === 'custom' ? <LinkIcon /> : <PageIcon />}\n {linkUrl && linkUrl.length > 0 ? (\n <a className=\"link-input__url\" href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n {linkNode?.__fields.newTab ? (\n <>\n <NewTabIcon size={16} /> <div className=\"link-input__divider\" />{' '}\n </>\n ) : null}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n {linkNode?.__fields.newTab ? (\n <>\n <NewTabIcon size={16} /> <div className=\"link-input__divider\" />{' '}\n </>\n ) : null}\n </>\n ) : null}\n\n {isEditable && (\n <div className=\"link-input__actions\">\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <WriteIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <TrashIcon small />\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","formatDrawerSlug","NewTabIcon","useConfig","useEditDepth","useLocale","useModal","useTranslation","WriteIcon","requests","$getSelection","$isLineBreakNode","$isRangeSelection","$onUpdate","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useLayoutEffect","useRef","useState","useEditorConfigContext","LinkIcon","PageIcon","TrashIcon","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","selectedNodeRectRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","modalState","isDrawerOpen","Boolean","isOpen","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","stopImmediatePropagation","_jsxs","Fragment","_jsx","hidden","ref","__fields","length","href","rel","target","newTab","_Fragment","size","onClick","onMouseDown","tabIndex","type","small","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n formatDrawerSlug,\n NewTabIcon,\n useConfig,\n useEditDepth,\n useLocale,\n useModal,\n useTranslation,\n WriteIcon,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n $onUpdate,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../server/schema.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { LinkIcon } from '../../../../../../lexical/ui/icons/Link/index.js'\nimport { PageIcon } from '../../../../../../lexical/ui/icons/Page/index.js'\nimport { TrashIcon } from '../../../../../../lexical/ui/icons/Trash/index.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const selectedNodeRectRef = useRef<DOMRect | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n const { modalState } = useModal()\n const isDrawerOpen = Boolean(modalState[drawerSlug]?.isOpen)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n // The drawer owns the in-progress edit until it closes, including its selected nodes.\n if (isDrawerOpen) {\n return\n }\n\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis')}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled')} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n // Store the rect for positioning in useLayoutEffect after content renders\n selectedNodeRectRef.current = selectedNodeDomRect\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n isDrawerOpen,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $onUpdate(() => editor.read('latest', $updateLinkEditor))\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n (event) => {\n if (isLink) {\n event.preventDefault()\n event.stopImmediatePropagation()\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n // Position the tooltip after React renders the link content\n useLayoutEffect(() => {\n if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {\n return\n }\n\n // Now the DOM has the actual link element, we can position the tooltip\n setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem)\n // linkNode dependency ensures re-positioning when clicking between different links with the same URL\n }, [linkUrl, linkLabel, isLink, anchorElem, linkNode])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" data-theme=\"dark\" hidden={!isLink} ref={editorRef}>\n <div className=\"link-input\">\n {linkNode?.__fields?.linkType === 'custom' ? <LinkIcon /> : <PageIcon />}\n {linkUrl && linkUrl.length > 0 ? (\n <a className=\"link-input__url\" href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n {linkNode?.__fields.newTab ? (\n <>\n <NewTabIcon size={16} /> <div className=\"link-input__divider\" />{' '}\n </>\n ) : null}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n {linkNode?.__fields.newTab ? (\n <>\n <NewTabIcon size={16} /> <div className=\"link-input__divider\" />{' '}\n </>\n ) : null}\n </>\n ) : null}\n\n {isEditable && (\n <div className=\"link-input__actions\">\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <WriteIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <TrashIcon small />\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -156,7 +156,7 @@ function TableCellResizer({
|
|
|
156
156
|
}
|
|
157
157
|
let height = tableRow.getHeight();
|
|
158
158
|
if (height === undefined) {
|
|
159
|
-
const rowCells = tableRow.getChildren();
|
|
159
|
+
const rowCells = tableRow.getChildren().filter($isTableCellNode);
|
|
160
160
|
height = Math.min(...rowCells.map(cell_0 => getCellNodeHeight(cell_0, editor) ?? Infinity));
|
|
161
161
|
}
|
|
162
162
|
const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getDOMCellFromTarget","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","SKIP_SCROLL_INTO_VIEW_TAG","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","useEditorConfigContext","MIN_ROW_HEIGHT","MIN_COLUMN_WIDTH","getCellNodeHeight","cell","activeEditor","domCellNode","getElementByKey","getKey","clientHeight","TableCellResizer","editor","targetRef","resizerRef","tableRectRef","hasTable","setHasTable","editorConfig","mouseStartPosRef","mouseCurrentPos","updateMouseCurrentPos","activeCell","updateActiveCell","isMouseDown","updateIsMouseDown","draggingDirection","updateDraggingDirection","resetState","current","isMouseDownOnEvent","event","buttons","tableKeys","Set","registerMutationListener","nodeMutations","nodeKey","mutation","delete","add","size","registerNodeTransform","tableNode","getColWidths","numColumns","getColumnCount","columnWidth","setColWidths","Array","fill","onMouseMove","target","x","clientX","y","clientY","contains","getEditorState","read","tableCellNode","elem","Error","tableElement","getBoundingClientRect","onMouseDown","onMouseUp","removeRootListener","registerRootListener","rootElement","prevRootElement","removeEventListener","addEventListener","isHeightChanging","direction","updateRowHeight","heightChange","update","baseRowIndex","tableRows","getChildren","isFullRowMerge","getColSpan","tableRowIndex","getRowSpan","length","tableRow","height","getHeight","undefined","rowCells","Math","min","map","Infinity","newHeight","max","setHeight","tag","getCellColumnIndex","tableMap","columnIndex","forEach","row","columnIndexInner","updateColumnWidth","widthChange","colWidths","width","newColWidths","newWidth","mouseUpHandler","handler","preventDefault","stopPropagation","zoom","document","toggleResize","resizerStyles","setResizerStyles","bottom","left","right","top","isInModal","Boolean","getRootElement","closest","scrollX","window","scrollY","position","zoneWidth","styles","backgroundColor","cursor","tableRect","_jsx","ref","_jsxs","Fragment","className","lexical","theme","tableCellResizer","style","TableCellResizerPlugin","$","isEditable","portalTarget","setPortalTarget","t0","t1","root","body","t2"],"sources":["../../../../../../src/features/table/client/plugins/TableCellResizerPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.css'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nconst getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n}\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren<TableCellNode>()\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const isInModal = Boolean(editor.getRootElement()?.closest('dialog, [role=\"dialog\"]'))\n const scrollX = isInModal ? 0 : window.scrollX\n const scrollY = isInModal ? 0 : window.scrollY\n const position = isInModal ? ('fixed' as const) : ('absolute' as const)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${scrollX + left}px`,\n position,\n top: `${scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${scrollX + left + width - zoneWidth / 2}px`,\n position,\n top: `${scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, editor, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n const [portalTarget, setPortalTarget] = useState<Element | null>(null)\n\n useEffect(\n () =>\n editor.registerRootListener((root) => {\n setPortalTarget(root?.closest('dialog, [role=\"dialog\"]') ?? document.body)\n }),\n [editor],\n )\n\n return useMemo(\n () =>\n isEditable && portalTarget\n ? createPortal(<TableCellResizer editor={editor} />, portalTarget)\n : null,\n [editor, isEditable, portalTarget],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAMA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,kBAAkB,QAAQ;AACnC,SACEC,6BAA6B,EAC7BC,mCAAmC,EACnCC,kCAAkC,EAClCC,gBAAgB,EAChBC,eAAe,EACfC,oBAAoB,EACpBC,eAAe,EACfC,SAAS,QACJ;AACP,SAASC,kBAAkB,EAAEC,aAAa,QAAQ;AAClD,SAASC,0BAA0B,EAAEC,aAAa,EAAEC,yBAAyB,QAAQ;AACrF,YAAYC,KAAA,MAAW;AACvB,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAClE,SAASC,YAAY,QAAQ;AAI7B,OAAO;AACP,SAASC,sBAAsB,QAAQ;AASvC,MAAMC,cAAA,GAAiB;AACvB,MAAMC,gBAAA,GAAmB;AAEzB,MAAMC,iBAAA,GAAoBA,CACxBC,IAAA,EACAC,YAAA;EAEA,MAAMC,WAAA,GAAcD,YAAA,CAAaE,eAAe,CAACH,IAAA,CAAKI,MAAM;EAC5D,OAAOF,WAAA,EAAaG,YAAA;AACtB;AAEA,SAASC,iBAAiB;EAAEC;AAAM,CAA6B;EAC7D,MAAMC,SAAA,GAAYf,MAAA,CAA2B;EAC7C,MAAMgB,UAAA,GAAahB,MAAA,CAA8B;EACjD,MAAMiB,YAAA,GAAejB,MAAA,CAA0B;EAC/C,MAAM,CAACkB,QAAA,EAAUC,WAAA,CAAY,GAAGlB,QAAA,CAAS;EACzC,MAAMmB,YAAA,GAAejB,sBAAA;EAErB,MAAMkB,gBAAA,GAAmBrB,MAAA,CAA6B;EACtD,MAAM,CAACsB,eAAA,EAAiBC,qBAAA,CAAsB,GAAGtB,QAAA,CAA+B;EAEhF,MAAM,CAACuB,UAAA,EAAYC,gBAAA,CAAiB,GAAGxB,QAAA,CAA8B;EACrE,MAAM,CAACyB,WAAA,EAAaC,iBAAA,CAAkB,GAAG1B,QAAA,CAAkB;EAC3D,MAAM,CAAC2B,iBAAA,EAAmBC,uBAAA,CAAwB,GAAG5B,QAAA,CAAwC;EAE7F,MAAM6B,UAAA,GAAajC,WAAA,CAAY;IAC7B4B,gBAAA,CAAiB;IACjBV,SAAA,CAAUgB,OAAO,GAAG;IACpBF,uBAAA,CAAwB;IACxBR,gBAAA,CAAiBU,OAAO,GAAG;IAC3Bd,YAAA,CAAac,OAAO,GAAG;EACzB,GAAG,EAAE;EAEL,MAAMC,kBAAA,GAAsBC,KAAA;IAC1B,OAAO,CAACA,KAAA,CAAMC,OAAO,GAAG,OAAO;EACjC;EAEApC,SAAA,CAAU;IACR,MAAMqC,SAAA,GAAY,IAAIC,GAAA;IACtB,OAAO5C,aAAA,CACLsB,MAAA,CAAOuB,wBAAwB,CAAC/C,SAAA,EAAYgD,aAAA;MAC1C,KAAK,MAAM,CAACC,OAAA,EAASC,QAAA,CAAS,IAAIF,aAAA,EAAe;QAC/C,IAAIE,QAAA,KAAa,aAAa;UAC5BL,SAAA,CAAUM,MAAM,CAACF,OAAA;QACnB,OAAO;UACLJ,SAAA,CAAUO,GAAG,CAACH,OAAA;QAChB;MACF;MACApB,WAAA,CAAYgB,SAAA,CAAUQ,IAAI,GAAG;IAC/B,IACA7B,MAAA,CAAO8B,qBAAqB,CAACtD,SAAA,EAAYuD,SAAA;MACvC,IAAIA,SAAA,CAAUC,YAAY,IAAI;QAC5B,OAAOD,SAAA;MACT;MAEA,MAAME,UAAA,GAAaF,SAAA,CAAUG,cAAc;MAC3C,MAAMC,WAAA,GAAc5C,gBAAA;MAEpBwC,SAAA,CAAUK,YAAY,CAACC,KAAA,CAAMJ,UAAA,EAAYK,IAAI,CAACH,WAAA;MAC9C,OAAOJ,SAAA;IACT;EAEJ,GAAG,CAAC/B,MAAA,CAAO;EAEXhB,SAAA,CAAU;IACR,IAAI,CAACoB,QAAA,EAAU;MACb;IACF;IAEA,MAAMmC,WAAA,GAAepB,OAAA;MACnB,MAAMqB,MAAA,GAASrB,OAAA,CAAMqB,MAAM;MAC3B,IAAI,CAAC5D,aAAA,CAAc4D,MAAA,GAAS;QAC1B;MACF;MAEA,IAAI1B,iBAAA,EAAmB;QACrBL,qBAAA,CAAsB;UACpBgC,CAAA,EAAGtB,OAAA,CAAMuB,OAAO;UAChBC,CAAA,EAAGxB,OAAA,CAAMyB;QACX;QACA;MACF;MACA/B,iBAAA,CAAkBK,kBAAA,CAAmBC,OAAA;MACrC,IAAIjB,UAAA,CAAWe,OAAO,IAAIf,UAAA,CAAWe,OAAO,CAAC4B,QAAQ,CAACL,MAAA,GAAS;QAC7D;MACF;MAEA,IAAIvC,SAAA,CAAUgB,OAAO,KAAKuB,MAAA,EAAQ;QAChCvC,SAAA,CAAUgB,OAAO,GAAGuB,MAAA;QACpB,MAAM/C,IAAA,GAAOnB,oBAAA,CAAqBkE,MAAA;QAElC,IAAI/C,IAAA,IAAQiB,UAAA,KAAejB,IAAA,EAAM;UAC/BO,MAAA,CAAO8C,cAAc,GAAGC,IAAI,CAC1B;YACE,MAAMC,aAAA,GAAgBrE,0BAAA,CAA2Bc,IAAA,CAAKwD,IAAI;YAE1D,IAAI,CAACD,aAAA,EAAe;cAClB,MAAM,IAAIE,KAAA,CAAM;YAClB;YAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,aAAA;YACtD,MAAMG,YAAA,GAAe5E,eAAA,CACnBwD,WAAA,EACA/B,MAAA,CAAOJ,eAAe,CAACmC,WAAA,CAAUlC,MAAM;YAEzC,IAAI,CAACsD,YAAA,EAAc;cACjB,MAAM,IAAID,KAAA,CAAM;YAClB;YAEAjD,SAAA,CAAUgB,OAAO,GAAGuB,MAAA;YACpBrC,YAAA,CAAac,OAAO,GAAGkC,YAAA,CAAaC,qBAAqB;YACzDzC,gBAAA,CAAiBlB,IAAA;UACnB,GACA;YAAEO;UAAO;QAEb,OAAO,IAAIP,IAAA,IAAQ,MAAM;UACvBuB,UAAA;QACF;MACF;IACF;IAEA,MAAMqC,WAAA,GAAelC,OAAA;MACnBN,iBAAA,CAAkB;IACpB;IAEA,MAAMyC,SAAA,GAAanC,OAAA;MACjBN,iBAAA,CAAkB;IACpB;IAEA,MAAM0C,kBAAA,GAAqBvD,MAAA,CAAOwD,oBAAoB,CAAC,CAACC,WAAA,EAAaC,eAAA;MACnEA,eAAA,EAAiBC,mBAAA,CAAoB,aAAapB,WAAA;MAClDmB,eAAA,EAAiBC,mBAAA,CAAoB,aAAaN,WAAA;MAClDK,eAAA,EAAiBC,mBAAA,CAAoB,WAAWL,SAAA;MAChDG,WAAA,EAAaG,gBAAA,CAAiB,aAAarB,WAAA;MAC3CkB,WAAA,EAAaG,gBAAA,CAAiB,aAAaP,WAAA;MAC3CI,WAAA,EAAaG,gBAAA,CAAiB,WAAWN,SAAA;IAC3C;IAEA,OAAO;MACLC,kBAAA;IACF;EACF,GAAG,CAAC7C,UAAA,EAAYI,iBAAA,EAAmBd,MAAA,EAAQI,QAAA,EAAUY,UAAA,CAAW;EAEhE,MAAM6C,gBAAA,GAAoBC,SAAA;IACxB,IAAIA,SAAA,KAAc,UAAU;MAC1B,OAAO;IACT;IACA,OAAO;EACT;EAEA,MAAMC,eAAA,GAAkBhF,WAAA,CACrBiF,YAAA;IACC,IAAI,CAACtD,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IAEAlD,MAAA,CAAOiE,MAAM,CACX;MACE,MAAMjB,eAAA,GAAgBrE,0BAAA,CAA2B+B,UAAA,CAAWuC,IAAI;MAChE,IAAI,CAAC7E,gBAAA,CAAiB4E,eAAA,GAAgB;QACpC,MAAM,IAAIE,KAAA,CAAM;MAClB;MAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,eAAA;MAEtD,MAAMkB,YAAA,GAAe/F,kCAAA,CAAmC6E,eAAA;MACxD,MAAMmB,SAAA,GAAYpC,WAAA,CAAUqC,WAAW;MAEvC;MACA,MAAMC,cAAA,GAAiBrB,eAAA,CAAcsB,UAAU,OAAOvC,WAAA,CAAUG,cAAc;MAE9E;MACA,MAAMqC,aAAA,GAAgBF,cAAA,GAClBH,YAAA,GACAA,YAAA,GAAelB,eAAA,CAAcwB,UAAU,KAAK;MAEhD,IAAID,aAAA,IAAiBJ,SAAA,CAAUM,MAAM,IAAIF,aAAA,GAAgB,GAAG;QAC1D,MAAM,IAAIrB,KAAA,CAAM;MAClB;MAEA,MAAMwB,QAAA,GAAWP,SAAS,CAACI,aAAA,CAAc;MAEzC,IAAI,CAAClG,eAAA,CAAgBqG,QAAA,GAAW;QAC9B,MAAM,IAAIxB,KAAA,CAAM;MAClB;MAEA,IAAIyB,MAAA,GAASD,QAAA,CAASE,SAAS;MAC/B,IAAID,MAAA,KAAWE,SAAA,EAAW;QACxB,MAAMC,QAAA,GAAWJ,QAAA,CAASN,WAAW;QACrCO,MAAA,GAASI,IAAA,CAAKC,GAAG,IACZF,QAAA,CAASG,GAAG,CAAExF,MAAA,IAASD,iBAAA,CAAkBC,MAAA,EAAMO,MAAA,KAAWkF,QAAA;MAEjE;MAEA,MAAMC,SAAA,GAAYJ,IAAA,CAAKK,GAAG,CAACT,MAAA,GAASX,YAAA,EAAc1E,cAAA;MAClDoF,QAAA,CAASW,SAAS,CAACF,SAAA;IACrB,GACA;MAAEG,GAAA,EAAKzG;IAA0B;EAErC,GACA,CAAC6B,UAAA,EAAYV,MAAA,CAAO;EAGtB,MAAMuF,kBAAA,GAAqBA,CAACvC,eAAA,EAA8BwC,QAAA;IACxD,IAAIC,WAAA;IACJD,QAAA,CAASE,OAAO,CAAEC,GAAA;MAChBA,GAAA,CAAID,OAAO,CAAC,CAACjG,MAAA,EAAMmG,gBAAA;QACjB,IAAInG,MAAA,CAAKA,IAAI,KAAKuD,eAAA,EAAe;UAC/ByC,WAAA,GAAcG,gBAAA;QAChB;MACF;IACF;IACA,OAAOH,WAAA;EACT;EAEA,MAAMI,iBAAA,GAAoB9G,WAAA,CACvB+G,WAAA;IACC,IAAI,CAACpF,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IACAlD,MAAA,CAAOiE,MAAM,CACX;MACE,MAAMjB,eAAA,GAAgBrE,0BAAA,CAA2B+B,UAAA,CAAWuC,IAAI;MAChE,IAAI,CAAC7E,gBAAA,CAAiB4E,eAAA,GAAgB;QACpC,MAAM,IAAIE,KAAA,CAAM;MAClB;MAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,eAAA;MACtD,MAAM,CAACwC,UAAA,CAAS,GAAGvH,6BAAA,CAA8B8D,WAAA,EAAW,MAAM;MAClE,MAAM0D,aAAA,GAAcF,kBAAA,CAAmBvC,eAAA,EAAewC,UAAA;MACtD,IAAIC,aAAA,KAAgBZ,SAAA,EAAW;QAC7B,MAAM,IAAI3B,KAAA,CAAM;MAClB;MAEA,MAAM6C,SAAA,GAAYhE,WAAA,CAAUC,YAAY;MACxC,IAAI,CAAC+D,SAAA,EAAW;QACd;MACF;MACA,MAAMC,KAAA,GAAQD,SAAS,CAACN,aAAA,CAAY;MACpC,IAAIO,KAAA,KAAUnB,SAAA,EAAW;QACvB;MACF;MACA,MAAMoB,YAAA,GAAe,C,GAAIF,SAAA,CAAU;MACnC,MAAMG,QAAA,GAAWnB,IAAA,CAAKK,GAAG,CAACY,KAAA,GAAQF,WAAA,EAAavG,gBAAA;MAC/C0G,YAAY,CAACR,aAAA,CAAY,GAAGS,QAAA;MAC5BnE,WAAA,CAAUK,YAAY,CAAC6D,YAAA;IACzB,GACA;MAAEX,GAAA,EAAKzG;IAA0B;EAErC,GACA,CAAC6B,UAAA,EAAYV,MAAA,CAAO;EAGtB,MAAMmG,cAAA,GAAiBpH,WAAA,CACpB+E,WAAA;IACC,MAAMsC,OAAA,GAAWjF,OAAA;MACfA,OAAA,CAAMkF,cAAc;MACpBlF,OAAA,CAAMmF,eAAe;MAErB,IAAI,CAAC5F,UAAA,EAAY;QACf,MAAM,IAAIwC,KAAA,CAAM;MAClB;MAEA,IAAI3C,gBAAA,CAAiBU,OAAO,EAAE;QAC5B,MAAM;UAAEwB,CAAC;UAAEE;QAAC,CAAE,GAAGpC,gBAAA,CAAiBU,OAAO;QAEzC,IAAIP,UAAA,KAAe,MAAM;UACvB;QACF;QACA,MAAM6F,IAAA,GAAO9H,kBAAA,CAAmB0C,OAAA,CAAMqB,MAAM;QAE5C,IAAIqB,gBAAA,CAAiBC,WAAA,GAAY;UAC/B,MAAME,cAAA,GAAe,CAAC7C,OAAA,CAAMyB,OAAO,GAAGD,CAAA,IAAK4D,IAAA;UAC3CxC,eAAA,CAAgBC,cAAA;QAClB,OAAO;UACL,MAAM8B,aAAA,GAAc,CAAC3E,OAAA,CAAMuB,OAAO,GAAGD,CAAA,IAAK8D,IAAA;UAC1CV,iBAAA,CAAkBC,aAAA;QACpB;QAEA9E,UAAA;QACAwF,QAAA,CAAS7C,mBAAmB,CAAC,WAAWyC,OAAA;MAC1C;IACF;IACA,OAAOA,OAAA;EACT,GACA,CAAC1F,UAAA,EAAYM,UAAA,EAAY6E,iBAAA,EAAmB9B,eAAA,CAAgB;EAG9D,MAAM0C,YAAA,GAAe1H,WAAA,CAClB+E,WAAA,IACE3C,OAAA;IACCA,OAAA,CAAMkF,cAAc;IACpBlF,OAAA,CAAMmF,eAAe;IAErB,IAAI,CAAC5F,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IAEA3C,gBAAA,CAAiBU,OAAO,GAAG;MACzBwB,CAAA,EAAGtB,OAAA,CAAMuB,OAAO;MAChBC,CAAA,EAAGxB,OAAA,CAAMyB;IACX;IACAnC,qBAAA,CAAsBF,gBAAA,CAAiBU,OAAO;IAC9CF,uBAAA,CAAwB+C,WAAA;IAExB0C,QAAA,CAAS5C,gBAAgB,CAAC,WAAWuC,cAAA,CAAerC,WAAA;EACtD,GACF,CAACpD,UAAA,EAAYyF,cAAA,CAAe;EAG9B,MAAM,CAACO,aAAA,EAAeC,gBAAA,CAAiB,GAAGxH,QAAA,CAKvC;IACDyH,MAAA,EAAQ;IACRC,IAAA,EAAM;IACNC,KAAA,EAAO;IACPC,GAAA,EAAK;EACP;EAEA/H,SAAA,CAAU;IACR,IAAI0B,UAAA,EAAY;MACd,MAAM;QAAEiE,MAAM,EAANA,QAAM;QAAEkC,IAAI;QAAEE,GAAG;QAAEf,KAAK,EAALA;MAAK,CAAE,GAAGtF,UAAA,CAAWuC,IAAI,CAACG,qBAAqB;MAC1E,MAAMmD,MAAA,GAAO9H,kBAAA,CAAmBiC,UAAA,CAAWuC,IAAI;MAC/C,MAAM+D,SAAA,GAAYC,OAAA,CAAQjH,MAAA,CAAOkH,cAAc,IAAIC,OAAA,CAAQ;MAC3D,MAAMC,OAAA,GAAUJ,SAAA,GAAY,IAAIK,MAAA,CAAOD,OAAO;MAC9C,MAAME,OAAA,GAAUN,SAAA,GAAY,IAAIK,MAAA,CAAOC,OAAO;MAC9C,MAAMC,QAAA,GAAWP,SAAA,GAAa,UAAqB;MACnD,MAAMQ,SAAA,GAAY,GAAG;AAAA;MACrB,MAAMC,MAAA,GAAS;QACbb,MAAA,EAAQ;UACNc,eAAA,EAAiB;UACjBC,MAAA,EAAQ;UACRhD,MAAA,EAAQ,GAAG6C,SAAA,IAAa;UACxBX,IAAA,EAAM,GAAGO,OAAA,GAAUP,IAAA,IAAQ;UAC3BU,QAAA;UACAR,GAAA,EAAK,GAAGO,OAAA,GAAUP,GAAA,GAAMpC,QAAA,GAAS6C,SAAA,GAAY,KAAK;UAClDxB,KAAA,EAAO,GAAGA,OAAA;QACZ;QACAc,KAAA,EAAO;UACLY,eAAA,EAAiB;UACjBC,MAAA,EAAQ;UACRhD,MAAA,EAAQ,GAAGA,QAAA,IAAU;UACrBkC,IAAA,EAAM,GAAGO,OAAA,GAAUP,IAAA,GAAOb,OAAA,GAAQwB,SAAA,GAAY,KAAK;UACnDD,QAAA;UACAR,GAAA,EAAK,GAAGO,OAAA,GAAUP,GAAA,IAAO;UACzBf,KAAA,EAAO,GAAGwB,SAAA;QACZ;MACF;MAEA,MAAMI,SAAA,GAAYzH,YAAA,CAAac,OAAO;MAEtC,IAAIH,iBAAA,IAAqBN,eAAA,IAAmBoH,SAAA,EAAW;QACrD,IAAI/D,gBAAA,CAAiB/C,iBAAA,GAAoB;UACvC2G,MAAM,CAAC3G,iBAAA,CAAkB,CAAC+F,IAAI,GAAG,GAAGO,OAAA,GAAUQ,SAAA,CAAUf,IAAI,IAAI;UAChEY,MAAM,CAAC3G,iBAAA,CAAkB,CAACiG,GAAG,GAAG,GAAGO,OAAA,GAAU9G,eAAA,CAAgBmC,CAAC,GAAG4D,MAAA,IAAQ;UACzEkB,MAAM,CAAC3G,iBAAA,CAAkB,CAAC6D,MAAM,GAAG;UACnC8C,MAAM,CAAC3G,iBAAA,CAAkB,CAACkF,KAAK,GAAG,GAAG4B,SAAA,CAAU5B,KAAK,IAAI;QAC1D,OAAO;UACLyB,MAAM,CAAC3G,iBAAA,CAAkB,CAACiG,GAAG,GAAG,GAAGO,OAAA,GAAUM,SAAA,CAAUb,GAAG,IAAI;UAC9DU,MAAM,CAAC3G,iBAAA,CAAkB,CAAC+F,IAAI,GAAG,GAAGO,OAAA,GAAU5G,eAAA,CAAgBiC,CAAC,GAAG8D,MAAA,IAAQ;UAC1EkB,MAAM,CAAC3G,iBAAA,CAAkB,CAACkF,KAAK,GAAG;UAClCyB,MAAM,CAAC3G,iBAAA,CAAkB,CAAC6D,MAAM,GAAG,GAAGiD,SAAA,CAAUjD,MAAM,IAAI;QAC5D;QAEA8C,MAAM,CAAC3G,iBAAA,CAAkB,CAAC4G,eAAe,GAAG;MAC9C;MAEAf,gBAAA,CAAiBc,MAAA;IACnB,OAAO;MACLd,gBAAA,CAAiB;QACfC,MAAA,EAAQ;QACRC,IAAA,EAAM;QACNC,KAAA,EAAO;QACPC,GAAA,EAAK;MACP;IACF;EACF,GAAG,CAACrG,UAAA,EAAYI,iBAAA,EAAmBd,MAAA,EAAQQ,eAAA,CAAgB;EAE3D,oBACEqH,IAAA,CAAC;IAAIC,GAAA,EAAK5H,UAAA;cACPQ,UAAA,IAAc,QAAQ,CAACE,WAAA,iBACtBmH,KAAA,CAACjJ,KAAA,CAAMkJ,QAAQ;8BACbH,IAAA,CAAC;QACCI,SAAA,EAAW,GAAG3H,YAAA,CAAaA,YAAY,CAAC4H,OAAO,CAACC,KAAK,CAACC,gBAAgB,uBAAuB;QAC7F/E,WAAA,EAAaoD,YAAA,CAAa;QAC1B4B,KAAA,EAAO3B,aAAA,CAAcI,KAAK,IAAIjC;uBAEhCgD,IAAA,CAAC;QACCI,SAAA,EAAW,GAAG3H,YAAA,CAAaA,YAAY,CAAC4H,OAAO,CAACC,KAAK,CAACC,gBAAgB,uBAAuB;QAC7F/E,WAAA,EAAaoD,YAAA,CAAa;QAC1B4B,KAAA,EAAO3B,aAAA,CAAcE,MAAM,IAAI/B;;;;AAM3C;AAEA,OAAO,MAAMyD,sBAAA,GAA0CA,CAAA;EAAA,MAAAC,CAAA,GAAAzK,EAAA;EACrD,OAAAkC,MAAA,IAAiBjC,yBAAA;EACjB,MAAAyK,UAAA,GAAmBxK,kBAAA;EACnB,OAAAyK,YAAA,EAAAC,eAAA,IAAwCvJ,QAAA,CAAyB;EAAA,IAAAwJ,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAvI,MAAA;IAG/D2I,EAAA,GAAAA,CAAA,KACE3I,MAAA,CAAAwD,oBAA2B,CAACqF,IAAA;MAC1BH,eAAA,CAAgBG,IAAA,EAAA1B,OAAc,4BAAuC,CAAI,IAAbX,QAAA,CAAAsC,IAAa;IAAA,CAC3E;IACFF,EAAA,IAAC5I,MAAA,CAAO;IAAAuI,CAAA,MAAAvI,MAAA;IAAAuI,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EALVvJ,SAAA,CACE2J,EAGE,EACFC,EAAQ;EAAA,IAAAG,EAAA;EAAA,IAAAR,CAAA,QAAAvI,MAAA,IAAAuI,CAAA,QAAAC,UAAA,IAAAD,CAAA,QAAAE,YAAA;IAKNM,EAAA,GAAAP,UAAc,IAAdC,YAEI,GADArJ,YAAA,CAAayI,IAAA,CAAC9H,gBAAA;MAAAC;QAAqCyI,YACnD,IAFJ,IAEI;IAAAF,CAAA,MAAAvI,MAAA;IAAAuI,CAAA,MAAAC,UAAA;IAAAD,CAAA,MAAAE,YAAA;IAAAF,CAAA,MAAAQ,EAAA;EAAA;IAAAA,EAAA,GAAAR,CAAA;EAAA;EAAA,OAFJQ,EAEI;AAAA,CAGV","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getDOMCellFromTarget","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","SKIP_SCROLL_INTO_VIEW_TAG","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","useEditorConfigContext","MIN_ROW_HEIGHT","MIN_COLUMN_WIDTH","getCellNodeHeight","cell","activeEditor","domCellNode","getElementByKey","getKey","clientHeight","TableCellResizer","editor","targetRef","resizerRef","tableRectRef","hasTable","setHasTable","editorConfig","mouseStartPosRef","mouseCurrentPos","updateMouseCurrentPos","activeCell","updateActiveCell","isMouseDown","updateIsMouseDown","draggingDirection","updateDraggingDirection","resetState","current","isMouseDownOnEvent","event","buttons","tableKeys","Set","registerMutationListener","nodeMutations","nodeKey","mutation","delete","add","size","registerNodeTransform","tableNode","getColWidths","numColumns","getColumnCount","columnWidth","setColWidths","Array","fill","onMouseMove","target","x","clientX","y","clientY","contains","getEditorState","read","tableCellNode","elem","Error","tableElement","getBoundingClientRect","onMouseDown","onMouseUp","removeRootListener","registerRootListener","rootElement","prevRootElement","removeEventListener","addEventListener","isHeightChanging","direction","updateRowHeight","heightChange","update","baseRowIndex","tableRows","getChildren","isFullRowMerge","getColSpan","tableRowIndex","getRowSpan","length","tableRow","height","getHeight","undefined","rowCells","filter","Math","min","map","Infinity","newHeight","max","setHeight","tag","getCellColumnIndex","tableMap","columnIndex","forEach","row","columnIndexInner","updateColumnWidth","widthChange","colWidths","width","newColWidths","newWidth","mouseUpHandler","handler","preventDefault","stopPropagation","zoom","document","toggleResize","resizerStyles","setResizerStyles","bottom","left","right","top","isInModal","Boolean","getRootElement","closest","scrollX","window","scrollY","position","zoneWidth","styles","backgroundColor","cursor","tableRect","_jsx","ref","_jsxs","Fragment","className","lexical","theme","tableCellResizer","style","TableCellResizerPlugin","$","isEditable","portalTarget","setPortalTarget","t0","t1","root","body","t2"],"sources":["../../../../../../src/features/table/client/plugins/TableCellResizerPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.css'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nconst getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n}\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren().filter($isTableCellNode)\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const isInModal = Boolean(editor.getRootElement()?.closest('dialog, [role=\"dialog\"]'))\n const scrollX = isInModal ? 0 : window.scrollX\n const scrollY = isInModal ? 0 : window.scrollY\n const position = isInModal ? ('fixed' as const) : ('absolute' as const)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${scrollX + left}px`,\n position,\n top: `${scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${scrollX + left + width - zoneWidth / 2}px`,\n position,\n top: `${scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, editor, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n const [portalTarget, setPortalTarget] = useState<Element | null>(null)\n\n useEffect(\n () =>\n editor.registerRootListener((root) => {\n setPortalTarget(root?.closest('dialog, [role=\"dialog\"]') ?? document.body)\n }),\n [editor],\n )\n\n return useMemo(\n () =>\n isEditable && portalTarget\n ? createPortal(<TableCellResizer editor={editor} />, portalTarget)\n : null,\n [editor, isEditable, portalTarget],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAMA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,kBAAkB,QAAQ;AACnC,SACEC,6BAA6B,EAC7BC,mCAAmC,EACnCC,kCAAkC,EAClCC,gBAAgB,EAChBC,eAAe,EACfC,oBAAoB,EACpBC,eAAe,EACfC,SAAS,QACJ;AACP,SAASC,kBAAkB,EAAEC,aAAa,QAAQ;AAClD,SAASC,0BAA0B,EAAEC,aAAa,EAAEC,yBAAyB,QAAQ;AACrF,YAAYC,KAAA,MAAW;AACvB,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAClE,SAASC,YAAY,QAAQ;AAI7B,OAAO;AACP,SAASC,sBAAsB,QAAQ;AASvC,MAAMC,cAAA,GAAiB;AACvB,MAAMC,gBAAA,GAAmB;AAEzB,MAAMC,iBAAA,GAAoBA,CACxBC,IAAA,EACAC,YAAA;EAEA,MAAMC,WAAA,GAAcD,YAAA,CAAaE,eAAe,CAACH,IAAA,CAAKI,MAAM;EAC5D,OAAOF,WAAA,EAAaG,YAAA;AACtB;AAEA,SAASC,iBAAiB;EAAEC;AAAM,CAA6B;EAC7D,MAAMC,SAAA,GAAYf,MAAA,CAA2B;EAC7C,MAAMgB,UAAA,GAAahB,MAAA,CAA8B;EACjD,MAAMiB,YAAA,GAAejB,MAAA,CAA0B;EAC/C,MAAM,CAACkB,QAAA,EAAUC,WAAA,CAAY,GAAGlB,QAAA,CAAS;EACzC,MAAMmB,YAAA,GAAejB,sBAAA;EAErB,MAAMkB,gBAAA,GAAmBrB,MAAA,CAA6B;EACtD,MAAM,CAACsB,eAAA,EAAiBC,qBAAA,CAAsB,GAAGtB,QAAA,CAA+B;EAEhF,MAAM,CAACuB,UAAA,EAAYC,gBAAA,CAAiB,GAAGxB,QAAA,CAA8B;EACrE,MAAM,CAACyB,WAAA,EAAaC,iBAAA,CAAkB,GAAG1B,QAAA,CAAkB;EAC3D,MAAM,CAAC2B,iBAAA,EAAmBC,uBAAA,CAAwB,GAAG5B,QAAA,CAAwC;EAE7F,MAAM6B,UAAA,GAAajC,WAAA,CAAY;IAC7B4B,gBAAA,CAAiB;IACjBV,SAAA,CAAUgB,OAAO,GAAG;IACpBF,uBAAA,CAAwB;IACxBR,gBAAA,CAAiBU,OAAO,GAAG;IAC3Bd,YAAA,CAAac,OAAO,GAAG;EACzB,GAAG,EAAE;EAEL,MAAMC,kBAAA,GAAsBC,KAAA;IAC1B,OAAO,CAACA,KAAA,CAAMC,OAAO,GAAG,OAAO;EACjC;EAEApC,SAAA,CAAU;IACR,MAAMqC,SAAA,GAAY,IAAIC,GAAA;IACtB,OAAO5C,aAAA,CACLsB,MAAA,CAAOuB,wBAAwB,CAAC/C,SAAA,EAAYgD,aAAA;MAC1C,KAAK,MAAM,CAACC,OAAA,EAASC,QAAA,CAAS,IAAIF,aAAA,EAAe;QAC/C,IAAIE,QAAA,KAAa,aAAa;UAC5BL,SAAA,CAAUM,MAAM,CAACF,OAAA;QACnB,OAAO;UACLJ,SAAA,CAAUO,GAAG,CAACH,OAAA;QAChB;MACF;MACApB,WAAA,CAAYgB,SAAA,CAAUQ,IAAI,GAAG;IAC/B,IACA7B,MAAA,CAAO8B,qBAAqB,CAACtD,SAAA,EAAYuD,SAAA;MACvC,IAAIA,SAAA,CAAUC,YAAY,IAAI;QAC5B,OAAOD,SAAA;MACT;MAEA,MAAME,UAAA,GAAaF,SAAA,CAAUG,cAAc;MAC3C,MAAMC,WAAA,GAAc5C,gBAAA;MAEpBwC,SAAA,CAAUK,YAAY,CAACC,KAAA,CAAMJ,UAAA,EAAYK,IAAI,CAACH,WAAA;MAC9C,OAAOJ,SAAA;IACT;EAEJ,GAAG,CAAC/B,MAAA,CAAO;EAEXhB,SAAA,CAAU;IACR,IAAI,CAACoB,QAAA,EAAU;MACb;IACF;IAEA,MAAMmC,WAAA,GAAepB,OAAA;MACnB,MAAMqB,MAAA,GAASrB,OAAA,CAAMqB,MAAM;MAC3B,IAAI,CAAC5D,aAAA,CAAc4D,MAAA,GAAS;QAC1B;MACF;MAEA,IAAI1B,iBAAA,EAAmB;QACrBL,qBAAA,CAAsB;UACpBgC,CAAA,EAAGtB,OAAA,CAAMuB,OAAO;UAChBC,CAAA,EAAGxB,OAAA,CAAMyB;QACX;QACA;MACF;MACA/B,iBAAA,CAAkBK,kBAAA,CAAmBC,OAAA;MACrC,IAAIjB,UAAA,CAAWe,OAAO,IAAIf,UAAA,CAAWe,OAAO,CAAC4B,QAAQ,CAACL,MAAA,GAAS;QAC7D;MACF;MAEA,IAAIvC,SAAA,CAAUgB,OAAO,KAAKuB,MAAA,EAAQ;QAChCvC,SAAA,CAAUgB,OAAO,GAAGuB,MAAA;QACpB,MAAM/C,IAAA,GAAOnB,oBAAA,CAAqBkE,MAAA;QAElC,IAAI/C,IAAA,IAAQiB,UAAA,KAAejB,IAAA,EAAM;UAC/BO,MAAA,CAAO8C,cAAc,GAAGC,IAAI,CAC1B;YACE,MAAMC,aAAA,GAAgBrE,0BAAA,CAA2Bc,IAAA,CAAKwD,IAAI;YAE1D,IAAI,CAACD,aAAA,EAAe;cAClB,MAAM,IAAIE,KAAA,CAAM;YAClB;YAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,aAAA;YACtD,MAAMG,YAAA,GAAe5E,eAAA,CACnBwD,WAAA,EACA/B,MAAA,CAAOJ,eAAe,CAACmC,WAAA,CAAUlC,MAAM;YAEzC,IAAI,CAACsD,YAAA,EAAc;cACjB,MAAM,IAAID,KAAA,CAAM;YAClB;YAEAjD,SAAA,CAAUgB,OAAO,GAAGuB,MAAA;YACpBrC,YAAA,CAAac,OAAO,GAAGkC,YAAA,CAAaC,qBAAqB;YACzDzC,gBAAA,CAAiBlB,IAAA;UACnB,GACA;YAAEO;UAAO;QAEb,OAAO,IAAIP,IAAA,IAAQ,MAAM;UACvBuB,UAAA;QACF;MACF;IACF;IAEA,MAAMqC,WAAA,GAAelC,OAAA;MACnBN,iBAAA,CAAkB;IACpB;IAEA,MAAMyC,SAAA,GAAanC,OAAA;MACjBN,iBAAA,CAAkB;IACpB;IAEA,MAAM0C,kBAAA,GAAqBvD,MAAA,CAAOwD,oBAAoB,CAAC,CAACC,WAAA,EAAaC,eAAA;MACnEA,eAAA,EAAiBC,mBAAA,CAAoB,aAAapB,WAAA;MAClDmB,eAAA,EAAiBC,mBAAA,CAAoB,aAAaN,WAAA;MAClDK,eAAA,EAAiBC,mBAAA,CAAoB,WAAWL,SAAA;MAChDG,WAAA,EAAaG,gBAAA,CAAiB,aAAarB,WAAA;MAC3CkB,WAAA,EAAaG,gBAAA,CAAiB,aAAaP,WAAA;MAC3CI,WAAA,EAAaG,gBAAA,CAAiB,WAAWN,SAAA;IAC3C;IAEA,OAAO;MACLC,kBAAA;IACF;EACF,GAAG,CAAC7C,UAAA,EAAYI,iBAAA,EAAmBd,MAAA,EAAQI,QAAA,EAAUY,UAAA,CAAW;EAEhE,MAAM6C,gBAAA,GAAoBC,SAAA;IACxB,IAAIA,SAAA,KAAc,UAAU;MAC1B,OAAO;IACT;IACA,OAAO;EACT;EAEA,MAAMC,eAAA,GAAkBhF,WAAA,CACrBiF,YAAA;IACC,IAAI,CAACtD,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IAEAlD,MAAA,CAAOiE,MAAM,CACX;MACE,MAAMjB,eAAA,GAAgBrE,0BAAA,CAA2B+B,UAAA,CAAWuC,IAAI;MAChE,IAAI,CAAC7E,gBAAA,CAAiB4E,eAAA,GAAgB;QACpC,MAAM,IAAIE,KAAA,CAAM;MAClB;MAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,eAAA;MAEtD,MAAMkB,YAAA,GAAe/F,kCAAA,CAAmC6E,eAAA;MACxD,MAAMmB,SAAA,GAAYpC,WAAA,CAAUqC,WAAW;MAEvC;MACA,MAAMC,cAAA,GAAiBrB,eAAA,CAAcsB,UAAU,OAAOvC,WAAA,CAAUG,cAAc;MAE9E;MACA,MAAMqC,aAAA,GAAgBF,cAAA,GAClBH,YAAA,GACAA,YAAA,GAAelB,eAAA,CAAcwB,UAAU,KAAK;MAEhD,IAAID,aAAA,IAAiBJ,SAAA,CAAUM,MAAM,IAAIF,aAAA,GAAgB,GAAG;QAC1D,MAAM,IAAIrB,KAAA,CAAM;MAClB;MAEA,MAAMwB,QAAA,GAAWP,SAAS,CAACI,aAAA,CAAc;MAEzC,IAAI,CAAClG,eAAA,CAAgBqG,QAAA,GAAW;QAC9B,MAAM,IAAIxB,KAAA,CAAM;MAClB;MAEA,IAAIyB,MAAA,GAASD,QAAA,CAASE,SAAS;MAC/B,IAAID,MAAA,KAAWE,SAAA,EAAW;QACxB,MAAMC,QAAA,GAAWJ,QAAA,CAASN,WAAW,GAAGW,MAAM,CAAC3G,gBAAA;QAC/CuG,MAAA,GAASK,IAAA,CAAKC,GAAG,IACZH,QAAA,CAASI,GAAG,CAAEzF,MAAA,IAASD,iBAAA,CAAkBC,MAAA,EAAMO,MAAA,KAAWmF,QAAA;MAEjE;MAEA,MAAMC,SAAA,GAAYJ,IAAA,CAAKK,GAAG,CAACV,MAAA,GAASX,YAAA,EAAc1E,cAAA;MAClDoF,QAAA,CAASY,SAAS,CAACF,SAAA;IACrB,GACA;MAAEG,GAAA,EAAK1G;IAA0B;EAErC,GACA,CAAC6B,UAAA,EAAYV,MAAA,CAAO;EAGtB,MAAMwF,kBAAA,GAAqBA,CAACxC,eAAA,EAA8ByC,QAAA;IACxD,IAAIC,WAAA;IACJD,QAAA,CAASE,OAAO,CAAEC,GAAA;MAChBA,GAAA,CAAID,OAAO,CAAC,CAAClG,MAAA,EAAMoG,gBAAA;QACjB,IAAIpG,MAAA,CAAKA,IAAI,KAAKuD,eAAA,EAAe;UAC/B0C,WAAA,GAAcG,gBAAA;QAChB;MACF;IACF;IACA,OAAOH,WAAA;EACT;EAEA,MAAMI,iBAAA,GAAoB/G,WAAA,CACvBgH,WAAA;IACC,IAAI,CAACrF,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IACAlD,MAAA,CAAOiE,MAAM,CACX;MACE,MAAMjB,eAAA,GAAgBrE,0BAAA,CAA2B+B,UAAA,CAAWuC,IAAI;MAChE,IAAI,CAAC7E,gBAAA,CAAiB4E,eAAA,GAAgB;QACpC,MAAM,IAAIE,KAAA,CAAM;MAClB;MAEA,MAAMnB,WAAA,GAAY7D,mCAAA,CAAoC8E,eAAA;MACtD,MAAM,CAACyC,UAAA,CAAS,GAAGxH,6BAAA,CAA8B8D,WAAA,EAAW,MAAM;MAClE,MAAM2D,aAAA,GAAcF,kBAAA,CAAmBxC,eAAA,EAAeyC,UAAA;MACtD,IAAIC,aAAA,KAAgBb,SAAA,EAAW;QAC7B,MAAM,IAAI3B,KAAA,CAAM;MAClB;MAEA,MAAM8C,SAAA,GAAYjE,WAAA,CAAUC,YAAY;MACxC,IAAI,CAACgE,SAAA,EAAW;QACd;MACF;MACA,MAAMC,KAAA,GAAQD,SAAS,CAACN,aAAA,CAAY;MACpC,IAAIO,KAAA,KAAUpB,SAAA,EAAW;QACvB;MACF;MACA,MAAMqB,YAAA,GAAe,C,GAAIF,SAAA,CAAU;MACnC,MAAMG,QAAA,GAAWnB,IAAA,CAAKK,GAAG,CAACY,KAAA,GAAQF,WAAA,EAAaxG,gBAAA;MAC/C2G,YAAY,CAACR,aAAA,CAAY,GAAGS,QAAA;MAC5BpE,WAAA,CAAUK,YAAY,CAAC8D,YAAA;IACzB,GACA;MAAEX,GAAA,EAAK1G;IAA0B;EAErC,GACA,CAAC6B,UAAA,EAAYV,MAAA,CAAO;EAGtB,MAAMoG,cAAA,GAAiBrH,WAAA,CACpB+E,WAAA;IACC,MAAMuC,OAAA,GAAWlF,OAAA;MACfA,OAAA,CAAMmF,cAAc;MACpBnF,OAAA,CAAMoF,eAAe;MAErB,IAAI,CAAC7F,UAAA,EAAY;QACf,MAAM,IAAIwC,KAAA,CAAM;MAClB;MAEA,IAAI3C,gBAAA,CAAiBU,OAAO,EAAE;QAC5B,MAAM;UAAEwB,CAAC;UAAEE;QAAC,CAAE,GAAGpC,gBAAA,CAAiBU,OAAO;QAEzC,IAAIP,UAAA,KAAe,MAAM;UACvB;QACF;QACA,MAAM8F,IAAA,GAAO/H,kBAAA,CAAmB0C,OAAA,CAAMqB,MAAM;QAE5C,IAAIqB,gBAAA,CAAiBC,WAAA,GAAY;UAC/B,MAAME,cAAA,GAAe,CAAC7C,OAAA,CAAMyB,OAAO,GAAGD,CAAA,IAAK6D,IAAA;UAC3CzC,eAAA,CAAgBC,cAAA;QAClB,OAAO;UACL,MAAM+B,aAAA,GAAc,CAAC5E,OAAA,CAAMuB,OAAO,GAAGD,CAAA,IAAK+D,IAAA;UAC1CV,iBAAA,CAAkBC,aAAA;QACpB;QAEA/E,UAAA;QACAyF,QAAA,CAAS9C,mBAAmB,CAAC,WAAW0C,OAAA;MAC1C;IACF;IACA,OAAOA,OAAA;EACT,GACA,CAAC3F,UAAA,EAAYM,UAAA,EAAY8E,iBAAA,EAAmB/B,eAAA,CAAgB;EAG9D,MAAM2C,YAAA,GAAe3H,WAAA,CAClB+E,WAAA,IACE3C,OAAA;IACCA,OAAA,CAAMmF,cAAc;IACpBnF,OAAA,CAAMoF,eAAe;IAErB,IAAI,CAAC7F,UAAA,EAAY;MACf,MAAM,IAAIwC,KAAA,CAAM;IAClB;IAEA3C,gBAAA,CAAiBU,OAAO,GAAG;MACzBwB,CAAA,EAAGtB,OAAA,CAAMuB,OAAO;MAChBC,CAAA,EAAGxB,OAAA,CAAMyB;IACX;IACAnC,qBAAA,CAAsBF,gBAAA,CAAiBU,OAAO;IAC9CF,uBAAA,CAAwB+C,WAAA;IAExB2C,QAAA,CAAS7C,gBAAgB,CAAC,WAAWwC,cAAA,CAAetC,WAAA;EACtD,GACF,CAACpD,UAAA,EAAY0F,cAAA,CAAe;EAG9B,MAAM,CAACO,aAAA,EAAeC,gBAAA,CAAiB,GAAGzH,QAAA,CAKvC;IACD0H,MAAA,EAAQ;IACRC,IAAA,EAAM;IACNC,KAAA,EAAO;IACPC,GAAA,EAAK;EACP;EAEAhI,SAAA,CAAU;IACR,IAAI0B,UAAA,EAAY;MACd,MAAM;QAAEiE,MAAM,EAANA,QAAM;QAAEmC,IAAI;QAAEE,GAAG;QAAEf,KAAK,EAALA;MAAK,CAAE,GAAGvF,UAAA,CAAWuC,IAAI,CAACG,qBAAqB;MAC1E,MAAMoD,MAAA,GAAO/H,kBAAA,CAAmBiC,UAAA,CAAWuC,IAAI;MAC/C,MAAMgE,SAAA,GAAYC,OAAA,CAAQlH,MAAA,CAAOmH,cAAc,IAAIC,OAAA,CAAQ;MAC3D,MAAMC,OAAA,GAAUJ,SAAA,GAAY,IAAIK,MAAA,CAAOD,OAAO;MAC9C,MAAME,OAAA,GAAUN,SAAA,GAAY,IAAIK,MAAA,CAAOC,OAAO;MAC9C,MAAMC,QAAA,GAAWP,SAAA,GAAa,UAAqB;MACnD,MAAMQ,SAAA,GAAY,GAAG;AAAA;MACrB,MAAMC,MAAA,GAAS;QACbb,MAAA,EAAQ;UACNc,eAAA,EAAiB;UACjBC,MAAA,EAAQ;UACRjD,MAAA,EAAQ,GAAG8C,SAAA,IAAa;UACxBX,IAAA,EAAM,GAAGO,OAAA,GAAUP,IAAA,IAAQ;UAC3BU,QAAA;UACAR,GAAA,EAAK,GAAGO,OAAA,GAAUP,GAAA,GAAMrC,QAAA,GAAS8C,SAAA,GAAY,KAAK;UAClDxB,KAAA,EAAO,GAAGA,OAAA;QACZ;QACAc,KAAA,EAAO;UACLY,eAAA,EAAiB;UACjBC,MAAA,EAAQ;UACRjD,MAAA,EAAQ,GAAGA,QAAA,IAAU;UACrBmC,IAAA,EAAM,GAAGO,OAAA,GAAUP,IAAA,GAAOb,OAAA,GAAQwB,SAAA,GAAY,KAAK;UACnDD,QAAA;UACAR,GAAA,EAAK,GAAGO,OAAA,GAAUP,GAAA,IAAO;UACzBf,KAAA,EAAO,GAAGwB,SAAA;QACZ;MACF;MAEA,MAAMI,SAAA,GAAY1H,YAAA,CAAac,OAAO;MAEtC,IAAIH,iBAAA,IAAqBN,eAAA,IAAmBqH,SAAA,EAAW;QACrD,IAAIhE,gBAAA,CAAiB/C,iBAAA,GAAoB;UACvC4G,MAAM,CAAC5G,iBAAA,CAAkB,CAACgG,IAAI,GAAG,GAAGO,OAAA,GAAUQ,SAAA,CAAUf,IAAI,IAAI;UAChEY,MAAM,CAAC5G,iBAAA,CAAkB,CAACkG,GAAG,GAAG,GAAGO,OAAA,GAAU/G,eAAA,CAAgBmC,CAAC,GAAG6D,MAAA,IAAQ;UACzEkB,MAAM,CAAC5G,iBAAA,CAAkB,CAAC6D,MAAM,GAAG;UACnC+C,MAAM,CAAC5G,iBAAA,CAAkB,CAACmF,KAAK,GAAG,GAAG4B,SAAA,CAAU5B,KAAK,IAAI;QAC1D,OAAO;UACLyB,MAAM,CAAC5G,iBAAA,CAAkB,CAACkG,GAAG,GAAG,GAAGO,OAAA,GAAUM,SAAA,CAAUb,GAAG,IAAI;UAC9DU,MAAM,CAAC5G,iBAAA,CAAkB,CAACgG,IAAI,GAAG,GAAGO,OAAA,GAAU7G,eAAA,CAAgBiC,CAAC,GAAG+D,MAAA,IAAQ;UAC1EkB,MAAM,CAAC5G,iBAAA,CAAkB,CAACmF,KAAK,GAAG;UAClCyB,MAAM,CAAC5G,iBAAA,CAAkB,CAAC6D,MAAM,GAAG,GAAGkD,SAAA,CAAUlD,MAAM,IAAI;QAC5D;QAEA+C,MAAM,CAAC5G,iBAAA,CAAkB,CAAC6G,eAAe,GAAG;MAC9C;MAEAf,gBAAA,CAAiBc,MAAA;IACnB,OAAO;MACLd,gBAAA,CAAiB;QACfC,MAAA,EAAQ;QACRC,IAAA,EAAM;QACNC,KAAA,EAAO;QACPC,GAAA,EAAK;MACP;IACF;EACF,GAAG,CAACtG,UAAA,EAAYI,iBAAA,EAAmBd,MAAA,EAAQQ,eAAA,CAAgB;EAE3D,oBACEsH,IAAA,CAAC;IAAIC,GAAA,EAAK7H,UAAA;cACPQ,UAAA,IAAc,QAAQ,CAACE,WAAA,iBACtBoH,KAAA,CAAClJ,KAAA,CAAMmJ,QAAQ;8BACbH,IAAA,CAAC;QACCI,SAAA,EAAW,GAAG5H,YAAA,CAAaA,YAAY,CAAC6H,OAAO,CAACC,KAAK,CAACC,gBAAgB,uBAAuB;QAC7FhF,WAAA,EAAaqD,YAAA,CAAa;QAC1B4B,KAAA,EAAO3B,aAAA,CAAcI,KAAK,IAAIlC;uBAEhCiD,IAAA,CAAC;QACCI,SAAA,EAAW,GAAG5H,YAAA,CAAaA,YAAY,CAAC6H,OAAO,CAACC,KAAK,CAACC,gBAAgB,uBAAuB;QAC7FhF,WAAA,EAAaqD,YAAA,CAAa;QAC1B4B,KAAA,EAAO3B,aAAA,CAAcE,MAAM,IAAIhC;;;;AAM3C;AAEA,OAAO,MAAM0D,sBAAA,GAA0CA,CAAA;EAAA,MAAAC,CAAA,GAAA1K,EAAA;EACrD,OAAAkC,MAAA,IAAiBjC,yBAAA;EACjB,MAAA0K,UAAA,GAAmBzK,kBAAA;EACnB,OAAA0K,YAAA,EAAAC,eAAA,IAAwCxJ,QAAA,CAAyB;EAAA,IAAAyJ,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAxI,MAAA;IAG/D4I,EAAA,GAAAA,CAAA,KACE5I,MAAA,CAAAwD,oBAA2B,CAACsF,IAAA;MAC1BH,eAAA,CAAgBG,IAAA,EAAA1B,OAAc,4BAAuC,CAAI,IAAbX,QAAA,CAAAsC,IAAa;IAAA,CAC3E;IACFF,EAAA,IAAC7I,MAAA,CAAO;IAAAwI,CAAA,MAAAxI,MAAA;IAAAwI,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EALVxJ,SAAA,CACE4J,EAGE,EACFC,EAAQ;EAAA,IAAAG,EAAA;EAAA,IAAAR,CAAA,QAAAxI,MAAA,IAAAwI,CAAA,QAAAC,UAAA,IAAAD,CAAA,QAAAE,YAAA;IAKNM,EAAA,GAAAP,UAAc,IAAdC,YAEI,GADAtJ,YAAA,CAAa0I,IAAA,CAAC/H,gBAAA;MAAAC;QAAqC0I,YACnD,IAFJ,IAEI;IAAAF,CAAA,MAAAxI,MAAA;IAAAwI,CAAA,MAAAC,UAAA;IAAAD,CAAA,MAAAE,YAAA;IAAAF,CAAA,MAAAQ,EAAA;EAAA;IAAAA,EAAA,GAAAR,CAAA;EAAA;EAAA,OAFJQ,EAEI;AAAA,CAGV","ignoreList":[]}
|