import { useEffect, forwardRef, type ForwardedRef, useRef, useLayoutEffect, useMemo, Fragment, type ReactNode, } from "react"; import { Suspense, lazy } from "react"; import { computed } from "nanostores"; import { useStore } from "@nanostores/react"; import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext"; import { mergeRefs } from "@react-aria/utils"; import type { Instance, Instances, Prop } from "@webstudio-is/sdk"; import { findTreeInstanceIds } from "@webstudio-is/sdk"; import { type WebstudioComponentProps, idAttribute, componentAttribute, showAttribute, selectorIdAttribute, indexAttribute, getIndexesWithinAncestors, createInstanceChildrenElements, collectionComponent, type AnyComponent, textContentAttribute, descendantComponent, } from "@webstudio-is/react-sdk"; import { rawTheme } from "@webstudio-is/design-system"; import { $propValuesByInstanceSelectorWithMemoryProps, getIndexedInstanceId, $instances, $registeredComponentMetas, $selectedInstanceRenderState, $selectedInstanceSelector, $selectedPage, } from "~/shared/nano-states"; import { $textEditingInstanceSelector } from "~/shared/nano-states"; import { type InstanceSelector, areInstanceSelectorsEqual, } from "~/shared/tree-utils"; import { setDataCollapsed } from "~/canvas/collapsed"; import { getIsVisuallyHidden } from "~/shared/visually-hidden"; import { serverSyncStore } from "~/shared/sync"; const TextEditor = lazy(async () => { const { TextEditor } = await import("../text-editor"); return { default: TextEditor }; }); const ContentEditable = ({ renderComponentWithRef, }: { renderComponentWithRef: ( elementRef: ForwardedRef ) => JSX.Element; }) => { const [editor] = useLexicalComposerContext(); const ref = useRef(null); /** * useLayoutEffect to be sure that editor plugins on useEffect would have access to rootElement */ useLayoutEffect(() => { let rootElement = ref.current; if (rootElement == null) { return; } if (getIsVisuallyHidden(rootElement)) { return; } if (rootElement?.tagName === "BUTTON" || rootElement.tagName === "A") { //