{"version":3,"sources":["Embed.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\"\nimport { addPropertyControls, BorderStyle, ControlType } from \"framer\"\nimport {\n    useIsOnCanvas,\n    emptyStateStyle,\n    containerStyles,\n} from \"https://framer.com/m/framer/default-utils.js\"\n\ninterface Border {\n    borderColor?: string\n    borderStyle?: BorderStyle\n    borderWidth?: number\n    borderTopWidth?: number\n    borderLeftWidth?: number\n    borderRightWidth?: number\n    borderBottomWidth?: number\n}\n\ninterface EmbedProps {\n    type: \"url\" | \"html\"\n    url?: string\n    html?: string\n    zoom?: number\n    radius?: string\n    border?: Border\n    style?: React.CSSProperties\n}\n\n/**\n * @framerIntrinsicWidth 600\n * @framerIntrinsicHeight 400\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n *\n * @framerDisableUnlink\n */\nexport default function Embed({\n    type,\n    url,\n    html,\n    zoom,\n    radius,\n    border,\n    style = {},\n}: EmbedProps) {\n    if (type === \"url\" && url) {\n        return (\n            <EmbedUrl\n                url={url}\n                zoom={zoom}\n                radius={radius}\n                border={border}\n                style={style}\n            />\n        )\n    }\n\n    if (type === \"html\" && html) {\n        return <EmbedHtml html={html} style={style} />\n    }\n\n    return <Instructions style={style} />\n}\n\naddPropertyControls(Embed, {\n    type: {\n        type: ControlType.Enum,\n        defaultValue: \"url\",\n        displaySegmentedControl: true,\n        options: [\"url\", \"html\"],\n        optionTitles: [\"URL\", \"HTML\"],\n    },\n\n    url: {\n        title: \"URL\",\n        type: ControlType.String,\n        description: \"Some websites don’t support embedding.\",\n        hidden(props) {\n            return props.type !== \"url\"\n        },\n    },\n\n    html: {\n        title: \"HTML\",\n        type: ControlType.String,\n        displayTextArea: true,\n        hidden(props) {\n            return props.type !== \"html\"\n        },\n    },\n\n    border: {\n        title: \"Border\",\n        type: ControlType.Border,\n        optional: true,\n        hidden(props) {\n            return props.type !== \"url\"\n        },\n    },\n\n    radius: {\n        type: ControlType.BorderRadius,\n        title: \"Radius\",\n        hidden(props) {\n            return props.type !== \"url\"\n        },\n    },\n\n    zoom: {\n        title: \"Zoom\",\n        defaultValue: 1,\n        type: ControlType.Number,\n        hidden(props) {\n            return props.type !== \"url\"\n        },\n        min: 0.1,\n        max: 1,\n        step: 0.1,\n        displayStepper: true,\n    },\n})\n\ninterface InstructionsProps {\n    style: React.CSSProperties\n}\n\nfunction Instructions({ style }: InstructionsProps) {\n    return (\n        <div\n            style={{\n                minHeight: getMinHeight(style),\n                ...emptyStateStyle,\n                overflow: \"hidden\",\n                ...style,\n            }}\n        >\n            <div style={centerTextStyle}>\n                To embed a website or widget, add it to the\n                properties&nbsp;panel.\n            </div>\n        </div>\n    )\n}\n\n// Embed a URL\n\ntype BlockedState = undefined | Error | boolean\n\ninterface EmbedUrlProps {\n    url: string\n    zoom: number\n    radius: string\n    border: Border\n    style: React.CSSProperties\n}\n\nfunction EmbedUrl({ url, zoom, radius, border, style }: EmbedUrlProps) {\n    const hasAutoHeight = !style.height\n\n    // Add https:// if the URL does not have a protocol.\n    if (!/[a-z]+:\\/\\//.test(url)) {\n        url = \"https://\" + url\n    }\n\n    const onCanvas = useIsOnCanvas()\n\n    // We need to check if the url is blocked inside an iframe by the X-Frame-Options\n    // or Content-Security-Policy headers on the backend.\n    const [state, setState] = useState<BlockedState>(\n        onCanvas ? undefined : false\n    )\n\n    useEffect(() => {\n        // We only want to check on the canvas.\n        // On the website we want to avoid the additional delay.\n        if (!onCanvas) return\n\n        // TODO: We could also use AbortController here.\n        let isLastEffect = true\n\n        setState(undefined)\n\n        async function load() {\n            const response = await fetch(\n                \"https://api.framer.com/functions/check-iframe-url?url=\" +\n                    encodeURIComponent(url)\n            )\n\n            if (response.status == 200) {\n                const { isBlocked } = await response.json()\n\n                if (isLastEffect) {\n                    setState(isBlocked)\n                }\n            } else {\n                const message = await response.text()\n                console.error(message)\n                const error = new Error(\"This site can’t be reached.\")\n                setState(error)\n            }\n        }\n\n        load().catch((error) => {\n            console.error(error)\n            setState(error)\n        })\n\n        return () => {\n            isLastEffect = false\n        }\n    }, [url])\n\n    if (onCanvas && hasAutoHeight) {\n        return (\n            <ErrorMessage\n                message=\"URL embeds do not support auto height.\"\n                style={style}\n            />\n        )\n    }\n\n    if (!url.startsWith(\"https://\")) {\n        return <ErrorMessage message=\"Unsupported protocol.\" style={style} />\n    }\n\n    if (state === undefined) {\n        return <LoadingIndicator />\n    }\n\n    if (state instanceof Error) {\n        return <ErrorMessage message={state.message} style={style} />\n    }\n\n    if (state === true) {\n        const message = `Can’t embed ${url} due to its content security policy.`\n        return <ErrorMessage message={message} style={style} />\n    }\n\n    return (\n        <iframe\n            src={url}\n            style={{\n                ...iframeStyle,\n                ...style,\n                ...border,\n                zoom: zoom,\n                borderRadius: radius,\n\n                transformOrigin: \"top center\",\n            }}\n            loading=\"lazy\"\n            // @ts-ignore\n            fetchPriority={onCanvas ? \"low\" : \"auto\"}\n            referrerPolicy=\"no-referrer\"\n            sandbox={getSandbox(onCanvas)}\n        />\n    )\n}\n\nconst iframeStyle: React.CSSProperties = {\n    width: \"100%\",\n    height: \"100%\",\n    border: \"none\",\n}\n\nfunction getSandbox(onCanvas: boolean) {\n    const result = [\"allow-same-origin\", \"allow-scripts\"]\n\n    if (!onCanvas) {\n        result.push(\n            \"allow-downloads\",\n            \"allow-forms\",\n            \"allow-modals\",\n            \"allow-orientation-lock\",\n            \"allow-pointer-lock\",\n            \"allow-popups\",\n            \"allow-popups-to-escape-sandbox\",\n            \"allow-presentation\",\n            \"allow-storage-access-by-user-activation\",\n            \"allow-top-navigation-by-user-activation\"\n        )\n    }\n\n    return result.join(\" \")\n}\n\n// Embed some HTML\n\ninterface EmbedHtmlProps {\n    html: string\n    style: React.CSSProperties\n}\n\nfunction EmbedHtml({ html, ...props }: EmbedHtmlProps) {\n    const hasScript = html.includes(\"</script>\")\n\n    if (hasScript) {\n        const hasSplineViewer = html.includes(\"</spline-viewer>\")\n        const hasComment = html.includes(\"<!-- framer-direct-embed -->\")\n\n        if (hasSplineViewer || hasComment) {\n            return <EmbedHtmlWithScripts html={html} {...props} />\n        }\n\n        return <EmbedHtmlInsideIframe html={html} {...props} />\n    }\n\n    return <EmbedHtmlWithoutScripts html={html} {...props} />\n}\n\nfunction EmbedHtmlInsideIframe({ html, style }: EmbedHtmlProps) {\n    const ref = useRef<HTMLIFrameElement>()\n\n    const [iframeHeight, setIframeHeight] = useState(0)\n\n    // Handle auto sizing\n    useEffect(() => {\n        const iframeWindow = ref.current?.contentWindow\n\n        function handleMessage(event: MessageEvent) {\n            if (event.source !== iframeWindow) return\n\n            const data = event.data\n            if (typeof data !== \"object\" || data === null) return\n\n            const height = data.embedHeight\n            if (typeof height !== \"number\") return\n\n            setIframeHeight(height)\n        }\n\n        window.addEventListener(\"message\", handleMessage)\n\n        // After SSG the iframe loads before we attach the event handler,\n        // therefore we need to request the latest height from the iframe.\n        iframeWindow?.postMessage(\"getEmbedHeight\", \"*\")\n\n        return () => {\n            window.removeEventListener(\"message\", handleMessage)\n        }\n    }, [])\n\n    // The CSS is mainly copied from:\n    // FramerStudio/src/app/vekter/src/renderer/setDefaultFont.ts\n    // FramerStudio/src/app/vekter/src/export/globalStylesForExport.ts\n    const srcDoc = `\n<html>\n    <head>\n        <style>\n            html, body {\n                margin: 0;\n                padding: 0;\n            }\n\n            body {\n                display: flex;\n                justify-content: center;\n                align-items: center;\n            }\n\n            :root {\n                -webkit-font-smoothing: antialiased;\n                -moz-osx-font-smoothing: grayscale;\n            }\n\n            * {\n                box-sizing: border-box;\n                -webkit-font-smoothing: inherit;\n            }\n\n            h1, h2, h3, h4, h5, h6, p, figure {\n                margin: 0;\n            }\n\n            body, input, textarea, select, button {\n                font-size: 12px;\n                font-family: sans-serif;\n            }\n        </style>\n    </head>\n    <body>\n        ${html}\n        <script type=\"module\">\n            let height = 0\n\n            function sendEmbedHeight() {\n                window.parent.postMessage({\n                    embedHeight: height\n                }, \"*\")\n            }\n\n            const observer = new ResizeObserver((entries) => {\n                if (entries.length !== 1) return\n                const entry = entries[0]\n                if (entry.target !== document.body) return\n\n                height = entry.contentRect.height\n                sendEmbedHeight()\n            })\n\n            observer.observe(document.body)\n\n            window.addEventListener(\"message\", (event) => {\n                if (event.source !== window.parent) return\n                if (event.data !== \"getEmbedHeight\") return\n                sendEmbedHeight()\n            })\n        </script>\n    <body>\n</html>\n`\n\n    const currentStyle: React.CSSProperties = {\n        ...iframeStyle,\n        ...style,\n    }\n\n    const hasAutoHeight = !style.height\n    if (hasAutoHeight) {\n        currentStyle.height = iframeHeight + \"px\"\n    }\n\n    return <iframe ref={ref} style={currentStyle} srcDoc={srcDoc} />\n}\n\nfunction EmbedHtmlWithScripts({ html, style }: EmbedHtmlProps) {\n    const ref = useRef<HTMLDivElement>()\n\n    useEffect(() => {\n        const div = ref.current\n        if (!div) return\n\n        div.innerHTML = html\n        executeScripts(div)\n\n        return () => {\n            div.innerHTML = \"\"\n        }\n    }, [html])\n\n    return <div ref={ref} style={{ ...htmlStyle, ...style }} />\n}\n\nfunction EmbedHtmlWithoutScripts({ html, style }: EmbedHtmlProps) {\n    return (\n        <div\n            style={{ ...htmlStyle, ...style }}\n            dangerouslySetInnerHTML={{ __html: html }}\n        />\n    )\n}\n\nconst htmlStyle: React.CSSProperties = {\n    width: \"100%\",\n    height: \"100%\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n}\n\n// This function replaces scripts with executable ones.\n// https://stackoverflow.com/questions/1197575/can-scripts-be-inserted-with-innerhtml\nfunction executeScripts(node: Node) {\n    if (node instanceof Element && node.tagName === \"SCRIPT\") {\n        const script = document.createElement(\"script\")\n        script.text = node.innerHTML\n\n        for (const { name, value } of node.attributes) {\n            script.setAttribute(name, value)\n        }\n\n        node.parentElement.replaceChild(script, node)\n    } else {\n        for (const child of node.childNodes) {\n            executeScripts(child)\n        }\n    }\n}\n\n// Generic components\n\nfunction LoadingIndicator() {\n    return (\n        <div\n            className=\"framerInternalUI-componentPlaceholder\"\n            style={{ ...containerStyles, overflow: \"hidden\" }}\n        >\n            <div style={centerTextStyle}>Loading…</div>\n        </div>\n    )\n}\n\ninterface ErrorMessageProps {\n    message: string\n    style: React.CSSProperties\n}\n\nfunction ErrorMessage({ message, style }: ErrorMessageProps) {\n    return (\n        <div\n            className=\"framerInternalUI-errorPlaceholder\"\n            style={{\n                minHeight: getMinHeight(style),\n                ...containerStyles,\n                overflow: \"hidden\",\n                ...style,\n            }}\n        >\n            <div style={centerTextStyle}>{message}</div>\n        </div>\n    )\n}\n\nconst centerTextStyle: React.CSSProperties = {\n    textAlign: \"center\",\n    minWidth: 140,\n}\n\n// Returns a min-height if the component is using auto-height.\nfunction getMinHeight(style: React.CSSProperties) {\n    const hasAutoHeight = !style.height\n    if (hasAutoHeight) return 200\n}\n"],"names":[],"mappings":"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"}