import React, { Fragment } from "react"; import clsx from "clsx"; import { Dialog, Transition } from "@headlessui/react"; import { useLocation } from "@docusaurus/router"; import { useColorMode } from "@docusaurus/theme-common"; import { CloseIcon } from "./icons/close"; export const LandingPlaygroundModal = ({ visible, close }) => { const iframeRef = React.useRef(null); const { colorMode } = useColorMode(); const { search, hash } = useLocation(); const [isActive, setIsActive] = React.useState(false); React.useEffect(() => { // when color mode changes, post a message to the iframe // to update its color mode if (iframeRef.current) { iframeRef.current.contentWindow?.postMessage( { type: "colorMode", colorMode, }, "*", ); } }, [colorMode, visible, isActive]); React.useEffect(() => { const mediaQuery = window.matchMedia("(max-width: 959px)"); setIsActive(mediaQuery.matches); const listener = () => { setIsActive(mediaQuery.matches); }; mediaQuery.addEventListener("change", listener); return () => { mediaQuery.removeEventListener("change", listener); }; }, []); const [params, setParams] = React.useState>({}); const scrollToItem = React.useCallback(() => { const playgroundElement = document.getElementById("playground"); if (playgroundElement) { playgroundElement.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest", }); } }, []); React.useEffect(() => { const _params = new URLSearchParams(search); const paramsObj: Record = {}; // @ts-expect-error no downlevel iteration for (const [key, value] of _params.entries()) { paramsObj[key] = value; } setParams(paramsObj); }, [search]); React.useEffect(() => { if (params.playground || hash === "#playground") { scrollToItem(); } }, [params.playground, hash]); const closePlayground = React.useCallback(() => { close(); }, []); React.useEffect(() => { if (isActive && visible) { if (typeof document !== "undefined" && document.documentElement) { document.documentElement.style.scrollBehavior = "unset"; } } else { setTimeout(() => { if ( typeof document !== "undefined" && document.documentElement ) { document.documentElement.style.scrollBehavior = "smooth"; } }, 300); } }, [isActive, visible]); if (!isActive) return null; return (